[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
This commit is contained in:
Jigar Patel
2016-08-18 15:12:08 +02:00
committed by Thibault Delavallée
parent 6b87c731fb
commit 9f7d7c6809
5 changed files with 279 additions and 18 deletions
+240 -15
View File
@@ -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>
+31
View File
@@ -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')
+5 -2
View File
@@ -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,
})]
})
+3
View File
@@ -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')
-1
View File
@@ -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']