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/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/__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/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 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) 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 + + + + +
+
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)