diff --git a/addons/website_event/models/event_event.py b/addons/website_event/models/event_event.py
index 5a7901ba22b..bfd96da84e6 100644
--- a/addons/website_event/models/event_event.py
+++ b/addons/website_event/models/event_event.py
@@ -70,12 +70,16 @@ class Event(models.Model):
@api.model
def create(self, vals):
res = super(Event, self).create(vals)
- res._update_website_menus(vals)
+ res._update_website_menus()
return res
def write(self, vals):
+ menu_activated = self.filtered(lambda event: event.website_menu)
+ menu_deactivated = self.filtered(lambda event: not event.website_menu)
res = super(Event, self).write(vals)
- self._update_website_menus(vals)
+ menu_to_deactivate = menu_activated.filtered(lambda event: not event.website_menu)
+ menu_to_activate = menu_deactivated.filtered(lambda event: event.website_menu)
+ (menu_to_activate | menu_to_deactivate)._update_website_menus()
return res
def _get_menu_entries(self):
@@ -88,19 +92,19 @@ class Event(models.Model):
(_('Register'), '/event/%s/register' % slug(self), False),
]
- def _update_website_menus(self, vals):
+ def _update_website_menus(self):
for event in self:
- if 'website_menu' in vals:
- if event.menu_id and not event.website_menu:
- event.menu_id.unlink()
- elif event.website_menu and not event.menu_id:
- root_menu = self.env['website.menu'].create({'name': event.name, 'website_id': event.website_id.id})
- event.menu_id = root_menu
- for sequence, (name, url, xml_id) in enumerate(event._get_menu_entries()):
- event._create_menu(sequence, name, url, xml_id)
+ if event.menu_id and not event.website_menu:
+ event.menu_id.unlink()
+ elif event.website_menu and not event.menu_id:
+ root_menu = self.env['website.menu'].create({'name': event.name, 'website_id': event.website_id.id})
+ event.menu_id = root_menu
+ for sequence, (name, url, xml_id) in enumerate(event._get_menu_entries()):
+ event._create_menu(sequence, name, url, xml_id)
def _create_menu(self, sequence, name, url, xml_id):
if not url:
+ self.env['ir.ui.view'].search([('name', '=', name + ' ' + self.name)]).unlink()
newpath = self.env['website'].new_page(name + ' ' + self.name, template=xml_id, ispage=False)['url']
url = "/event/" + slug(self) + "/page/" + newpath[1:]
menu = self.env['website.menu'].create({
diff --git a/addons/website_event/static/src/js/website_event_set_customize_options.js b/addons/website_event/static/src/js/website_event_set_customize_options.js
new file mode 100644
index 00000000000..4b593fcefcc
--- /dev/null
+++ b/addons/website_event/static/src/js/website_event_set_customize_options.js
@@ -0,0 +1,95 @@
+odoo.define('website_event.set_customize_options', function (require) {
+"use strict";
+
+var CustomizeMenu = require('website.customizeMenu');
+var publicWidget = require('web.public.widget');
+
+var EventSpecificOptions = publicWidget.Widget.extend({
+ template: 'website_event.customize_options',
+ xmlDependencies: ['/website_event/static/src/xml/customize_options.xml'],
+ events: {
+ 'change #display-website-menu': '_onDisplaySubmenuChange',
+ },
+
+ /**
+ * @override
+ */
+ start: function () {
+ this.$submenuInput = this.$('#display-website-menu');
+ this.modelName = this._getEventObject().model;
+ this.eventId = this._getEventObject().id;
+ this._initCheckbox();
+ },
+
+ _initCheckbox: function () {
+ this._rpc({
+ model: this.modelName,
+ method: 'read',
+ args: [[this.eventId], ['website_menu', 'website_url']],
+ }).then((data) => {
+ if (data[0]['website_menu']) {
+ this.$submenuInput.attr('checked', 'checked');
+ }
+ this.eventUrl = data[0]['website_url'];
+ });
+ },
+
+ _onDisplaySubmenuChange: function (ev) {
+ var checkboxValue = this.$submenuInput.is(':checked');
+ this._toggleSubmenuDisplay(checkboxValue);
+ },
+
+ _toggleSubmenuDisplay: function (val) {
+ var self = this;
+ this._rpc({
+ model: this.modelName,
+ method: 'toggle_website_menu',
+ args: [[this.eventId], val],
+ }).then(function () {
+ self._reloadEventPage();
+ });
+ },
+
+ _reloadEventPage: function () {
+ window.location = this.eventUrl;
+ },
+
+ _getEventObject: function() {
+ var repr = $('html').data('main-object');
+ var m = repr.match(/(.+)\((\d+),(.*)\)/);
+ return {
+ model: m[1],
+ id: m[2] | 0,
+ };
+ }
+
+});
+
+CustomizeMenu.include({
+ _getEventObject: function() {
+ var repr = $('html').data('main-object');
+ var m = repr.match(/(.+)\((\d+),(.*)\)/);
+ return {
+ model: m[1],
+ id: m[2] | 0,
+ };
+ },
+
+ _loadCustomizeOptions: function () {
+ var self = this;
+ var def = this._super.apply(this, arguments);
+ return def.then(function () {
+ if (!self.__eventOptionsLoaded && self._getEventObject().model === 'event.event') {
+ self.__eventOptionsLoaded = true;
+ self.eventOptions = new EventSpecificOptions(self);
+ self.eventOptions.insertAfter(self.$el.find('.dropdown-divider:first()'));
+ }
+ });
+ },
+});
+
+return {
+ EventSpecificOptions: EventSpecificOptions,
+};
+
+});
diff --git a/addons/website_event/static/src/xml/customize_options.xml b/addons/website_event/static/src/xml/customize_options.xml
new file mode 100644
index 00000000000..539a3ef028f
--- /dev/null
+++ b/addons/website_event/static/src/xml/customize_options.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/website_event/views/assets.xml b/addons/website_event/views/assets.xml
index 28f03d3848b..e19a829e3ff 100644
--- a/addons/website_event/views/assets.xml
+++ b/addons/website_event/views/assets.xml
@@ -15,6 +15,7 @@
+
diff --git a/addons/website_event_track/models/event_event.py b/addons/website_event_track/models/event_event.py
index f8b2ecab2c9..22d835d516a 100644
--- a/addons/website_event_track/models/event_event.py
+++ b/addons/website_event_track/models/event_event.py
@@ -55,7 +55,7 @@ class Event(models.Model):
for event in self:
event.sponsor_count = result.get(event.id, 0)
- @api.depends('event_type_id', 'website_menu')
+ @api.depends('event_type_id', 'website_menu', 'website_track_proposal')
def _compute_website_track(self):
""" Explicitly checks that event_type has changed before copying its value
on the event itself. Changing website_menu trigger should not mess with the
@@ -63,8 +63,10 @@ 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 not event.website_menu or not event.website_track:
+ elif not event.website_menu:
event.website_track = False
+ elif event.website_track_proposal and not event.website_track:
+ event.website_track = True
@api.depends('event_type_id', 'website_track')
def _compute_website_track_proposal(self):
@@ -74,57 +76,46 @@ class Event(models.Model):
elif not event.website_track:
event.website_track_proposal = False
- @api.onchange('website_track_proposal')
- def _onchange_website_track_proposal(self):
- """ Keep an explicit onchange for tick / untick of website_track_proposal.
- Indeed otherwise you have a loop of dependencies between website_track and
- website_track_proposal
-
- * untick website_track: website_track_proposal = False (done in _compute_website_track_proposal)
- * tick website_track: no effect
- * untick website_track_proposal: no effect
- * tick website_track_proposa: website_track = True
-
- It would be complicated to write in computed fields, as they depend on
- each other, on cache and current values, ...
-
- It is therefore simpler to keep an onchange: when ticking website_track_proposal
- set website_track as True in interface.
- """
- for event in self:
- if event.website_track_proposal and not event.website_track:
- event.website_track = True
-
@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
- def _update_website_menus(self, vals):
- super(Event, self)._update_website_menus(vals)
+ def _update_website_menus(self):
+ super(Event, self)._update_website_menus()
for event in self:
- if 'website_track' in vals:
- if vals['website_track'] and not event.track_menu_ids:
- for sequence, (name, url, xml_id, menu_type) in enumerate(event._get_track_menu_entries()):
- menu = super(Event, event)._create_menu(sequence, name, url, xml_id)
- event.env['website.event.menu'].create({
- 'menu_id': menu.id,
- 'event_id': event.id,
- 'menu_type': menu_type,
- })
- elif event.track_menu_ids and not vals['website_track']:
- event.track_menu_ids.mapped('menu_id').unlink()
- if 'website_track_proposal' in vals:
- if vals['website_track_proposal'] and not event.track_proposal_menu_ids:
- for sequence, (name, url, xml_id, menu_type) in enumerate(event._get_track_proposal_menu_entries()):
- menu = super(Event, event)._create_menu(sequence, name, url, xml_id)
- event.env['website.event.menu'].create({
- 'menu_id': menu.id,
- 'event_id': event.id,
- 'menu_type': menu_type,
- })
- elif event.track_proposal_menu_ids and not vals['website_track_proposal']:
- event.track_proposal_menu_ids.mapped('menu_id').unlink()
+ if event.website_track and not event.track_menu_ids:
+ for sequence, (name, url, xml_id, menu_type) in enumerate(event._get_track_menu_entries()):
+ menu = super(Event, event)._create_menu(sequence, name, url, xml_id)
+ event.env['website.event.menu'].create({
+ 'menu_id': menu.id,
+ 'event_id': event.id,
+ 'menu_type': menu_type,
+ })
+ elif not event.website_track:
+ event.track_menu_ids.mapped('menu_id').unlink()
+ if event.website_track_proposal and not event.track_proposal_menu_ids:
+ for sequence, (name, url, xml_id, menu_type) in enumerate(event._get_track_proposal_menu_entries()):
+ menu = super(Event, event)._create_menu(sequence, name, url, xml_id)
+ event.env['website.event.menu'].create({
+ 'menu_id': menu.id,
+ 'event_id': event.id,
+ 'menu_type': menu_type,
+ })
+ elif not event.website_track_proposal:
+ event.track_proposal_menu_ids.mapped('menu_id').unlink()
+
+ def write(self, values):
+ track_activated = self.filtered(lambda event: event.website_track)
+ track_deactivated = self.filtered(lambda event: not event.website_track)
+ track_proposal_activated = self.filtered(lambda event: event.website_track_proposal)
+ track_proposal_deactivated = self.filtered(lambda event: not event.website_track_proposal)
+ super(Event, self).write(values)
+ to_deactivate = track_activated.filtered(lambda event: not event.website_track)
+ to_activate = track_deactivated.filtered(lambda event: event.website_track)
+ track_proposal_to_deactivate = track_proposal_activated.filtered(lambda event: not event.website_track_proposal)
+ track_proposal_to_activate = track_proposal_deactivated.filtered(lambda event: event.website_track_proposal)
+ (to_activate | to_deactivate | track_proposal_to_activate | track_proposal_to_deactivate)._update_website_menus()
def _get_track_menu_entries(self):
self.ensure_one()
@@ -137,3 +128,12 @@ class Event(models.Model):
self.ensure_one()
res = [(_('Talk Proposals'), '/event/%s/track_proposal' % slug(self), False, 'track_proposal')]
return res
+
+ def toggle_website_menu(self, val):
+ self.website_menu = val
+
+ def toggle_website_track(self, val):
+ self.website_track = val
+
+ def toggle_website_track_proposal(self, val):
+ self.website_track_proposal = val
diff --git a/addons/website_event_track/static/src/js/website_event_track_set_customize_options.js b/addons/website_event_track/static/src/js/website_event_track_set_customize_options.js
new file mode 100644
index 00000000000..5f09478211e
--- /dev/null
+++ b/addons/website_event_track/static/src/js/website_event_track_set_customize_options.js
@@ -0,0 +1,79 @@
+odoo.define('website_event_track.set_customize_options', function (require) {
+"use strict";
+
+var EventSpecificOptions = require('website_event.set_customize_options').EventSpecificOptions;
+
+EventSpecificOptions.include({
+ xmlDependencies: (EventSpecificOptions.prototype.xmlDependencies || [])
+ .concat([
+ '/website_event_track/static/src/xml/customize_options.xml',
+ ]),
+
+ events: _.extend({}, EventSpecificOptions.prototype.events, {
+ 'change #display-showcase-talks': '_onDisplayTalksChange',
+ 'change #allow-talk-proposal': '_onAllowTalkProposalChange',
+ }),
+
+ start: function () {
+ this.$displayTalksInput = this.$('#display-showcase-talks');
+ this.$allowTalksInput = this.$('#allow-talk-proposal');
+ this._super.apply(this, arguments);
+ },
+
+ _initCheckbox: function () {
+ this._rpc({
+ model: this.modelName,
+ method: 'read',
+ args: [[this.eventId], ['website_menu', 'website_url', 'website_track', 'website_track_proposal']],
+ }).then((data) => {
+ if (data[0]['website_track']) {
+ this.$displayTalksInput.attr('checked', 'checked');
+ }
+ if (data[0]['website_track_proposal']) {
+ this.$allowTalksInput.attr('checked', 'checked');
+ }
+ if (data[0]['website_menu']) {
+ this.$submenuInput.attr('checked', 'checked');
+ } else {
+ this.$displayTalksInput.closest('a').addClass('d-none');
+ this.$allowTalksInput.closest('a').addClass('d-none');
+ }
+ this.eventUrl = data[0]['website_url'];
+ });
+ },
+
+ _onAllowTalkProposalChange: function () {
+ var checkboxValue = this.$allowTalksInput.is(':checked');
+ this._toggleTalkProposal(checkboxValue);
+ },
+
+ _toggleTalkProposal: function (val) {
+ var self = this;
+ this._rpc({
+ model: this.modelName,
+ method: 'toggle_website_track_proposal',
+ args: [[this.eventId], val],
+ }).then(function () {
+ self._reloadEventPage();
+ });
+ },
+
+ _onDisplayTalksChange: function () {
+ var checkboxValue = this.$displayTalksInput.is(':checked');
+ this._toggleDisplayTalks(checkboxValue);
+ },
+
+ _toggleDisplayTalks: function (val) {
+ var self = this;
+ this._rpc({
+ model: this.modelName,
+ method: 'toggle_website_track',
+ args: [[this.eventId], val],
+ }).then(function () {
+ self._reloadEventPage();
+ });
+ }
+
+});
+
+});
diff --git a/addons/website_event_track/static/src/xml/customize_options.xml b/addons/website_event_track/static/src/xml/customize_options.xml
new file mode 100644
index 00000000000..bee68f8c0c5
--- /dev/null
+++ b/addons/website_event_track/static/src/xml/customize_options.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/website_event_track/views/event_track_templates.xml b/addons/website_event_track/views/event_track_templates.xml
index 1534765d367..c9003a9e3bf 100644
--- a/addons/website_event_track/views/event_track_templates.xml
+++ b/addons/website_event_track/views/event_track_templates.xml
@@ -5,6 +5,7 @@
+