
    	]j!                        d Z ddlZddlmZ ddlmZ ddlmZ ddlm	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 ddlmZ ddlmZ ddl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Z(g Z) e*e(ej                  jW                         jX                  dz         D ]  Z-e)j]                  e-e-f         ej^                   ed      e)ej                  jW                         jX                        Z, G d de      Z0 G d dejb                        Z2 eejf                        Z4 G d de4eee2      Z5 eee5      d d       Z6y)!zThis file and its contents are licensed under the Apache License 2.0. Please see the included NOTICE for copyright information and LICENSE for a copy of the license.
    N)Optional)flag_set)	load_func)
fast_first)settings)AbstractBaseUserBaseUserManager)PermissionsMixin)models)	post_save)receiver)timezone)cached_property)gettext_lazy)Organization)Token)hash_upload)get_user_last_activityschedule_activity_syncset_user_last_activityi     year)choicesdefaultc                   $    e Zd ZdZd ZddZd Zy)UserManagerTc                     |st        d      | j                  |      } | j                  dd|i|}|j                  |       |j	                  | j
                         |S )zK
        Create and save a user with the given email and password.
        zMust specify an email addressemail)using )
ValueErrornormalize_emailmodelset_passwordsave_db)selfr   passwordextra_fieldsusers        C/root/env/lib/python3.12/site-packages/label_studio/users/models.py_create_userzUserManager._create_user"   s`     <==$$U+tzz666(#			!    Nc                 r    |j                  dd       |j                  dd        | j                  ||fi |S )Nis_staffFis_superuser)
setdefaultr,   r'   r   r(   r)   s       r+   create_userzUserManager.create_user1   s<    
E26 t  ALAAr-   c                     |j                  dd       |j                  dd       |j                  d      durt        d      |j                  d      durt        d       | j                  ||fi |S )Nr/   Tr0   z"Superuser must have is_staff=True.z&Superuser must have is_superuser=True.)r1   getr!   r,   r2   s       r+   create_superuserzUserManager.create_superuser6   sz    
D15J't3ABBN+47EFF t  ALAAr-   N)__name__
__module____qualname__use_in_migrationsr,   r3   r6   r    r-   r+   r   r      s    B
	Br-   r   c                       e Zd Z ej                   ed      ej                  d      Zd Z	d Z
ed        Z G d d      Zy	)
UserLastActivityMixinzlast activityF)r   editablec                     t        j                         }t        dd      r>t        | j                  |      }|s|| _        | j                  dg       yt                y|| _        | j                  dg       y)z:Update user's last activity timestamp using Redis caching.9fflag_fix_back_plt_840_redis_last_activity_29072025_shortautor*   last_activity)update_fieldsN)r   nowr   r   idrC   r%   r   )r'   current_timeredis_successs      r+   update_last_activityz*UserLastActivityMixin.update_last_activityE   sd    ||~OV\]2477LIM %1"		(9	:&(!-DII_$5I6r-   c                 L    t        | j                        }||S | j                  S )z6Get user's last activity timestamp with Redis caching.)r   rF   rC   )r'   cached_activitys     r+   get_last_activityz'UserLastActivityMixin.get_last_activityU   s,     19&"" !!!r-   c                 "    | j                         S )z,Property for accessing cached last activity.)rL   r'   s    r+   last_activity_cachedz*UserLastActivityMixin.last_activity_cached`   s     %%''r-   c                       e Zd ZdZy)UserLastActivityMixin.MetaTN)r8   r9   r:   abstractr    r-   r+   MetarQ   e   s    r-   rS   N)r8   r9   r:   r   DateTimeField_r   rE   rC   rI   rL   propertyrO   rS   r    r-   r+   r=   r=   B   sJ    (F((?);X\\\abM7 	" ( ( r-   r=   c            	           e Zd ZdZ ej
                   ed      d      Z ej                   ed      dd      Z	 ej
                   ed      dd	      Z
 ej
                   ed
      dd	      Z ej
                   ed      dd	      Z ej                  ed      Z ej                    ed      edd ed            Z ej&                   ed      d ed            Z ej&                   ed      d ed            Z ej,                   ed      ej0                        Z ej,                   ed      d      Z ej6                  ddej8                  d      Z ej&                   ed      dd ed             Z e       Z d!Z!d!Z"d"Z# G d# d$      Z$e%d%        Z&d& Z'd' Z(d( Z)e%d)e*e+   fd*       Z,e%d+        Z- fd,Z.d- Z/d. Z0d/ Z1d)e2fd0Z3d)e2fd1Z4d3d2Z5 xZ6S )4Userz
    An abstract base class implementing a fully featured User model with
    admin-compliant permissions.

    Username and password are required. Other fields are optional.
    username   )
max_lengthzemail addressT)uniqueblankz
first name)r[   r]   z	last namephone)	upload_tor]   zcustom hotkeysz>Custom keyboard shortcuts configuration for the user interface)r   r]   null	help_textzstaff statusFz9Designates whether the user can log into this admin site.)r   ra   activez\Designates whether to treat this user as active. Unselect this instead of deleting accounts.zdate joined)r   zlast annotation activity)auto_nowzorganizations.Organizationactive_users)r`   	on_deleterelated_namezallow newslettersNz!Allow sending newsletters to user)r`   r   ra   r   r    c                       e Zd ZdZ ed      Z ed      Z ej                  dg       ej                  dg       ej                  dg       ej                  dg       ej                  d	g      gZ	y
)	User.Metahtx_userr*   usersrY   )fieldsr   
first_name	last_namedate_joinedN)
r8   r9   r:   db_tablerU   verbose_nameverbose_name_pluralr   Indexindexesr    r-   r+   rS   rh      sq    yjFLL-FLL	*FLL/FLL.FLL0
r-   rS   c                     | j                   rMt        j                  r| j                   j                  S t        j                  | j                   j                  z   S y r7   )avatarr   CLOUD_FILE_STORAGE_ENABLEDurlHOSTNAMErN   s    r+   
avatar_urlzUser.avatar_url   s>    ;;22{{&((4;;??::	 r-   c                      y)NTr    )r'   org_pks     r+   is_organization_adminzUser.is_organization_admin   s    r-   c                 N    | j                   j                  | j                        S )N)project__organization)annotationsfilteractive_organizationrN   s    r+   active_organization_annotationsz$User.active_organization_annotations   s"    &&T=U=U&VVr-   c                 |    | j                         }|j                  d      j                         j                         S )Nproject)r   values_listdistinctcount)r'   r   s     r+   .active_organization_contributed_project_numberz3User.active_organization_contributed_project_number   s3    ::<&&y1::<BBDDr-   returnc                 T    t        t        j                  j                  |             S N)
created_by)r   r   objectsr   rN   s    r+   own_organizationzUser.own_organization   s!    ,..555FGGr-   c                 ^    t         j                  j                  |       j                         S r   )r   r   r   existsrN   s    r+   has_organizationzUser.has_organization   s%    ##**d*;BBDDr-   c                     t         |           | j                  j                  j	                  | j
                        | _        y r7   )superclean	__class__r   r"   r   )r'   r   s    r+   r   z
User.clean   s,    ^^++;;DJJG
r-   c                 Z    | j                         }t        |      dk(  r| j                  }|S )Nr   )get_full_namelenr   )r'   names     r+   name_or_emailzUser.name_or_email   s)    !!#t9>::Dr-   c                 X    | j                   d| j                  }|j                         S )zc
        Return the first_name and the last_name for a given user with a space in between.
         )rl   rm   strip)r'   	full_names     r+   r   zUser.get_full_name   s#      $?	  r-   c                     | j                   S )z#Return the short name for the user.)rl   rN   s    r+   get_short_namezUser.get_short_name   s    r-   c                 ^    t         j                  j                  |       j                         S NrB   )r   r   r   firstrN   s    r+   	get_tokenzUser.get_token   s#    }}###.4466r-   c                     t         j                  j                  |       j                          t         j                  j	                  |       S r   )r   r   r   deletecreaterN   s    r+   reset_tokenzUser.reset_token   s8    $'..0}}###..r-   c                 t   d}|ry| j                   s| j                  s| j                  dd }|S | j                   r| j                  s| j                   dd }|S | j                  r| j                   s| j                  dd }|S | j                   r+| j                  r| j                   dd | j                  dd z   }|S )N?DUr      r   )rl   rm   r   )r'   
is_deletedinitialss      r+   get_initialszUser.get_initials   s    t~~zz!AH  __T^^q+H
 	 ^^DOO~~a*H  __q+dnnQq.AAHr-   )F)7r8   r9   r:   __doc__r   	CharFieldrU   rY   
EmailFieldr   rl   rm   r^   
ImageFieldr   ru   	JSONFielddictcustom_hotkeysBooleanFieldr/   	is_activerT   r   rE   rn   activity_at
ForeignKeySET_NULLr   allow_newslettersr   r   EMAIL_FIELDUSERNAME_FIELDREQUIRED_FIELDSrS   r   ry   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__)r   s   @r+   rX   rX   l   sO     v*#>HFa0TJE!!!!L/cNJ   ;CtLIFQwZCtDEVDAF%V%%	
TUN #v""	.5A6q4rH $##	(rsI '&&&q'7NK&&&&q)C'DtTK+&++$46??Yg ,++	
T41EhCi mGKNO

 

 ; ;WE H(<"8 H H E EH!75 7/U /r-   rX   )senderc                 J    |r!t         j                  j                  |       y y r   )r   r   r   )r   instancecreatedkwargss       r+   	init_userr      s    (+ r-   )NF)7r   datetimetypingr   core.feature_flagsr   core.utils.commonr   core.utils.dbr   django.confr   django.contrib.auth.base_userr   r	   django.contrib.auth.modelsr
   	django.dbr   django.db.models.signalsr   django.dispatchr   django.utilsr   django.utils.functionalr   django.utils.translationr   rU   organizations.modelsr   rest_framework.authtoken.modelsr   users.functionsr   users.functions.last_activityr   r   r   
YEAR_STARTYEAR_CHOICESrangerE   r   rappendIntegerFieldr   Modelr=   
USER_MIXIN	UserMixinrX   r   r    r-   r+   <module>r      s%     ' ' $   K 7  . $ ! 3 6 - 1 ' p p
	zH--113881<	>  AA  v1V9lHDUDUDYDYD[D`D`a B/  BF$FLL $N h))*	D9&(8:O DN 
)D!, ",r-   