[IMP] website_event_track: clean website.visitors wishlisted tracks

This commit is the community counterpart of the enterprise commit that
consolidates push tokens on website.visitors.

We now don't need to keep wishlisted tracks on children records of a
website.visitor and we can keep the whole wishlisted tracks list consolidated
on the parent only.

This allows some code cleaning and some simplification as well as a few
performance improvements.

Task-2429652

Part-of: odoo/odoo#65113
This commit is contained in:
Aurélien Warnon
2022-02-17 17:37:41 +00:00
parent a0d33b1c29
commit 8ba14334b2
@@ -22,27 +22,21 @@ class WebsiteVisitor(models.Model):
compute="_compute_event_track_wishlisted_ids", compute_sudo=True,
groups='event.group_event_user')
@api.depends('parent_id', 'event_track_visitor_ids.track_id', 'event_track_visitor_ids.is_wishlisted')
@api.depends('event_track_visitor_ids.track_id', 'event_track_visitor_ids.is_wishlisted')
def _compute_event_track_wishlisted_ids(self):
# include parent's track visitors in a visitor o2m field. We don't add
# child one as child should not have track visitors (moved to the parent)
all_visitors = self + self.parent_id
results = self.env['event.track.visitor'].read_group(
[('visitor_id', 'in', all_visitors.ids), ('is_wishlisted', '=', True)],
[('visitor_id', 'in', self.ids), ('is_wishlisted', '=', True)],
['visitor_id', 'track_id:array_agg'],
['visitor_id']
)
track_ids_map = {result['visitor_id'][0]: result['track_id'] for result in results}
for visitor in self:
visitor_track_ids = track_ids_map.get(visitor.id, [])
parent_track_ids = track_ids_map.get(visitor.parent_id.id, [])
visitor.event_track_wishlisted_ids = visitor_track_ids + [track_id for track_id in parent_track_ids if track_id not in visitor_track_ids]
visitor.event_track_wishlisted_ids = track_ids_map.get(visitor.id, [])
visitor.event_track_wishlisted_count = len(visitor.event_track_wishlisted_ids)
def _search_event_track_wishlisted_ids(self, operator, operand):
""" Search visitors with terms on wishlisted tracks. E.g. [('event_track_wishlisted_ids',
'in', [1, 2])] should return visitors having wishlisted tracks 1, 2 as
well as their children for notification purpose. """
'in', [1, 2])] should return visitors having wishlisted tracks 1, 2. """
if operator == "not in":
raise NotImplementedError("Unsupported 'Not In' operation on track wishlist visitors")
@@ -50,17 +44,8 @@ class WebsiteVisitor(models.Model):
('track_id', operator, operand),
('is_wishlisted', '=', True)
])
if track_visitors:
visitors = track_visitors.visitor_id
# search children, even archived one, to contact them
children = self.env['website.visitor'].with_context(
active_test=False
).sudo().search([('parent_id', 'in', visitors.ids)])
visitor_ids = (visitors + children).ids
else:
visitor_ids = []
return [('id', 'in', visitor_ids)]
return [('id', 'in', track_visitors.visitor_id.ids)]
def _inactive_visitors_domain(self):
""" Visitors registered to push subscriptions are considered always active and should not be