
    	]jA                        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 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 ddlmZmZmZmZ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-m.Z.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5 ddl6m7Z7 ddl8m9Z9 ddl:m;Z; ddl<m=Z=m>Z> ddl?m@Z@  ej                  eB      ZC ee	j                        ZE ed edgddd d!d"gd#$      %       G d& d'e#j                               ZG G d( d)e+      ZH ed edgd*d+ ed,ej                  d-d./      gd d0gd!d"gd1d2d3d45      %       G d6 d7e#j                               ZK ed edgd8d9 ed:ej                  d;d</       ed,ej                  d-d=/      gd> e       id d0gdd"gd#?      %       ed@ edgdAdB ed:ej                  d;dC/      g edDE       edFE       edGE       edHE      dId d0gd@d"gd#?      %       G dJ dKee#j                                      ZN ed edgdLdMd dd"gd#$      %       edN edgdOdPd dQd"gd#$      %       G dR dSe#j                                      ZP ed edTgdUdVd> e       id dWd"gd#X      %       G dY dZe#j                               ZR ed[ edTgd\d]d> e       id d^d"gd#X      %       G d_ d`e7             ZSy)azThis 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)flag_set)GetParentObjectMixin)	load_func)settings)reverse)method_decorator)cached_property)OpenApiTypes)OpenApiParameterOpenApiResponseextend_schema)OrganizationOrganizationMember)OrganizationIdSerializerOrganizationInviteSerializer&OrganizationMemberListParamsSerializer OrganizationMemberListSerializerOrganizationMemberSerializerOrganizationSerializer)Project)genericsstatus)NotFoundPermissionDenied)get_object_or_404)PageNumberPagination)
FormParser
JSONParserMultiPartParser)IsAuthenticated)Response)api_settings)APIView)
Annotation)User)ViewClassPermissionall_permissions)bool_from_requestgetOrganizationszList your organizationsz_
        Return a list of the organizations you've created or that you have access to.
        organizationslistpublic)x-fern-sdk-group-namex-fern-sdk-method-namex-fern-audiences)tagssummarydescription
extensions)name	decoratorc                       e Zd Zej                  j                         Zeee	fZ
 eej                  ej                  ej                  ej                  ej                        ZeZd Z fdZ ed       fd       Z xZS )OrganizationListAPI)GETPUTPOSTPATCHDELETEc                     |j                  | j                  j                  j                  j                  d            j	                         S )NT)deleted_at__isnull)organizationmember__in)filterrequestuser
om_throughdistinct)selfquerysets     H/root/env/lib/python3.12/site-packages/label_studio/organizations/api.pyfilter_querysetz#OrganizationListAPI.filter_querysetG   sA    #'<<#4#4#?#?#F#FZ^#F#_  

(*	    c                 2    t        t        | 
  |g|i |S N)superr8   r)   rF   rB   argskwargs	__class__s       rH   r)   zOrganizationListAPI.getL   s     ($3GMdMfMMrJ   Texcludec                 2    t        t        | 
  |g|i |S rL   )rM   r8   postrN   s       rH   rU   zOrganizationListAPI.postO   s     ($4WNtNvNNrJ   )__name__
__module____qualname__r   objectsallrG   r   r   r   parser_classesr&   r'   organizations_vieworganizations_changeorganizations_createpermission_requiredr   serializer_classrI   r)   r   rU   __classcell__rQ   s   @rH   r8   r8   ,   s      ##'')H *o>N-..00112233 0
N 4 O !OrJ   r8   c                   &     e Zd ZdZdZ fdZ xZS ) OrganizationMemberListPagination   	page_sizec                     | j                   |j                  v r|j                  | j                      dk(  ryt        |   |      S )Nz-1i@B )page_size_query_paramquery_paramsrM   get_page_size)rF   rB   rQ   s     rH   rj   z.OrganizationMemberListPagination.get_page_sizeX   sE     &&'*>*>>$$T%?%?@DHw$W--rJ   )rV   rW   rX   rf   rh   rj   ra   rb   s   @rH   rd   rd   T   s    I'. .rJ   rd   zGet organization members listz:Retrieve a list of the organization members and their IDs.contributed_to_projectsqueryzFWhether to include projects created and contributed to by the members.)r5   typelocationr3   membersz$request.pagez$response.results)offsetresults)r.   r/   r0   zx-fern-pagination)r1   r2   r3   
parametersr4   c                        e Zd ZeeefZ eej                  ej                  ej                  ej                        ZeZeZed        Zd Zd Z fdZd Zd Z xZS )OrganizationMemberListAPI)r9   r:   r<   r=   c                 ^    | j                  | j                  | j                                     S rL   )paginate_querysetrI   get_querysetrF   s    rH   paginated_membersz+OrganizationMemberListAPI.paginated_members   s'    %%d&:&:4;L;L;N&OPPrJ   c                    | j                   }|D cg c]  }|j                   }}t        j                  j	                  || j
                  j                  j                        j                  ddd      j                         }i }|D ]/  }|j                  |d   g       j                  |d   |d   d       1 |S c c}w )N)created_by_id__inorganizationcreated_by_ididtitler~   r   )ry   user_idr   rY   rA   rB   rC   active_organizationvaluesrE   
setdefaultappend)rF   ro   memberuser_idsprojectsprojects_mapprojects          rH   _get_created_projects_mapz3OrganizationMemberListAPI._get_created_projects_map   s    ((189vFNN99OO""XDLLL]L]LqLq"rVOT73XZ 	
  	G##GO$<bAHH!$-$W-	  :s   B<c                    | j                   }|D cg c]  }|j                   }}t        j                  j	                  | j
                  j                  j                        j                  dd      }t        j                  j	                  t        |      t        |            j                  dd      j                         }|D cg c]  }|d   	 }}t        j                  j                  |d      }i }	|D ]E  }||d      }
|	j                  |d   g       j                  |
j                   |
j"                  d	       G |	S c c}w c c}w )
Nr|   r~   T)flat)completed_by__inproject__incompleted_by
project_id)id_list
field_namer   )ry   r   r   rY   rA   rB   rC   r   values_listr$   r,   r   rE   in_bulkr   r   r~   r   )rF   ro   r   r   org_project_idsannotations
annotationproject_idsr   contributed_to_projects_mapr   s              rH    _get_contributed_to_projects_mapz:OrganizationMemberListAPI._get_contributed_to_projects_map   s>   ((189vFNN99!//00dll>O>O>c>c0dppt q 
 %%tH~SWXgSh%iVNL1XZ 	
 CNNJz,/NN..{t.T&(#% 	J":l#;<G'22:n3MrRYY!**$]]	 +*+ : Os   E
Ec                     t         |          }t        | j                  j                  dd      }||r| j                         nd |r| j                         nd d|S )Nrk   F)rk   created_projects_mapr   )rM   get_serializer_contextr(   rB   r9   r   r   )rF   contextrk   rQ   s      rH   r   z0OrganizationMemberListAPI.get_serializer_context   sg    '02"3DLL4D4DF_af"g'>H_D$B$B$Dei& ,0+P+P+R
 
 	
rJ   c                 t   t        j                  | j                  j                  j                  | j
                  | j                           }t        d| j                  j                        rt        | j                  j                        }|j                  d       |j                  j                  d      }|r*|j                  j                  d      j                  d      S |j                   j                  d      j                  d      S |j                   j                  d      j                  d      S )	Npk.fix_backend_dev_3134_exclude_deactivated_usersdataT)raise_exceptionactiveuser__om_throughuser__username)r   r   rB   rC   r+   rP   lookup_fieldr   r   r9   is_validvalidated_datar)   active_membersprefetch_relatedorder_byro   )rF   org
serializerr   s       rH   rw   z&OrganizationMemberListAPI.get_queryset   s    (():):)H)HT[[Y]YjYjMklDdllFWFWX?T\\EUEUVJ5..228<F ))::;MNWWXhii ;;//0BCLLM]^^;;//0BCLLM]^^rJ   c                 v    | j                   }| j                  |d      }| j                  |j                        S )NT)many)ry   get_serializerget_paginated_responser   )rF   rB   rO   rP   pager   s         rH   r,   zOrganizationMemberListAPI.list   s7    %%((D(9
**:??;;rJ   )rV   rW   rX   r   r   r   r[   r&   r'   r\   r]   r_   r   r`   rd   pagination_classr	   ry   r   r   r   rw   r,   ra   rb   s   @rH   rt   rt   b   s|    4 !*o>N-..002233	 87Q Q$+2

_ <rJ   rt   zGet organization member detailsz+Get organization member details by user ID.user_pkpathzLA unique integer value identifying the user to get organization details for.zEWhether to include projects created and contributed to by the member.   )r1   r2   r3   rr   	responsesr4   deletez"Soft delete an organization memberz+Soft delete a member from the organization.zPA unique integer value identifying the user to be deleted from the organization.zMember deleted successfully.)r3   zUser cannot soft delete self.Member not found@You can delete members only for your current active organization)   i  i  i  c                        e Zd Z eej
                  ej                        Zej                  j                         ZeeefZeZddgZed        Zd Z fdZd Zd	dZ xZS )
OrganizationMemberDetailAPI)r9   r=   r   r)   c                 l    | j                   j                  dk(  rt        t        gS t        j
                  S )Nr=   )rB   methodr    HasObjectPermissionr"   DEFAULT_PERMISSION_CLASSESrx   s    rH   permission_classesz.OrganizationMemberDetailAPI.permission_classes  s,    <<(*#%899666rJ   c                 t    t         j                  j                  | j                        j	                  d      S )Nr   rC   )r   rY   rA   parent_objectselect_relatedrx   s    rH   rw   z(OrganizationMemberDetailAPI.get_queryset  s.    !))00d>P>P0Q``aghhrJ   c                     i t         |          | j                  t        | j                  j
                  dd      dS )Nrk   F)r|   rk   )rM   r   r   r(   rB   r9   )rF   rQ   s    rH   r   z2OrganizationMemberDetailAPI.get_serializer_context!  sC    
g,.
 ..'89I9IKdfk'l
 	
rJ   c                     | j                         }t        ||      }| j                  ||       | j                  |      }t	        |j
                        S )N)rC   )rw   r   check_object_permissionsr   r!   r   )rF   rB   r   r   rG   r   r   s          rH   r)   zOrganizationMemberDetailAPI.get(  sK    $$&"8':%%gv6((0

((rJ   c                    | j                   }||j                  j                  k7  rt        d      t	        t
        |      }t	        t        ||      }|j                  t        d      |j                  |j                  j                  k(  rt        ddit        j                        S |j                          t        d      S )	Nr   r   )rC   r|   r   detailzUser cannot soft delete selfr   r   )r   rC   r   r   r   r%   r   
deleted_atr   r   r~   r!   r   HTTP_405_METHOD_NOT_ALLOWEDsoft_delete)rF   rB   r   r   r   rC   r   s          rH   r   z"OrganizationMemberDetailAPI.delete/  s      ',,222"#eff '2"#5DsS(-..>>W\\__,X'EFvOqOqrrs##rJ   )NN)rV   rW   rX   r&   r'   r\   r]   r_   r   rY   rZ   parent_querysetr   r   r   r[   r   r`   http_method_namespropertyr   rw   r   r)   r   ra   rb   s   @rH   r   r      s}    p ...33 #**..0O *o>N3!5)7 7
i
)$rJ   r   zGet organization settingsz8Retrieve the settings for a specific organization by ID.patchzUpdate organization settingsz6Update the settings for a specific organization by ID.updatec                        e Zd ZeeefZej                  j                         Z
ej                  ZeZdZdZ fdZ fdZ ed       fd       Z xZS )OrganizationAPIzorganizations-dashboardr   c                 2    t        t        | 
  |g|i |S rL   )rM   r   r)   rN   s       rH   r)   zOrganizationAPI.getd  s    _d/I$I&IIrJ   c                 2    t        t        | 
  |g|i |S rL   )rM   r   r   rN   s       rH   r   zOrganizationAPI.patchg  s    _d1'KDKFKKrJ   TrR   c                 2    t        t        | 
  |g|i |S rL   )rM   r   putrN   s       rH   r   zOrganizationAPI.putj  s    _d/I$I&IIrJ   )rV   rW   rX   r   r   r   r[   r   rY   rZ   rG   r'   r]   r_   r   r`   redirect_routeredirect_kwargr)   r   r   r   ra   rb   s   @rH   r   r   @  sh    8 !*o>N##'')H)>>-.NNJL 4 J !JrJ   r   InviteszGet organization invite linkzWGet a link to use to invite a new member to an organization in Label Studio Enterprise.
get_invite)r1   r2   r3   r   r4   c                   d    e Zd ZefZej                  j                         Ze	j                  Zd Zy)OrganizationInviteAPIc                 z   |j                   j                  }dj                  t        d      |j                        }t        t        d      r1t        j                  r!|j                  t        j                  dd      }t        ||j                  d      }|j                          t        |j                  d	      S )
N{}?token={}user-signupFORCE_SCRIPT_NAME    
invite_urltokenr   r   r   )rC   r   formatr   r   hasattrr   r   replacer   r   r!   r   rF   rB   rO   rP   r   r   r   s          rH   r)   zOrganizationInviteAPI.get  s    ll.."))'-*@#))L
801h6P6P#++H,F,FANJ1j[^[d[d7ef

44rJ   N)rV   rW   rX   r   r[   r   rY   rZ   rG   r'   organizations_inviter_   r)    rJ   rH   r   r   o  s0     !]N##'')H)>>5rJ   r   rU   zReset organization tokenzQReset the token used in the invitation link to invite someone to an organization.reset_tokenc                   0    e Zd Zej                  ZefZd Zy)OrganizationResetTokenAPIc                 v   |j                   j                  }|j                          t        j	                  d|j
                   d|j                          dj                  t        d      |j                        }t        ||j                  d      }|j                          t        |j                  d      S )	NzNew token for organization z is r   r   r   r      r   )rC   r   r   loggerdebugr   r   r   r   r   r   r!   r   r   s          rH   rU   zOrganizationResetTokenAPI.post  s    ll..2366($syykJK"))'-*@#))L
1j[^[d[d7ef

44rJ   N)	rV   rW   rX   r'   r   r_   r   r[   rU   r   rJ   rH   r   r     s     *>> ]N5rJ   r   )T__doc__loggingcore.feature_flagsr   core.mixinsr   core.utils.commonr   django.confr   django.urlsr   django.utils.decoratorsr   django.utils.functionalr	   drf_spectacular.typesr
   drf_spectacular.utilsr   r   r   organizations.modelsr   r   organizations.serializersr   r   r   r   r   r   projects.modelsr   rest_frameworkr   r   rest_framework.exceptionsr   r   rest_framework.genericsr   rest_framework.paginationr   rest_framework.parsersr   r   r   rest_framework.permissionsr    rest_framework.responser!   rest_framework.settingsr"   rest_framework.viewsr#   tasks.modelsr$   users.modelsr%   label_studio.core.permissionsr&   r'   label_studio.core.utils.paramsr(   	getLoggerrV   r   MEMBER_PERMr   ListCreateAPIViewr8   rd   BOOLListAPIViewrt   INTRetrieveDestroyAPIViewr   RetrieveUpdateAPIViewr   RetrieveAPIViewr   r   r   rJ   rH   <module>r     s    ' , '    4 3 . R R A  $ + @ 5 : J J 6 , 0 ( #  N <			8	$ 4 45  	) &5&,!)

O(44 OO2.'; . 	/P.!&& d	
 '6y%A&,!)
)."	
2Y< 4 4 Y<32Y<x 	1A!%%j	 .!&& c	
 467&5y%A&+!)

'8 	4A!%%n	
 !-KL -LM -?@ -op	
 '6y%A&.!)

%6/$"68W8W /$79n/$d 	+N%4&+!)

		 	.L%4&.!)

		Jh44 J4J* 	[.m467%4&2!)


5H44 55 	[*g467%4&3!)


5 55rJ   