Project Employee view
This commit is contained in:
parent
73a27d8921
commit
fa3833bac3
|
|
@ -0,0 +1 @@
|
||||||
|
from . import models
|
||||||
|
|
@ -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,
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
from . import project
|
||||||
|
from . import employee_project_work_line
|
||||||
|
|
@ -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),
|
||||||
|
],
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
|
@ -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>
|
||||||
Loading…
Reference in New Issue