From 5eae8f7110b9663084b2e83dae201b6eada48fd5 Mon Sep 17 00:00:00 2001 From: RomainLibert Date: Fri, 14 Sep 2018 14:59:32 +0200 Subject: [PATCH] [FIX] crm,sale_crm: split action_mark_won Since https://github.com/odoo/odoo/commit/4330ea02676a4afd88707bb463a007e7de3c8686, action_mark_won was not api.multi anymore, which made it impossible to mark leads as won in batch. The problem is that we do exactly this in the demo data. As we need to keep the rainbowman in the interface the decision has been taken to split the method in two parts, one for the interface which returns the rainbowman (and uses ensure_one) and the second which is a true api.multi method. Thanks to @tde-banana-odoo for his advice on the matter --- addons/crm/models/crm_lead.py | 94 +++++++++++++----------- addons/crm/views/crm_lead_views.xml | 2 +- addons/sale_crm/views/crm_lead_views.xml | 2 +- 3 files changed, 53 insertions(+), 45 deletions(-) diff --git a/addons/crm/models/crm_lead.py b/addons/crm/models/crm_lead.py index 2ec7aa5f0bf..0e24634a568 100644 --- a/addons/crm/models/crm_lead.py +++ b/addons/crm/models/crm_lead.py @@ -363,52 +363,60 @@ class Lead(models.Model): for lead in self: stage_id = lead._stage_find(domain=[('probability', '=', 100.0), ('on_change', '=', True)]) lead.write({'stage_id': stage_id.id, 'probability': 100}) - if lead.user_id and lead.team_id and lead.planned_revenue: - query = """ - SELECT - SUM(CASE WHEN user_id = %(user_id)s THEN 1 ELSE 0 END) as total_won, - MAX(CASE WHEN date_closed >= CURRENT_DATE - INTERVAL '30 days' AND user_id = %(user_id)s THEN planned_revenue ELSE 0 END) as max_user_30, - MAX(CASE WHEN date_closed >= CURRENT_DATE - INTERVAL '7 days' AND user_id = %(user_id)s THEN planned_revenue ELSE 0 END) as max_user_7, - MAX(CASE WHEN date_closed >= CURRENT_DATE - INTERVAL '30 days' AND team_id = %(team_id)s THEN planned_revenue ELSE 0 END) as max_team_30, - MAX(CASE WHEN date_closed >= CURRENT_DATE - INTERVAL '7 days' AND team_id = %(team_id)s THEN planned_revenue ELSE 0 END) as max_team_7 - FROM crm_lead - WHERE - type = 'opportunity' - AND - active = True - AND - probability = 100 - AND - DATE_TRUNC('year', date_closed) = DATE_TRUNC('year', CURRENT_DATE) - AND - (user_id = %(user_id)s OR team_id = %(team_id)s) - """ - lead.env.cr.execute(query, {'user_id': lead.user_id.id, - 'team_id': lead.team_id.id}) - query_result = self.env.cr.dictfetchone() - message = False - if query_result['total_won'] == 1: - message = _('Go, go, go! Congrats for your first deal.') - elif query_result['max_team_30'] == lead.planned_revenue: - message = _('Boom! Team record for the past 30 days.') - elif query_result['max_team_7'] == lead.planned_revenue: - message = _('Yeah! Deal of the last 7 days for the team.') - elif query_result['max_user_30'] == lead.planned_revenue: - message = _('You just beat your personal record for the past 30 days.') - elif query_result['max_user_7'] == lead.planned_revenue: - message = _('You just beat your personal record for the past 7 days.') + return True - if message: - return { - 'effect': { - 'fadeout': 'slow', - 'message': message, - 'img_url': '/web/image/%s/%s/image' % (lead.team_id.user_id._name, lead.team_id.user_id.id) if lead.team_id.user_id.image else '/web/static/src/img/smile.svg', - 'type': 'rainbow_man', - } + @api.multi + def action_set_won_rainbowman(self): + self.ensure_one() + self.action_set_won() + + if self.user_id and self.team_id and self.planned_revenue: + query = """ + SELECT + SUM(CASE WHEN user_id = %(user_id)s THEN 1 ELSE 0 END) as total_won, + MAX(CASE WHEN date_closed >= CURRENT_DATE - INTERVAL '30 days' AND user_id = %(user_id)s THEN planned_revenue ELSE 0 END) as max_user_30, + MAX(CASE WHEN date_closed >= CURRENT_DATE - INTERVAL '7 days' AND user_id = %(user_id)s THEN planned_revenue ELSE 0 END) as max_user_7, + MAX(CASE WHEN date_closed >= CURRENT_DATE - INTERVAL '30 days' AND team_id = %(team_id)s THEN planned_revenue ELSE 0 END) as max_team_30, + MAX(CASE WHEN date_closed >= CURRENT_DATE - INTERVAL '7 days' AND team_id = %(team_id)s THEN planned_revenue ELSE 0 END) as max_team_7 + FROM crm_lead + WHERE + type = 'opportunity' + AND + active = True + AND + probability = 100 + AND + DATE_TRUNC('year', date_closed) = DATE_TRUNC('year', CURRENT_DATE) + AND + (user_id = %(user_id)s OR team_id = %(team_id)s) + """ + self.env.cr.execute(query, {'user_id': self.user_id.id, + 'team_id': self.team_id.id}) + query_result = self.env.cr.dictfetchone() + + message = False + if query_result['total_won'] == 1: + message = _('Go, go, go! Congrats for your first deal.') + elif query_result['max_team_30'] == self.planned_revenue: + message = _('Boom! Team record for the past 30 days.') + elif query_result['max_team_7'] == self.planned_revenue: + message = _('Yeah! Deal of the last 7 days for the team.') + elif query_result['max_user_30'] == self.planned_revenue: + message = _('You just beat your personal record for the past 30 days.') + elif query_result['max_user_7'] == self.planned_revenue: + message = _('You just beat your personal record for the past 7 days.') + + if message: + return { + 'effect': { + 'fadeout': 'slow', + 'message': message, + 'img_url': '/web/image/%s/%s/image' % (self.team_id.user_id._name, self.team_id.user_id.id) if self.team_id.user_id.image else '/web/static/src/img/smile.svg', + 'type': 'rainbow_man', } - return True + } + return True @api.multi def action_schedule_meeting(self): diff --git a/addons/crm/views/crm_lead_views.xml b/addons/crm/views/crm_lead_views.xml index c3384a4bc96..0a5dfc1e9c5 100644 --- a/addons/crm/views/crm_lead_views.xml +++ b/addons/crm/views/crm_lead_views.xml @@ -430,7 +430,7 @@
-