o
    Mf                     @   s   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 eeZeejZG d	d
 d
eejZeejZG dd deejZdS )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)gettext_lazyc                   @   s   e Zd ZdZejejejdddZ	ejdejddZ
ejedd	d
Zejedd	dZejeddd	d	d	ddZedd Zedd Zedd ZG dd dZdd ZdS )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                 C   s0   ddl m} t||r|jn|}tjj||dS )Nr   Useruserorganization)users.modelsr   
isinstancepkr   objectsget)clsuser_or_user_pkorganization_pkr   user_pk r)   c/var/www/html/analyze/labelStudio/lib/python3.10/site-packages/label_studio/organizations/models.pyfind_by_user*   s   zOrganizationMember.find_by_userc                 C   s
   t | jS N)bool
deleted_atselfr)   r)   r*   
is_deleted1   s   
zOrganizationMember.is_deletedc                 C   s   | j j| jjjkS r,   )r   idr   
created_byr/   r)   r)   r*   is_owner5   s   zOrganizationMember.is_ownerc                   @   s   e Zd ZdgZdS )zOrganizationMember.Metar"   N)__name__
__module____qualname__orderingr)   r)   r)   r*   Meta9   s    
r9   c                 C   s|   t  ( t | _| jdgd | jjjdd	 | j_
| jjdgd W d    n1 s/w   Y  | jj   d S )Nr.   update_fieldsT&organizationmember__deleted_at__isnullactive_organization)r   atomicr	   nowr.   saver   organizationsfilterfirstr>   
task_locksalldeleter/   r)   r)   r*   soft_delete<   s   

zOrganizationMember.soft_delete)r5   r6   r7   __doc__r   
ForeignKeyr   AUTH_USER_MODELCASCADEr   r   DateTimeField_
created_at
updated_atr.   classmethodr+   propertyr1   r4   r9   rH   r)   r)   r)   r*   r      s4    


r   c                   @   s`  e Zd ZdZejeddddZejeddedddd	Z	ej
ejd
edZejejejddeddZejedddZejedddZejeddddZdd Zed>ddZed?ddZedd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Z d)d* Z!d+d, Z"d-d. Z#d/d0 Z$d1d2 Z%d3d4 Z&d5e'fd6d7Z(e)d8d9 Z*e)d:d; Z+G d<d= d=Z,dS )@Organizationr   zorganization titlei  F)
max_lengthr   token   T)rT   r   uniquer   r   rB   )r   throughr   r3   )r   r   r   verbose_namer   r   r   r   zcontact info)r   r   c                 C   s   | j d t| j S )Nz, id=)titlestrr"   r/   r)   r)   r*   __str__a      zOrganization.__str__NYour Organizationc                 C   s   t tj}|||dS )N)rZ   r3   )r   r   CREATE_ORGANIZATION)r%   r3   rZ   _create_organizationr)   r)   r*   create_organizationd   s   
z Organization.create_organizationc                 C   sV   t jj|dd}| std| | }|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#   rC   prefetch_relatedexists
ValueErrorrD   r.   r   )r%   r   check_deletedmemberships
membershipr)   r)   r*   r+   i   s   zOrganization.find_by_userc                 C   s8   | ddd }t|rtjj|dS td| )N/)rU   z(Can't find Organization by welcome URL: )stripsplitlenrS   r#   r$   KeyError)r%   urlrU   r)   r)   r*   find_by_invite_urlt   s   zOrganization.find_by_invite_urlc                 C   s   | j j|jd S )Nr"   )usersrC   r"   rc   r0   r   r)   r)   r*   has_user|   r]   zOrganization.has_userc                 C      t jj|| dd S )NFr   r   deleted_at__isnullr   r#   rC   rc   rr   r)   r)   r*   has_deleted      zOrganization.has_deletedc                 C   s   | j j|d S )N)members__user)projectsrC   rc   rr   r)   r)   r*   has_project_member   s   zOrganization.has_project_memberc                 C   rt   )NTru   rw   rr   r)   r)   r*   has_permission   ry   zOrganization.has_permissionc                 C   sf   | j j|jd rtd d S t  t|| d}|	  |W  d    S 1 s,w   Y  d S )Nrp   z$User already exists in organization.r   )
rq   rC   r"   rc   loggerdebugr   r?   r   rA   )r0   r   omr)   r)   r*   add_user   s   

$zOrganization.add_userc                 C   sJ   t jj|| d  |j| jkr#|jjdd |_|j	dgd d S d S )Nr   Tr<   r>   r:   )
r   r#   rC   rG   active_organization_idr2   rB   rD   r>   rA   rr   r)   r)   r*   remove_user   s
   zOrganization.remove_userc                 C   s   t  | _| jdgd d S )NrU   r:   )r   rU   rA   r/   r)   r)   r*   reset_token   s   zOrganization.reset_tokenc                 C      dS )z:This check raise an exception if the projects limit is hitNr)   r/   r)   r)   r*   check_max_projects      zOrganization.check_max_projectsc                 C   s2   | j  djtdtdtdddddS )Nz-created_attasksT)tasks__is_labeled)rC   )tasks_countlabeled_tasks_countr3   )r{   rF   order_byannotater   r   rb   r/   r)   r)   r*   projects_sorted_by_created_at   s   z*Organization.projects_sorted_by_created_atc                 C   s   | j dS )Nz%d %b %Y %H:%M:%S)rO   strftimer/   r)   r)   r*   created_at_prettify   s   z Organization.created_at_prettifyc                 C   s2   ddl m} | jjddd }|jj|d}|S )Nr   r   members__user__pkT)flat)pk__in)r    r   r{   values_listdistinctr#   rC   )r0   r   invited_idsper_project_invited_usersr)   r)   r*   r      s   z&Organization.per_project_invited_usersreturnc                 C   s&   t | dr| j  }d ur|S tjS )Nbilling)hasattrr   verify_ssl_certsr   VERIFY_SSL_CERTS)r0   
org_verifyr)   r)   r*   should_verify_ssl_certs   s   z$Organization.should_verify_ssl_certsc                 C   r   )NFr)   r/   r)   r)   r*   secure_mode   r   zOrganization.secure_modec                 C   s   t jj| dS )N)r   )r   r#   rC   r/   r)   r)   r*   members   s   zOrganization.membersc                   @   s   e Zd ZdZdS )zOrganization.Metar   N)r5   r6   r7   db_tabler)   r)   r)   r*   r9      s    r9   )Nr^   )F)-r5   r6   r7   rI   r   	CharFieldrN   rZ   r   rU   ManyToManyFieldr   rK   r   rq   OneToOneFieldSET_NULLr3   rM   rO   rP   
EmailFieldcontact_infor\   rQ   ra   r+   ro   rs   rx   r|   r}   r   r   r   r   r   r   r   r-   r   rR   r   r   r9   r)   r)   r)   r*   rS   K   sN    



rS   )rI   loggingcore.utils.commonr   r   django.confr   	django.dbr   r   django.db.modelsr   r   django.utilsr	   django.utils.translationr
   rN   	getLoggerr5   r~   ORGANIZATION_MEMBER_MIXINOrganizationMemberMixinModelr   ORGANIZATION_MIXINOrganizationMixinrS   r)   r)   r)   r*   <module>   s    


7