From 01f93f7a4be95fce924755afa228583f442fe28e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 31 Jul 2020 19:36:01 +0000 Subject: [PATCH] [FIX] website_event(_track): allow event managers to unlink menus Followup of 69d2513de21c2e80de605f77912a3687b8a79c6d : fix computation of menu fields values to be more inlined with base menu option (website_menu) + True by default when activating menus. Also force update when writing directly on a menu field to ensure coherency of website.event.menu. PR #55325 closes odoo/odoo#55340 X-original-commit: 19d028aa885d5623ae98b26ad135a1b29c89d5ee Signed-off-by: Thibault Delavallee (tde) --- addons/website_event/models/event_event.py | 18 +++++++++++++----- addons/website_event_track/data/event_demo.xml | 10 ++++------ .../website_event_track/models/event_event.py | 8 ++++---- .../static/src/xml/customize_options.xml | 2 +- 4 files changed, 22 insertions(+), 16 deletions(-) diff --git a/addons/website_event/models/event_event.py b/addons/website_event/models/event_event.py index b2a89b3787a..01d76489777 100644 --- a/addons/website_event/models/event_event.py +++ b/addons/website_event/models/event_event.py @@ -75,7 +75,7 @@ class Event(models.Model): def write(self, vals): menus_state_by_field = self._split_menus_state_by_field() res = super(Event, self).write(vals) - menus_update_by_field = self._get_menus_update_by_field(menus_state_by_field) + menus_update_by_field = self._get_menus_update_by_field(menus_state_by_field, force_update=vals.keys()) self._update_website_menus(menus_update_by_field=menus_update_by_field) return res @@ -113,20 +113,28 @@ class Event(models.Model): } return menus_state_by_field - def _get_menus_update_by_field(self, menus_state_by_field): + def _get_menus_update_by_field(self, menus_state_by_field, force_update=None): """ For each field linked to a menu, get the set of events requiring this menu to be activated or de-activated based on previous recorded value. + :param menus_state_by_field: see ``_split_menus_state_by_field``; + :param force_update: list of field to which we force update of menus. This + is used notably when a direct write to a stored editable field messes with + its pre-computed value, notably in a transient mode (aka demo for example); + :return dict: key = name of field triggering a website menu update, get { 'activated': subset of self having its menu toggled to True 'deactivated': subset of self having its menu toggled to False } """ menus_update_by_field = dict() for fname in self._get_menu_update_fields(): - menus_update_by_field[fname] = self.env['event.event'] - menus_update_by_field[fname] |= menus_state_by_field[fname]['activated'].filtered(lambda event: not event[fname]) - menus_update_by_field[fname] |= menus_state_by_field[fname]['deactivated'].filtered(lambda event: event[fname]) + if fname in force_update: + menus_update_by_field[fname] = self + else: + menus_update_by_field[fname] = self.env['event.event'] + menus_update_by_field[fname] |= menus_state_by_field[fname]['activated'].filtered(lambda event: not event[fname]) + menus_update_by_field[fname] |= menus_state_by_field[fname]['deactivated'].filtered(lambda event: event[fname]) return menus_update_by_field def _get_menu_entries(self): diff --git a/addons/website_event_track/data/event_demo.xml b/addons/website_event_track/data/event_demo.xml index 130f6bf6fb1..e670cb16014 100644 --- a/addons/website_event_track/data/event_demo.xml +++ b/addons/website_event_track/data/event_demo.xml @@ -1,13 +1,11 @@ - True - True - True + + - True - True - True + + diff --git a/addons/website_event_track/models/event_event.py b/addons/website_event_track/models/event_event.py index 9e5cc1b58cf..7759a0e4a5c 100644 --- a/addons/website_event_track/models/event_event.py +++ b/addons/website_event_track/models/event_event.py @@ -62,7 +62,7 @@ class Event(models.Model): 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 != event._origin.website_menu or not event.website_track: + elif event.website_menu != event._origin.website_menu or not event.website_menu or not event.website_track: event.website_track = event.website_menu elif event.website_track_proposal and not event.website_track: event.website_track = True @@ -74,7 +74,7 @@ class Event(models.Model): 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_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') @@ -98,9 +98,9 @@ class Event(models.Model): 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 not menus_update_by_field or event in menus_update_by_field.get('website_track'): + if (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 not menus_update_by_field or event in menus_update_by_field.get('website_track_proposal'): + if (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 _update_website_menu_entry(self, fname_bool, fname_o2m, method_name): diff --git a/addons/website_event_track/static/src/xml/customize_options.xml b/addons/website_event_track/static/src/xml/customize_options.xml index 50f49f6b16c..b7d64bca0db 100644 --- a/addons/website_event_track/static/src/xml/customize_options.xml +++ b/addons/website_event_track/static/src/xml/customize_options.xml @@ -1,7 +1,7 @@ - +