From f0e1e60528fa927082ab395e0290f11d2525da54 Mon Sep 17 00:00:00 2001 From: Florian Charlier Date: Wed, 2 Mar 2022 12:25:17 +0000 Subject: [PATCH] [IMP] {*_,,}event{,,_sms}: update sms reminder template * = website Change the wording of the sms reminder template to make it sound friendlier and more complete. The sms will include the event address if it is defined. Otherwise, it will link to the event page if website is installed. A one line-formatted version of the venue is added to the model to be used in the template and other places. This required to update `event_registration.get_date_range_str` to not include the time when describing an event happening more than a month from the current date, which makes sense as there is no reason to specify the time only in that case, and we add the time somewhere else when it's useful anyway. For consistency, Wembley Stadium is updated to London timezone in the demo data. Task-2777183 closes odoo/odoo#85664 Signed-off-by: Thibault Delavallee (tde) --- addons/event/data/event_demo.xml | 1 + addons/event/models/event_event.py | 17 ++++++++++++++++- addons/event/models/event_registration.py | 6 +++--- addons/event/tests/test_event_internals.py | 2 +- addons/event/views/event_views.xml | 4 ++-- addons/event_sms/data/sms_data.xml | 3 ++- addons/website_event/models/event_event.py | 2 +- 7 files changed, 26 insertions(+), 9 deletions(-) diff --git a/addons/event/data/event_demo.xml b/addons/event/data/event_demo.xml index e51e5f0ecd3..51b83ab1420 100644 --- a/addons/event/data/event_demo.xml +++ b/addons/event/data/event_demo.xml @@ -144,6 +144,7 @@ + Europe/London diff --git a/addons/event/models/event_event.py b/addons/event/models/event_event.py index 6458f4e6177..797e5fd36ca 100644 --- a/addons/event/models/event_event.py +++ b/addons/event/models/event_event.py @@ -191,6 +191,9 @@ class EventEvent(models.Model): address_id = fields.Many2one( 'res.partner', string='Venue', default=lambda self: self.env.company.partner_id.id, tracking=True, domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]") + address_inline = fields.Char( + string='Venue (formatted for one line uses)', compute='_compute_address_inline', + compute_sudo=True) country_id = fields.Many2one( 'res.country', 'Country', related='address_id.country_id', readonly=False, store=True) # ticket reports @@ -494,6 +497,18 @@ class EventEvent(models.Model): is_html_empty(event.event_type_id.ticket_instructions): event.ticket_instructions = event.event_type_id.ticket_instructions + @api.depends('address_id') + def _compute_address_inline(self): + """Use venue address if available, otherwise its name, finally ''. """ + for event in self: + if (event.address_id.contact_address or '').strip(): + event.address_inline = ', '.join( + frag.strip() + for frag in event.address_id.contact_address.split('\n') if frag.strip() + ) + else: + event.address_inline = event.address_id.name or '' + @api.constrains('seats_max', 'seats_available', 'seats_limited') def _check_seats_limit(self): for event in self: @@ -585,7 +600,7 @@ class EventEvent(models.Model): cal_event.add('dtend').value = event.date_end.astimezone(pytz.timezone(event.date_tz)) cal_event.add('summary').value = event.name if event.address_id: - cal_event.add('location').value = event.sudo().address_id.contact_address + cal_event.add('location').value = event.address_inline result[event.id] = cal.serialize().encode('utf-8') return result diff --git a/addons/event/models/event_registration.py b/addons/event/models/event_registration.py index 7a733869c82..7a48123bcb5 100644 --- a/addons/event/models/event_registration.py +++ b/addons/event/models/event_registration.py @@ -4,7 +4,7 @@ from dateutil.relativedelta import relativedelta from odoo import _, api, fields, models, SUPERUSER_ID -from odoo.tools import format_datetime +from odoo.tools import format_date from odoo.exceptions import AccessError, ValidationError @@ -296,7 +296,7 @@ class EventRegistration(models.Model): # TOOLS # ------------------------------------------------------------ - def get_date_range_str(self): + def get_date_range_str(self, lang_code=False): self.ensure_one() today = fields.Datetime.now() event_date = self.event_begin_date @@ -312,7 +312,7 @@ class EventRegistration(models.Model): elif event_date.month == (today + relativedelta(months=+1)).month: return _('next month') else: - return _('on %(date)s', date=format_datetime(self.env, self.event_begin_date, tz=self.event_id.date_tz, dt_format='medium')) + return _('on %(date)s', date=format_date(self.env, self.event_begin_date, lang_code=lang_code, date_format='medium')) def _get_registration_summary(self): self.ensure_one() diff --git a/addons/event/tests/test_event_internals.py b/addons/event/tests/test_event_internals.py index 2b1b3b9b546..e8601effe50 100644 --- a/addons/event/tests/test_event_internals.py +++ b/addons/event/tests/test_event_internals.py @@ -79,7 +79,7 @@ class TestEventData(TestEventInternalsCommon): self.assertEqual(registration.get_date_range_str(), u'next month') event.date_begin = datetime(2020, 3, 1, 10, 0, 0) - self.assertEqual(registration.get_date_range_str(), u'on Mar 1, 2020, 11:00:00 AM') + self.assertEqual(registration.get_date_range_str(), u'on Mar 1, 2020') # Is actually 8:30 to 20:00 in Mexico event.write({ diff --git a/addons/event/views/event_views.xml b/addons/event/views/event_views.xml index b140429a001..8ce556e4379 100644 --- a/addons/event/views/event_views.xml +++ b/addons/event/views/event_views.xml @@ -572,8 +572,8 @@ - - + + diff --git a/addons/event_sms/data/sms_data.xml b/addons/event_sms/data/sms_data.xml index 39629dd993d..2ee5fcc769c 100644 --- a/addons/event_sms/data/sms_data.xml +++ b/addons/event_sms/data/sms_data.xml @@ -11,7 +11,8 @@ Event: Reminder - {{ object.event_id.organizer_id.name or object.event_id.company_id.name or user.env.company.name }}: We are excited to remind you that the {{ object.event_id.name }} event is starting {{ object.get_date_range_str() }}. We confirm your registration and hope to meet you there. + Ready for "{{ object.event_id.name }}" {{ object.get_date_range_str(object.partner_id.lang) }}? +{{ 'It starts at %s' % format_time(time=object.event_begin_date, tz=object.event_id.date_tz, time_format='short', lang_code=object.partner_id.lang) + (', at %s' % object.event_id.address_inline if object.event_id.address_inline else '') + '.\nSee you there!' if object.event_id.address_inline or 'website_published' not in object.event_id._fields else 'Join us on %s/event/%i !' % (object.get_base_url(), object.event_id.id) }} {{ object.partner_id.lang }} diff --git a/addons/website_event/models/event_event.py b/addons/website_event/models/event_event.py index 4e28ef71678..4b6e5c33532 100644 --- a/addons/website_event/models/event_event.py +++ b/addons/website_event/models/event_event.py @@ -417,7 +417,7 @@ class Event(models.Model): 'details': self.name, } if self.address_id: - params.update(location=self.sudo().address_id.contact_address.replace('\n', ' ')) + params.update(location=self.address_inline) encoded_params = werkzeug.urls.url_encode(params) google_url = GOOGLE_CALENDAR_URL + encoded_params iCal_url = '/event/%d/ics?%s' % (self.id, encoded_params)