2727import logging
2828
2929from django .contrib .auth import get_user_model
30+ from django .core .exceptions import FieldDoesNotExist
3031from django .db import transaction , IntegrityError
3132from django .db .models import Q
3233from django .http import Http404
34+ from django .template .defaultfilters import slugify
3335from rest_framework import serializers , status
3436from rest_framework .exceptions import PermissionDenied
3537from rest_framework .generics import (ListAPIView , ListCreateAPIView ,
4345from ..docs import extend_schema , OpenApiResponse
4446from ..decorators import _has_valid_access
4547from ..filters import OrderingFilter , SearchFilter
46- from ..helpers import full_name_natural_split
48+ from ..helpers import full_name_natural_parts
4749from ..mixins import (OrganizationMixin , OrganizationCreateMixin ,
4850 OrganizationSmartListMixin , RoleDescriptionMixin , RoleMixin ,
4951 RoleSmartListMixin , UserMixin )
@@ -70,52 +72,53 @@ def create_user_from_email(email, password=None, **kwargs):
7072 # `signup.models.ActivatedUserManager.create_user_from_email`.
7173 # Its purpose here instead of calling the above is to have
7274 # djaodjin-saas works as a stand-alone project (no dependency on signup).
75+ request = kwargs .pop ('request' , None )
7376 user = None
7477 user_model = get_user_model ()
75- first_name = kwargs .get ('first_name' , "" )
76- last_name = kwargs .get ('last_name' , "" )
77- if not (first_name or last_name ):
78- first_name , last_name = full_name_natural_split (
79- kwargs .get ('full_name' , '' ))
80- first_name = _clean_field (
81- user_model , 'first_name' , first_name , prefix = 'user_' )
82- last_name = _clean_field (
83- user_model , 'last_name' , last_name , prefix = 'user_' )
8478 # The e-mail address was already validated by the Serializer.
8579 err = IntegrityError ()
86- if hasattr ( user_model . objects , 'create_user_from_email' ):
87- # Implementation Note:
88- # calling `signup.models.ActivatedUserManager.create_user_from_email`
89- # directly bypasses sending a `user_registered` signal.
90- user = user_model . objects . create_user_from_email (
91- email , password = password ,
92- first_name = first_name , last_name = last_name )
93- else :
94- username = _clean_field (
95- user_model , 'username' , email . split ( '@' )[ 0 ], prefix = 'user_' )
96- #pylint:disable=protected-access
97- field = user_model . _meta . get_field ( 'username' )
98- max_length = field . max_length
99- trials = 0
100- username_base = username
101- while trials < 10 :
80+ user_kwargs = {}
81+ user_kwargs . update ( kwargs )
82+ username = _clean_field (
83+ user_model , 'username' , slugify ( email . split ( '@' )[ 0 ]), prefix = 'user_' )
84+ if ( 'first_name' not in user_kwargs or
85+ 'last_name' not in user_kwargs ):
86+ first_name , _mid , last_name = \
87+ full_name_natural_parts ( kwargs . get ( 'full_name' ))
88+ if 'first_name' not in user_kwargs :
89+ user_kwargs . update ({ 'first_name' : first_name } )
90+ if 'last_name' not in user_kwargs :
91+ user_kwargs . update ({ 'last_name' : last_name } )
92+ if not hasattr ( user_model . objects , 'create_user_from_email' ):
93+ # When djaodjin-saas is used in conjunction with djaodjin-signup,
94+ # we are able to set a full_name, phone number, etc.
95+ for field_name in kwargs :
10296 try :
103- user = user_model .objects .create_user (username ,
104- email = email , first_name = first_name , last_name = last_name )
105- break
106- except IntegrityError as exp :
107- err = exp
108- suffix = '-%s' % generate_random_slug (3 )
109- if len (username_base ) + len (suffix ) > max_length :
110- username = '%s%s' % (
111- username_base [:(max_length - len (suffix ))],
112- suffix )
113- else :
114- username = '%s%s' % (username_base , suffix )
115- trials = trials + 1
97+ _field = user_model ._meta .get_field (field_name )
98+ except (FieldDoesNotExist , KeyError ):
99+ del user_kwargs [field_name ]
100+ #pylint:disable=protected-access
101+ field = user_model ._meta .get_field ('username' )
102+ max_length = field .max_length
103+ trials = 0
104+ username_base = username
105+ while trials < 10 :
106+ try :
107+ user = user_model .objects .create_user (username ,
108+ email = email , password = password , ** user_kwargs )
109+ break
110+ except IntegrityError as exp :
111+ err = exp
112+ suffix = '-%s' % generate_random_slug (3 )
113+ if len (username_base ) + len (suffix ) > max_length :
114+ username = '%s%s' % (
115+ username_base [:(max_length - len (suffix ))],
116+ suffix )
117+ else :
118+ username = '%s%s' % (username_base , suffix )
119+ trials = trials + 1
116120 if not user :
117121 raise err
118- request = kwargs .get ('request' , None )
119122 invited_by = request .user if request else None
120123 LOGGER .info ("'%s %s <%s>' invited by '%s'" ,
121124 user .first_name , user .last_name , user .email , invited_by ,
0 commit comments