diff --git a/project_task_line/__init__.py b/project_task_line/__init__.py new file mode 100644 index 00000000..0650744f --- /dev/null +++ b/project_task_line/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/project_task_line/__manifest__.py b/project_task_line/__manifest__.py new file mode 100644 index 00000000..6db1ed20 --- /dev/null +++ b/project_task_line/__manifest__.py @@ -0,0 +1,21 @@ +{ + 'name': 'Project Task Lines', + 'version': '17.0.1.0.0', + 'author': 'Hibou Corp. ', + 'website': 'https://hibou.io/', + 'license': 'AGPL-3', + 'category': 'Tools', + 'complexity': 'easy', + 'description': """ +Adds "todo" lines onto Project Tasks, and improves sub-tasks. + """, + 'depends': [ + 'project', + ], + 'data': [ + 'security/ir.model.access.csv', + 'views/project_views.xml', + ], + 'installable': True, + 'auto_install': False, +} diff --git a/project_task_line/migrations/17.0.1.0.0/pre-migration.py b/project_task_line/migrations/17.0.1.0.0/pre-migration.py new file mode 100644 index 00000000..85d8bd0c --- /dev/null +++ b/project_task_line/migrations/17.0.1.0.0/pre-migration.py @@ -0,0 +1,14 @@ +def migrate(cr, installed_version): + cr.execute( + """ + ALTER TABLE project_task_line + ADD COLUMN IF NOT EXISTS state VARCHAR + """, + ) + cr.execute( + """ + UPDATE project_task_line + SET state = kanban_state + WHERE kanban_state IN ('done', 'blocked') + """, + ) diff --git a/project_task_line/models/__init__.py b/project_task_line/models/__init__.py new file mode 100644 index 00000000..351a3ad3 --- /dev/null +++ b/project_task_line/models/__init__.py @@ -0,0 +1 @@ +from . import project diff --git a/project_task_line/models/project.py b/project_task_line/models/project.py new file mode 100644 index 00000000..1a467a7f --- /dev/null +++ b/project_task_line/models/project.py @@ -0,0 +1,32 @@ +from odoo import api, fields, models + + +class ProjectTask(models.Model): + _inherit = 'project.task' + + line_ids = fields.One2many('project.task.line', 'task_id', string='Todo List') + + +class ProjectTaskLine(models.Model): + _name = 'project.task.line' + _description = 'Task Todos' + _order = 'sequence, id asc' + + task_id = fields.Many2one('project.task', required=True) + name = fields.Char(string='Name') + user_id = fields.Many2one( + 'res.users', string='Completed By', + context={'active_test': False}, + compute='_compute_user_id', + store=True, readonly=False, precompute=True, + ) + sequence = fields.Integer(string='Sequence') + state = fields.Selection([ + ('done', 'Done'), + ('blocked', 'Blocked'), + ], string='State', copy=False) + + @api.depends('state') + def _compute_user_id(self): + for line in self.filtered(lambda l: l.state == 'done' and not l.user_id): + line.user_id = self.env.user diff --git a/project_task_line/security/ir.model.access.csv b/project_task_line/security/ir.model.access.csv new file mode 100644 index 00000000..a4846d4f --- /dev/null +++ b/project_task_line/security/ir.model.access.csv @@ -0,0 +1,3 @@ +"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" +"access_project_task_line","access_project_task_line","model_project_task_line","base.group_user",1,1,1,1 +"access_project_task_line_public","access_project_task_line public","model_project_task_line","base.group_public",1,0,0,0 \ No newline at end of file diff --git a/project_task_line/views/project_views.xml b/project_task_line/views/project_views.xml new file mode 100644 index 00000000..8df89a1f --- /dev/null +++ b/project_task_line/views/project_views.xml @@ -0,0 +1,25 @@ + + + + project.task.form.inherit + project.task + + + + {'default_name': name + ':', 'default_user_ids': user_ids, 'default_project_id': project_id, 'default_milestone_id': milestone_id, 'subtask_action': True} + + + + + + + + + + + + + + + +