60 lines
2.9 KiB
Python
60 lines
2.9 KiB
Python
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import api, fields, models
|
|
|
|
|
|
class ProjectProject(models.Model):
|
|
_inherit = "project.project"
|
|
|
|
allow_worksheets = fields.Boolean(
|
|
"Worksheets", compute="_compute_allow_worksheets", store=True, readonly=False)
|
|
worksheet_template_id = fields.Many2one(
|
|
'worksheet.template', compute="_compute_worksheet_template_id", store=True, readonly=False,
|
|
string="Worksheet Template",
|
|
domain="[('res_model', '=', 'project.task'), '|', ('company_id', '=', False), ('company_id', '=', company_id)]")
|
|
|
|
@api.depends('is_fsm')
|
|
def _compute_allow_worksheets(self):
|
|
for project in self:
|
|
project.allow_worksheets = project.is_fsm
|
|
|
|
@api.depends('allow_worksheets', 'company_id')
|
|
def _compute_worksheet_template_id(self):
|
|
default_worksheet = self.env.ref('industry_fsm_report.fsm_worksheet_template', False)
|
|
project_ids = []
|
|
for project in self:
|
|
if not project.worksheet_template_id:
|
|
if project.allow_worksheets:
|
|
if default_worksheet and (not project.company_id or not default_worksheet.company_id or project.company_id in default_worksheet.company_id):
|
|
project.worksheet_template_id = default_worksheet
|
|
else:
|
|
project_ids.append(project.id)
|
|
else:
|
|
project.worksheet_template_id = False
|
|
elif (project.allow_worksheets and project.company_id != project.worksheet_template_id.company_id):
|
|
project_ids.append(project.id)
|
|
if project_ids:
|
|
projects = self.browse(project_ids)
|
|
WorksheetTemplate = self.env['worksheet.template']
|
|
|
|
if len(projects.company_id) == 1:
|
|
projects.worksheet_template_id = WorksheetTemplate.search(
|
|
[('company_id', 'in', [projects.company_id.id, False]), ('res_model', '=', 'project.task')],
|
|
limit=1,
|
|
order="company_id, sequence, id DESC",
|
|
)
|
|
else:
|
|
company_worksheets = WorksheetTemplate._read_group(
|
|
[('company_id', 'in', [*projects.company_id.ids, False]), ('res_model', '=', 'project.task')],
|
|
['company_id'],
|
|
['id:recordset'],
|
|
)
|
|
worksheet_mapping = {company.id: templates.sorted(key=lambda t: (t.sequence, -t.id))[:1] for company, templates in company_worksheets}
|
|
|
|
# Assign the appropriate worksheet template to each project
|
|
for project in projects:
|
|
project.worksheet_template_id = worksheet_mapping.get(
|
|
project.company_id.id,
|
|
worksheet_mapping.get(False, False) # Fallback to a template without a company
|
|
)
|