website_visitor.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. # -*- coding: utf-8 -*-
  2. # Part of Odoo. See LICENSE file for full copyright and licensing details.
  3. from odoo import api, fields, models
  4. from odoo.osv import expression
  5. class WebsiteVisitor(models.Model):
  6. _name = 'website.visitor'
  7. _inherit = ['website.visitor']
  8. event_track_visitor_ids = fields.One2many(
  9. 'event.track.visitor', 'visitor_id', string="Track Visitors",
  10. groups='event.group_event_user')
  11. event_track_wishlisted_ids = fields.Many2many(
  12. 'event.track', string="Wishlisted Tracks",
  13. compute="_compute_event_track_wishlisted_ids", compute_sudo=True,
  14. search="_search_event_track_wishlisted_ids",
  15. groups="event.group_event_user")
  16. event_track_wishlisted_count = fields.Integer(
  17. string="# Wishlisted",
  18. compute="_compute_event_track_wishlisted_ids", compute_sudo=True,
  19. groups='event.group_event_user')
  20. @api.depends('event_track_visitor_ids.track_id', 'event_track_visitor_ids.is_wishlisted')
  21. def _compute_event_track_wishlisted_ids(self):
  22. results = self.env['event.track.visitor']._read_group(
  23. [('visitor_id', 'in', self.ids), ('is_wishlisted', '=', True)],
  24. ['visitor_id', 'track_id:array_agg'],
  25. ['visitor_id']
  26. )
  27. track_ids_map = {result['visitor_id'][0]: result['track_id'] for result in results}
  28. for visitor in self:
  29. visitor.event_track_wishlisted_ids = track_ids_map.get(visitor.id, [])
  30. visitor.event_track_wishlisted_count = len(visitor.event_track_wishlisted_ids)
  31. def _search_event_track_wishlisted_ids(self, operator, operand):
  32. """ Search visitors with terms on wishlisted tracks. E.g. [('event_track_wishlisted_ids',
  33. 'in', [1, 2])] should return visitors having wishlisted tracks 1, 2. """
  34. if operator == "not in":
  35. raise NotImplementedError("Unsupported 'Not In' operation on track wishlist visitors")
  36. track_visitors = self.env['event.track.visitor'].sudo().search([
  37. ('track_id', operator, operand),
  38. ('is_wishlisted', '=', True)
  39. ])
  40. return [('id', 'in', track_visitors.visitor_id.ids)]
  41. def _inactive_visitors_domain(self):
  42. """ Visitors registered to push subscriptions are considered always active and should not be
  43. deleted. """
  44. domain = super()._inactive_visitors_domain()
  45. return expression.AND([domain, [('event_track_visitor_ids', '=', False)]])
  46. def _merge_visitor(self, target):
  47. """ Override linking process to link wishlist to the final visitor. """
  48. self.event_track_visitor_ids.visitor_id = target.id
  49. track_visitor_wo_partner = self.event_track_visitor_ids.filtered(lambda track_visitor: not track_visitor.partner_id)
  50. if track_visitor_wo_partner:
  51. track_visitor_wo_partner.partner_id = target.partner_id
  52. return super()._merge_visitor(target)