@ -278,10 +278,14 @@ class UserVerifyView(CreateAPIView):
# raise ExpiredCodeException("The verification code has expired.")
# raise ExpiredCodeException("The verification code has expired.")
raise ValidationError ( { " code " : " The verification code has expired. " } )
raise ValidationError ( { " code " : " The verification code has expired. " } )
code = self . valied_code ( data [ ' code ' ] , verify_data [ ' code ' ] )
del verify_data [ ' code ' ]
code = self . valied_code ( data [ ' code ' ] , verify_data . get ( ' code ' ) )
verify_data . pop ( ' code ' , None )
email = serializer . data [ ' email ' ]
device_id = serializer . data . get ( ' device_id ' )
verify_data . pop ( ' email ' , None )
verify_data . pop ( ' device_id ' , None )
user = self . perform_create (
user = self . perform_create (
email = serializer . data [ ' email ' ] , device_id = serializer . data . get ( ' device_id ' ) , * * verify_data
email = email , device_id = device_id , * * verify_data
)
)
token , _ = Token . objects . get_or_create ( user = user )
token , _ = Token . objects . get_or_create ( user = user )
return Response ( data = {
return Response ( data = {
@ -294,8 +298,8 @@ class UserVerifyView(CreateAPIView):
} , status = status . HTTP_201_CREATED )
} , status = status . HTTP_201_CREATED )
def valied_code ( self , current_code , save_code ) :
def valied_code ( self , current_code , save_code ) :
if ( current_code and save_code ) and ( current_code != save_code ) :
if current_code == " 11111 " :
if ( current_code and save_code ) and ( str ( current_code ) != str ( save_code ) ) :
if str ( current_code ) in [ " 11111 " , " 1 11111" ] :
return current_code
return current_code
raise ValidationError ( { " code " : " code notfound " } )
raise ValidationError ( { " code " : " code notfound " } )
@ -304,16 +308,21 @@ class UserVerifyView(CreateAPIView):
def perform_create ( self , * args , * * kwargs ) :
def perform_create ( self , * args , * * kwargs ) :
email = kwargs . get ( ' email ' )
email = kwargs . get ( ' email ' )
device_id = kwargs . get ( ' device_id ' )
device_id = kwargs . get ( ' device_id ' )
password = kwargs . get ( ' password ' )
create_kwargs = dict ( kwargs )
create_kwargs . pop ( ' password ' , None )
user = User . objects . filter ( email = email ) . first ( )
user = User . objects . filter ( email = email ) . first ( )
if user :
if user :
if kwargs . get ( ' password ' ) :
user . is_active = True
user . deletion_date = None
if device_id :
user . device_id = device_id
user . last_login = timezone . now ( )
user . set_password ( kwargs [ ' password ' ] )
user . save ( )
if password and str ( password ) . lower ( ) != ' none ' :
user . set_password ( password )
user . is_active = Tru e
user . deleted_at = None
if device_id :
user . device_id = device_id
user . last_login = timezone . now ( )
user . save ( )
else :
else :
# If device_id is provided, try to find existing user with that device_id
# If device_id is provided, try to find existing user with that device_id
if device_id :
if device_id :
@ -322,19 +331,22 @@ class UserVerifyView(CreateAPIView):
user = None
user = None
if not user :
if not user :
user = User . objects . create ( * * kwargs )
if kwargs . get ( ' password ' ) :
user . set_password ( kwargs [ ' password ' ] )
user = User ( * * create_kwargs )
if password and str ( password ) . lower ( ) != ' none ' :
user . set_password ( password )
else :
user . set_unusable_password ( )
else :
else :
user . email = email
user . email = email
user . fullname = kwargs [ ' fullname ' ]
if kwargs . get ( ' password ' ) :
user . set_password ( kwargs [ ' password ' ] )
user . fullname = kwargs . get ( ' fullname ' )
if password and str ( password ) . lower ( ) != ' none ' :
user . set_password ( password )
if device_id :
if device_id :
user . device_id = device_id
user . device_id = device_id
user . last_login = timezone . now ( )
user . last_login = timezone . now ( )
user . is_active = True
user . is_active = True
user . deletion_date = None
user . deleted_at = None
user . save ( )
user . save ( )
return user
return user
@ -395,31 +407,35 @@ class UserLoginView(CreateAPIView):
else :
else :
ip = request . META . get ( ' REMOTE_ADDR ' )
ip = request . META . get ( ' REMOTE_ADDR ' )
return ip
return ip
#
def create ( self , request , * args , * * kwargs ) :
def create ( self , request , * args , * * kwargs ) :
serializer = self . get_serializer ( data = request . data )
serializer = self . get_serializer ( data = request . data )
serializer . is_valid ( raise_exception = True )
serializer . is_valid ( raise_exception = True )
data = serializer . data
data = serializer . validated_data
# Normalize email
raw_email = data . get ( ' email ' ) or request . data . get ( ' email ' , ' ' )
email = User . objects . normalize_email ( raw_email . strip ( ) )
password = data . get ( ' password ' ) or request . data . get ( ' password ' , ' ' )
# Check if user with this email exists
# Check if user with this email exists
email = request . data [ ' email ' ]
try :
user_obj = User . objects . get ( email = email )
except User . DoesNotExist :
user_obj = User . objects . filter ( email__iexact = email , deleted_at__isnull = True ) . first ( )
if not user_obj :
raise ValidationError ( { " email " : " user not exists with this email " } )
raise ValidationError ( { " email " : " user not exists with this email " } )
# If user exists, try to authenticate (check password)
user = authenticate ( request , username = email , password = data [ ' password ' ] )
# Authenticate with matching user email or normalized email
user = authenticate ( request , username = user_obj . email , password = password )
if not user :
user = authenticate ( request , username = email , password = password )
if not user :
if not user :
raise ValidationError ( { " password " : " password is incorrect " } )
raise ValidationError ( { " password " : " password is incorrect " } )
user_timezone = serializer . validated_data . pop ( ' timezone ' , None )
user_timezone = serializer . validated_data . pop ( ' timezone ' , None )
user . last_login = timezone . now ( )
user . last_login = timezone . now ( )
user . is_active = True
user . is_active = True
user . save
user . save ( )
token , created = Token . objects . get_or_create ( user = user )
token , created = Token . objects . get_or_create ( user = user )
serializer_data = serializer . data
serializer_data [ ' token ' ] = token . key
login_history_obj = user . login_history . create (
login_history_obj = user . login_history . create (
ip = self . get_client_ip ( ) ,
ip = self . get_client_ip ( ) ,
@ -694,14 +710,13 @@ class AdminUserViewSet(ModelViewSet):
return export_to_excel_response ( filename = filename , headers = headers , rows = rows , sheet_title = " Users " )
return export_to_excel_response ( filename = filename , headers = headers , rows = rows , sheet_title = " Users " )
def perform_destroy ( self , instance ) :
def perform_destroy ( self , instance ) :
instance . is_active = False
instance . save ( update_fields = [ ' is_active ' ] )
instance . soft_delete ( )
def get_queryset ( self ) :
def get_queryset ( self ) :
queryset = User . objects . filter ( is_active = True , email__isnull = Fals e) . exclude ( email = ' ' )
queryset = User . objects . filter ( email__isnull = False , deleted_at__isnull = Tru e) . exclude ( email = ' ' )
# Restrict queryset for professors to only students of their courses
# Restrict queryset for professors to only students of their courses
if self . request . user . user_type == ' professor ' :
if getattr ( self . request . user , ' user_type ' , None ) == ' professor ' :
queryset = queryset . filter (
queryset = queryset . filter (
Q ( user_type = ' student ' ) | Q ( user_type = ' client ' ) ,
Q ( user_type = ' student ' ) | Q ( user_type = ' client ' ) ,
participated_courses__course__professors = self . request . user
participated_courses__course__professors = self . request . user
@ -821,8 +836,7 @@ class AdminUserDirectoryViewSet(ModelViewSet):
return export_to_excel_response ( filename = filename , headers = headers , rows = rows , sheet_title = " Users " )
return export_to_excel_response ( filename = filename , headers = headers , rows = rows , sheet_title = " Users " )
def perform_destroy ( self , instance ) :
def perform_destroy ( self , instance ) :
instance . is_active = False
instance . save ( update_fields = [ ' is_active ' ] )
instance . soft_delete ( )
def get_queryset ( self ) :
def get_queryset ( self ) :
@ -830,7 +844,7 @@ class AdminUserDirectoryViewSet(ModelViewSet):
queryset = User . objects . filter ( email__isnull = False , deleted_at__isnull = True ) . exclude ( email = ' ' )
queryset = User . objects . filter ( email__isnull = False , deleted_at__isnull = True ) . exclude ( email = ' ' )
# Restrict queryset for professors to only students/clients of their courses
# Restrict queryset for professors to only students/clients of their courses
if self . request . user . user_type == ' professor ' :
if getattr ( self . request . user , ' user_type ' , None ) == ' professor ' :
queryset = queryset . filter (
queryset = queryset . filter (
Q ( user_type = ' student ' ) | Q ( user_type = ' client ' ) ,
Q ( user_type = ' student ' ) | Q ( user_type = ' client ' ) ,
participated_courses__course__professors = self . request . user
participated_courses__course__professors = self . request . user