@ -1,9 +1,9 @@
import logging
import random
from ast import literal_eval
from collections import defaultdict
from dateutil.relativedelta import relativedelta
from datetime import datetime , timedelta
from odoo import api , fields , models , _
from odoo.exceptions import UserError
from odoo.osv import expression
@ -17,6 +17,11 @@ _logger = logging.getLogger(__name__)
class ResUsers ( models . Model ) :
_inherit = ' res.users '
def random_token ( self ) :
# the token has an entropy of about 120 bits (6 bits/char * 20 chars)
chars = ' ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 '
return ' ' . join ( random . SystemRandom ( ) . choice ( chars ) for _ in range ( 20 ) )
@api.model
def signup ( self , values , token = None ) :
""" signup a user, to either:
@ -27,7 +32,25 @@ class ResUsers(models.Model):
: param token : signup token ( optional )
: return : ( dbname , login , password ) for the signed up user
"""
#recherche si un contact existe avec l'adresse email saisie
partner_email = self . env [ ' res.partner ' ] . sudo ( ) . search ( [ ( ' email ' , ' = ' , values . get ( ' login ' ) ) ] )
_logger . error ( " partner_email: " + str ( partner_email . email ) )
#si le contact existe déjà on vérifie s'il existe déjà un compte utilisateur
if partner_email :
user_email = self . env [ ' res.users ' ] . sudo ( ) . search ( [ ( ' login ' , ' = ' , values . get ( ' email ' ) ) ] )
#si un compte utilisateur existe déjà avec l'adresse email, message
if user_email : return True
#si pas de compte utilisateur on crée un token pour le contact trouvé
else :
partner_email . signup_type = ' signup '
partner_email . signup_token = self . random_token ( )
partner_email . signup_expiration = datetime . today ( ) + timedelta ( days = 1 )
token = partner_email . signup_token
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
@ -43,19 +66,20 @@ class ResUsers(models.Model):
values . pop ( ' lang ' , None )
if partner_user :
_logger . error ( " user exists, modify it according to values " + str ( partner . email ) )
# 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 :
_logger . error ( " user does not exist: sign up invited user " )
# 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 ' ) ,
} )
@ -67,6 +91,8 @@ class ResUsers(models.Model):
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 ' ) )