Project Employee view

This commit is contained in:
pranaysaidurga 2026-04-27 12:37:57 +05:30
parent 73a27d8921
commit fa3833bac3
7 changed files with 171 additions and 0 deletions

View File

@ -0,0 +1 @@
from . import models

View File

@ -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,
}

View File

@ -0,0 +1,2 @@
from . import project
from . import employee_project_work_line

View File

@ -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),
],
}

View File

@ -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

View File

@ -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
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_employee_project_work_line_user employee.project.work.line user model_employee_project_work_line base.group_user 1 0 0 0

View File

@ -0,0 +1,43 @@
<odoo>
<record id="project_form_employee_work_overview" model="ir.ui.view">
<field name="name">project.form.employee.work.overview</field>
<field name="model">project.project</field>
<field name="inherit_id" ref="project.edit_project"/>
<field name="arch" type="xml">
<xpath expr="//notebook" position="inside">
<page string="Employee Work">
<!-- Employee selector -->
<group>
<field name="selected_employee_id"/>
</group>
<!-- Unified Employee Work Overview -->
<group string="Employee Work Overview">
<field name="employee_project_work_ids"
readonly="1"
invisible="not selected_employee_id">
<list>
<field name="project_id"/>
<field name="task_count"/>
<button name="action_view_tasks"
string="Tasks"
type="object"/>
<button name="action_view_timeline"
string="Timeline"
type="object"/>
</list>
</field>
</group>
</page>
</xpath>
</field>
</record>
</odoo>