From ba7afeb5bcfaa4b1fdaba1ef7d7e16441f24ccb6 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 31 Oct 2019 10:01:24 +0000 Subject: [PATCH] [REM] sale_timesheet: dynamic domains closes odoo/odoo#40947 Signed-off-by: Xavier Morel (xmo) --- addons/sale_timesheet/models/project.py | 11 +++-------- .../views/project_task_views.xml | 1 + .../wizard/project_create_invoice.py | 18 +++++++++++------- .../wizard/project_create_invoice_views.xml | 1 + 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/addons/sale_timesheet/models/project.py b/addons/sale_timesheet/models/project.py index 7d29162024b..f2dbb291619 100644 --- a/addons/sale_timesheet/models/project.py +++ b/addons/sale_timesheet/models/project.py @@ -121,11 +121,12 @@ class Project(models.Model): class ProjectTask(models.Model): _inherit = "project.task" - sale_line_id = fields.Many2one('sale.order.line', 'Sales Order Item', domain="[('is_service', '=', True), ('order_partner_id', 'child_of', commercial_partner_id), ('is_expense', '=', False), ('state', 'in', ['sale', 'done'])]", + sale_line_id = fields.Many2one('sale.order.line', 'Sales Order Item', domain="[('is_service', '=', True), ('order_partner_id', 'child_of', commercial_partner_id), ('is_expense', '=', False), ('state', 'in', ['sale', 'done']), ('order_id', '=?', project_sale_order_id)]", compute='_compute_sale_line', store=True, readonly=False, help="Sales order item to which the task is linked. If an employee timesheets on a this task, " "and if this employee is not in the 'Employee/Sales Order Item Mapping' of the project, the " "timesheet entry will be linked to this sales order item.", copy=False) + project_sale_order_id = fields.Many2one('sale.order', string="project's sale order", related='project_id.sale_order_id') sale_order_id = fields.Many2one('sale.order', 'Sales Order', compute='_compute_sale_order_id', store=True, readonly=False, help="Sales order to which the task is linked.") billable_type = fields.Selection([ ('task_rate', 'At Task Rate'), @@ -161,7 +162,7 @@ class ProjectTask(models.Model): @api.onchange('project_id') def _onchange_project(self): - result = super(ProjectTask, self)._onchange_project() + super(ProjectTask, self)._onchange_project() if self.project_id: if self.project_id.billable_type == 'employee_rate': if not self.partner_id: @@ -172,12 +173,6 @@ class ProjectTask(models.Model): if not self.partner_id: self.partner_id = self.sale_line_id.order_partner_id # set domain on SO: on non billable project, all SOL of customer, otherwise the one from the SO - result = result or {} - domain = [('is_service', '=', True), ('is_expense', '=', False), ('order_partner_id', 'child_of', self.partner_id.commercial_partner_id.id), ('state', 'in', ['sale', 'done'])] - if self.project_id.sale_order_id: - domain += [('order_id', '=', self.project_id.sale_order_id.id)] - result.setdefault('domain', {})['sale_line_id'] = domain - return result @api.depends('project_id.sale_line_id.order_partner_id') def _compute_partner_id(self): diff --git a/addons/sale_timesheet/views/project_task_views.xml b/addons/sale_timesheet/views/project_task_views.xml index e1ba57d9baf..445095f118b 100644 --- a/addons/sale_timesheet/views/project_task_views.xml +++ b/addons/sale_timesheet/views/project_task_views.xml @@ -73,6 +73,7 @@ + diff --git a/addons/sale_timesheet/wizard/project_create_invoice.py b/addons/sale_timesheet/wizard/project_create_invoice.py index c159d788df8..54b964a54f0 100644 --- a/addons/sale_timesheet/wizard/project_create_invoice.py +++ b/addons/sale_timesheet/wizard/project_create_invoice.py @@ -23,16 +23,20 @@ class ProjectCreateInvoice(models.TransientModel): return result project_id = fields.Many2one('project.project', "Project", help="Project to make billable", required=True) - sale_order_id = fields.Many2one('sale.order', string="Choose the Sales Order to invoice", required=True) + _candidate_orders = fields.Many2many('sale.order', compute='_compute_candidate_orders') + sale_order_id = fields.Many2one( + 'sale.order', string="Choose the Sales Order to invoice", required=True, + domain="[('id', 'in', _candidate_orders)]" + ) amount_to_invoice = fields.Monetary("Amount to invoice", compute='_compute_amount_to_invoice', currency_field='currency_id', help="Total amount to invoice on the sales order, including all items (services, storables, expenses, ...)") currency_id = fields.Many2one(related='sale_order_id.currency_id', readonly=True) - @api.onchange('project_id') - def _onchange_project_id(self): - sale_orders = self.project_id.tasks.mapped('sale_line_id.order_id').filtered(lambda so: so.invoice_status == 'to invoice') - return { - 'domain': {'sale_order_id': [('id', 'in', sale_orders.ids)]}, - } + @api.depends('project_id.tasks.sale_line_id.order_id.invoice_status') + def _compute_candidate_orders(self): + for p in self: + p._candidate_orders = p.project_id\ + .mapped('tasks.sale_line_id.order_id')\ + .filtered(lambda so: so.invoice_status == 'to invoice') @api.depends('sale_order_id') def _compute_amount_to_invoice(self): diff --git a/addons/sale_timesheet/wizard/project_create_invoice_views.xml b/addons/sale_timesheet/wizard/project_create_invoice_views.xml index 9d6f2f1b96f..191cab2c0c4 100644 --- a/addons/sale_timesheet/wizard/project_create_invoice_views.xml +++ b/addons/sale_timesheet/wizard/project_create_invoice_views.xml @@ -8,6 +8,7 @@
+