auth_totp_mail/models/res_users.py

75 lines
2.9 KiB
Python
Raw Permalink Normal View History

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import _, models
class Users(models.Model):
_inherit = 'res.users'
def write(self, vals):
res = super().write(vals)
if 'totp_secret' in vals:
if vals.get('totp_secret'):
self._notify_security_setting_update(
_("Security Update: 2FA Activated"),
_("Two-factor authentication has been activated on your account"),
suggest_2fa=False,
)
else:
self._notify_security_setting_update(
_("Security Update: 2FA Deactivated"),
_("Two-factor authentication has been deactivated on your account"),
suggest_2fa=False,
)
return res
def _notify_security_setting_update_prepare_values(self, content, suggest_2fa=True, **kwargs):
"""" Prepare rendering values for the 'mail.account_security_setting_update' qweb template
:param bool suggest_2fa:
Whether or not to suggest the end-user to turn on 2FA authentication in the email sent.
It will only suggest to turn on 2FA if not already turned on on the user's account. """
values = super()._notify_security_setting_update_prepare_values(content, **kwargs)
values['suggest_2fa'] = suggest_2fa and not self.totp_enabled
return values
def action_open_my_account_settings(self):
action = {
"name": _("Account Security"),
"type": "ir.actions.act_window",
"res_model": "res.users",
"views": [[self.env.ref('auth_totp_mail.res_users_view_form').id, "form"]],
"res_id": self.id,
}
return action
def get_totp_invite_url(self):
return '/web#action=auth_totp_mail.action_activate_two_factor_authentication'
def action_totp_invite(self):
invite_template = self.env.ref('auth_totp_mail.mail_template_totp_invite')
users_to_invite = self.sudo().filtered(lambda user: not user.totp_secret)
for user in users_to_invite:
email_values = {
'email_from': self.env.user.email_formatted,
'author_id': self.env.user.partner_id.id,
}
invite_template.send_mail(user.id, force_send=True, email_values=email_values,
email_layout_xmlid='mail.mail_notification_light')
# Display a confirmation toaster
return {
'type': 'ir.actions.client',
'tag': 'display_notification',
'params': {
'type': 'info',
'sticky': False,
'message': _("Invitation to use two-factor authentication sent for the following user(s): %s",
', '.join(users_to_invite.mapped('name'))),
}
}