summaryrefslogtreecommitdiff
path: root/addons/website_event_track/models/website_visitor.py
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/website_event_track/models/website_visitor.py
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/website_event_track/models/website_visitor.py')
-rw-r--r--addons/website_event_track/models/website_visitor.py75
1 files changed, 75 insertions, 0 deletions
diff --git a/addons/website_event_track/models/website_visitor.py b/addons/website_event_track/models/website_visitor.py
new file mode 100644
index 00000000..18072c86
--- /dev/null
+++ b/addons/website_event_track/models/website_visitor.py
@@ -0,0 +1,75 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo import api, fields, models
+
+
+class WebsiteVisitor(models.Model):
+ _name = 'website.visitor'
+ _inherit = ['website.visitor']
+
+ event_track_visitor_ids = fields.One2many(
+ 'event.track.visitor', 'visitor_id', string="Track Visitors",
+ groups='event.group_event_user')
+ event_track_wishlisted_ids = fields.Many2many(
+ 'event.track', string="Wishlisted Tracks",
+ compute="_compute_event_track_wishlisted_ids", compute_sudo=True,
+ search="_search_event_track_wishlisted_ids",
+ groups="event.group_event_user")
+ event_track_wishlisted_count = fields.Integer(
+ string="# Wishlisted",
+ 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')
+ 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', '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_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. """
+ if operator == "not in":
+ raise NotImplementedError("Unsupported 'Not In' operation on track wishlist visitors")
+
+ track_visitors = self.env['event.track.visitor'].sudo().search([
+ ('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)]
+
+ def _link_to_partner(self, partner, update_values=None):
+ """ Propagate partner update to track_visitor records """
+ if partner:
+ track_visitor_wo_partner = self.event_track_visitor_ids.filtered(lambda track_visitor: not track_visitor.partner_id)
+ if track_visitor_wo_partner:
+ track_visitor_wo_partner.partner_id = partner
+ super(WebsiteVisitor, self)._link_to_partner(partner, update_values=update_values)
+
+ def _link_to_visitor(self, target, keep_unique=True):
+ """ Override linking process to link wishlist to the final visitor. """
+ self.event_track_visitor_ids.visitor_id = target.id
+ return super(WebsiteVisitor, self)._link_to_visitor(target, keep_unique=keep_unique)