diff options
| author | Jigar Patel <jat@openerp.com> | 2016-06-22 16:08:26 +0530 |
|---|---|---|
| committer | Thibault Delavallée <tde@openerp.com> | 2016-08-18 15:12:08 +0200 |
| commit | 9f7d7c680930207c7989df8d8ae07731b523907a (patch) | |
| tree | c3247ba86ed3d111d856832635a965750eafec3a | |
| parent | 6b87c731fb3daa4204c3679e9dfb2569902cbb55 (diff) | |
[IMP] event: improve emails sent by event
* improve layout of confirmation and reminder emails
* add default mails configuration on events: 2 reminders are added
J-2 and J_15
| -rw-r--r-- | addons/event/data/email_template_data.xml | 255 | ||||
| -rw-r--r-- | addons/event/models/event.py | 31 | ||||
| -rw-r--r-- | addons/event/tests/common.py | 7 | ||||
| -rw-r--r-- | addons/event/tests/test_event_flow.py | 3 | ||||
| -rw-r--r-- | addons/website_event/models/event.py | 1 |
5 files changed, 279 insertions, 18 deletions
diff --git a/addons/event/data/email_template_data.xml b/addons/event/data/email_template_data.xml index 8e33d116881..aa49de0995c 100644 --- a/addons/event/data/email_template_data.xml +++ b/addons/event/data/email_template_data.xml @@ -29,11 +29,123 @@ <field name="reply_to">${object.event_id.reply_to|safe}</field> <field name="subject">Your registration at ${object.event_id.name}</field> <field name="body_html"><![CDATA[ -<p>Dear ${object.name},</p> -<p>Thank you for your inquiry.</p> -<p>We confirm your registration to the event <b>${object.event_id.name}</b>. You will receive emails with practical information.</p> -<p>If you have any questions, please let us know.</p> -<p>Best regards,</p>]]></field> +% set date_begin = format_tz(object.event_id.date_begin, tz='UTC', format='%Y%m%dT%H%M%SZ') +% set date_end = format_tz(object.event_id.date_end, tz='UTC', format='%Y%m%dT%H%M%SZ') +<div style="background:#F3F5F6;color:#515166;padding:25px 0px;font-family:Arial,Helvetica,sans-serif;font-size:14px;"> + <table style="width:600px;margin:5px auto;"> + <tbody> + <tr> + <td> + <a href="/"> + <img src="/logo" alt="${object.company_id.name}" style="vertical-align:baseline;max-width:100px;" /> + </a> + </td> + <td style="text-align:right;vertical-align:middle;"> + % if 'website_url' in object.event_id and object.event_id.website_url: + <a href="/event" style="text-decoration:none;color:#717188;">More Events</a> + % endif + </td> + </tr> + </tbody> + </table> + <table style="width:600px;margin:0px auto;background:white;border:1px solid #e1e1e1;"> + <tbody> + <tr> + <td style="padding:15px 20px 0px 20px;"> + <h2 style="font-weight:300;"> + Hi ${object.name}, here is your order confirmation for + % if 'website_url' in object.event_id and object.event_id.website_url: + <a href="${object.event_id.website_url}" style="color:#a24689;text-decoration:none;">${object.event_id.name}</a> + % else: + <strong>${object.event_id.name}</strong> + % endif + </h2> + </td> + </tr> + <tr> + <td style="padding:15px 20px 0px 20px;"> + <table style="width:100%;border-top:1px solid #e1e1e1;"> + <tr> + <td style="padding:25px 0px;vertical-align:top;"> + <img src="/web_editor/font_to_img/61505/rgb(81,81,102)/34" style="padding:4px;max-width:inherit;" height="34"> + </td> + <td style="padding:30px 10px 25px 10px;width:50%;vertical-align:top;"> + % if object.event_id.address_id.street: + <p style="margin:0px 0px 0px 0px;">${object.event_id.address_id.street},</p> + % set location = object.event_id.address_id.street + % endif + % if object.event_id.address_id.street2: + <p style="margin:0px 0px 0px 0px;">${object.event_id.address_id.street2},</p> + % set location = '%s, %s' % (location, object.event_id.address_id.street2) + % endif + % if object.event_id.address_id.city: + ${object.event_id.address_id.city}, + % set location = '%s, %s' % (location, object.event_id.address_id.city) + % endif + % if object.event_id.address_id.state_id.name: + ${object.event_id.address_id.state_id.name}, + % set location = '%s, %s' % (location, object.event_id.address_id.state_id.name) + % endif + % if object.event_id.address_id.zip: + ${object.event_id.address_id.zip}, + % set location = '%s, %s' % (location, object.event_id.address_id.zip) + % endif + % if object.event_id.address_id.country_id.name: + <p style="margin:0px 0px 0px 0px;">${object.event_id.address_id.country_id.name}</p> + % set location = '%s, %s' % (location, object.event_id.address_id.country_id.name) + % endif + </td> + <td style="padding:25px 0px;vertical-align:top;"> + <img src="/web_editor/font_to_img/61555/rgb(81,81,102)/34" style="padding:4px;max-width:inherit;" height="34"> + </td> + <td style="padding:25px 10px 25px 10px;width:50%;line-height:20px;vertical-align:top;"> + <div><strong>From</strong> ${object.event_id.date_begin_located}</div> + <div><strong>To</strong> ${object.event_id.date_end_located}</div> + <div style="font-size:12px;color:#9e9e9e"><i><strong>TZ</strong> ${object.event_id.date_tz}</i></div> + </td> + </tr> + </table> + % if object.event_id.organizer_id.email: + <table style="width:100%;border-top:1px solid #e1e1e1;"> + <tr> + <td style="padding:10px 0px 25px 0px;"> + <h2 style="font-weight:300;margin:10px 0px">Questions about this event?</h2> + <div>Please contact the organizer at <a href="mailto:${object.event_id.organizer_id.email}" style="text-decoration:none;color:#a24689;">${object.event_id.organizer_id.email}</a></div> + </td> + </tr> + </table> + % endif + <table style="width:100%;border-top:1px solid #e1e1e1;"> + <tr> + <td style="padding:25px 0px;"> + <strong>Add this event to your calendar</strong> + <a href="https://www.google.com/calendar/render?action=TEMPLATE&text=${object.event_id.name}&dates=${date_begin}/${date_end}&location=${location}" style="padding:3px 5px;border:1px solid #a24689;color:#a24689;text-decoration:none;border-radius:3px;" target="new"><img src="/web_editor/font_to_img/61525/rgb(162,70,137)/16" style="vertical-align:middle;" height="16"> Google</a> + <a href="https://bay02.calendar.live.com/calendar/calendar.aspx?rru=addevent&summary=${object.event_id.name}&dtstart=${date_begin}&dtend=${date_end}&location=${location}" style="padding:3px 5px;border:1px solid #a24689;color:#a24689;text-decoration:none;border-radius:3px;" target="new"><img src="/web_editor/font_to_img/61525/rgb(162,70,137)/16" style="vertical-align:middle;" height="16"> Outlook</a> + <a href="https://calendar.yahoo.com/?v=60&view=d&type=20&title=${object.event_id.name}&in_loc=${location}&st=${format_tz(object.event_id.date_begin, tz='UTC', format='%Y%m%dT%H%M%S')}&et=${format_tz(object.event_id.date_end, tz='UTC', format='%Y%m%dT%H%M%S')}" style="padding:3px 5px;border:1px solid #a24689;color:#a24689;text-decoration:none;border-radius:3px;" target="new"><img src="/web_editor/font_to_img/61525/rgb(162,70,137)/16" style="vertical-align:middle;" height="16"> Yahoo</a> + </td> + </tr> + </table> + </td> + </tr> + </tbody> + </table> + <div style="width:598px;margin:0px auto;border-left:1px solid #dddddd;border-right:1px solid #dddddd;border-bottom:1px solid #dddddd;"> + <a href="https://maps.google.com/maps?q=${location}" target="new"> + <img src="http://maps.googleapis.com/maps/api/staticmap?autoscale=1&size=598x100&maptype=roadmap&format=png&visual_refresh=true&markers=size:mid%7Ccolor:0xa5117d%7Clabel:%7C${location}" style="vertical-align:bottom;" /> + </a> + </div> + <table style="width:600px;margin:0px auto;text-align:center;"> + <tbody> + <tr> + <td style="padding-top:10px;font-size: 12px;"> + <div>This email was sent to <a href="mailto:${object.email}" style="text-decoration:none;color:#a24689;">${object.email}</a></div> + <p style="margin:0px 0px 9px 0px;padding-top:10px;">Copyright © ${object.company_id.name}</p> + </td> + </tr> + </tbody> + </table> +</div> + ]]></field> </record> <record id="event_reminder" model="mail.template"> @@ -43,17 +155,130 @@ <field name="email_to" >${object.partner_id.email or object.email|safe}</field> <field name="lang">${object.partner_id.lang}</field> <field name="reply_to">${object.event_id.reply_to|safe}</field> - <field name="subject">Reminder of event ${object.event_id.name}</field> + <field name="subject">Reminder for ${object.event_id.name}</field> <field name="body_html"><![CDATA[ -<p>Dear ${object.name},</p> -<p>Thank you for your registration to the event ${object.event_id.name}.</p> -<p>The event will take place at ${object.event_id.address_id.city} -% if object.event_id.address_id.street -, ${object.event_id.address_id.street} -% endif -from ${object.event_id.date_begin_located} to ${object.event_id.date_end_located}.</p> -<p>If you have any questions, please let us know.</p> -<p>Best regards,</p>]]></field> +% set date_begin = format_tz(object.event_id.date_begin, tz='UTC', format='%Y%m%dT%H%M%SZ') +% set date_end = format_tz(object.event_id.date_end, tz='UTC', format='%Y%m%dT%H%M%SZ') +<div style="background:#F3F5F6;color:#515166;padding:25px 0px;font-family:Arial,Helvetica,sans-serif;font-size:14px;"> + <table style="width:600px;margin:5px auto;"> + <tbody> + <tr> + <td> + <a href="/"> + <img src="/logo" alt="${object.company_id.name}" style="vertical-align:baseline;max-width:100px;" /> + </a> + </td> + <td style="text-align:right;vertical-align:middle;"> + % if 'website_url' in object.event_id and object.event_id.website_url: + <a href="/event" style="text-decoration:none;color:#717188;">More Events</a> + % endif + </td> + </tr> + </tbody> + </table> + <table style="width:600px;margin:0px auto;background:white;border:1px solid #e1e1e1;"> + <tbody> + <tr> + <td style="padding:15px 20px 0px 20px;"> + <h2 style="font-weight:300;"> + Hi ${object.name}, + </h2> + <p style="font-size:16px;"> + Please keep in mind that the event + % if 'website_url' in object.event_id and object.event_id.website_url: + <a href="${object.event_id.website_url}" style="color:#a24689;text-decoration:none;">${object.event_id.name}</a> + % else: + <strong>${object.event_id.name}</strong> + % endif + takes place on + <strong>${object.get_date_range_str()}</strong> + </p> + </td> + </tr> + <tr> + <td style="padding:15px 20px 0px 20px;"> + <table style="width:100%;border-top:1px solid #e1e1e1;"> + <tr> + <td style="padding:25px 0px;vertical-align:top;"> + <img src="/web_editor/font_to_img/61505/rgb(81,81,102)/34" style="padding:4px;max-width:inherit;" height="34"> + </td> + <td style="padding:30px 10px 25px 10px;width:50%;vertical-align:top;"> + % if object.event_id.address_id.street: + <p style="margin:0px 0px 0px 0px;">${object.event_id.address_id.street},</p> + % set location = object.event_id.address_id.street + % endif + % if object.event_id.address_id.street2: + <p style="margin:0px 0px 0px 0px;">${object.event_id.address_id.street2},</p> + % set location = '%s, %s' % (location, object.event_id.address_id.street2) + % endif + % if object.event_id.address_id.city: + ${object.event_id.address_id.city}, + % set location = '%s, %s' % (location, object.event_id.address_id.city) + % endif + % if object.event_id.address_id.state_id.name: + ${object.event_id.address_id.state_id.name}, + % set location = '%s, %s' % (location, object.event_id.address_id.state_id.name) + % endif + % if object.event_id.address_id.zip: + ${object.event_id.address_id.zip}, + % set location = '%s, %s' % (location, object.event_id.address_id.zip) + % endif + % if object.event_id.address_id.country_id.name: + <p style="margin:0px 0px 0px 0px;">${object.event_id.address_id.country_id.name}</p> + % set location = '%s, %s' % (location, object.event_id.address_id.country_id.name) + % endif + </td> + <td style="padding:25px 0px;vertical-align:top;"> + <img src="/web_editor/font_to_img/61555/rgb(81,81,102)/34" style="padding:4px;max-width:inherit;" height="34"> + </td> + <td style="padding:25px 10px 25px 10px;width:50%;line-height:20px;vertical-align:top;"> + <div><strong>From</strong> ${object.event_id.date_begin_located}</div> + <div><strong>To</strong> ${object.event_id.date_end_located}</div> + <div style="font-size:12px;color:#9e9e9e"><i><strong>TZ</strong> ${object.event_id.date_tz}</i></div> + </td> + </tr> + </table> + % if object.event_id.organizer_id.email: + <table style="width:100%;border-top:1px solid #e1e1e1;"> + <tr> + <td style="padding:10px 0px 25px 0px;"> + <h2 style="font-weight:300;margin:10px 0px">Questions about this event?</h2> + <div>Please contact the organizer at <a href="mailto:${object.event_id.organizer_id.email}" style="text-decoration:none;color:#a24689;">${object.event_id.organizer_id.email}</a></div> + </td> + </tr> + </table> + % endif + <table style="width:100%;border-top:1px solid #e1e1e1;"> + <tr> + <td style="padding:25px 0px;"> + <strong>Add this event to your calendar</strong> + <a href="https://www.google.com/calendar/render?action=TEMPLATE&text=${object.event_id.name}&dates=${date_begin}/${date_end}&location=${location}" style="padding:3px 5px;border:1px solid #a24689;color:#a24689;text-decoration:none;border-radius:3px;" target="new"><img src="/web_editor/font_to_img/61525/rgb(162,70,137)/16" style="vertical-align:middle;" height="16"> Google</a> + <a href="https://bay02.calendar.live.com/calendar/calendar.aspx?rru=addevent&summary=${object.event_id.name}&dtstart=${date_begin}&dtend=${date_end}&location=${location}" style="padding:3px 5px;border:1px solid #a24689;color:#a24689;text-decoration:none;border-radius:3px;" target="new"><img src="/web_editor/font_to_img/61525/rgb(162,70,137)/16" style="vertical-align:middle;" height="16"> Outlook</a> + <a href="https://calendar.yahoo.com/?v=60&view=d&type=20&title=${object.event_id.name}&in_loc=${location}&st=${format_tz(object.event_id.date_begin, tz='UTC', format='%Y%m%dT%H%M%S')}&et=${format_tz(object.event_id.date_end, tz='UTC', format='%Y%m%dT%H%M%S')}" style="padding:3px 5px;border:1px solid #a24689;color:#a24689;text-decoration:none;border-radius:3px;" target="new"><img src="/web_editor/font_to_img/61525/rgb(162,70,137)/16" style="vertical-align:middle;" height="16"> Yahoo</a> + </td> + </tr> + </table> + </td> + </tr> + </tbody> + </table> + <div style="width:598px;margin:0px auto;border-left:1px solid #dddddd;border-right:1px solid #dddddd;border-bottom:1px solid #dddddd;"> + <a href="https://maps.google.com/maps?q=${location}" target="new"> + <img src="http://maps.googleapis.com/maps/api/staticmap?autoscale=1&size=598x100&maptype=roadmap&format=png&visual_refresh=true&markers=size:mid%7Ccolor:0xa5117d%7Clabel:%7C${location}" style="vertical-align:bottom;" /> + </a> + </div> + <table style="width:600px;margin:0px auto;text-align:center;"> + <tbody> + <tr> + <td style="padding-top:10px;font-size: 12px;"> + <div>This email was sent to <a href="mailto:${object.email}" style="text-decoration:none;color:#a24689;">${object.email}</a></div> + <p style="margin:0px 0px 9px 0px;padding-top:10px;">Copyright © ${object.company_id.name}</p> + </td> + </tr> + </tbody> + </table> +</div> + ]]></field> </record> </data> diff --git a/addons/event/models/event.py b/addons/event/models/event.py index c87c2947bef..707866af345 100644 --- a/addons/event/models/event.py +++ b/addons/event/models/event.py @@ -3,6 +3,7 @@ import pytz from odoo import _, api, fields, models +from odoo.addons.mail.models.mail_template import format_tz from odoo.exceptions import AccessError, UserError, ValidationError from odoo.tools.translate import html_translate @@ -57,6 +58,16 @@ class EventEvent(models.Model): 'interval_unit': 'now', 'interval_type': 'after_sub', 'template_id': self.env.ref('event.event_subscription') + }), (0, 0, { + 'interval_nbr': 2, + 'interval_unit': 'days', + 'interval_type': 'before_event', + 'template_id': self.env.ref('event.event_reminder') + }), (0, 0, { + 'interval_nbr': 15, + 'interval_unit': 'days', + 'interval_type': 'before_event', + 'template_id': self.env.ref('event.event_reminder') })] # Seats and computation @@ -410,3 +421,23 @@ class EventRegistration(models.Model): 'target': 'new', 'context': ctx, } + + @api.multi + def get_date_range_str(self): + self.ensure_one() + today = fields.Datetime.from_string(fields.Datetime.now()) + event_date = fields.Datetime.from_string(self.event_begin_date) + + if today.month == event_date.month: + if event_date.day == today.day: + return _('Today') + elif event_date.day - today.day == 1: + return _('Tomorrow') + elif event_date.isocalendar()[1] == today.isocalendar()[1]: + return _('This week') + else: + return _('This month') + elif event_date.month - today.month == 1: + return _('Next month') + else: + return format_tz(self.event_begin_date, tz='UTC', format='%Y%m%dT%H%M%SZ') diff --git a/addons/event/tests/common.py b/addons/event/tests/common.py index 15ad898e565..6e2f0406357 100644 --- a/addons/event/tests/common.py +++ b/addons/event/tests/common.py @@ -46,6 +46,9 @@ class TestEventCommon(common.TransactionCase): self.event_0 = self.env['event.event'].create({ 'name': 'TestEvent', - 'date_begin': fields.Datetime.to_string(datetime.today() - timedelta(days=5)), - 'date_end': fields.Datetime.to_string(datetime.today() + timedelta(days=5)), + '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, + })] }) diff --git a/addons/event/tests/test_event_flow.py b/addons/event/tests/test_event_flow.py index c35d03088df..90a4a99f20b 100644 --- a/addons/event/tests/test_event_flow.py +++ b/addons/event/tests/test_event_flow.py @@ -115,3 +115,6 @@ class TestEventFlow(TestEventCommon): 'auto_confirmation': 1 }) event_config.execute() + + def test_event_data(self): + self.assertEqual(self.event_0.registration_ids.get_date_range_str(), u'Tomorrow') diff --git a/addons/website_event/models/event.py b/addons/website_event/models/event.py index 82cc834f1eb..1fdc7bb8ff6 100644 --- a/addons/website_event/models/event.py +++ b/addons/website_event/models/event.py @@ -7,7 +7,6 @@ from odoo.addons.website.models.website import slug class Event(models.Model): - _name = 'event.event' _inherit = ['event.event', 'website.seo.metadata', 'website.published.mixin'] |
