
    	]ja                     L   d Z ddlZddlZddlmZ ddlmZ ddlm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mZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z# ddl$m%Z% ddl&m'Z'm(Z(m)Z) ddl*m+Z+ ddl,m-Z- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5  ejl                  e7      Z8dZ9 G d de/      Z: e:       Z;e;jx                  de;jz                  de;j|                  de;j~                  de;j                  de;j                  de;j                  de;j                  de;j                  de;j                  de;j                  de;j                  de;j                  de;j                  diZJd  ZKdDd!ZLdEd"ZMd# ZNd$ ZOd% ZPd& ZQ G d' d(e+ej                        ZS G d) d*e      ZTd+e fd,ZUd-eSd+eSfd.ZVd-eSd+eSfd/ZWd0 ZXd-eSd+eSfd1ZYd2 ZZd3 Z[d4 Z\d5 Z]d6 Z^d7 Z_d8 Z`d9 Zad: Zbd; Zcd< Zde`eWeZe[e_e]e\e^ebeaeYedd=e_e        d> Zfd? Zg G d@ dAej                        Zi G dB dCej                        Zjy)FzThis 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)datetime)reduce)ClassVar)flag_set)
fast_first)ConjunctionEnum)settings)ArrayAgg)models)	AggregateAvgCaseDateTimeFieldExistsF
FloatFieldOuterRefQSubquery	TextFieldValueWhen)KeyTextTransform)CastCoalesceConcat)FSMStateQuerySetMixin)get_state_choices)	BaseModel)ValidationError)	load_func)cast_bool_from_strz%Y-%m-%dT%H:%M:%S.%fZc                   &   e Zd ZU dZee   ed<   dZee   ed<   dZee   ed<   dZ	ee   ed<   d	Z
ee   ed
<   dZee   ed<   dZee   ed<   dZee   ed<   dZee   ed<   dZee   ed<   dZee   ed<   dZee   ed<   dZee   ed<   dZee   ed<   y)	_OperatorequalEQUAL	not_equal	NOT_EQUALlessLESSgreaterGREATERless_or_equalLESS_OR_EQUALgreater_or_equalGREATER_OR_EQUALinINnot_inNOT_INin_listIN_LISTnot_in_listNOT_IN_LISTemptyEMPTYcontainsCONTAINSnot_containsNOT_CONTAINSregexREGEXN)__name__
__module____qualname__r&   r   str__annotations__r(   r*   r,   r.   r0   r2   r4   r6   r8   r:   r<   r>   r@        L/root/env/lib/python3.12/site-packages/label_studio/data_manager/managers.pyr$   r$   .   s    "E8C="*Ix}* D(3- &GXc]&#2M8C=2&8hsm8B$FHSM$&GXc]&!.K#."E8C="(Hhsm("0L(3-0"E8C="rG   r$    __lt__gt__lte__gte__isnull__icontains__regexc                 R   g }| |S | j                   r@| j                   d   j                  dd      j                  dd      }|j                  |       | j                  rH| j                  j                  D ]/  }|j
                  j                  dd      }|j                  |       1 |S )Nr   ztasks:rI   -filter:tasks:)orderingreplaceappendfiltersitemsfilter)prepare_paramsresultordering_field_name_filterfilter_field_names        rH   get_fields_for_filter_orderingr_   S   s    F ,55a8@@2NVVWZ\^_)* %--33 	-G ' 6 6 KMM+,	- MrG   c           
      \   ddl m} ddlm} g }|t	        |       z  }| j
                  j                  dd      }|rddlm} t        t        j                        } ||j                  j                  | j                        |      }	t        |	d   D 
cg c]$  }
||
j                  d	d      d
k(  rdndz   |
d   z   & c}
      }	t        |d         t        |d         z  }|	|z
  }|D 
ch c]  }
|
t        |      d  c}
d
hz
  }t        |      |z  }t        |      }|rs|j                   j"                  D cg c]  }|j$                   }}|j'                  d       |D cg c]	  }||vs| }}|D cg c]  }|j)                  d      r| }}|S c c}
w c c}
w c c}w c c}w c c}w )zCollecting field names to annotate them

    :param prepare_params: structure with filters and ordering
    :param user: user
    :return: list of field names
    r   Project)TaskhiddenColumnsN)TASKS)idcolumnsparentdatazdata.rI   rf   explorelabeling)projects.modelsrb   tasks.modelsrc   r_   ri   get#label_studio.data_manager.functionsre   r!   r	   DATA_MANAGER_GET_ALL_COLUMNSobjectsprojectsetlen_metafieldsattnamerV   
startswith)rZ   userskip_regularrb   rc   r[   rv   re   GET_ALL_COLUMNSall_columnschiddenshownfieldskipped_fieldsfs                   rH   get_fields_for_evaluationr   e   s    (!F
,^<<F   $$_d;F=#H$I$IJ%goo&9&9^=S=S&9&TVZ[]hir]stXYUx!6&!@gbIAdGSt
 VI&'#fZ.@*AAf$*/0Q3u:<0F8;Vu$ [F 59ZZ5F5FGE%--GGd##?q'>!??#A1<<+@!AAM# u 1 H?As*   )F)F8F"	F$,F$6F)F)c                    |r#t        t        j                        }|d   }d}|j                  d      }|d|v r||d   v r|d   |   dk(  rd} |||      \  }	}
|	j	                  d      r|	j                  dd	      }d}|du rB| j                  t        t        |d
      t                           } 	 | j                          d}|s| j                  t        |d
            } |
rt        d      j                  d      nt        d      j!                  d      }n|	dk(  rt#        d      }t%        |j&                        D cg c]  \  }}t)        |t+        |dz                 }}}| j                  t-        |t+        d      t/        j0                         d      } |
rt        d      j                  d      nt        d      j!                  d      }n8|
rt        |	      j                  d      nt        |	      j!                  d      }| j3                  |      } | S | j3                  d      } | S # t        $ r&}t        j                  d| d|        Y d }~d }~ww xY wc c}}w )Nr   Fz-+columnsDisplayTypeNumberTrr   data__rI   ri   output_field)ordering_fieldz+Failed to apply numeric ordering for field z: r   )
nulls_laststatetask   )current_statethendefaultr   )state_orderr   rf   )r!   r	   PREPROCESS_FIELD_NAMElstriprx   rU   annotater   r   r   first	Exceptionloggerwarningr   ascdescr   	enumeratevaluesr   r   r   r   IntegerFieldorder_by)querysetrT   rr   request	view_datapreprocess_field_nameraw_field_namenumeric_orderingunsigned_field_name
field_name	ascending
json_fieldnumeric_ordering_applieder   state_choicesir   whenss                      rH   apply_orderingr      s{    )(*H*H I!! ,33D9!$	1#y1E'FF./0CDP# 5ng V
I  *#++Hb9J',$4'#,,#'(8V(L[e[g#h - dNN$/3, ,#,,<LZY_<`,a<E"#''4'81M]K^KcKcosKcKtA7"-f5MR[\i\p\pRqrhaTE!a%LArEr(( %qH[H[H]^ ) H :C- $$$5-HXH]H]imH]HnA6?*!!T!2Qz]EWEWcgEWEhA$$Q' O $$T*O) ! dNN%PQ[P\\^_`^a#bccd ss   5H: #I,:	I)I$$I)c                 8   t        | j                  d      r| j                  dk(  r]t        | j                  j                        | j                  _        t        | j                  j
                        | j                  _        y | j                  dk(  r{t        j                  | j                  j                  t              | j                  _        t        j                  | j                  j
                  t              | j                  _        y y | j                  dk(  rt        | j                        | _        y | j                  dk(  r*t        j                  | j                  t              | _        y | j                  dk(  rt        | j                        | _        y y )Nmaxr   DatetimeBoolean)
hasattrvaluetypefloatminr   r   strptimeDATETIME_FORMATr"   )r]   s    rH   
cast_valuer      s   w}}e$<<8# %gmm&7&7 8GMM %gmm&7&7 8GMM\\Z' ( 1 1'--2C2C_ UGMM ( 1 1'--2C2C_ UGMM (
 <<8#!'--0GM\\Z'$--gmm_MGM\\Y&.w}}=GM 'rG   c           	         ddl m} ddlm}m} | dk(  r|n|}| dk(  rt        |j                  j                   |dd            j                  t        |      t        |j                  	      z        j                  t        d
            j                  dd            }net        |j                  j                   |dd            j                  t        t        d
            t        |j                  	      z              }|j                  t        j                  t        j                   fv r	 t#        j$                  |j                        }	t        |j                  j                  t        t        d
            t        |	      z              }
|j'                  |j                  t        j                  k(  r|
       y|
        y|j                  t        j(                  k(  r|j'                  t        |             y|j                  t        j*                  k(  r|j'                  t        |              y|j                  t        j,                  k(  r[t/        |j                        rt        d      t        g       z  }
nt        d      t        g        z  }
|j'                  |
       yy #  Y yxY w)Nr   )RawSQL)
Annotation
Predictionannotations_resultszcast(result as text)rI   )json_strr   )json_str__containspkr   r   Tflatid__inexit)r[   continue)annotations__result__isnull)annotations__resultF)django.db.models.expressionsr   rm   r   r   r   rq   r   rY   r   r   values_listr   operatorOperatorr&   r(   jsonloadsrV   r<   r>   r:   r"   )r   r]   filter_expressionsrr   r   r   r   _classsubqueryr   qs              rH   add_result_filterr      s&   33%)>>ZJF **%%..?UWY8Z.[VAg&gmm)LLMV$V([d[+	
 NN##V4JB-O#PWWx~&gmm)LL
 HNNH,>,>??	JJw}}-E 6>>(()?!5/)QRS!!w'7'78>>'I!R QRrR			X..	.!!!H+.			X22	2!!1X;,/			X^^	+gmm,d3aB6OOAe4b8Q7QQA!!!$ 
,	s   7J; ;J?c           
         | rM|j                   t        j                  k(  r0|j                  t	        di |t        |j                        i       y| rN|j                   t        j                  k(  r1|j                  t	        di |t        |j                        i        y| rS|j                   t        j                  k(  r5t        |j                        }|j                  t	        di |dz   |i       yy y )Nr   rN   rF   )
r   r   r<   rV   r   intr   r>   r:   r"   )enabledkeyr]   r   r   s        rH   add_user_filterr     s    7##x'8'88!!!"@sC,>&?"@A	W%%)>)>>!!1#AS-?'@#A"AB	W%%7"7==1!!!"@sZ'7&?"@A 8rG   c                    |s| S t        t        j                        }g }|j                  D ]  }|j                  r||j                  gn|g}g }|D ]t  }	|j                  d uxr |	|j                  u }
|	j
                  j                  d      r|	j                  Jt        t        j                        } ||	j
                  |      \  }}t        t        j                        } ||	|      }	 ||	||||
      }|r|j                  |       t        |dk(  d|	|      }|dk(  rt        |dk(  d|	|      }|dk(  r|dv r.t        ||	||      }|dk(  r| j                         c c S |dk(  r|d	k(  rd
}d|	j                  v rit        j                   d|	j                        D cg c]!  }|s|j#                         st%        |      # c}|	_        |	j                  dk(  rdnd|	_        n/d|	j                  v r!|	j                  j#                         sd|	_        |dk(  rZ|	j                  t&        j(                  k(  r=t+               }|	j                  D ]  }|t+        |      z  } |j                  |       (|dk(  r[|	j                  t&        j,                  k(  r>t+               }|	j                  D ]  }|t+        |       z  } |j                  |       |dk(  rO|	j                  t&        j.                  k(  r2t1        |	j                        }|j                  t+        |             |dk(  rd}|	j2                  dk(  r}|j                  d      rl|j5                  dd      } | j6                  d3i d|j5                  dd       t9        t;        |d      t=                     i} d|j5                  dd       }n|}|dv r4|	j                  dk(  r%t1        |	j                        rdnd |	_        d|	_        d!}| j?                         r)t3        | jA                  |d"#      d         jB                  }|d$k(  s|d%k(  rd|	j                  v rtE        d&      |	j2                  d'v r|	j                  dk(  rt1        |	j                        }|rPt+        t+        d3i |d it+        d3i |d(z   d"iz        }|d!k(  r|t+        d3i |diz  }|d$k(  rbt+        d3i |d gi}nSt+        t+        d3i |d i t+        d3i |d(z   d"i z        }|d!k(  r|t+        d3i |di z  }|d$k(  rt+        d3i |d gi }|j                  |       |	j                  d)k(  r*	 t        jF                  tI        |	j                        *       | tP        jS                  |	j                  d       }|	j                  d,k(  rYtU        |	       |j                  t+        d3i | d-|	j                  jV                  | d.|	j                  jX                  i       |	j                  d/k(  rZtU        |	       |j                  t+        d3i | d-|	j                  jV                  | d.|	j                  jX                  i        |	j                  dk(  r+|j                  t+        d3i | d0|	j                  i       Y|	j                  dk(  r,|j                  t+        d3i | d0|	j                  i        |	j                  dk(  rRt1        |	j                        r|j                  t+        d3i |d"i       |j                  t+        d3i |d"i        |	j                  j                  d1      r4tU        |	       |j                  t+        d3i ||	j                  i        DtU        |	       |j                  t+        d3i ||	j                  i       w |j                  |        |D cg c]  }t[        d2 |       }}	 |j\                  t^        j`                  k(  rDt+               }|D ]"  }|jc                  |t*        j`                         $ | j                  |      } | S |D ]  }| j                  |      }  | S c c}w # tJ        $ rH}tL        jO                  d+|	j                  tI        |             | j                         cY d }~c c S d }~ww xY wc c}w )4NrS   )r   is_child_filter
annotatorsannotations__completed_byr   
updated_by)r   predictions_resultsr   annotations_idsannotations__idr;   z,|;| r5   r7   r%   r   predictions_model_versions)$predictions__model_version__contains)"predictions__model_version__isnullfile_uploadfile_upload_fieldr   r   rI   filter_z$undefined$	undefinedri   r   )total_predictionstotal_annotationscancelled_annotationsr9   r'   rD   Tr   listtuplezNot supported filter type)StringUnknownrN   r?   )patternz"Incorrect regex for filter: %s: %sr1   rM   rL   r3   __innot_c                     | |z  S NrF   )xys     rH   <lambda>zapply_filters.<locals>.<lambda>  s
    Q rG   rF   )2r!   r	   &DATA_MANAGER_CUSTOM_FILTER_EXPRESSIONSrX   child_filterrY   rx   r   r   DATA_MANAGER_PREPROCESS_FILTERrV   r   r   noner   resplitisdigitr   r   r<   r   r>   r:   r"   r   rU   r   r   r   r   existsr   rA   r    compilerD   r   r   info	operatorsrn   r   r   r   r   conjunctionr   ORadd)r   rW   rr   r   custom_filter_expressionsfilter_line_expressionsparent_filterfilter_liner   r]   r   r   r   _preprocess_filterfilter_expressionr[   r   r   r   clean_field_name
value_typer   fleresolved_filter_linesresult_filterresolved_filters                              rH   apply_filtersr    s    !*(*Y*Y Z .0  H;ERE_E_}m&@&@Afset&(" B	LG+88DnTaTnTnInO >>,,_=AV %.h.L.L$M!1'..'JMJ !*(*Q*Q R'<G !: /! !"))*;< %l*,GRdF # %Z<%?wXjkF# KK*:w@RT[\V##==?*z) ...
!1!11 13'--0P%',TY^c^k^k^mE
%GM 5<4D4D
4RyXeG$ 0 00"==002() 99g>N>NRZRcRc>cC$]] GEFFAG"))!,;;@P@PT\TiTi@iC$]] HE!GGGAH"))!,;;@P@PT\TbTb@b*7==9"))!u*UV ]*0
 ||x'J,A,A(,K'//"=
,8,, !*"4"4]K"P!QRTX,Z@z|U &-Z-?-?{-[,\#] #-  !$gg$$/.@.O7U`  ! J !("6"6z"6"Ma"PQZZ
f$
g(=7gN^N^C^%&ABB ||449I9IW9T*7==9!1z401A4Xj9PRV8W4XXYA!U*Q2*b!122!V+5dV 45 12
D122a6Z:
;RTX:Y6Z5ZZ[A!U*a3:r"2333!V+6*tf!566"))!, !!W,+JJs7=='9: --immG<L<Lb.Q-RSJ 4'7#")) )l%0'--2C2C)l%0'--2C2C !!X-7#")) )l%0'--2C2C)l%0'--2C2C  !!Y."))=J<t,gmm<=
 !!]2"))>ZL-w}}=>>
 !!W,%gmm4&--a.E:t2D.EF&--q/FJ3E/F.FG !!,,V47#"))1+K
GMM/J+K*KL 7#"))!*Jz7==.I*JKEB	LH 	 &&'9:QH;T I``V$6<`` o0004 	5Ooqtt4	5??=1 O  5 	8O7H	8OE%h ! +KK DgmmUXYZU[\#==?**+| as6   $a3,a3=a3)a8!c8	c	9c:c	c	c                       e Zd ZdZddZy)TaskQuerySetzGQuerySet for Task model with Data Manager filters and ordering support.Nc                    ddl m} | }||S |j                  r*|j                  j	                  |j
                  d         }n&|j                  j	                  |j                        }|j                  }t        ||j                  ||      }t        ||j                  |||j                        }|j                  s|S |j                  j                  du r>|j                  j                  r(|j!                  |j                  j                        }|S |j                  j                  du r<|j                  j"                  r&|j%                  |j                  j"                        }|S )a  Apply filters, ordering and selected items to queryset

        :param prepare_params: prepare params with project, filters, orderings, etc
        :return: ordered and filtered queryset

        Note: For multi-project queries, filters and ordering will use the first project's
        configuration (label config, custom fields, etc.). This is backwards compatible
        with single-project queries.
        r   ra   )r   )r   Fr   T)rl   rb   is_multi_projectrq   rn   projectsrr   r   r  rW   r   rT   ri   selectedItemsallincludedrY   excludedexclude)selfrZ   rb   r   rr   r   s         rH   preparedzTaskQuerySet.prepared  s@    	,!O **oo))^-D-DQ-G)HG oo))^-C-C)DG (( >+A+A7GT!(N,C,CWgaoatatu++O ''++u49U9U9^9^n.J.J.S.STH  ))--5.:V:V:_:_''~/K/K/T/T'UHrG   r   )rA   rB   rC   __doc__r$  rF   rG   rH   r  r    s
    Q(rG   r  c                   (     e Zd ZdZdZd fd	Z xZS )GroupConcatGROUP_CONCATz)%(function)s(%(distinct)s%(expressions)s)c                 d    |t        j                         n|}t        |   |f|rdnd|d| y )Nz	DISTINCT rI   )distinctr   )r   	JSONFieldsuper__init__)r#  
expressionr*  r   extra	__class__s        rH   r-  zGroupConcat.__init__'  s7    -9-Av'')|rXk2\hrlqrrG   )FN)rA   rB   rC   functiontemplater-  __classcell__)r0  s   @rH   r'  r'  #  s    H:Hs srG   r'  returnc                      ddl m}  | j                  j                  t	        d            j                  d      d d }t        |j                  d            S )Nr   )r   r   r   z-idr   
created_at)rm   r   rq   rY   r   r   r   r   )r   newest_annotationss     rH   newest_annotation_subqueryr8  ,  sO    '#++222GPPQVWXZYZ[&--l;<<rG   r   c           	      ^    | j                  t        t        dt                                 S )NT)
is_labeledr   completed_at)r   r   r   r8  r   s    rH   base_annotate_completed_atr>  3  s&    $ttJdJf/g*hiirG   c                     t        t        j                        }t        t        j                        }t	        |      }t	        |      }|r|rt        |       S t        |       S r   )r!   r	   LSE_PROJECTGET_TASKS_AGREEMENT_QUERYSETbool6annotated_completed_at_considering_agreement_thresholdr>  )r   
LseProjectget_tasks_agreement_querysetis_lse_projecthas_custom_agreement_querysets        rH   annotate_completed_atrH  7  sU    8//0J#,X-R-R#S *%N$()E$F!7EhOO%h//rG   c                    t        t        j                        }t        t        j                        }t	        |      }t	        |      }|xr t        | d      xr | j                  d u}|r| j                  j                  nd }||r|st        |       S t        |j                  j                  |      j                  dd            }|r|d   nd }|r|st        |       S  ||       } |d   }	t        t        t        d      t        |      t        t!        d      |	z   	      z  z  t#               
      t%        d       t'                     }
| j)                  |
      S )Nrr   )
project_idagreement_threshold$max_additional_annotators_assignableT)r:  )_agreement__gteoverlap)annotator_count__gte)r   r   r;  )r!   r	   r@  rA  rB  r   rr   rf   r>  r   rq   rY   r   r   r   r   r   r8  r   r   r   )r   rD  rE  rF  rG  project_existsrJ  lse_projectrK  rL  completed_at_cases              rH   rC  rC  D  sb   8//0J#,X-R-R#S *%N$()E$F!#e)(DeIYIYaeIeN(6!!$$DJ7T)(33!!Z!8??!#I	
K AL+&;<QU1)(33+H5H+67]+^("56!I,9]*]_`
 ,-	
 d"_ *;<<rG   c           
          ddl m} t        j                  D cg c]  }t	        |dz          }}| j                  t         ||t        d            dt               i      S c c}w )Nr   )intersperse__key;r   )storage_filename)	ro   rT  r	   IO_STORAGES_IMPORT_LINK_NAMESr   r   r   r   r   )r   rT  sstorage_key_namess       rH   annotate_storage_filenamer[  q  sb    ?191W1WXA1w;XX->c
!KfZcZef    Ys   A#c           	         t         j                  t         j                  k(  rB| j                  t	        t        d      t        d      t        j                                     S | j                  t        ddt        g                   S )Nr   rI   r   )r   Tr*  r   
r	   	DJANGO_DBDJANGO_DB_SQLITEr   r   r'  r   r   	CharFieldr
   r=  s    rH   annotate_annotations_resultsrb  z  x    X666   (12E"IFL\L\L^! ! 
 	
   X>S^blqrtlu5v wwrG   c           	         t         j                  t         j                  k(  rB| j                  t	        t        d      t        d      t        j                                     S | j                  t        ddt        g                   S )Npredictions__resultrI   r   )r   Tr]  r^  r=  s    rH   annotate_predictions_resultsrf    rc  rG   c           	         t         j                  t         j                  k(  rB| j                  t	        t        d      t        d      t        j                                     S | j                  t        ddt        g                   S )Nr   rI   r   )r   Tr]  r^  r=  s    rH   annotate_annotatorsrh    sw    X666  ,G H%PR)bhbrbrbtu ! 
 	
   H5P[_inoqir,s ttrG   c                 f   | j                         }|s| S t        d|j                  j                  j                        rt        |j                  j                  j                  |j                        j                  dd            }t        |      dk(  r| j                  t        d            S | j                  t        dt        |	      
            S |j                  j                  }|| j                  t        d            S | j                  t        dt        |      
            S )N5ff_front_dev_1682_model_version_dropdown_070622_shortr   model_versionTr   r   predictions__score)predictions_score)predictions__model_version__in)rY   )predictions__model_version)r   r   rr   organization
created_byr   ml_backendsrY   r   rt   r   r   r   rk  )r   
first_taskmodel_versionsrk  s       rH   annotate_predictions_scoreru    s$   !J GI[I[IhIhIsIst**11*:L:L1MYYZiptYu
 ~!#$$s;O7P$QQ $$"%&:1drCs"t %   #**88 $$s;O7P$QQ$$"%&:1`mCn"o %  rG   c                     t         j                  t         j                  k(  r/| j                  t	        dt        j                                     S | j                  t        dt        g                   S )Nr   r   )r   r   	r	   r_  r`  r   r'  r   ra  r
   r   r=  s    rH   annotate_annotations_idsry    s_    X666  =N]c]m]m]o1p qq  :KUZ[]U^1_ ``rG   c                     t         j                  t         j                  k(  r/| j                  t	        dt        j                                     S | j                  t        dt        g                   S )Nro  r   )r   rw  rx  r=  s    rH   #annotate_predictions_model_versionsr{    sh    X666  '23O^d^n^n^p'q ! 
 	
   HEakpqskt<u vvrG   c                 8    | j                  t        d            S )Nannotations__lead_time)avg_lead_time)r   r   r=  s    rH   annotate_avg_lead_timer    s    3/G+HIIrG   c           	          ddl m} | j                  t        |j                  j                  t        d                        S )Nr   )AnnotationDraftr   r   )draft_exists)rm   r  r   r   rq   rY   r   )r   r  s     rH   annotate_draft_existsr    s9    ,&1H1H1O1OU]^bUc1O1d*effrG   c                 8    | j                  t        d            S )Nfile_upload__file)r   )r   r   r=  s    rH   r   r     s    q1D/EFFrG   c                     | S r   rF   r=  s    rH   dummyr    s    OrG   c                     | j                         } d| j                  j                  v r| j                  t	        d            S | S )a  
    Annotate queryset with FSM state as 'state' field.

    Uses FSMStateQuerySetMixin.with_state() to efficiently annotate
    the current state without causing N+1 queries. Aliases 'current_state' to
    'state' to match the Data Manager column name.

    Note: Feature flag checks and user context validation are handled by
    with_state() itself, so no additional checks are needed here.
    r   )r   )
with_statequeryannotationsr   r   r=  s    rH   annotate_stater    sD     ""$H (..444  q'9 ::OrG   )r~  r<  r   r   r   rm  r   r   r   r  rW  r   c                  "    t         j                  S r   )r	   DATA_MANAGER_ANNOTATIONS_MAPrF   rG   rH   get_annotations_mapr    s    000rG   c                 B    t         j                  j                  |        y r   )r	   r  update)objs    rH   update_annotation_mapr    s    ))005rG   c                   6    e Zd ZdZe	 dd       Z	 ddZddZy)	PreparedTaskManagera  
    Manager for Task model with Data Manager annotations.

    Provides:
    - Advanced query annotations for Data Manager
    - Filter and ordering support
    - FSM state annotation support (via TaskQuerySet)

    Note: Overrides the base get_queryset() to return TaskQuerySet. Also has
    a custom get_queryset(fields_for_evaluation, prepare_params, ...) method
    for Data Manager-specific functionality.
    Nc                 L   t               }t        dd      rt        t        dd       }|rt	        |      } ||t        | j                         dd             xs i }t        |t              rN|rLi ||}|D|j                         D 	cg c]	  }	|	|v s|	 }
}	|
r t        t        |      t        |
      z        }|g }|g }| j                         }|d n|j                  }|j                         D ])  }||v s|s
||vs|| _        || _        ||   } ||       } + | S c c}	w )N-fflag_utc_428_consensus_control_tag_agreementauto)ry   GET_DYNAMIC_DM_ANNOTATIONSrr   )r   rr   )r  r   getattrr	   r!   r   
isinstancedictkeysr   rs   rr   r   )r   fields_for_evaluation
all_fieldsexcluded_fields_for_evaluationr   annotations_mapinject_pathoverlay_funcoverlay_mapkoverlay_keys_in_requestrs  rr   r   r1  s                  rH   annotate_querysetz%PreparedTaskManager.annotate_queryset  sW    ./ C&Q!(,H$OK(5*7GHNNL\^gimDnousuk40[
 'I&HK&HO,8>I>N>N>P2oTUYnTn12o/2o248=R9SVYZqVr9r4s1 ($&!)1-/*^^%
$,$*2D2D %))+ 	.E..*%OmBm#* #* *51#H-	. / 3ps   		D!D!c                     |!t        | j                  | j                        S | j                  |      }t	        |dd      |_        | j                  |||||j                        S )a  
        Get queryset with optional Data Manager annotations and filters.

        When called without parameters (Django internal use), returns TaskQuerySet.
        When called with parameters (Data Manager use), returns annotated and filtered queryset.

        :param fields_for_evaluation: list of annotated fields in task
        :param prepare_params: filters, ordering, selected items
        :param all_fields: evaluate all fields for task
        :param excluded_fields_for_evaluation: list of fields to exclude even when all_fields=True
        :param request: request for user extraction
        :return: task queryset with annotated fields
        NusingrZ   ri   )r  r  r  r   )r  model_dbonly_filteredr  r   r  r   )r#  r  rZ   r  r  r   s         rH   get_querysetz PreparedTaskManager.get_querysetB  sr    " !

$((;; %%^%D$^VTB%%"7!+I"** & 
 	
rG   c                 R   |j                   }|j                  r0t        | j                        j	                  |j
                        }n/t        | j                        j	                  |j                        }t        |      }| j                  |||      }|j                  |      S )N)project__inr   )r  r   r  )
r   r  r  r  rY   r  rr   r_   r  r$  )r#  rZ   r   r   fields_for_filter_orderings        rH   r  z!PreparedTaskManager.only_filteredb  s     ((**#DJJ/66>CZCZ6[H#DJJ/66~?U?U6VH%CN%S"))(Jdnu)v   ??rG   )NFNN)NNFNr   )rA   rB   rC   r%  staticmethodr  r  r  rF   rG   rH   r  r    s2     mq, ,^ qu
@	@rG   r  c                   "    e Zd ZdZd Zd Zd Zy)TaskManagera  
    Default manager for Task model.

    Provides:
    - User-scoped filtering
    - Custom QuerySet with FSM state support

    Note: Overrides get_queryset() to return TaskQuerySet, which includes
    FSMStateQuerySetMixin for state annotation support.
    c                 D    t        | j                  | j                        S )z?Return TaskQuerySet which includes FSM state annotation supportr  )r  r  r  r#  s    rH   r  zTaskManager.get_querysetz  s    DJJdhh77rG   c                 V    | j                         j                  |j                        S )N)project__organization)r  rY   active_organization)r#  ry   s     rH   for_userzTaskManager.for_user~  s%      "))@X@X)YYrG   c                 >    | j                         j                         S )z)Return queryset with FSM state annotated.)r  r  r  s    rH   r  zTaskManager.with_state  s      "--//rG   N)rA   rB   rC   r%  r  r  r  rF   rG   rH   r  r  n  s    	8Z0rG   r  )Tr   )kr%  loggingr  r   	functoolsr   typingr   ujsonr   core.feature_flagsr   core.utils.dbr   data_manager.prepare_paramsr   django.confr	   "django.contrib.postgres.aggregatesr
   	django.dbr   django.db.modelsr   r   r   r   r   r   r   r   r   r   r   r   r   django.db.models.fields.jsonr   django.db.models.functionsr   r   r   fsm.queryset_mixinsr   fsm.registryr   pydanticr   rest_framework.exceptionsr    label_studio.core.utils.commonr!   label_studio.core.utils.paramsr"   	getLoggerrA   r   r   r$   r   r&   r(   r*   r,   r.   r0   r2   r4   r6   r8   r:   r<   r>   r@   r  r_   r   r   r   r   r   r  QuerySetr  r'  r8  r>  rH  rC  r[  rb  rf  rh  ru  ry  r{  r  r  r   r  r  r  r  r  Managerr  r  rF   rG   rH   <module>r     sX    	     ' $ 7   7     : = = 5 *  5 4 =			8	$)#	 #" ; NNBMM6fGwKKOORb"NNJ}=NNI	$$&R0f>&+\
cL+(&// +\s) s=H =j j, j
0L 
0\ 
0*=Z  xxu6awJgG0 ,)77"E3%/)1) % 16f@&.. f@R0&.. 0rG   