From 89d72df22b0ee22fb7cfd62b6ad595b00a7971e4 Mon Sep 17 00:00:00 2001 From: nounoubensebia Date: Wed, 5 May 2021 15:28:07 +0000 Subject: [PATCH] [IMP] *_event_*: revamp event template form This commit revamps the event template form to be similar to the event form itself and removes unnecessary fields, purpose is to give more clarity to the user. It also fixes the order of the fields in the event form to be exactly the same as in the front-end, so that the user don't get confused. Task-2541208 closes odoo/odoo#71856 Ent-pr: https://github.com/odoo/enterprise/pull/19128 Upg-pr: https://github.com/odoo/upgrade/pull/2516 Related: odoo/enterprise#19128 Related: odoo/upgrade#2516 Signed-off-by: Thibault Delavallee (tde) --- addons/event/__manifest__.py | 2 +- addons/event/data/event_data.xml | 1 - addons/event/data/event_demo_misc.xml | 5 - addons/event/models/event_event.py | 61 ++----- addons/event/tests/common.py | 3 - addons/event/tests/test_event_internals.py | 40 +++-- addons/event/views/event_views.xml | 165 ++++++------------ .../event_sale/tests/test_event_internals.py | 8 - .../tests/test_event_security.py | 2 - .../website_event/views/event_type_views.xml | 37 ++-- .../views/event_event_views.xml | 2 +- .../views/event_type_views.xml | 9 +- .../views/event_type_views.xml | 13 +- .../website_event_questions/__manifest__.py | 2 +- .../data/event_demo.xml | 2 - .../models/event_event.py | 3 +- .../website_event_questions/tests/common.py | 1 - .../views/event_views.xml | 31 ++-- .../views/event_type_views.xml | 16 +- .../views/event_type_views.xml | 4 +- 20 files changed, 143 insertions(+), 264 deletions(-) diff --git a/addons/event/__manifest__.py b/addons/event/__manifest__.py index d6de5098a76..64964354bcc 100644 --- a/addons/event/__manifest__.py +++ b/addons/event/__manifest__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- { 'name': 'Events Organization', - 'version': '1.5', + 'version': '1.6', 'website': 'https://www.odoo.com/app/events', 'category': 'Marketing/Events', 'summary': 'Trainings, Conferences, Meetings, Exhibitions, Registrations', diff --git a/addons/event/data/event_data.xml b/addons/event/data/event_data.xml index bcaeb997ffe..bb623435a15 100644 --- a/addons/event/data/event_data.xml +++ b/addons/event/data/event_data.xml @@ -5,7 +5,6 @@ Ticketing - Conference diff --git a/addons/event/data/event_demo_misc.xml b/addons/event/data/event_demo_misc.xml index a87cce5d7bb..1480546c504 100644 --- a/addons/event/data/event_demo_misc.xml +++ b/addons/event/data/event_demo_misc.xml @@ -5,22 +5,17 @@ Exhibition - Training - Sport - - US/Pacific - Europe/Brussels diff --git a/addons/event/models/event_event.py b/addons/event/models/event_event.py index e14899d4dab..b8336668947 100644 --- a/addons/event/models/event_event.py +++ b/addons/event/models/event_event.py @@ -6,7 +6,7 @@ import pytz from odoo import _, api, Command, fields, models from odoo.addons.base.models.res_partner import _tz_get -from odoo.tools import format_datetime +from odoo.tools import format_datetime, is_html_empty from odoo.exceptions import ValidationError from odoo.tools.translate import html_translate @@ -25,13 +25,10 @@ class EventType(models.Model): _order = 'sequence, id' name = fields.Char('Event Template', required=True, translate=True) + note = fields.Html(string='Note') sequence = fields.Integer() # tickets - use_ticket = fields.Boolean('Ticketing') - event_type_ticket_ids = fields.One2many( - 'event.type.ticket', 'event_type_id', - string='Tickets', compute='_compute_event_type_ticket_ids', - readonly=False, store=True) + event_type_ticket_ids = fields.One2many('event.type.ticket', 'event_type_id', string='Tickets') tag_ids = fields.Many2many('event.tag', string="Tags") # registration has_seats_limitation = fields.Boolean('Limited Seats') @@ -43,46 +40,10 @@ class EventType(models.Model): 'Automatically Confirm Registrations', default=True, help="Events and registrations will automatically be confirmed " "upon creation, easing the flow for simple events.") - # location - use_timezone = fields.Boolean('Use Default Timezone') default_timezone = fields.Selection( _tz_get, string='Timezone', default=lambda self: self.env.user.tz or 'UTC') # communication - use_mail_schedule = fields.Boolean( - 'Automatically Send Emails', default=True) - event_type_mail_ids = fields.One2many( - 'event.type.mail', 'event_type_id', - string='Mail Schedule', compute='_compute_event_type_mail_ids', - readonly=False, store=True) - - @api.depends('use_mail_schedule') - def _compute_event_type_mail_ids(self): - for template in self: - if not template.use_mail_schedule: - template.event_type_mail_ids = [(5, 0)] - elif not template.event_type_mail_ids: - template.event_type_mail_ids = [(0, 0, { - 'notification_type': 'mail', - 'interval_unit': 'now', - 'interval_type': 'after_sub', - 'template_id': self.env.ref('event.event_subscription').id, - }), (0, 0, { - 'notification_type': 'mail', - 'interval_nbr': 10, - 'interval_unit': 'days', - 'interval_type': 'before_event', - 'template_id': self.env.ref('event.event_reminder').id, - })] - - @api.depends('use_ticket') - def _compute_event_type_ticket_ids(self): - for template in self: - if not template.use_ticket: - template.event_type_ticket_ids = [(5, 0)] - elif not template.event_type_ticket_ids: - template.event_type_ticket_ids = [(0, 0, { - 'name': _('Registration'), - })] + event_type_mail_ids = fields.One2many('event.type.mail', 'event_type_id', string='Mail Schedule') @api.depends('has_seats_limitation') def _compute_default_registration(self): @@ -106,7 +67,7 @@ class EventEvent(models.Model): return self.env['ir.ui.view']._render_template('event.event_default_descripton') name = fields.Char(string='Event', translate=True, required=True) - note = fields.Html(string='Note') + note = fields.Html(string='Note', store=True, compute="_compute_note", readonly=False) description = fields.Html(string='Description', translate=html_translate, sanitize_attributes=False, sanitize_form=False, default=_default_description) active = fields.Boolean(default=True) user_id = fields.Many2one( @@ -355,7 +316,7 @@ class EventEvent(models.Model): @api.depends('event_type_id') def _compute_date_tz(self): for event in self: - if event.event_type_id.use_timezone and event.event_type_id.default_timezone: + if event.event_type_id.default_timezone: event.date_tz = event.event_type_id.default_timezone if not event.date_tz: event.date_tz = self.env.user.tz or 'UTC' @@ -417,7 +378,7 @@ class EventEvent(models.Model): lambda mail: not(mail._origin.mail_done) and not(mail._origin.mail_registration_ids) ) command = [Command.unlink(mail.id) for mail in mails_to_remove] - if event.event_type_id.use_mail_schedule: + if event.event_type_id.event_type_mail_ids: command += [ Command.create({ attribute_name: line[attribute_name] if not isinstance(line[attribute_name], models.BaseModel) else line[attribute_name].id @@ -460,7 +421,7 @@ class EventEvent(models.Model): # lines to keep: those with existing registrations tickets_to_remove = event.event_ticket_ids.filtered(lambda ticket: not ticket._origin.registration_ids) command = [Command.unlink(ticket.id) for ticket in tickets_to_remove] - if event.event_type_id.use_ticket: + if event.event_type_id.event_type_ticket_ids: command += [ Command.create({ attribute_name: line[attribute_name] if not isinstance(line[attribute_name], models.BaseModel) else line[attribute_name].id @@ -469,6 +430,12 @@ class EventEvent(models.Model): ] event.event_ticket_ids = command + @api.depends('event_type_id') + def _compute_note(self): + for event in self: + if event.event_type_id and not is_html_empty(event.event_type_id.note): + event.note = event.event_type_id.note + @api.constrains('seats_max', 'seats_available', 'seats_limited') def _check_seats_limit(self): if any(event.seats_limited and event.seats_max and event.seats_available < 0 for event in self): diff --git a/addons/event/tests/common.py b/addons/event/tests/common.py index efbfbd27c78..ad3252dc0f2 100644 --- a/addons/event/tests/common.py +++ b/addons/event/tests/common.py @@ -69,16 +69,13 @@ class TestEventCommon(common.TransactionCase): 'auto_confirm': True, 'has_seats_limitation': True, 'seats_max': 30, - 'use_timezone': True, 'default_timezone': 'Europe/Paris', - 'use_ticket': True, 'event_type_ticket_ids': [(0, 0, { 'name': 'First Ticket', }), (0, 0, { 'name': 'Second Ticket', }) ], - 'use_mail_schedule': True, 'event_type_mail_ids': [ (0, 0, { # right at subscription 'interval_unit': 'now', diff --git a/addons/event/tests/test_event_internals.py b/addons/event/tests/test_event_internals.py index e1ef56214e7..49b02f24141 100644 --- a/addons/event/tests/test_event_internals.py +++ b/addons/event/tests/test_event_internals.py @@ -81,12 +81,6 @@ class TestEventData(TestEventCommon): # ------------------------------------------------------------ event_type = self.env['event.type'].browse(self.event_type_complex.id) - event_type.write({ - 'use_mail_schedule': False, - 'use_ticket': False, - }) - self.assertEqual(event_type.event_type_mail_ids, self.env['event.type.mail']) - self.assertEqual(event_type.event_type_ticket_ids, self.env['event.type.ticket']) event = self.env['event.event'].create({ 'name': 'Event Update Type', @@ -108,11 +102,9 @@ class TestEventData(TestEventCommon): # change template to a one with mails -> fill event as it is void event_type.write({ - 'use_mail_schedule': True, 'event_type_mail_ids': [(5, 0), (0, 0, { 'interval_nbr': 1, 'interval_unit': 'days', 'interval_type': 'before_event', 'template_id': self.env['ir.model.data'].xmlid_to_res_id('event.event_reminder')})], - 'use_ticket': True, 'event_type_ticket_ids': [(5, 0), (0, 0, {'name': 'TestRegistration'})], }) event.write({'event_type_id': event_type.id}) @@ -155,7 +147,6 @@ class TestEventData(TestEventCommon): # setup test records event_type_default = self.env['event.type'].create({ 'name': 'Type Default', - 'use_mail_schedule': False, 'auto_confirm': True }) event_type_mails = self.env['event.type'].create({ @@ -163,7 +154,6 @@ class TestEventData(TestEventCommon): 'auto_confirm': False }) event_type_mails.write({ - 'use_mail_schedule': True, 'event_type_mail_ids': [ Command.clear(), Command.create({ @@ -227,6 +217,28 @@ class TestEventData(TestEventCommon): set([mail.id]) ) + @users('user_eventmanager') + def test_event_configuration_note_from_type(self): + event_type = self.env['event.type'].browse(self.event_type_complex.id) + + event = self.env['event.event'].create({ + 'name': 'Event Update Type Note', + 'date_begin': FieldsDatetime.to_string(datetime.today() + timedelta(days=1)), + 'date_end': FieldsDatetime.to_string(datetime.today() + timedelta(days=15)), + }) + + # verify that note is not propagated if the event type contains blank html + event.write({'note': '

Event Note

'}) + event_type.write({'note': '


'}) + event.write({'event_type_id': event_type.id}) + self.assertEqual(event.note, '

Event Note

') + + # verify that note is correctly propagated if it contains non empty html + event.write({'event_type_id': False}) + event_type.write({'note': '

Event Type Note

'}) + event.write({'event_type_id': event_type.id}) + self.assertEqual(event.note, '

Event Type Note

') + @users('user_eventmanager') def test_event_configuration_tickets_from_type(self): """ Test data computation (related to tickets) of event coming from its event.type template. @@ -238,7 +250,6 @@ class TestEventData(TestEventCommon): # setup test records event_type_default = self.env['event.type'].create({ 'name': 'Type Default', - 'use_ticket': False, 'auto_confirm': True }) event_type_tickets = self.env['event.type'].create({ @@ -246,7 +257,6 @@ class TestEventData(TestEventCommon): 'auto_confirm': False }) event_type_tickets.write({ - 'use_ticket': True, 'event_type_ticket_ids': [ Command.clear(), Command.create({ @@ -614,17 +624,11 @@ class TestEventTypeData(TestEventCommon): 'name': 'Testing fields computation', 'has_seats_limitation': True, 'seats_max': 30, - 'use_ticket': True, }) self.assertTrue(event_type.has_seats_limitation) self.assertEqual(event_type.seats_max, 30) - self.assertEqual(event_type.event_type_ticket_ids.mapped('name'), ['Registration']) # reset seats limitation event_type.write({'has_seats_limitation': False}) self.assertFalse(event_type.has_seats_limitation) self.assertEqual(event_type.seats_max, 0) - - # reset tickets - event_type.write({'use_ticket': False}) - self.assertEqual(event_type.event_type_ticket_ids, self.env['event.type.ticket']) diff --git a/addons/event/views/event_views.xml b/addons/event/views/event_views.xml index eb4095a14af..289d0f49673 100644 --- a/addons/event/views/event_views.xml +++ b/addons/event/views/event_views.xml @@ -9,116 +9,63 @@
-
-
-

Location

-
-
-
- -
-
-
-
-
-

Communication

-
-
-
- -
-
-
-
-
-

Visibility

-
-
-
- -
-
-
-
-
-
-
-
-
-
-

Attendees

-
-
-
- -
-
-
-
-
-
- -
-
-
-
+
+
+ + + +
+
+
+
+
+ +
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/addons/event_sale/tests/test_event_internals.py b/addons/event_sale/tests/test_event_internals.py index 80e648586b6..6eb4833426e 100644 --- a/addons/event_sale/tests/test_event_internals.py +++ b/addons/event_sale/tests/test_event_internals.py @@ -16,11 +16,6 @@ class TestEventData(TestEventSaleCommon): """ In addition to event test, also test tickets configuration coming from event_sale capabilities. """ event_type = self.event_type_complex.with_user(self.env.user) - event_type.write({ - 'use_mail_schedule': False, - 'use_ticket': False, - }) - self.assertEqual(event_type.event_type_ticket_ids, self.env['event.type.ticket']) event = self.env['event.event'].create({ 'name': 'Event Update Type', @@ -28,10 +23,7 @@ class TestEventData(TestEventSaleCommon): 'date_begin': FieldsDatetime.to_string(datetime.today() + timedelta(days=1)), 'date_end': FieldsDatetime.to_string(datetime.today() + timedelta(days=15)), }) - self.assertEqual(event.event_ticket_ids, self.env['event.event.ticket']) - event_type.write({ - 'use_ticket': True, 'event_type_ticket_ids': [(5, 0), (0, 0, { 'name': 'First Ticket', 'product_id': self.event_product.id, diff --git a/addons/test_event_full/tests/test_event_security.py b/addons/test_event_full/tests/test_event_security.py index 9e05631316b..1c4cdd32d26 100644 --- a/addons/test_event_full/tests/test_event_security.py +++ b/addons/test_event_full/tests/test_event_security.py @@ -92,7 +92,6 @@ class TestEventSecurity(TestEventCommon): with self.assertRaises(AccessError): self.env['event.type'].create({ 'name': 'ManagerEventType', - 'use_mail_schedule': True, 'event_type_mail_ids': [(5, 0), (0, 0, { 'interval_nbr': 1, 'interval_unit': 'days', 'interval_type': 'before_event', 'template_id': self.env['ir.model.data'].xmlid_to_res_id('event.event_reminder')})] @@ -104,7 +103,6 @@ class TestEventSecurity(TestEventCommon): # Event Type event_type = self.env['event.type'].create({ 'name': 'ManagerEventType', - 'use_mail_schedule': True, 'event_type_mail_ids': [(5, 0), (0, 0, { 'interval_nbr': 1, 'interval_unit': 'days', 'interval_type': 'before_event', 'template_id': self.env['ir.model.data'].xmlid_to_res_id('event.event_reminder')})] diff --git a/addons/website_event/views/event_type_views.xml b/addons/website_event/views/event_type_views.xml index e9b55068bcb..8a6d74a2b91 100644 --- a/addons/website_event/views/event_type_views.xml +++ b/addons/website_event/views/event_type_views.xml @@ -6,31 +6,20 @@ event.type -
-
-
+ + +
-
-
-
-
+ + + + + +
diff --git a/addons/website_event_exhibitor/views/event_event_views.xml b/addons/website_event_exhibitor/views/event_event_views.xml index 94e24c70367..392485178cc 100644 --- a/addons/website_event_exhibitor/views/event_event_views.xml +++ b/addons/website_event_exhibitor/views/event_event_views.xml @@ -15,7 +15,7 @@ - + diff --git a/addons/website_event_exhibitor/views/event_type_views.xml b/addons/website_event_exhibitor/views/event_type_views.xml index c7a5500baf4..120cda13975 100644 --- a/addons/website_event_exhibitor/views/event_type_views.xml +++ b/addons/website_event_exhibitor/views/event_type_views.xml @@ -5,10 +5,11 @@ event.type - -
-
+ + +
diff --git a/addons/website_event_meet/views/event_type_views.xml b/addons/website_event_meet/views/event_type_views.xml index 0da3069e67e..8016922092a 100644 --- a/addons/website_event_meet/views/event_type_views.xml +++ b/addons/website_event_meet/views/event_type_views.xml @@ -5,13 +5,14 @@ event.type - -
-
+ + + - - {'invisible': [('website_menu', '=', False)]} + + 0
diff --git a/addons/website_event_questions/__manifest__.py b/addons/website_event_questions/__manifest__.py index 29583470c48..d2ce78dc19e 100644 --- a/addons/website_event_questions/__manifest__.py +++ b/addons/website_event_questions/__manifest__.py @@ -4,7 +4,7 @@ 'name': 'Questions on Events', 'description': 'Questions on Events', 'category': 'Marketing', - 'version': '1.1', + 'version': '1.2', 'depends': ['website_event'], 'data': [ 'views/event_views.xml', diff --git a/addons/website_event_questions/data/event_demo.xml b/addons/website_event_questions/data/event_demo.xml index cd199671613..1aff5b7fe3d 100644 --- a/addons/website_event_questions/data/event_demo.xml +++ b/addons/website_event_questions/data/event_demo.xml @@ -1,8 +1,6 @@ - Europe/Brussels - \ No newline at end of file diff --git a/addons/website_event_questions/models/event_event.py b/addons/website_event_questions/models/event_event.py index f81f5316908..87e16f663c0 100644 --- a/addons/website_event_questions/models/event_event.py +++ b/addons/website_event_questions/models/event_event.py @@ -7,7 +7,6 @@ from odoo import api, fields, models class EventType(models.Model): _inherit = 'event.type' - use_questions = fields.Boolean('Questions to Attendees') question_ids = fields.One2many( 'event.question', 'event_type_id', string='Questions', copy=True) @@ -53,7 +52,7 @@ class EventEvent(models.Model): command = [(3, question.id) for question in questions_toremove] else: command = [(5, 0)] - if event.event_type_id.use_mail_schedule: + if event.event_type_id.event_type_mail_ids: command += [ (0, 0, { 'title': question.title, diff --git a/addons/website_event_questions/tests/common.py b/addons/website_event_questions/tests/common.py index 7ad2697a81f..1a621875dc2 100644 --- a/addons/website_event_questions/tests/common.py +++ b/addons/website_event_questions/tests/common.py @@ -36,4 +36,3 @@ class TestEventQuestionCommon(TestEventCommon): 'event_type_id': cls.event_type_complex.id, 'once_per_order': True, }) - cls.event_type_complex.write({'use_questions': True}) diff --git a/addons/website_event_questions/views/event_views.xml b/addons/website_event_questions/views/event_views.xml index 7b92e292d94..6e59baf8992 100644 --- a/addons/website_event_questions/views/event_views.xml +++ b/addons/website_event_questions/views/event_views.xml @@ -5,26 +5,17 @@ event.type -
-
-
- -
-
-
-
-
+ + + + + + + + + + +
diff --git a/addons/website_event_track/views/event_type_views.xml b/addons/website_event_track/views/event_type_views.xml index 523b31382ec..ae1065b488e 100644 --- a/addons/website_event_track/views/event_type_views.xml +++ b/addons/website_event_track/views/event_type_views.xml @@ -6,13 +6,15 @@ event.type - -
-
-
-
+ + + + +
diff --git a/addons/website_event_track_quiz/views/event_type_views.xml b/addons/website_event_track_quiz/views/event_type_views.xml index 460a5e5bf5b..61882eee234 100644 --- a/addons/website_event_track_quiz/views/event_type_views.xml +++ b/addons/website_event_track_quiz/views/event_type_views.xml @@ -5,8 +5,8 @@ event.type - - {'invisible': [('website_menu', '=', False)]} + + 0