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