From 68bfa256b2425c777423d911a5a3fae6c7beef90 Mon Sep 17 00:00:00 2001 From: root Date: Fri, 5 Aug 2022 17:05:34 +0200 Subject: [PATCH] corrections --- models/res_users.py | 72 +++++++++++++++++++++++++++ views/auth_signup_login_templates.xml | 21 ++++++++ views/website_templates.xml | 8 +++ 3 files changed, 101 insertions(+) create mode 100644 models/res_users.py create mode 100644 views/auth_signup_login_templates.xml create mode 100644 views/website_templates.xml diff --git a/models/res_users.py b/models/res_users.py new file mode 100644 index 0000000..6aad1f8 --- /dev/null +++ b/models/res_users.py @@ -0,0 +1,72 @@ +import logging + +from ast import literal_eval +from collections import defaultdict +from dateutil.relativedelta import relativedelta + +from odoo import api, fields, models, _ +from odoo.exceptions import UserError +from odoo.osv import expression +from odoo.tools.misc import ustr + +from odoo.addons.base.models.ir_mail_server import MailDeliveryException +from odoo.addons.auth_signup.models.res_partner import SignupError, now + +_logger = logging.getLogger(__name__) + +class ResUsers(models.Model): + _inherit = 'res.users' + + @api.model + def signup(self, values, token=None): + """ signup a user, to either: + - create a new user (no token), or + - create a user for a partner (with token, but no user for partner), or + - change the password of a user (with token, and existing user). + :param values: a dictionary with field values that are written on user + :param token: signup token (optional) + :return: (dbname, login, password) for the signed up user + """ + if token: + # signup with a token: find the corresponding partner id + partner = self.env['res.partner']._signup_retrieve_partner(token, check_validity=True, raise_exception=True) + # invalidate signup token + partner.write({'signup_token': False, 'signup_type': False, 'signup_expiration': False}) + + partner_user = partner.user_ids and partner.user_ids[0] or False + + # avoid overwriting existing (presumably correct) values with geolocation data + if partner.country_id or partner.zip or partner.city: + values.pop('city', None) + values.pop('country_id', None) + if partner.lang: + values.pop('lang', None) + + if partner_user: + # user exists, modify it according to values + values.pop('login', None) + values.pop('name', None) + values.pop('firstname', None) + partner_user.write(values) + if not partner_user.login_date: + partner_user._notify_inviter() + return (self.env.cr.dbname, partner_user.login, values.get('password')) + else: + # user does not exist: sign up invited user + values.update({ + 'name': partner.name, + 'firstname': partner.firstname, + 'partner_id': partner.id, + 'email': values.get('email') or values.get('login'), + }) + if partner.company_id: + values['company_id'] = partner.company_id.id + values['company_ids'] = [(6, 0, [partner.company_id.id])] + partner_user = self._signup_create_user(values) + partner_user._notify_inviter() + else: + # no token, sign up an external user + values['email'] = values.get('email') or values.get('login') + self._signup_create_user(values) + + return (self.env.cr.dbname, values.get('login'), values.get('password')) \ No newline at end of file diff --git a/views/auth_signup_login_templates.xml b/views/auth_signup_login_templates.xml new file mode 100644 index 0000000..667f107 --- /dev/null +++ b/views/auth_signup_login_templates.xml @@ -0,0 +1,21 @@ + + + + + \ No newline at end of file diff --git a/views/website_templates.xml b/views/website_templates.xml new file mode 100644 index 0000000..cf53f4d --- /dev/null +++ b/views/website_templates.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file