From 309d090ff11a1a7c30a9921cda6b3aa85431fd60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Mon, 29 Jun 2020 15:37:22 +0000 Subject: [PATCH 1/4] [IMP] base: add format support on duration field RATIONALE Even will soon gain a major update called Event Online, allowing to better support full-online events. In order to prepare its merge, preparatory merge are done to lessen the final diff. PURPOSE In this commit we add support of formatting on duration widget. Possible values are long, short and narrow (see babel formatting options). This option is not used in digital display mode. LINKS PR #54801 Task ID 2304817 (Event Preparation 3) Prepares Task ID 2252655 (Main Online Event task) Prepares Task ID 2283796 (Event B2Basics) X-original-commit: 468a30b0057f4f1c4fba409f4b4baa4f889aad12 --- odoo/addons/base/i18n/base.pot | 6 ++++++ odoo/addons/base/models/ir_qweb_fields.py | 12 +++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/odoo/addons/base/i18n/base.pot b/odoo/addons/base/i18n/base.pot index 2b694e436fd..b7a542202b4 100644 --- a/odoo/addons/base/i18n/base.pot +++ b/odoo/addons/base/i18n/base.pot @@ -12532,6 +12532,12 @@ msgstr "" msgid "Formatted Email" msgstr "" +#. module: base +#: code:addons/base/models/ir_qweb_fields.py:0 +#, python-format +msgid "Formatting: long, short, narrow (not used for digital)" +msgstr "" + #. module: base #: model:ir.module.module,shortdesc:base.module_website_forum msgid "Forum" diff --git a/odoo/addons/base/models/ir_qweb_fields.py b/odoo/addons/base/models/ir_qweb_fields.py index be6618508e8..3caa5c665aa 100644 --- a/odoo/addons/base/models/ir_qweb_fields.py +++ b/odoo/addons/base/models/ir_qweb_fields.py @@ -518,6 +518,16 @@ class DurationConverter(models.AbstractModel): digital=dict(type="boolean", string=_('Digital formatting')), unit=dict(type="selection", params=unit, string=_('Date unit'), description=_('Date unit used for comparison and formatting'), default_value='second', required=True), round=dict(type="selection", params=unit, string=_('Rounding unit'), description=_("Date unit used for the rounding. The value must be smaller than 'hour' if you use the digital formatting."), default_value='second'), + format=dict( + type="selection", + params=[ + ('long', _('Long')), + ('short', _('Short')), + ('narrow', _('Narrow'))], + string=_('Format'), + description=_("Formatting: long, short, narrow (not used for digital)"), + default_value='long' + ), ) return options @@ -556,7 +566,7 @@ class DurationConverter(models.AbstractModel): if not v: continue section = babel.dates.format_timedelta( - v*secs_per_unit, threshold=1, locale=locale) + v*secs_per_unit, format=options.get('format', 'long'), threshold=1, locale=locale) if section: sections.append(section) From 1db746419f566a6299aaead8f0f8b6bb279732e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Wed, 8 Jul 2020 11:11:10 +0000 Subject: [PATCH 2/4] [REF] website_event(_track): reorganize website menu management code RATIONALE Even will soon gain a major update called Event Online, allowing to better support full-online events. In order to prepare its merge, preparatory merge are done to lessen the final diff. PURPOSE In this commit we simply move some code in website_event and event_track to better separate code about menu management from other code. It allows to understand code organization and will lessen diff of future commits improving menu management. LINKS PR #54801 Task ID 2304817 (Event Preparation 3) Prepares Task ID 2252655 (Main Online Event task) Prepares Task ID 2283796 (Event B2Basics) X-original-commit: 35b265f1950e9f2977edc940645c35efef19e3c9 --- addons/website_event/models/event_event.py | 14 +++++-- .../website_event_track/models/event_event.py | 40 ++++++++++--------- 2 files changed, 33 insertions(+), 21 deletions(-) diff --git a/addons/website_event/models/event_event.py b/addons/website_event/models/event_event.py index d901c8c92e4..4071afbfe42 100644 --- a/addons/website_event/models/event_event.py +++ b/addons/website_event/models/event_event.py @@ -82,6 +82,13 @@ class Event(models.Model): (menu_to_activate | menu_to_deactivate)._update_website_menus() return res + # ------------------------------------------------------------ + # WEBSITE MENU MANAGEMENT + # ------------------------------------------------------------ + + def toggle_website_menu(self, val): + self.website_menu = val + def _get_menu_entries(self): """ Method returning menu entries to display on the website view of the event, possibly depending on some options in inheriting modules. """ @@ -116,6 +123,10 @@ class Event(models.Model): }) return menu + # ------------------------------------------------------------ + # TOOLS + # ------------------------------------------------------------ + def google_map_link(self, zoom=8): self.ensure_one() if self.address_id: @@ -168,6 +179,3 @@ class Event(models.Model): def get_backend_menu_id(self): return self.env.ref('event.event_main_menu').id - - def toggle_website_menu(self, val): - self.website_menu = val diff --git a/addons/website_event_track/models/event_event.py b/addons/website_event_track/models/event_event.py index bf9473b7d9f..51ff629e690 100644 --- a/addons/website_event_track/models/event_event.py +++ b/addons/website_event_track/models/event_event.py @@ -81,6 +81,28 @@ class Event(models.Model): for event in self: event.tracks_tag_ids = event.track_ids.mapped('tag_ids').filtered(lambda tag: tag.color != 0).ids + 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() + + # ------------------------------------------------------------ + # 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 _update_website_menus(self): super(Event, self)._update_website_menus() for event in self: @@ -105,18 +127,6 @@ class Event(models.Model): 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() res = [ @@ -128,9 +138,3 @@ class Event(models.Model): self.ensure_one() res = [(_('Talk Proposals'), '/event/%s/track_proposal' % slug(self), False, 'track_proposal')] return res - - def toggle_website_track(self, val): - self.website_track = val - - def toggle_website_track_proposal(self, val): - self.website_track_proposal = val From cbee702ba4f3efa8fe794c8e2416e6584564ff0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Wed, 8 Jul 2020 10:50:47 +0000 Subject: [PATCH 3/4] [REF] website_event(_track): improve tests and test classes RATIONALE Even will soon gain a major update called Event Online, allowing to better support full-online events. In order to prepare its merge, preparatory merge are done to lessen the final diff., ... SPECIFICATIONS Improve website_event and website_event_track test coding style, notably * use specific users when performing tests to trigger access rights issues (this notably allowed to find an issue with event groups not allowed to update menus); * define common classes; LINKS PR #54801 Task ID 2304817 (Event Preparation 3) Prepares Task ID 2252655 (Main Online Event task) Prepares Task ID 2283796 (Event B2Basics) X-original-commit: 774211c7e4667c5350ac090510e72c106f2d10b6 --- addons/website_event/tests/__init__.py | 4 +- addons/website_event/tests/common.py | 17 +++++++ .../tests/test_event_internals.py | 28 +++++++++++ .../website_event/tests/test_event_website.py | 47 ------------------- .../website_event/tests/test_website_event.py | 13 +++++ addons/website_event_track/tests/__init__.py | 5 +- ...track_website.py => test_website_event.py} | 21 ++++++--- 7 files changed, 79 insertions(+), 56 deletions(-) create mode 100644 addons/website_event/tests/common.py create mode 100644 addons/website_event/tests/test_event_internals.py delete mode 100644 addons/website_event/tests/test_event_website.py create mode 100644 addons/website_event/tests/test_website_event.py rename addons/website_event_track/tests/{test_event_track_website.py => test_website_event.py} (62%) diff --git a/addons/website_event/tests/__init__.py b/addons/website_event/tests/__init__.py index 8db62f8ae97..6986da4eab7 100644 --- a/addons/website_event/tests/__init__.py +++ b/addons/website_event/tests/__init__.py @@ -1,5 +1,7 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. +from . import common +from . import test_event_internals from . import test_ui -from . import test_event_website +from . import test_website_event diff --git a/addons/website_event/tests/common.py b/addons/website_event/tests/common.py new file mode 100644 index 00000000000..b4bd532ab04 --- /dev/null +++ b/addons/website_event/tests/common.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo.addons.event.tests.common import TestEventCommon + + +class TestWebsiteEventCommon(TestEventCommon): + + def _get_menus(self): + return set(['Introduction', 'Location', 'Register']) + + def _assert_website_menus(self, event): + self.assertTrue(event.menu_id) + + menus = self.env['website.menu'].search([('parent_id', '=', event.menu_id.id)]) + self.assertEqual(len(menus), len(self._get_menus())) + self.assertEqual(set(menus.mapped('name')), self._get_menus()) diff --git a/addons/website_event/tests/test_event_internals.py b/addons/website_event/tests/test_event_internals.py new file mode 100644 index 00000000000..83ff4901df8 --- /dev/null +++ b/addons/website_event/tests/test_event_internals.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from datetime import datetime, timedelta + +from odoo import fields +from odoo.addons.website_event.tests.common import TestWebsiteEventCommon +from odoo.tests.common import users + + +class TestEventWebsite(TestWebsiteEventCommon): + + @users('user_eventmanager') + def test_menu_create(self): + event = self.env['event.event'].create({ + 'name': 'TestEvent', + 'date_begin': fields.Datetime.to_string(datetime.today() + timedelta(days=1)), + 'date_end': fields.Datetime.to_string(datetime.today() + timedelta(days=15)), + 'website_menu': True, + }) + self._assert_website_menus(event) + + @users('user_eventmanager') + def test_menu_update(self): + event = self.env['event.event'].browse(self.event_0.id) + self.assertFalse(event.menu_id) + event.website_menu = True + self._assert_website_menus(event) diff --git a/addons/website_event/tests/test_event_website.py b/addons/website_event/tests/test_event_website.py deleted file mode 100644 index cc8098bd75f..00000000000 --- a/addons/website_event/tests/test_event_website.py +++ /dev/null @@ -1,47 +0,0 @@ -from datetime import datetime, timedelta - -from odoo import fields -from odoo.addons.event.tests.common import TestEventCommon -from odoo.addons.website.tests.test_base_url import TestUrlCommon -import odoo.tests - - -class TestEventWebsiteHelper(TestEventCommon): - def _get_menus(self): - return set(['Introduction', 'Location', 'Register']) - - def _assert_website_menus(self, event): - self.assertTrue(event.menu_id) - - menus = self.env['website.menu'].search([('parent_id', '=', event.menu_id.id)]) - self.assertEqual(len(menus), len(self._get_menus())) - self.assertEqual(set(menus.mapped('name')), self._get_menus()) - - -class TestEventWebsite(TestEventWebsiteHelper): - - def test_create_menu0(self): - event = self.env['event.event'].create({ - 'name': 'TestEvent', - 'date_begin': fields.Datetime.to_string(datetime.today() + timedelta(days=1)), - 'date_end': fields.Datetime.to_string(datetime.today() + timedelta(days=15)), - 'registration_ids': [(0, 0, { - 'partner_id': self.user_eventuser.partner_id.id, - 'name': 'test_reg', - })], - 'website_menu': True, - }) - - self._assert_website_menus(event) - - def test_write_menu0(self): - self.assertFalse(self.event_0.menu_id) - self.event_0.website_menu = True - self._assert_website_menus(self.event_0) - - -@odoo.tests.tagged('-at_install', 'post_install') -class TestUrlCanonical(TestUrlCommon): - def test_01_canonical_url(self): - self._assertCanonical('/event?date=all', self.domain + '/event') - self._assertCanonical('/event?date=old', self.domain + '/event?date=old') diff --git a/addons/website_event/tests/test_website_event.py b/addons/website_event/tests/test_website_event.py new file mode 100644 index 00000000000..54e657d2c9f --- /dev/null +++ b/addons/website_event/tests/test_website_event.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo.addons.website.tests.test_base_url import TestUrlCommon +from odoo.tests import tagged + + +@tagged('-at_install', 'post_install') +class TestUrlCanonical(TestUrlCommon): + + def test_01_canonical_url(self): + self._assertCanonical('/event?date=all', self.domain + '/event') + self._assertCanonical('/event?date=old', self.domain + '/event?date=old') diff --git a/addons/website_event_track/tests/__init__.py b/addons/website_event_track/tests/__init__.py index a2186e6f137..3773e715842 100644 --- a/addons/website_event_track/tests/__init__.py +++ b/addons/website_event_track/tests/__init__.py @@ -1 +1,4 @@ -from . import test_event_track_website \ No newline at end of file +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import test_website_event diff --git a/addons/website_event_track/tests/test_event_track_website.py b/addons/website_event_track/tests/test_website_event.py similarity index 62% rename from addons/website_event_track/tests/test_event_track_website.py rename to addons/website_event_track/tests/test_website_event.py index 17f424bc538..cb7fd75460e 100644 --- a/addons/website_event_track/tests/test_event_track_website.py +++ b/addons/website_event_track/tests/test_website_event.py @@ -1,15 +1,20 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + from datetime import datetime, timedelta from odoo import fields -from odoo.addons.website_event.tests.test_event_website import TestEventWebsiteHelper +from odoo.addons.website_event.tests.common import TestWebsiteEventCommon +from odoo.tests.common import users -class TestEventWebsiteTrack(TestEventWebsiteHelper): +class TestEventWebsiteTrack(TestWebsiteEventCommon): def _get_menus(self): return super(TestEventWebsiteTrack, self)._get_menus() | set(['Talks', 'Agenda', 'Talk Proposals']) - def test_create_menu1(self): + @users('user_eventmanager') + def test_create_menu(self): event = self.env['event.event'].create({ 'name': 'TestEvent', 'date_begin': fields.Datetime.to_string(datetime.today() + timedelta(days=1)), @@ -25,11 +30,13 @@ class TestEventWebsiteTrack(TestEventWebsiteHelper): self._assert_website_menus(event) - def test_write_menu1(self): - self.assertFalse(self.event_0.menu_id) - self.event_0.write({ + @users('user_eventmanager') + def test_write_menu(self): + event = self.env['event.event'].browse(self.event_0.id) + self.assertFalse(event.menu_id) + event.write({ 'website_menu': True, 'website_track': True, 'website_track_proposal': True, }) - self._assert_website_menus(self.event_0) + self._assert_website_menus(event) From 507989114456c4d80cbdcfc632c6c6b658ce5d35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Thu, 9 Jul 2020 11:09:37 +0000 Subject: [PATCH 4/4] [IMP] website_event_track: add views for website menu model RATIONALE Even will soon gain a major update called Event Online, allowing to better support full-online events. In order to prepare its merge, preparatory merge are done to lessen the final diff. PURPOSE Add missing views for website menu model. This helps debugging and tracking what happens with those event-specific menus. LINKS PR #54801 Task ID 2304817 (Event Preparation 3) Prepares Task ID 2252655 (Main Online Event task) Prepares Task ID 2283796 (Event B2Basics) X-original-commit: 92f4e01c35460afd8aeee5ed9790e10850b68109 --- addons/website_event_track/__manifest__.py | 1 + .../views/website_event_menu_views.xml | 58 +++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 addons/website_event_track/views/website_event_menu_views.xml diff --git a/addons/website_event_track/__manifest__.py b/addons/website_event_track/__manifest__.py index b99d9bdcde9..9a94f6d4f52 100644 --- a/addons/website_event_track/__manifest__.py +++ b/addons/website_event_track/__manifest__.py @@ -17,6 +17,7 @@ 'views/event_track_views.xml', 'views/event_sponsor_views.xml', 'views/event_views.xml', + 'views/website_event_menu_views.xml', ], 'demo': [ 'data/event_demo.xml', diff --git a/addons/website_event_track/views/website_event_menu_views.xml b/addons/website_event_track/views/website_event_menu_views.xml new file mode 100644 index 00000000000..2429b8ebb0d --- /dev/null +++ b/addons/website_event_track/views/website_event_menu_views.xml @@ -0,0 +1,58 @@ + + + + + website.event.menu.view.search + website.event.menu + + + + + + + + + + + website.event.menu.view.form + website.event.menu + +
+ + + + + + + +
+
+
+ + + website.event.menu.view.tree + website.event.menu + + + + + + + + + + + Menus + website.event.menu + tree,form + + + + +
+