[IMP] mail: convert the "Reset Password" template into QWeb
Purpose ======= Convert the "Reset Password" template into QWeb, so the users can't modify it. All values are manually overwritten anyway, and we don't want the users to be able to change it. Technical ========= Now we also manually rollback the transaction, to be sure to not keep any record in database related to the password change. We manually create the <mail.mail> because all methods that allow to send an email from a QWeb template in mail thread use the mail composer, and `user_notification` is not supported for the `message_type` in this wizard. Before, force_send was set to False only when we import users. Now we just skip the email sending when we import and always set force_send to True. Task-3265210 closes odoo/odoo#125874 Related: odoo/upgrade#4807 Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
This commit is contained in:
@@ -22,6 +22,7 @@ Allow users to sign up and reset their password
|
||||
'views/res_config_settings_views.xml',
|
||||
'views/res_users_views.xml',
|
||||
'views/auth_signup_login_templates.xml',
|
||||
'views/auth_signup_templates_email.xml',
|
||||
'views/webclient_templates.xml',
|
||||
],
|
||||
'bootstrap': True,
|
||||
|
||||
@@ -1,102 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<data noupdate="1">
|
||||
<!-- Email template for reset password -->
|
||||
<record id="reset_password_email" model="mail.template">
|
||||
<field name="name">Settings: User Reset Password</field>
|
||||
<field name="model_id" ref="base.model_res_users"/>
|
||||
<field name="subject">Password reset</field>
|
||||
<field name="email_from">{{ (object.company_id.email_formatted or user.email_formatted) }}</field>
|
||||
<field name="email_to">{{ object.email_formatted }}</field>
|
||||
<field name="description">Sent to user who requested a password reset</field>
|
||||
<field name="body_html" type="html">
|
||||
<table border="0" cellpadding="0" cellspacing="0" style="padding-top: 16px; background-color: #FFFFFF; font-family:Verdana, Arial,sans-serif; color: #454748; width: 100%; border-collapse:separate;"><tr><td align="center">
|
||||
<table border="0" cellpadding="0" cellspacing="0" width="590" style="padding: 16px; background-color: #FFFFFF; color: #454748; border-collapse:separate;">
|
||||
<tbody>
|
||||
<!-- HEADER -->
|
||||
<tr>
|
||||
<td align="center" style="min-width: 590px;">
|
||||
<table border="0" cellpadding="0" cellspacing="0" width="590" style="min-width: 590px; background-color: white; padding: 0px 8px 0px 8px; border-collapse:separate;">
|
||||
<tr><td valign="middle">
|
||||
<span style="font-size: 10px;">Your Account</span><br/>
|
||||
<span style="font-size: 20px; font-weight: bold;">
|
||||
<t t-out="object.name or ''">Marc Demo</t>
|
||||
</span>
|
||||
</td><td valign="middle" align="right" t-if="not object.company_id.uses_default_logo">
|
||||
<img t-attf-src="/logo.png?company={{ object.company_id.id }}" style="padding: 0px; margin: 0px; height: auto; width: 80px;" t-att-alt="object.company_id.name"/>
|
||||
</td></tr>
|
||||
<tr><td colspan="2" style="text-align:center;">
|
||||
<hr width="100%" style="background-color:rgb(204,204,204);border:medium none;clear:both;display:block;font-size:0px;min-height:1px;line-height:0; margin: 16px 0px 16px 0px;"/>
|
||||
</td></tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<!-- CONTENT -->
|
||||
<tr>
|
||||
<td align="center" style="min-width: 590px;">
|
||||
<table border="0" cellpadding="0" cellspacing="0" width="590" style="min-width: 590px; background-color: white; padding: 0px 8px 0px 8px; border-collapse:separate;">
|
||||
<tr><td valign="top" style="font-size: 13px;">
|
||||
<div>
|
||||
Dear <t t-out="object.name or ''">Marc Demo</t>,<br/><br/>
|
||||
A password reset was requested for the Odoo account linked to this email.
|
||||
You may change your password by following this link which will remain valid during 24 hours:<br/>
|
||||
<div style="margin: 16px 0px 16px 0px;">
|
||||
<a t-att-href="object.signup_url"
|
||||
style="background-color: #875A7B; padding: 8px 16px 8px 16px; text-decoration: none; color: #fff; border-radius: 5px; font-size:13px;">
|
||||
Change password
|
||||
</a>
|
||||
</div>
|
||||
If you do not expect this, you can safely ignore this email.<br/><br/>
|
||||
Thanks,
|
||||
<t t-if="user.signature">
|
||||
<br/>
|
||||
<t t-out="user.signature or ''">--<br/>Mitchell Admin</t>
|
||||
</t>
|
||||
</div>
|
||||
</td></tr>
|
||||
<tr><td style="text-align:center;">
|
||||
<hr width="100%" style="background-color:rgb(204,204,204);border:medium none;clear:both;display:block;font-size:0px;min-height:1px;line-height:0; margin: 16px 0px 16px 0px;"/>
|
||||
</td></tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<!-- FOOTER -->
|
||||
<tr>
|
||||
<td align="center" style="min-width: 590px;">
|
||||
<table border="0" cellpadding="0" cellspacing="0" width="590" style="min-width: 590px; background-color: white; font-size: 11px; padding: 0px 8px 0px 8px; border-collapse:separate;">
|
||||
<tr><td valign="middle" align="left">
|
||||
<t t-out="object.company_id.name or ''">YourCompany</t>
|
||||
</td></tr>
|
||||
<tr><td valign="middle" align="left" style="opacity: 0.7;">
|
||||
<t t-out="object.company_id.phone or ''">+1 650-123-4567</t>
|
||||
|
||||
<t t-if="object.company_id.email">
|
||||
| <a t-att-href="'mailto:%s' % object.company_id.email" style="text-decoration:none; color: #454748;" t-out="object.company_id.email or ''">info@yourcompany.com</a>
|
||||
</t>
|
||||
<t t-if="object.company_id.website">
|
||||
| <a t-att-href="'%s' % object.company_id.website" style="text-decoration:none; color: #454748;" t-out="object.company_id.website or ''">http://www.example.com</a>
|
||||
</t>
|
||||
</td></tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</td></tr>
|
||||
<!-- POWERED BY -->
|
||||
<tr><td align="center" style="min-width: 590px;">
|
||||
<table border="0" cellpadding="0" cellspacing="0" width="590" style="min-width: 590px; background-color: #F1F1F1; color: #454748; padding: 8px; border-collapse:separate;">
|
||||
<tr><td style="text-align: center; font-size: 13px;">
|
||||
Powered by <a target="_blank" href="https://www.odoo.com?utm_source=db&utm_medium=auth" style="color: #875A7B;">Odoo</a>
|
||||
</td></tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
</table>
|
||||
</field>
|
||||
<field name="lang">{{ object.lang }}</field>
|
||||
<field name="auto_delete" eval="True"/>
|
||||
</record>
|
||||
|
||||
<!-- Email template for new users -->
|
||||
<record id="set_password_email" model="mail.template">
|
||||
<field name="name">Settings: New Portal Signup</field>
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
import contextlib
|
||||
import logging
|
||||
|
||||
from ast import literal_eval
|
||||
@@ -170,7 +171,7 @@ class ResUsers(models.Model):
|
||||
|
||||
def _action_reset_password(self):
|
||||
""" create signup token for each user, and send their signup url by email """
|
||||
if self.env.context.get('install_mode', False):
|
||||
if self.env.context.get('install_mode') or self.env.context.get('import_file'):
|
||||
return
|
||||
if self.filtered(lambda user: not user.active):
|
||||
raise UserError(_("You cannot perform this action on an archived user."))
|
||||
@@ -183,15 +184,12 @@ class ResUsers(models.Model):
|
||||
self.mapped('partner_id').signup_prepare(signup_type="reset", expiration=expiration)
|
||||
|
||||
# send email to users with their signup url
|
||||
template = False
|
||||
account_created_template = None
|
||||
if create_mode:
|
||||
try:
|
||||
template = self.env.ref('auth_signup.set_password_email', raise_if_not_found=False)
|
||||
except ValueError:
|
||||
pass
|
||||
if not template:
|
||||
template = self.env.ref('auth_signup.reset_password_email')
|
||||
assert template._name == 'mail.template'
|
||||
account_created_template = self.env.ref('auth_signup.set_password_email', raise_if_not_found=False)
|
||||
if account_created_template and account_created_template._name != 'mail.template':
|
||||
_logger.error("Wrong set password template %r", account_created_template)
|
||||
return
|
||||
|
||||
email_values = {
|
||||
'email_cc': False,
|
||||
@@ -206,10 +204,23 @@ class ResUsers(models.Model):
|
||||
if not user.email:
|
||||
raise UserError(_("Cannot send email: user %s has no email address.", user.name))
|
||||
email_values['email_to'] = user.email
|
||||
# TDE FIXME: make this template technical (qweb)
|
||||
with self.env.cr.savepoint():
|
||||
force_send = not(self.env.context.get('import_file', False))
|
||||
template.send_mail(user.id, force_send=force_send, raise_exception=True, email_values=email_values)
|
||||
with contextlib.closing(self.env.cr.savepoint()):
|
||||
if account_created_template:
|
||||
account_created_template.send_mail(
|
||||
user.id, force_send=True,
|
||||
raise_exception=True, email_values=email_values)
|
||||
else:
|
||||
body = self.env['mail.render.mixin']._render_template(
|
||||
self.env.ref('auth_signup.reset_password_email'),
|
||||
model='res.users', res_ids=user.ids,
|
||||
engine='qweb_view', options={'post_process': True})[user.id]
|
||||
mail = self.env['mail.mail'].sudo().create({
|
||||
'subject': _('Password reset'),
|
||||
'email_from': user.company_id.email_formatted or user.email_formatted,
|
||||
'body_html': body,
|
||||
**email_values,
|
||||
})
|
||||
mail.send()
|
||||
_logger.info("Password reset email sent for user <%s> to <%s>", user.login, user.email)
|
||||
|
||||
def send_unregistered_user_reminder(self, after_days=5):
|
||||
|
||||
@@ -0,0 +1,87 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<template id="reset_password_email" name="User Reset Password">
|
||||
<table border="0" cellpadding="0" cellspacing="0" style="padding-top: 16px; background-color: #FFFFFF; font-family:Verdana, Arial,sans-serif; color: #454748; width: 100%; border-collapse:separate;"><tr><td align="center">
|
||||
<table border="0" cellpadding="0" cellspacing="0" width="590" style="padding: 16px; background-color: #FFFFFF; color: #454748; border-collapse:separate;">
|
||||
<tbody>
|
||||
<!-- HEADER -->
|
||||
<tr>
|
||||
<td align="center" style="min-width: 590px;">
|
||||
<table border="0" cellpadding="0" cellspacing="0" width="590" style="min-width: 590px; background-color: white; padding: 0px 8px 0px 8px; border-collapse:separate;">
|
||||
<tr><td valign="middle">
|
||||
<span style="font-size: 10px;">Your Account</span><br/>
|
||||
<span style="font-size: 20px; font-weight: bold;">
|
||||
<t t-out="object.name or ''">Marc Demo</t>
|
||||
</span>
|
||||
</td><td valign="middle" align="right" t-if="not object.company_id.uses_default_logo">
|
||||
<img t-attf-src="/logo.png?company={{ object.company_id.id }}" style="padding: 0px; margin: 0px; height: auto; width: 80px;" t-att-alt="object.company_id.name"/>
|
||||
</td></tr>
|
||||
<tr><td colspan="2" style="text-align:center;">
|
||||
<hr width="100%" style="background-color:rgb(204,204,204);border:medium none;clear:both;display:block;font-size:0px;min-height:1px;line-height:0; margin: 16px 0px 16px 0px;"/>
|
||||
</td></tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<!-- CONTENT -->
|
||||
<tr>
|
||||
<td align="center" style="min-width: 590px;">
|
||||
<table border="0" cellpadding="0" cellspacing="0" width="590" style="min-width: 590px; background-color: white; padding: 0px 8px 0px 8px; border-collapse:separate;">
|
||||
<tr><td valign="top" style="font-size: 13px;">
|
||||
<div>
|
||||
Dear <t t-out="object.name or ''">Marc Demo</t>,<br/><br/>
|
||||
A password reset was requested for the Odoo account linked to this email.
|
||||
You may change your password by following this link which will remain valid during 24 hours:<br/>
|
||||
<div style="margin: 16px 0px 16px 0px;">
|
||||
<a t-att-href="object.signup_url"
|
||||
style="background-color: #875A7B; padding: 8px 16px 8px 16px; text-decoration: none; color: #fff; border-radius: 5px; font-size:13px;">
|
||||
Change password
|
||||
</a>
|
||||
</div>
|
||||
If you do not expect this, you can safely ignore this email.<br/><br/>
|
||||
Thanks,
|
||||
<t t-if="user.signature">
|
||||
<br/>
|
||||
<t t-out="user.signature">--<br/>Mitchell Admin</t>
|
||||
</t>
|
||||
</div>
|
||||
</td></tr>
|
||||
<tr><td style="text-align:center;">
|
||||
<hr width="100%" style="background-color:rgb(204,204,204);border:medium none;clear:both;display:block;font-size:0px;min-height:1px;line-height:0; margin: 16px 0px 16px 0px;"/>
|
||||
</td></tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<!-- FOOTER -->
|
||||
<tr>
|
||||
<td align="center" style="min-width: 590px;">
|
||||
<table border="0" cellpadding="0" cellspacing="0" width="590" style="min-width: 590px; background-color: white; font-size: 11px; padding: 0px 8px 0px 8px; border-collapse:separate;">
|
||||
<tr><td valign="middle" align="left">
|
||||
<t t-out="object.company_id.name or ''">YourCompany</t>
|
||||
</td></tr>
|
||||
<tr><td valign="middle" align="left" style="opacity: 0.7;">
|
||||
<t t-out="object.company_id.phone or ''">+1 650-123-4567</t>
|
||||
|
||||
<t t-if="object.company_id.email">
|
||||
| <a t-att-href="'mailto:%s' % object.company_id.email" style="text-decoration:none; color: #454748;" t-out="object.company_id.email">info@yourcompany.com</a>
|
||||
</t>
|
||||
<t t-if="object.company_id.website">
|
||||
| <a t-att-href="'%s' % object.company_id.website" style="text-decoration:none; color: #454748;" t-out="object.company_id.website">http://www.example.com</a>
|
||||
</t>
|
||||
</td></tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</td></tr>
|
||||
<!-- POWERED BY -->
|
||||
<tr><td align="center" style="min-width: 590px;">
|
||||
<table border="0" cellpadding="0" cellspacing="0" width="590" style="min-width: 590px; background-color: #F1F1F1; color: #454748; padding: 8px; border-collapse:separate;">
|
||||
<tr><td style="text-align: center; font-size: 13px;">
|
||||
Powered by <a target="_blank" href="https://www.odoo.com?utm_source=db&utm_medium=auth" style="color: #875A7B;">Odoo</a>
|
||||
</td></tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
</table>
|
||||
</template>
|
||||
</odoo>
|
||||
Reference in New Issue
Block a user