diff --git a/addons_extensions/project_employee_view/__init__.py b/addons_extensions/project_employee_view/__init__.py new file mode 100644 index 000000000..7f0969edc --- /dev/null +++ b/addons_extensions/project_employee_view/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/addons_extensions/project_employee_view/__manifest__.py b/addons_extensions/project_employee_view/__manifest__.py new file mode 100644 index 000000000..96e042725 --- /dev/null +++ b/addons_extensions/project_employee_view/__manifest__.py @@ -0,0 +1,13 @@ +{ + 'name': 'Project Employee View', + 'version': '1.0', + 'depends': [ + 'project', + 'hr' + ], + 'data': [ + 'security/ir.model.access.csv', + 'views/project_form_view.xml', + ], + 'installable': True, +} diff --git a/addons_extensions/project_employee_view/models/__init__.py b/addons_extensions/project_employee_view/models/__init__.py new file mode 100644 index 000000000..ae45beed5 --- /dev/null +++ b/addons_extensions/project_employee_view/models/__init__.py @@ -0,0 +1,2 @@ +from . import project +from . import employee_project_work_line diff --git a/addons_extensions/project_employee_view/models/employee_project_work_line.py b/addons_extensions/project_employee_view/models/employee_project_work_line.py new file mode 100644 index 000000000..f00f59dc0 --- /dev/null +++ b/addons_extensions/project_employee_view/models/employee_project_work_line.py @@ -0,0 +1,55 @@ +from odoo import models, fields + + +class EmployeeProjectWorkLine(models.Model): + _name = 'employee.project.work.line' + _description = 'Employee Project Work Line' + _rec_name = 'project_id' + + # Back reference to project form + project_parent_id = fields.Many2one( + 'project.project', + ondelete='cascade' + ) + + # Actual project + project_id = fields.Many2one( + 'project.project', + string='Project', + readonly=True + ) + + # Tasks of selected employee in this project + task_ids = fields.Many2many( + 'project.task', + readonly=True + ) + + task_count = fields.Integer( + string='Task Count', + readonly=True + ) + + def action_view_tasks(self): + self.ensure_one() + return { + 'type': 'ir.actions.act_window', + 'name': 'Tasks', + 'res_model': 'project.task', + 'view_mode': 'list,form', + 'domain': [('id', 'in', self.task_ids.ids)], + 'context': {'create': False}, + } + + def action_view_timeline(self): + self.ensure_one() + return { + 'type': 'ir.actions.act_window', + 'name': 'Timeline', + 'res_model': 'mail.message', + 'view_mode': 'list', + 'domain': [ + ('model', '=', 'project.project'), + ('res_id', '=', self.project_id.id), + ], + } diff --git a/addons_extensions/project_employee_view/models/project.py b/addons_extensions/project_employee_view/models/project.py new file mode 100644 index 000000000..9607a6452 --- /dev/null +++ b/addons_extensions/project_employee_view/models/project.py @@ -0,0 +1,55 @@ +from odoo import models, fields, api + + +class ProjectProject(models.Model): + _inherit = 'project.project' + + # Employee selector + selected_employee_id = fields.Many2one( + 'hr.employee', + string='Employee' + ) + + # Related user (used for task lookup) + selected_user_id = fields.Many2one( + 'res.users', + related='selected_employee_id.user_id', + store=False + ) + + employee_project_work_ids = fields.One2many( + 'employee.project.work.line', + 'project_parent_id', + compute='_compute_employee_project_work', + store=True + ) + + @api.depends('selected_employee_id', 'selected_employee_id.user_id') + @api.onchange('selected_employee_id') + def _compute_employee_project_work(self): + for project in self: + project.employee_project_work_ids = [(5, 0, 0)] + + if not project.selected_employee_id or not project.selected_employee_id.user_id: + continue + + user = project.selected_employee_id.user_id + + tasks = self.env['project.task'].search([ + ('user_ids', 'in', user.id), + ('project_id.active', '=', True), + ]) + + projects = tasks.mapped('project_id') + + lines = [] + for proj in projects: + proj_tasks = tasks.filtered(lambda t: t.project_id == proj) + + lines.append((0, 0, { + 'project_id': proj.id, + 'task_ids': [(6, 0, proj_tasks.ids)], + 'task_count': len(proj_tasks), + })) + + project.employee_project_work_ids = lines diff --git a/addons_extensions/project_employee_view/security/ir.model.access.csv b/addons_extensions/project_employee_view/security/ir.model.access.csv new file mode 100644 index 000000000..005078285 --- /dev/null +++ b/addons_extensions/project_employee_view/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_employee_project_work_line_user,employee.project.work.line user,model_employee_project_work_line,base.group_user,1,0,0,0 diff --git a/addons_extensions/project_employee_view/views/project_form_view.xml b/addons_extensions/project_employee_view/views/project_form_view.xml new file mode 100644 index 000000000..42ecfedf0 --- /dev/null +++ b/addons_extensions/project_employee_view/views/project_form_view.xml @@ -0,0 +1,43 @@ + + + project.form.employee.work.overview + project.project + + + + + + + + + + + + + + + + + + + +