
    yio                        d dl mZ d dlmZ ddlmZ d dlZd dlZd dlm	Z	 d dl
mZmZ d dlmZ d d	lmZ d d
lmZ d dlmZmZmZ ddlmZmZ  G d de	j0                        Z G d de	j0                        Z e edddd      g       G d de             Z e eddddd      g       G d de	j0                               Z e ed dddd!d"d#d$d%dd&d'gd(	      g       G d) d*e	j0                               Z e ed+dddd!d"d#d$d,d%d-dd&d'gd.d/gd0      g       G d1 d2e	j0                               Z e ed3d4d5d6d7d&d8d9d:      g       G d; d<e	j0                               Z G d= d>e	j0                        Z  e ed?d@dAdAdB      g       G dC dDe	jB                               Z" e edEdFd%i      g       G dG dHe	j0                               Z# G dI dJe	j0                        Z$ G dK dLe	jB                        Z% e edMd!d"dNdOd6dPdQdQdR      g       G dS dTe	j0                               Z& G dU dVe	jB                        Z'y)W    )TokenObtainPairSerializer)timezone   )LoginSessionN)serializers)UserGroup)validate_password)ValidationError)authenticate)extend_schema_serializerextend_schema_fieldOpenApiExample)UserProfiler   c                        e Zd Z G d d      Zy)UserSerializerc                       e Zd ZeZg dZy)UserSerializer.Meta)idusernameemailN__name__
__module____qualname__r   modelfields     /backend/users/serializers.pyMetar      s    ,r   r!   Nr   r   r   r!   r   r   r    r   r      s    - -r   r   c                        e Zd Z G d d      Zy)RoleSerializerc                       e Zd ZeZddgZy)RoleSerializer.Metar   nameN)r   r   r   r	   r   r   r   r   r    r!   r&      s    r   r!   Nr"   r   r   r    r$   r$      s       r   r$   zLogin Requestzuser@example.comyour_password)r   password)value)examplesc                   j    e Zd Zej                  Z ej                  dd      Zd Z	d Z
d Zd Zd Zy)	EmailLoginSerializerF)requireddefaultc           	         |j                  d      }|j                  d      }|j                  dd      }i }|sdg|d<   |sdg|d<   |rt        j                  |      	 t        j                  j                  |      }t        |j                  |
      }|st        j                  ddi      |j                  st        j                  ddi      || _	        | j                  |      }|r&|j                  t        j                  d             |j                  }| j                  |       t!        |      t!        |      |j"                  |j                  |j$                  |j&                  j)                         D 	cg c]  }	|	j*                   c}	ddS # t        j
                  $ r t        j                  dd	i      w xY wc c}	w )Nr   r)   remember_meFzEmail is required.zPassword is required.r   detailz!No account found with this email.r   r)   zInvalid email or password.zThis account is inactive.   )days)lifetime)r   r   r   roles)refreshaccessuser)getr   r   r   objectsDoesNotExistr   r   	is_activer;   	get_tokenset_expr   	timedeltaaccess_tokentrack_login_sessionstrr   r   groupsallr'   )
selfattrsr   r)   r1   errorsr;   r9   rC   groups
             r    validatezEmailLoginSerializer.validate(   s   		'"99Z(iiu534F7O"9!:F:--f55	<<##%#0D T]]XF--x9U.VWW~~--x9T.UVV 	..&OOX%7%7R%@OA++ 	  & 7|,'gg MM26++//2CD2C%**2CD		
 		
5    	-->? 	B Es    F  G+Gc                    	 | j                   j                  d      }|sy|j                  j                  dd      }t        j                  |      }| j                  |      }d|j                   dt        j                         j                          dt        j                         j                  dd  }t        j                  j                  ||||| j!                  |      |j"                  j$                   d|j"                  j&                   |j(                  j$                   d|j(                  j&                   | j+                  |      d	
	       y# t,        $ r}t/        d|        Y d}~yd}~ww xY w)zTrack login sessionrequestNHTTP_USER_AGENT jwt__    T)	r;   session_key
ip_address
user_agentdevice_typebrowseroperating_systemlocationr?   zSession tracking failed: )contextr<   METAuser_agentsparseget_client_ipr   r   now	timestampuuiduuid4hexr   r=   createget_device_typerY   familyversion_stringosget_location	Exceptionprint)rH   r;   rN   user_agent_stringrW   rV   rU   es           r    rD   z(EmailLoginSerializer.track_login_session]   sW   	3ll&&y1G !( 0 01BB G$**+<=J++G4J !	8<<>+C+C+E*Fa

HXHXY[Z[H\G]^K   '''%, 00<%--445Qz7I7I7X7X6YZ$.MM$8$8#9:==;W;W:X!Y**:6 ( 
  	3-aS122	3s   E D6E 	E8 E33E8c                     |j                   j                  d      }|r$|j                  d      d   j                         }|S |j                   j                  dd      }|S )zGet client IP addressHTTP_X_FORWARDED_FOR,r   REMOTE_ADDRUnknown)r]   r<   splitstrip)rH   rN   x_forwarded_forips       r    r`   z"EmailLoginSerializer.get_client_ip|   s\    !,,**+AB &&s+A.446B 	 !!-;B	r   c                 R    |j                   ry|j                  ry|j                  ryy)zDetermine device typeMobileTabletDesktoprt   )	is_mobile	is_tabletis_pc)rH   rW   s     r    rg   z$EmailLoginSerializer.get_device_type   s)    !!r   c                 R    |dv s"|j                  d      s|j                  d      ryy)zGet approximate location)z	127.0.0.1	localhostz192.168.z10.zLocal NetworkzUnknown Location)
startswith)rH   rV   s     r    rk   z!EmailLoginSerializer.get_location   s-    33z7L7LZ7X\f\q\qrw\x"!r   N)r   r   r   r   EMAIL_FIELDusername_fieldr   BooleanFieldr1   rL   rD   r`   rg   rk   r   r   r    r-   r-      s=     %%N*+**E5IK3
j3>	"r   r-   zRegistration Requestjohndoesecure_password123zjohn@example.comr   r)   r   c                   L    e Zd Z ej                  d      Z G d d      Zd Zy)RegisterSerializerT)
write_onlyc                       e Zd ZeZg dZy)RegisterSerializer.Metar   Nr   r   r   r    r!   r      s    2r   r!   c                    t         j                  j                  |d   |d   |j                  dd            }t        j                  j                  d      \  }}|j                  j                  |       t        j                  j                  || j                  j                  d      r<| j                  d   j                  j                  r| j                  d   j                  nd d	
       |S )Nr   r)   r   rP   r   Adminr'   rN   T)r;   
created_bysuper_admin)r   r=   create_userr<   r	   get_or_createrF   addr   rf   r\   r;   is_authenticated)rH   validated_datar;   admin_groupcreateds        r    rf   zRegisterSerializer.create   s    ||''#J/#J/ $$Wb1 ( 
  %}}:::HW$ 	""7;||7G7G	7RW[WcWcdmWnWsWs  XE  XEt||I.33  KO 	# 	
 r   N)r   r   r   r   	CharFieldr)   r!   rf   r   r   r    r   r      s%     %{$$5H3 3r   r   zUser List ResponseJohnDoezJohn Doez2025-01-01T12:00:00ZTzProperty Manager)r   r'   )	r   r   r   
first_name	last_name	full_namedate_joinedr?   r8   c                      e Zd ZdZ ej
                         Z ej
                         Z ej
                         Z ej
                         Z	 G d d      Z
 e ej                               defd       Z e ed            d        Z e ej                               d	        Z e ej$                               d
        Zy)UserListSerializerz7Serializer for listing users with essential fields onlyc                       e Zd ZeZg dZy)UserListSerializer.Meta)r   r   r   r   r   r   r   r?   r8   r   is_super_adminNr   r   r   r    r!   r      s    
r   r!   returnc                 p    |j                    d|j                   j                         xs |j                  S NrT   r   r   rv   r   rH   objs     r    get_full_namez UserListSerializer.get_full_name   .    ..!3==/288:JcllJr   Tmanyc                 `    t        |j                  j                         d      j                  S )NTr   )r$   rF   rG   datar   s     r    	get_roleszUserListSerializer.get_roles   s     cjjnn.T:???r   c                     	 |j                   }|j                  r|j                  j                  S 	 y # t        j                  $ r Y y w xY wNprofiler   r   r   r>   rH   r   r   s      r    get_created_byz!UserListSerializer.get_created_by   R    	kkG!!))222 "  '' 		   -2 AAc                 b    	 |j                   j                  S # t        j                  $ r Y yw xY wzCheck if user is super adminFr   r   r   r>   r   s     r    get_is_super_adminz%UserListSerializer.get_is_super_admin   /    	;;***'' 		    ..N)r   r   r   __doc__r   SerializerMethodFieldr   r8   r   r   r!   r   r   rE   r   r$   r   r   r   r   r   r   r    r   r      s    0 B1113I-K--/E2224J6[668N
 
 ...01KC K 2K T23@ 4@ ...01 2 11134 5r   r   zUser Detail Responsez2025-01-15T10:30:00ZFzproperties.add_propertyzproperties.change_property)r   r   r   r   r   r   r   
last_loginr?   is_staffr8   permissionsc                   *   e Zd ZdZ ej
                         Z ej
                         Z ej
                         Z ej
                         Z	 ej
                         Z
 ej
                         Z G d d      Z e ej                               d        Zy)UserDetailSerializerz,Detailed serializer for individual user datac                       e Zd ZeZg dZy)UserDetailSerializer.Meta)r   r   r   r   r   r   r   r   r?   r   r8   r   r   created_users_countr   Nr   r   r   r    r!   r   $  s    
r   r!   c                 b    	 |j                   j                  S # t        j                  $ r Y yw xY wr   r   r   s     r    r   z'UserDetailSerializer.get_is_super_admin/  r   r   N)r   r   r   r   r   r   r   r8   r   r   r   r   r!   r   r   r   r   r   r    r   r      s    > 71113I-K--/E3+335K2224J;+;;=6[668N
 
 11134 5r   r   zUpdate Profile RequestJaylonDorwartz+1 (555) 123-4567zBliss Property Managementz-https://example.com/profile-images/jaylon.jpgz(https://example.com/logos/bliss-logo.png)r   r   phone_numbercompany	job_title	image_urlcompany_logo_urlc                      e Zd ZdZ ej
                  dddd      Z ej
                  dddd      Z ej                  dd	
      Z	 ej
                  dddd      Z
 ej
                  dddd      Z ej
                  dddd      Z ej                  dddd      Z ej                  dddd      Z G d d      Zd Zd Zy)UserProfileUpdateSerializerz0Serializer for updating user profile informationr5   FTUser's first name
max_lengthr.   allow_blank	help_text   User's last namezUser's email addressr.   r      zUser's phone number   Company named   zJob title/positioni  zProfile image URLzCompany logo URLc                       e Zd ZeZg dZy) UserProfileUpdateSerializer.Meta)r   r   r   r   r   r   r   r   Nr   r   r   r    r!   r   |      
r   r!   c                     | j                   }t        j                  j                  |      j	                  |j
                        j                         rt        j                  d      |S )Validate email uniquenessr2   )r   z-This email is already in use by another user.)	instancer   r=   filterexcluder   existsr   r   rH   r*   r;   s      r    validate_emailz*UserProfileUpdateSerializer.validate_email  sR    }}<<U+33tww3?FFH--.]^^r   c                    g d}g d}|D ]  }||v st        ||||           |j                          t        j                  j	                  |      \  }}|D ]  }||v st        ||||           |j                          |S )z'Update both User and UserProfile fields)r   r   r   )r   r   r   r   r   )r;   )setattrsaver   r=   r   )rH   r   r   user_fieldsprofile_fieldsfieldr   r   s           r    updatez"UserProfileUpdateSerializer.update  s     ;b !E&%)>? ! 	 '..<<(<K $E&u(=> $ 	r   N)r   r   r   r   r   r   r   r   
EmailFieldr   r   r   r   URLFieldr   r   r!   r   r   r   r   r    r   r   7  s   " ; '&&%	J &%%$	I #K""(E );(('	L $k## 	G &%%&	I %$$%	I ,{++$	
 
r   r   c                      e Zd ZdZ ej
                         Z ej
                         Z ej
                         Z ej
                         Z	 ej
                         Z
 ej
                         Z ej
                         Z ej
                         Z ej
                         Z ej
                         Z G d d      Z e ej$                               defd       Z e ej$                               d        Z e ej$                               d        Z e ej$                               d        Z e ej0                               d	        Z e ej0                               d
        Z e ej6                               d        Z e ej$                               d        Z e ej<                   ej$                                     d        Z e ej@                               d        Z!y)UserProfileDetailSerializerz;Serializer for displaying complete user profile informationc                       e Zd ZeZg dZy) UserProfileDetailSerializer.Meta)r   r   r   r   r   r   r   r   r?   r   r   r   r   r   r   r   r8   property_countNr   r   r   r    r!   r     s    
r   r!   r   c                 p    |j                    d|j                   j                         xs |j                  S r   r   r   s     r    r   z)UserProfileDetailSerializer.get_full_name  r   r   c                 j    	 |j                   j                  xs dS # t        j                  $ r Y yw xY wNrP   )r   r   r   r>   r   s     r    get_phone_numberz,UserProfileDetailSerializer.get_phone_number  s4    	;;++1r1'' 		    22c                 j    	 |j                   j                  xs dS # t        j                  $ r Y yw xY wr   )r   r   r   r>   r   s     r    get_companyz'UserProfileDetailSerializer.get_company  s4    	;;&&,",'' 		r   c                 j    	 |j                   j                  xs dS # t        j                  $ r Y yw xY wr   )r   r   r   r>   r   s     r    get_job_titlez)UserProfileDetailSerializer.get_job_title  4    	;;((.B.'' 		r   c                 j    	 |j                   j                  xs dS # t        j                  $ r Y yw xY wr   )r   r   r   r>   r   s     r    get_image_urlz)UserProfileDetailSerializer.get_image_url  r  r   c                 j    	 |j                   j                  xs dS # t        j                  $ r Y yw xY wr   )r   r   r   r>   r   s     r    get_company_logo_urlz0UserProfileDetailSerializer.get_company_logo_url  s4    	;;//525'' 		r   c                 b    	 |j                   j                  S # t        j                  $ r Y yw xY w)NFr   r   s     r    get_super_adminz+UserProfileDetailSerializer.get_super_admin  s/    	;;***'' 		r   c                     	 |j                   }|j                  r|j                  j                  S 	 y # t        j                  $ r Y y w xY wr   r   r   s      r    r   z*UserProfileDetailSerializer.get_created_by  r   r   childc                 p    |j                   j                         D cg c]  }|j                   c}S c c}w r   )rF   rG   r'   )rH   r   rK   s      r    r   z%UserProfileDetailSerializer.get_roles  s+    (+

(89(8u

(8999s   3c                 b    	 |j                   j                  S # t        j                  $ r Y yw xY w)Nr   )r   r   r   r>   r   s     r    get_property_countz.UserProfileDetailSerializer.get_property_count  s/    	;;---'' 		r   N)"r   r   r   r   r   r   r   r   r   r   r   r   r   r   r8   r   r!   r   r   rE   r   r   r   r  r   r  r  r   r	  r   	ListFieldr   IntegerFieldr  r   r   r    r   r     s?   E 2113I 5;446L/k//1G1113I1113I8{88:3+335K2224J-K--/E6[668N

 

 ...01KC K 2K ...01 2 ...01 2 ...01 2 ---/0 1 ---/0 1 11134 5 ...01 2 ...5J[5J5J5LMN: O: 11134 5r   r   zChange Password Requestoldpassword123znewSecurePassword456!)current_passwordnew_passwordconfirm_passwordc                       e Zd ZdZ ej
                  dd      Z ej
                  ddd      Z ej
                  dd      Zd Z	d Z
d Zd	 Zy
)ChangePasswordSerializerz%Serializer for changing user passwordT)r.   r   rS   )r.   r   
min_lengthc                     | j                   d   j                  }t        |j                  |      st	        j
                  d      |S )zValidate current passwordrN   r4   zCurrent password is incorrect)r\   r;   r   r   r   r   r   s      r    validate_current_passwordz2ChangePasswordSerializer.validate_current_password  s;    ||I&++T]]UC--.MNNr   c                     	 t        || j                  d   j                         |S # t        $ r-}t	        j                  t        |j                              d}~ww xY w)z8Validate new password using Django's password validatorsrN   N)r
   r\   r;   r   r   listmessagesrH   r*   ro   s      r    validate_new_passwordz.ChangePasswordSerializer.validate_new_password  sV    	@eT\\)%<%A%AB   	@--d1::.>??	@s   #' 	A(AAc                     |d   |d   k7  rt        j                  d      |d   |d   k(  rt        j                  d      |S )Cross-field validationr  r  zNew passwords do not matchr  z4New password must be different from current password)r   r   rH   rI   s     r    rL   z!ChangePasswordSerializer.validate"  sQ     E*<$==--.JKK#$n(==--.deer   c                     | j                   d   j                  }|j                  | j                  d          |j	                          |S )zUpdate user passwordrN   r  )r\   r;   set_passwordr   r   )rH   r;   s     r    r   zChangePasswordSerializer.save,  s=    ||I&++$--n=>		r   N)r   r   r   r   r   r   r  r  r  r  r  rL   r   r   r   r    r  r    s\     0,{,,dtL(;(($4TUVL,{,,dtLr   r  zUpdate 2FA Settingstwo_factor_enabledc                   *    e Zd ZdZ G d d      Zd Zy)TwoFactorSettingsSerializerzSerializer for 2FA settingsc                       e Zd ZeZdgZy) TwoFactorSettingsSerializer.Metar%  N)r   r   r   r   r   r   r   r   r    r!   r)  @  s    &'r   r!   c                 h    |j                  d|j                        |_        |j                          |S )zUpdate 2FA settingr%  )r<   r%  r   )rH   r   r   s      r    r   z"TwoFactorSettingsSerializer.updateD  s,    &4&8&89MxOjOj&k#r   N)r   r   r   r   r!   r   r   r   r    r'  r'  3  s     &( (r   r'  c                       e Zd ZdZ ej
                         Z ej                  d      Z G d d      Z	 e
 ej                               d        Zy)LoginSessionSerializerzSerializer for login sessionsT)	read_onlyc                        e Zd ZeZg dZg dZy)LoginSessionSerializer.Meta)r   rU   rV   rW   rX   rY   rZ   r[   r?   
login_timelast_activitylogout_timesession_durationis_current_session)r   rU   r0  r1  N)r   r   r   r   r   r   read_only_fieldsr   r   r    r!   r/  O  s    
 Pr   r!   c                     |j                   rk|j                  r_|j                   |j                  z
  }t        |j                         d      \  }}t        |d      \  }}t	        |       dt	        |       dS y)zGet formatted session durationi  <   zh mActive)r2  r0  divmodtotal_secondsint)rH   r   durationhours	remainderminutessecondss          r    get_session_durationz+LoginSessionSerializer.get_session_durationY  sl     ??s~~7H%h&<&<&>EE9%i4GW%j\CL>33r   N)r   r   r   r   r   r   r3  r   r4  r!   r   r   rB  r   r   r    r,  r,  J  sZ    '8{88:111DAP P ...01 2r   r,  c                       e Zd ZdZ ej
                  d      Z ej                  dd      Z ej                         Z
d Zy)	SecuritySettingsSerializerz-Combined serializer for all security settingsF)r.   Tzuser.last_login)r-  sourcec                 t    t         j                  j                  |j                  d      j	                         S )zGet count of active sessionsT)r;   r?   )r   r=   r   r;   countr   s     r    get_active_sessions_countz4SecuritySettingsSerializer.get_active_sessions_counti  s+    ##**D*IOOQQr   N)r   r   r   r   r   r   r%  DateTimeFieldpassword_last_changedr   active_sessions_countrH  r   r   r    rD  rD  c  sE    71115A5K55M^_=K==?Rr   rD  zEnhanced Registration Requestzjohn.doe@example.comzDoe Properties LLC   zsecurePassword123!)r   r   r   r   r   r   r)   r  c                      e Zd ZdZ ej
                  ddd      Z ej
                  ddd      Z ej                  dd	      Z	 ej
                  ddd
d      Z
 ej
                  ddd      Z ej
                  dddd      Z ej
                  dddd      Z ej                  dddd      Z G d d      Zd Zd Zd Zd Zd Zd  Zy!)"EnhancedRegisterSerializerzBEnhanced serializer for user registration with all required fieldsr5   Tr   )r   r.   r   r   r   z/User's email address (will be used as username)r   rS   zPassword (minimum 8 characters))r   r.   r  r   zConfirm password)r   r.   r   r   Fr   r   r   zPhone numberr   i'  zNumber of properties managed)r.   	min_value	max_valuer   c                       e Zd ZeZg dZy)EnhancedRegisterSerializer.Meta)r   r   r   r)   r  r   r   r   Nr   r   r   r    r!   rR    r   r   r!   c                     t         j                  j                  |      j                         rt	        j
                  d      |j                         S )r   r2   z&A user with this email already exists.)r   r=   r   r   r   r   lowerrH   r*   s     r    r   z)EnhancedRegisterSerializer.validate_email  s>    <<U+224--.VWW{{}r   c                     	 t        |       |S # t        $ r-}t        j                  t        |j                              d}~ww xY w)z4Validate password using Django's password validatorsN)r
   r   r   r  r  r  s      r    r
   z,EnhancedRegisterSerializer.validate_password  sE    	@e$   	@--d1::.>??	@s    	A(A  Ac                    |j                  dd      j                  dd      j                  dd      j                  dd      j                  dd      }|j                         rt        |      dk  rt        j                  d      |S )	zBasic phone number validationrT   rP   ()-+
   z"Please enter a valid phone number.)replaceisdigitlenr   r   )rH   r*   cleaneds      r    validate_phone_numberz0EnhancedRegisterSerializer.validate_phone_number  sx     --R(00b9AA#rJRRSVXZ[ccdgikl CL2$5--.RSSr   c                     t        |j                               dk  rt        j                  d      |j                         S )zValidate company name   z0Company name must be at least 2 characters long.)r_  rv   r   r   rU  s     r    validate_companyz+EnhancedRegisterSerializer.validate_company  s3    u{{}!--.`aa{{}r   c                 "   |d   |d   k7  rt        j                  ddi      t        |d   j                               dk  rt        j                  ddi      t        |d   j                               dk  rt        j                  ddi      |S )	r!  r)   r  zPasswords do not match.r   r   zFirst name is required.r   zLast name is required.)r   r   r_  rv   r"  s     r    rL   z#EnhancedRegisterSerializer.validate  s     &8 99--"$=/  
 u\"((*+a/--7/   u[!'')*Q.--5/   r   c                    |j                  d      |j                  d      |j                  d      d}|j                  d       |d   j                  d      d   }|}d	}t        j                  j	                  |
      j                         r:| | }|d	z  }t        j                  j	                  |
      j                         r:t        j                  j                  ||d   |d   j                         |d   j                         |d         }t        j                  j                  d      \  }}|j                  j                  |       t        j                  j                  ||d   |d   |d   dd       |S )zCreate user with profiler   r   r   )r   r   r   r  r   @r   r   )r   r   r   r)   )r   r   r   r   r)   r   r   TN)r;   r   r   r   r   r   )popru   r   r=   r   r   r   rv   r	   r   rF   r   r   rf   )	rH   r   profile_datar   base_usernamecounterr;   r   r   s	            r    rf   z!EnhancedRegisterSerializer.create  s    &)))4*..~>,001AB

 	-. "'*005a8 !ll!!8!4;;='	2HqLG ll!!8!4;;=
 ||'' )%l399;$[1779#J/ ( 
  %}}:::HW$ 	"" +%n5'(89 	# 	
 r   N)r   r   r   r   r   r   r   r   r   r   r)   r  r   r   r  r   r!   r   r
   ra  rd  rL   rf   r   r   r    rN  rN  m  s"   $ M '&&%J
 &%%$I
 #K""CE %{$$3	H -{,,$ $k## 	G );(( 	L .[--0	N
 
*+r   rN  c                       e Zd ZdZ ej
                         Z ej                         Z ej                         Z
 G d dej                        Zy)SignupResponseSerializerzSerializer for signup responsec                      e Zd Z ej                         Z ej                         Z ej                         Z	 ej                         Z
 ej                         Z ej                         Z ej                         Z ej                         Z ej                         Z ej                    ej                               Zy)+SignupResponseSerializer.UserDataSerializerr  N)r   r   r   r   r  r   r   r   r   r   r   r   r   r   r   r   r  r8   r   r   r    UserDataSerializerro    s    %[%%'(;((*&&&(*[**,
)K))+	)K))+	'+''),{,,.1113%%%,AK,A,A,CDr   rp  N)r   r   r   r   r   r   successr   message	DictFieldr;   
Serializerrp  r   r   r    rm  rm    sI    (&k&&(G#k##%G ;  "D
E[33 
Er   rm  )($rest_framework_simplejwt.serializersr   django.utilsr   modelsr   r^   rc   rest_frameworkr   django.contrib.auth.modelsr   r	   'django.contrib.auth.password_validationr
   django.core.exceptionsr   django.contrib.authr   drf_spectacular.utilsr   r   r   r   ModelSerializerr   r$   r-   r   r   r   r   r   rt  r  r'  r,  rD  rN  rm  r   r   r    <module>r     s1   J !     & 2 E 2 , _ _ --[00 -
 [00  
 ++	

p"4 p"
p"d "%0+	
	44 6  %+$"'5!   2	
.'44 '/.'R "%+$"'54!!   2 .0 #	
<;66 =<8 $&& 36/L$N	
 Y+"="= Y! Yv]+"="= ]~ %$4 7$;	
	${55 $$L !$d	
	+"="= 	[88 2R!7!7 R +$"// 3"#0$8		
"U!<!< U#"UnE{55 Er   