from odoo import models, fields from datetime import datetime from pytz import UTC import random, string class ResUsers(models.Model): _inherit = 'res.users' reset_password_token = fields.Char(string="Reset Password Token") activation_token = fields.Char(string="Activation Token") otp_code = fields.Char(string='OTP Code') otp_create_date = fields.Datetime(string='OTP Create Date') def _generate_otp(self): for user in self: user.otp_code = '{:04d}'.format(random.randint(0, 9999)) user.otp_create_date = fields.Datetime.now() def _generate_activation_token(self): for user in self: token_source = string.ascii_letters + string.digits user.activation_token = ''.join(random.choice(token_source) for i in range(21)) def send_activation_mail(self): template = self.env.ref('indoteknik_custom.mail_template_res_user_activation_request') for user in self: user._generate_otp() user._generate_activation_token() template.send_mail(user.id, force_send=True) def get_activation_token_url(self): base_url = self.env['ir.config_parameter'].get_param('site.base.url') return f'{base_url}/register?activation=token&token={self.activation_token}' def get_voucher_code(self, type): if type == 'activation': vouchers = self.env['voucher'].get_active_voucher([('show_on_email', '=', 'user_activation')]) if not vouchers: return None return ', '.join(x.code for x in vouchers) return None def check_access(self, model, mode): assert mode in ('read', 'write', 'create', 'unlink', 'import', 'export'), 'Invalid access mode' self._cr.execute(""" SELECT MAX(CASE WHEN perm_{mode} THEN 1 ELSE 0 END) FROM ir_model_access a JOIN ir_model m ON (m.id = a.model_id) JOIN res_groups_users_rel gu ON (gu.gid = a.group_id) WHERE m.model = %s AND gu.uid = %s AND a.active IS TRUE """.format(mode=mode), (model, self._uid,)) r = self._cr.fetchone()[0] return bool(r)