diff --git a/addons/calendar/models/res_partner.py b/addons/calendar/models/res_partner.py index 5c5c1280c3f..42137e79607 100644 --- a/addons/calendar/models/res_partner.py +++ b/addons/calendar/models/res_partner.py @@ -25,18 +25,19 @@ class Partner(models.Model): def _compute_meeting(self): if self.ids: all_partners = self.with_context(active_test=False).search([('id', 'child_of', self.ids)]) + + event_id = self.env['calendar.event']._search([]) # ir.rules will be applied + subquery_string, subquery_params = event_id.select() + subquery = self.env.cr.mogrify(subquery_string, subquery_params).decode() + self.env.cr.execute(""" SELECT res_partner_id, calendar_event_id, count(1) FROM calendar_event_res_partner_rel - WHERE res_partner_id IN %s + WHERE res_partner_id IN %s AND calendar_event_id IN ({}) GROUP BY res_partner_id, calendar_event_id - """, [tuple(all_partners.ids)]) - meeting_data = self.env.cr.fetchall() + """.format(subquery), [tuple(all_partners.ids)]) - # Keep only valid meeting data based on record rules of events - events = [row[1] for row in meeting_data] - events = self.env['calendar.event'].search([('id', 'in', events)]).ids - meeting_data = [m for m in meeting_data if m[1] in events] + meeting_data = self.env.cr.fetchall() # Create a dict {partner_id: event_ids} and fill with events linked to the partner meetings = {p.id: set() for p in all_partners} diff --git a/addons/calendar/tests/__init__.py b/addons/calendar/tests/__init__.py index 409654f26f2..78a1c408fd4 100644 --- a/addons/calendar/tests/__init__.py +++ b/addons/calendar/tests/__init__.py @@ -9,3 +9,4 @@ from . import test_calendar_recurrent_event_case2 from . import test_event_recurrence from . import test_event_notifications from . import test_mail_activity_mixin +from . import test_res_partner diff --git a/addons/calendar/tests/test_res_partner.py b/addons/calendar/tests/test_res_partner.py new file mode 100644 index 00000000000..3e20cb8f0b8 --- /dev/null +++ b/addons/calendar/tests/test_res_partner.py @@ -0,0 +1,73 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo.tests.common import TransactionCase +from odoo.tests.common import new_test_user + + +class TestResPartner(TransactionCase): + + def test_meeting_count(self): + test_user = new_test_user(self.env, login='test_user', groups='base.group_user, base.group_partner_manager') + Partner = self.env['res.partner'].with_user(test_user) + Event = self.env['calendar.event'].with_user(test_user) + + # Partner hierarchy + # 1 5 + # /| + # 2 3 + # | + # 4 + + test_partner_1 = Partner.create({'name': 'test_partner_1'}) + test_partner_2 = Partner.create({'name': 'test_partner_2', 'parent_id': test_partner_1.id}) + test_partner_3 = Partner.create({'name': 'test_partner_3', 'parent_id': test_partner_1.id}) + test_partner_4 = Partner.create({'name': 'test_partner_4', 'parent_id': test_partner_3.id}) + test_partner_5 = Partner.create({'name': 'test_partner_5'}) + + Event.create({'name': 'event_1', + 'partner_ids': [(6, 0, [test_partner_1.id, + test_partner_2.id, + test_partner_3.id, + test_partner_4.id])]}) + Event.create({'name': 'event_2', + 'partner_ids': [(6, 0, [test_partner_1.id, + test_partner_3.id])]}) + Event.create({'name': 'event_2', + 'partner_ids': [(6, 0, [test_partner_2.id, + test_partner_3.id])]}) + Event.create({'name': 'event_3', + 'partner_ids': [(6, 0, [test_partner_3.id, + test_partner_4.id])]}) + Event.create({'name': 'event_4', + 'partner_ids': [(6, 0, [test_partner_1.id])]}) + Event.create({'name': 'event_5', + 'partner_ids': [(6, 0, [test_partner_3.id])]}) + Event.create({'name': 'event_6', + 'partner_ids': [(6, 0, [test_partner_4.id])]}) + Event.create({'name': 'event_7', + 'partner_ids': [(6, 0, [test_partner_5.id])]}) + Event.create({'name': 'event_8', + 'partner_ids': [(6, 0, [test_partner_5.id])]}) + + #Test rule to see if ir.rules are applied + calendar_event_model_id = self.env['ir.model']._get('calendar.event').id + self.env['ir.rule'].create({'name': 'test_rule', + 'model_id': calendar_event_model_id, + 'domain_force': [('name', 'not in', ['event_9', 'event_10'])], + 'perm_read': True, + 'perm_create': False, + 'perm_write': False}) + + Event.create({'name': 'event_9', + 'partner_ids': [(6, 0, [test_partner_2.id, + test_partner_3.id])]}) + + Event.create({'name': 'event_10', + 'partner_ids': [(6, 0, [test_partner_5.id])]}) + + self.assertEqual(test_partner_1.meeting_count, 7) + self.assertEqual(test_partner_2.meeting_count, 2) + self.assertEqual(test_partner_3.meeting_count, 6) + self.assertEqual(test_partner_4.meeting_count, 3) + self.assertEqual(test_partner_5.meeting_count, 2)