[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:
Odoo's Mergebot
2020-07-23 12:47:22 +02:00
committed by GitHub
13 changed files with 188 additions and 78 deletions
+11 -3
View File
@@ -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
+3 -1
View File
@@ -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
+17
View File
@@ -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
+4 -1
View File
@@ -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
@@ -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>
+6
View File
@@ -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"
+11 -1
View File
@@ -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)