[FW][MERGE] base, website_event(_track): provide website menu related cleanings
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 Prepare Event Online support by providing fixes and preparatory cleaning commits. SPECIFICATIONS base: support format on duration field when not in digital display website_event(_track): reorganize website menu management code: move it in order to have it clearly separated from other code, easening future changes website_event(_track): improve tests and test classes website_event_track: 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) closes odoo/odoo#54822 Forward-port-of: odoo/odoo#54801 Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com> Signed-off-by: Xavier Dollé (xdo) <xdo@odoo.com>
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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())
|
||||
@@ -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)
|
||||
@@ -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')
|
||||
@@ -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')
|
||||
@@ -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',
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1 +1,4 @@
|
||||
from . import test_event_track_website
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from . import test_website_event
|
||||
|
||||
+14
-7
@@ -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)
|
||||
@@ -0,0 +1,58 @@
|
||||
<?xml version="1.0"?>
|
||||
<odoo><data>
|
||||
|
||||
<record id="website_event_menu_view_search" model="ir.ui.view">
|
||||
<field name="name">website.event.menu.view.search</field>
|
||||
<field name="model">website.event.menu</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Website Event Menus">
|
||||
<field name="menu_id"/>
|
||||
<field name="event_id"/>
|
||||
<field name="menu_type"/>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="website_event_menu_view_form" model="ir.ui.view">
|
||||
<field name="name">website.event.menu.view.form</field>
|
||||
<field name="model">website.event.menu</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Website Event Menu">
|
||||
<sheet>
|
||||
<group>
|
||||
<field name="menu_id"/>
|
||||
<field name="event_id"/>
|
||||
<field name="menu_type"/>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="website_event_menu_view_tree" model="ir.ui.view">
|
||||
<field name="name">website.event.menu.view.tree</field>
|
||||
<field name="model">website.event.menu</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Website Event Menus">
|
||||
<field name="menu_id"/>
|
||||
<field name="event_id"/>
|
||||
<field name="menu_type"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="website_event_menu_action" model="ir.actions.act_window">
|
||||
<field name="name">Menus</field>
|
||||
<field name="res_model">website.event.menu</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
</record>
|
||||
|
||||
<menuitem id="menu_website_event_menu"
|
||||
name="Website Menus"
|
||||
action="website_event_menu_action"
|
||||
parent="event.menu_event_configuration"
|
||||
groups="base.group_no_one"
|
||||
sequence="99"/>
|
||||
|
||||
</data>
|
||||
</odoo>
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user