# -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. from odoo import api, fields, models, _ from odoo.addons.http_routing.models.ir_http import slug class Event(models.Model): _inherit = "event.event" track_ids = fields.One2many('event.track', 'event_id', 'Tracks') track_count = fields.Integer('Track Count', compute='_compute_track_count') sponsor_ids = fields.One2many('event.sponsor', 'event_id', 'Sponsors') sponsor_count = fields.Integer('Sponsor Count', compute='_compute_sponsor_count') website_track = fields.Boolean( 'Tracks on Website', compute='_compute_website_track', readonly=False, store=True) website_track_proposal = fields.Boolean( 'Proposals on Website', compute='_compute_website_track_proposal', readonly=False, store=True) track_menu_ids = fields.One2many('website.event.menu', 'event_id', string='Event Tracks Menus', domain=[('menu_type', '=', 'track')]) track_proposal_menu_ids = fields.One2many('website.event.menu', 'event_id', string='Event Proposals Menus', domain=[('menu_type', '=', 'track_proposal')]) allowed_track_tag_ids = fields.Many2many('event.track.tag', relation='event_allowed_track_tags_rel', string='Available Track Tags') tracks_tag_ids = fields.Many2many( 'event.track.tag', relation='event_track_tags_rel', string='Track Tags', compute='_compute_tracks_tag_ids', store=True) def _compute_track_count(self): data = self.env['event.track'].read_group([('stage_id.is_cancel', '!=', True)], ['event_id'], ['event_id']) result = dict((data['event_id'][0], data['event_id_count']) for data in data) for event in self: event.track_count = result.get(event.id, 0) def _compute_sponsor_count(self): data = self.env['event.sponsor'].read_group([], ['event_id'], ['event_id']) result = dict((data['event_id'][0], data['event_id_count']) for data in data) for event in self: event.sponsor_count = result.get(event.id, 0) @api.depends('event_type_id', 'website_menu') def _compute_website_track(self): """ Propagate event_type configuration (only at change); otherwise propagate website_menu updated value. Also force True is track_proposal changes. """ for event in self: if event.event_type_id and event.event_type_id != event._origin.event_type_id: event.website_track = event.event_type_id.website_track elif event.website_menu and (event.website_menu != event._origin.website_menu or not event.website_track): event.website_track = True elif not event.website_menu: event.website_track = False @api.depends('event_type_id', 'website_track') def _compute_website_track_proposal(self): """ Propagate event_type configuration (only at change); otherwise propagate website_track updated value (both together True or False at update). """ for event in self: if event.event_type_id and event.event_type_id != event._origin.event_type_id: event.website_track_proposal = event.event_type_id.website_track_proposal elif event.website_track != event._origin.website_track or not event.website_track or not event.website_track_proposal: event.website_track_proposal = event.website_track @api.depends('track_ids.tag_ids', 'track_ids.tag_ids.color') def _compute_tracks_tag_ids(self): for event in self: event.tracks_tag_ids = event.track_ids.mapped('tag_ids').filtered(lambda tag: tag.color != 0).ids # ------------------------------------------------------------ # WEBSITE MENU MANAGEMENT # ------------------------------------------------------------ def toggle_website_track(self, val): self.website_track = val def toggle_website_track_proposal(self, val): self.website_track_proposal = val def _get_menu_update_fields(self): return super(Event, self)._get_menu_update_fields() + ['website_track', 'website_track_proposal'] def _update_website_menus(self, menus_update_by_field=None): super(Event, self)._update_website_menus(menus_update_by_field=menus_update_by_field) for event in self: if event.menu_id and (not menus_update_by_field or event in menus_update_by_field.get('website_track')): event._update_website_menu_entry('website_track', 'track_menu_ids', '_get_track_menu_entries') if event.menu_id and (not menus_update_by_field or event in menus_update_by_field.get('website_track_proposal')): event._update_website_menu_entry('website_track_proposal', 'track_proposal_menu_ids', '_get_track_proposal_menu_entries') def _get_menu_type_field_matching(self): res = super(Event, self)._get_menu_type_field_matching() res['track_proposal'] = 'website_track_proposal' return res def _get_track_menu_entries(self): """ Method returning menu entries to display on the website view of the event, possibly depending on some options in inheriting modules. Each menu entry is a tuple containing : * name: menu item name * url: if set, url to a route (do not use xml_id in that case); * xml_id: template linked to the page (do not use url in that case); * menu_type: key linked to the menu, used to categorize the created website.event.menu; """ self.ensure_one() return [ (_('Talks'), '/event/%s/track' % slug(self), False, 10, 'track'), (_('Agenda'), '/event/%s/agenda' % slug(self), False, 70, 'track') ] def _get_track_proposal_menu_entries(self): """ See website_event_track._get_track_menu_entries() """ self.ensure_one() return [(_('Talk Proposals'), '/event/%s/track_proposal' % slug(self), False, 15, 'track_proposal')]