
    	]j                     4   d Z ddlZddlmZmZ ddlmZ ddlmZm	Z	 ddl
mZmZ ddlmZ ddlmZ dd	lmZ  ej(                  e      Z eej.                        Z G d
 deej2                        Z eej6                        Z G d deej2                        Zy)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)create_hash	load_func)settings)modelstransaction)CountQ)timezone)cached_property)gettext_lazyc                      e Zd ZdZ ej
                  ej                  ej                  dd      Z	 ej
                  dej                  d      Z
 ej                   ed      d	
      Z ej                   ed      d	      Z ej                   ed      dd	d	d	d      Zed        Zed        Zed        Z G d d      Zd Zy)OrganizationMember 
om_throughzUser ID)	on_deleterelated_name	help_textzorganizations.OrganizationzOrganization ID)r   r   
created atTauto_now_add
updated atauto_nowz
deleted atNzxTimestamp indicating when the organization member was marked as deleted.  If NULL, the member is not considered deleted.)defaultnullblankdb_indexr   c                     ddl m} t        ||      r|j                  n|}t        j
                  j                  ||      S )Nr   Useruserorganization)users.modelsr    
isinstancepkr   objectsget)clsuser_or_user_pkorganization_pkr    user_pks        K/root/env/lib/python3.12/site-packages/label_studio/organizations/models.pyfind_by_userzOrganizationMember.find_by_user+   s7    %(2?D(I/$$!))--7-YY    c                 ,    t        | j                        S N)bool
deleted_atselfs    r-   
is_deletedzOrganizationMember.is_deleted2   s    DOO$$r/   c                 p    | j                   j                  | j                  j                  j                  k(  S r1   )r"   idr#   
created_byr4   s    r-   is_ownerzOrganizationMember.is_owner6   s'    yy||t00;;>>>>r/   c                       e Zd ZdgZy)OrganizationMember.Metar&   N)__name__
__module____qualname__ordering r/   r-   Metar<   :   s	    6r/   rB   c                 n   t        j                         5  t        j                         | _        | j                  dg       | j                  j                  j                  d      j                         | j                  _
        | j                  j                  r7| j                  j                  j                  d       d | j                  _        | j                  j                  ddg       d d d        | j                  j                  j                         j                          y # 1 sw Y   <xY w)	Nr3   update_fieldsT&organizationmember__deleted_at__isnullF)saveactive_organizationavatar)r   atomicr
   nowr3   rH   r"   organizationsfilterfirstrI   rJ   delete
task_locksallr4   s    r-   soft_deletezOrganizationMember.soft_delete=   s    ! 		L&llnDOII\NI3,0II,C,C,J,J7; -K -eg II) yy		  ''U'3#'		 IINN*?)JNK		L 			  "))+		L 		Ls   CD++D4)r=   r>   r?   __doc__r   
ForeignKeyr   AUTH_USER_MODELCASCADEr"   r#   DateTimeField_
created_at
updated_atr3   classmethodr.   r   r6   r:   rB   rS   rA   r/   r-   r   r      s    6  FNNajD %6$$$J[L &%%aoDIJ%%%aoEJ%%%	,9J Z Z % % ? ? ,r/   r   c            	       |   e Zd ZdZ ej
                   ed      dd      Z ej
                   ed      deddd	      Z	 ej                  ej                  d
e      Z ej                  ej                  ej                   dd ed            Z ej$                   ed      d      Z ej$                   ed      d      Z ej*                   ed      dd      Zd Zed+d       Zed,d       Zed        Zd Zd Zd Zd Zd Z d Z!d  Z"d! Z#d" Z$d# Z%d$ Z&d%e'fd&Z(e)d'        Z*e)d(        Z+ G d) d*      Z,y)-Organizationr   zorganization titlei  F)
max_lengthr   token   T)r_   r   uniquer   r   rM   )r   throughr#   r9   )r   r   r   verbose_namer   r   r   r   zcontact info)r   r   c                 L    | j                   dz   t        | j                        z   S )Nz, id=)titlestrr&   r4   s    r-   __str__zOrganization.__str__e   s    zzG#c$''l22r/   Nc                 J    t        t        j                        } |d||d|S )N)rf   r9   rA   )r   r   CREATE_ORGANIZATION)r)   r9   rf   kwargs_create_organizations        r-   create_organizationz Organization.create_organizationh   s(    ()E)EF#Q%JQ&QQr/   c                 (   t         j                  j                  |      j                  d      }|j	                         st        d|       |j                         }|r(|j                  r|j                  dfS |j                  dfS |j                  S )N)r"   r#   zNo memberships found for user TF)	r   r'   rN   prefetch_relatedexists
ValueErrorrO   r3   r#   )r)   r"   check_deletedmemberships
memberships        r-   r.   zOrganization.find_by_userm   s    (0077T7BSSTbc!!#=dVDEE &&(
6@6K6KJ++T2qR\RiRikpQqq&&&r/   c                     |j                  d      j                  d      d   }t        |      r t        j                  j                  |      S t        d|       )N/)r`   z(Can't find Organization by welcome URL: )stripsplitlenr^   r'   r(   KeyError)r)   urlr`   s      r-   find_by_invite_urlzOrganization.find_by_invite_urlx   sS    		#$$S)"-u:''++%+88EcUKLLr/   c                 j    | j                   j                  |j                        j                         S )Nr&   )usersrN   r&   rp   r5   r"   s     r-   has_userzOrganization.has_user   s'    zz  DGG ,3355r/   c                 b    t         j                  j                  || d      j                         S )NFr"   r#   deleted_at__isnullr   r'   rN   rp   r   s     r-   has_deletedzOrganization.has_deleted   s*    !))00dbg0hooqqr/   c                 V    | j                   j                  |      j                         S )N)members__user)projectsrN   rp   r   s     r-   has_project_memberzOrganization.has_project_member   s#    }}##$#7>>@@r/   c                 b    t         j                  j                  || d      j                         S )NTr   r   r   s     r-   has_permissionzOrganization.has_permission   s*    !))00dbf0gnnppr/   c                 (   | j                   j                  |j                        j                         rt        j                  d       y t        j                         5  t        ||       }|j                          |cd d d        S # 1 sw Y   y xY w)Nr   z$User already exists in organization.r!   )
r   rN   r&   rp   loggerdebugr   rK   r   rH   )r5   r"   oms      r-   add_userzOrganization.add_user   sm    ::(//1LL?@! 	#DABGGI		 	 	s   BBc                    t         j                  j                  ||       j                          |j                  | j
                  k(  rC|j                  j                  d      j                         |_        |j                  dg       y y )Nr!   TrF   rI   rD   )
r   r'   rN   rP   active_organization_idr8   rM   rO   rI   rH   r   s     r-   remove_userzOrganization.remove_user   ss    ""))t$)GNNP&&$''1'+'9'9'@'@hl'@'m's's'uD$II%:$;I< 2r/   c                 H    t               | _        | j                  dg       y )Nr`   rD   )r   r`   rH   r4   s    r-   reset_tokenzOrganization.reset_token   s     ]
				*r/   c                      y)z:This check raise an exception if the projects limit is hitNrA   r4   s    r-   check_max_projectszOrganization.check_max_projects   s    r/   c           	          | j                   j                         j                  d      j                  t	        d      t	        dt        d                  j                  d      S )Nz-created_attasksT)tasks__is_labeled)rN   )tasks_countlabeled_tasks_countr9   )r   rR   order_byannotater   r	   ro   r4   s    r-   projects_sorted_by_created_atz*Organization.projects_sorted_by_created_at   sL    MMXm$X%.eG\]pt\uFvXwl+		
r/   c                 8    | j                   j                  d      S )Nz%d %b %Y %H:%M:%S)rZ   strftimer4   s    r-   created_at_prettifyz Organization.created_at_prettify   s    ''(;<<r/   c                     ddl m} | j                  j                  dd      j	                         }|j
                  j                  |      }|S )Nr   r   members__user__pkT)flat)pk__in)r$   r    r   values_listdistinctr'   rN   )r5   r    invited_idsper_project_invited_userss       r-   r   z&Organization.per_project_invited_users   sF    %mm//0C$/OXXZ$(LL$7$7{$7$K!((r/   returnc                 v    t        | d      r| j                  j                         x}|S t        j                  S )Nbilling)hasattrr   verify_ssl_certsr   VERIFY_SSL_CERTS)r5   
org_verifys     r-   should_verify_ssl_certsz$Organization.should_verify_ssl_certs   s5    4#t||7T7T7V)V(c(((r/   c                      y)NFrA   r4   s    r-   secure_modezOrganization.secure_mode   s    r/   c                 B    t         j                  j                  |       S )N)r#   )r   r'   rN   r4   s    r-   memberszOrganization.members   s    !))00d0CCr/   c                       e Zd ZdZy)Organization.Metar#   N)r=   r>   r?   db_tablerA   r/   r-   rB   r      s    !r/   rB   )NzYour Organization)F)-r=   r>   r?   rT   r   	CharFieldrY   rf   r   r`   ManyToManyFieldr   rV   r   r   OneToOneFieldSET_NULLr9   rX   rZ   r[   
EmailFieldcontact_inforh   r\   rm   r.   r}   r   r   r   r   r   r   r   r   r   r   r   r2   r   r   r   r   rB   rA   r/   r-   r^   r^   O   s   FQ34EREFQwZCUY`dlpqE"F""8#;#;/cuvE%%%  //#|_J &%%aoDIJ%%%aoEJ$6$$Q~%6dNL3 R R ' ' M M6rAq	=+
=)) )
   D D" "r/   r^   )rT   loggingcore.utils.commonr   r   django.confr   	django.dbr   r   django.db.modelsr   r	   django.utilsr
   django.utils.functionalr   django.utils.translationr   rY   	getLoggerr=   r   ORGANIZATION_MEMBER_MIXINOrganizationMemberMixinModelr   ORGANIZATION_MIXINOrganizationMixinr^   rA   r/   r-   <module>r      s     4   ) % ! 3 6			8	$#H$F$FG 7,0&,, 7,t h99: v"$fll v"r/   