From c555cdca62783ce7d8348cba868b6850543ef86b Mon Sep 17 00:00:00 2001 From: Goffin Simon Date: Thu, 29 Oct 2020 16:29:49 +0000 Subject: [PATCH] [FIX] point_of_sale, project: Smart buttons to count on partner Unify the behavior for smart buttons on res.partner view form Let's consider generic records R on a specific model M - All the R of the children and archived children of a contact C must be counted in smart button of M in the form of C - Clicking on the smart button of a contact C must display all R of the children and archived children of C closes odoo/odoo#61241 Signed-off-by: Simon Goffin (sig) --- addons/point_of_sale/models/res_partner.py | 31 ++++++++++++++++--- .../point_of_sale/views/res_partner_view.xml | 4 +-- addons/project/models/res_partner.py | 20 +++++++++--- 3 files changed, 45 insertions(+), 10 deletions(-) diff --git a/addons/point_of_sale/models/res_partner.py b/addons/point_of_sale/models/res_partner.py index a0246c6fadb..e2a8de5f9e4 100644 --- a/addons/point_of_sale/models/res_partner.py +++ b/addons/point_of_sale/models/res_partner.py @@ -15,10 +15,33 @@ class ResPartner(models.Model): pos_order_ids = fields.One2many('pos.order', 'partner_id', readonly=True) def _compute_pos_order(self): - partners_data = self.env['pos.order'].read_group([('partner_id', 'in', self.ids)], ['partner_id'], ['partner_id']) - mapped_data = dict([(partner['partner_id'][0], partner['partner_id_count']) for partner in partners_data]) - for partner in self: - partner.pos_order_count = mapped_data.get(partner.id, 0) + # retrieve all children partners and prefetch 'parent_id' on them + all_partners = self.with_context(active_test=False).search([('id', 'child_of', self.ids)]) + all_partners.read(['parent_id']) + + pos_order_data = self.env['pos.order'].read_group( + domain=[('partner_id', 'in', all_partners.ids)], + fields=['partner_id'], groupby=['partner_id'] + ) + + self.pos_order_count = 0 + for group in pos_order_data: + partner = self.browse(group['partner_id'][0]) + while partner: + if partner in self: + partner.pos_order_count += group['partner_id_count'] + partner = partner.parent_id + + def action_view_pos_order(self): + ''' + This function returns an action that displays the pos orders from partner. + ''' + action = self.env.ref('point_of_sale.action_pos_pos_form').read()[0] + if self.is_company: + action['domain'] = [('partner_id.commercial_partner_id.id', '=', self.id)] + else: + action['domain'] = [('partner_id.id', '=', self.id)] + return action @api.model def create_from_ui(self, partner): diff --git a/addons/point_of_sale/views/res_partner_view.xml b/addons/point_of_sale/views/res_partner_view.xml index 2a35f808651..ef2ebe9645f 100644 --- a/addons/point_of_sale/views/res_partner_view.xml +++ b/addons/point_of_sale/views/res_partner_view.xml @@ -8,8 +8,8 @@
-