|
@ -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')) |