
    	]jJ>                     *   d Z ddlZddlmZ ddlmZmZ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 dZ ej6                  e      Z G d de      Zd Z d Z!d Z"d Z#d Z$d Z%d Z&dee'e(f   fdZ)dedede*fd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)OrderedDict)AnyIterableTuple)unquote)flag_set)int_from_request)View)PrepareParams)settings)get_object_or_404)Tasktasks:c                       e Zd Zy)DataManagerExceptionN)__name__
__module____qualname__     M/root/env/lib/python3.12/site-packages/label_studio/data_manager/functions.pyr   r      s    r   r   c                    dg i}g }d}t               }i }| j                  j                         D ]  \  }}d|vs|||<    |j                  |j                                | j                  j
                  }	t        j                  d| j                   d|	d|       |	r%|j                  |	D ci c]
  }||vs|d c}       t        j                  d| j                   d|       t        |      dkD  r |j                  t        j                  d       t        j                  d| j                   d|d	|       t        |j                               D ]q  \  }}
||t        j                  k7  r|nd
|
dv r|
nddd
d||v xs |t        j                  k(  ddd}|d   j                  |       |j                  |d          |dz  }s t        dd      }d
d
dd|dd}|dxx   ddddddddddgz  cc<   |dxx   ddddddddddgz  cc<   |rg }n| j                   j#                  dd       }|dxx   d!d"d#dd$ddddd%d&d'ddd(ddddd%d)d*ddd+ddddd%d,d-ddd.ddddd%d/d0ddd1d2|sd3d4|iini ddddd5d6d7ddd8ddddd%d9d:ddd;ddddd%d<d=ddd>ddddd%d?d@dddA| j%                         ddBdddddCdDdEdddFddddd%dGdHdddIddddd%dJdKdddLddddd%dMdNd#ddOddddd%dPdQd#ddRddddd%dSdTdddUd2|sd3d4|iini ddddd5dVdWdXdYdddddddZd[d\d]ddddddgz  cc<   |d   j                  |       |S c c}w )^z/Make columns info for the frontend data managercolumnsr   [zget_all_columns: project_id=z all_data_columns=z data_types=UnknownNz project_data_types=data)ImageAudio	AudioPlusVideor   StringtasksT)explorelabeling)idtitletypetargetparentvisibility_defaultsproject_definedr%      3fflag_feat_fit_449_datamanager_filter_members_shortauto)userListF)r%   r&   r'   r(   childrenr+   IDNumberzTask ID)r%   r&   r'   helpr(   r*   r+   inner_idzInner IDz8Internal task ID starting from 1 for the current project)flatcompleted_at	CompletedDatetimezLast annotation date)r%   r&   r'   r(   r4   r*   r+   total_annotationsAnnotationszTotal annotations per taskcancelled_annotations	Cancelledz%Total cancelled (skipped) annotationstotal_predictionsPredictionszTotal predictions per task
annotatorszAnnotated byz All users who completed the task)r%   r&   r'   r(   r4   schemaitems)r*   r+   annotations_resultszAnnotation resultsz/Annotation results stacked over all annotationsannotations_idszAnnotation IDsz+Annotation IDs stacked over all annotationspredictions_scorezPrediction scorez2Average prediction score over all task predictionspredictions_model_versionszPrediction model versionsz.Model versions aggregated over all predictions)rB   multiple)r%   r&   r'   r(   r4   rA   r*   r+   predictions_resultszPrediction resultsz/Prediction results stacked over all predictionsfile_uploadzUpload filenamezFilename of uploaded filestorage_filenamezStorage filenamezFilename from import storage
created_atz
Created atzTask creation time
updated_atz
Updated atzTask update time
updated_byz
Updated byz!User who did the last task updateavg_lead_timez	Lead TimeTimez&Average lead time over all annotationsdraft_existsDraftsBooleanz.True if at least one draft exists for the task)r   
data_typesrB   updatesummaryall_data_columnsloggerinfor%   lenpopr   DATA_UNDEFINED_NAMElistappendr   all_membersvalues_listget_model_versions)project_resulttask_data_childrenirS   project_data_typeskeyvaluerV   	data_typecolumnremove_members_schema	data_rootproject_memberss                  r   get_all_columnsrn      se   _F 	AJ ((..0 ,
U c>&+s#	,
 (..01 77
KK.wzzl:M<L;NmPZ}]^5E_cT^I^3	>_`
KK.wzzl-J=IJ "x33T:
KK.wzzl-J=H]J\I^_`z//12 Y8#?#??SV!*.a!aIgo#55\@\@\9\$  $
 	y  (!!&,/	Q" %%Zagh & I 9 /3#G$	
  9N/4%#H$	

 
 !--99$T9J
9  */3#G$	
 &"0/3#F$	
 * ;/3#G$	
 &"0/3#G$	
 #6		
 >S7O45XZ		
 04#G$		
 ()E/4%#H$	
 $%A/4%#H$	
 &'H/4%#H$	
 /0D ' : : <$O/4%#H$		
 ()E/4%#H$	
  &//4%#H$	
 %'2/4%#H$	
 !(/4%#H$	
 !&/4%#H$	
 !7		
 >S7O45XZ		
 05%#H$		
 " </4%#H$	
 !D/4%#H$	
i] ]~ 9Y'MI `s   /	M9Mc                 h   t        | j                  dd      xs t        | j                  dd      }|dkD  rZt        t        |      }|j
                  j                  |j                  k7  rt        d      |j                  d      }| |_	        |S d| j                  v r,t        j                  t        | j                  d               }n| j                  }|j                  ddg d	      }t        |t              sAt        |t               r	 t        j                  |      }nt        dt)        |       d|       |j                  dd      }|j                  dg       }	t+        |j,                  ||||	|       }|S # t"        $ r+}t$        j'                  d
|        t        d|       d}~ww xY w)zThis function extract prepare_params from
    * view_id if it's inside of request data
    * selectedItems, filters, ordering if they are in request and there is no view id
    viewr   )pkzProject and View mismatchT)add_selected_itemsqueryselectedItems)allexcludedzError parsing selectedItems: z{selectedItems must be JSON encoded string for dict: {"all": [true|false], "excluded | included": [...task_ids...]}. Found: NzhselectedItems must be dict: {"all": [true|false], "excluded | included": [...task_ids...]}. Found type: z with value: filtersordering)ra   rt   r   rw   rx   request)r	   GETr   r   r
   ra   rq   r   get_prepare_tasks_paramsry   jsonloadsr   get
isinstancedictstr	ExceptionrW   errorr'   r   r%   )
ry   ra   view_idrp   prepare_paramsr   selectederw   rx   s
             r   get_prepare_paramsr     s    w{{FA6c:J7<<Y_ab:cG{ '2<<??gjj(&'BCC66$6O!(F = gkk!::ggkk'&:;<D <<D88OTr-JK(D)(C(#zz(3H +##'>"2-zK 
 ((9d+88J+&JJhT7]eov
 % ! LL#@!DE.""*- s   E= =	F1&F,,F1c                 ^    t        | |      }t        j                  j                  |      }|S )N)r   )r   r   preparedonly_filtered)ry   ra   r   querysets       r   get_prepared_querysetr   I  s*    '9N}}**.*IHOr   c                 h    | sy| d   j                   }|j                  }|r|j                  |       S y)z
    Call the given ML backend to retrieve predictions with the task queryset as an input.
    If backend is not specified, we'll assume the tasks' project only has one associated
    ML backend, and use that backend.
    Nr   )r"   )ra   
ml_backendpredict_tasks)r"   ra   backends      r   evaluate_predictionsr   O  s@     AhG  G$$5$11 r   c                 p    | j                  d      xs$ | j                  d      xs | j                  d      S )Nrw   rx   rt   )r~   )r   s    r   %filters_ordering_selected_items_existr   `  s-    88IS$((:"6S$((?:SSr   c                       y Nr   )argskwargss     r   custom_filter_expressionsr   d  s    r   c                     | S r   r   )_filterrb   s     r   preprocess_filterr   h  s    Nr   returnc                    | }d}|j                  d      rd}|dd }ddg}|D ]"  }|j                  |      s|t        |      d }$ |r|j                  d      rd}|dd }|j                  d      r|j                  dd	      }|j                  j                  }t        |j
                  j                               dk(  xr ||j
                  j                         v xs- t        |j
                  j                               d
k(  xr |dk(  }|r+|r)t        j                  |v rdt        j                   }||fS |j                  dd      }||fS )a  Transform a field name (as specified in the datamanager views endpoint) to
    a django ORM field name. Also handle dotted accesses to task.data.

    Edit with care; it's critical that this function not be changed in ways that
    introduce vulnerabilities in the vein of the ORM Leak (see #5012). In particular
    it is not advisable to use `replace` or other calls that replace all instances
    of a string within this function.

    Returns: Django ORM field name: str, Sort is ascending: bool
    T-Fr,   Nzfilter:r   zdata. r   r   data__)	
startswithrY   replacerU   common_data_columnsrS   keysr   r[   )	raw_field_namera   
field_name	ascendingoptional_prefixesprefix	real_namer   real_name_suitables	            r   preprocess_field_namer   l  s     JI S!	^
 #H-# 3  (#CKM2J3
 Z**3/	^
W%&&w3	%ooAA ""'')*a/ 7W//4466$ 7%%**,-2 $V# 	 #,,0CC!(">">!?@J y   $++GX>Jy  r   rB   	separatorc                     g }| D ]$  }|j                  |       |j                  |       & |r|j                          |S )z
    Create a list with a separator between each item in the passed iterable `items`

    for example, intersperse(['one', 'two', 'three'], 0) == ['one', 0, 'two', 0, 'three']
    )r]   rZ   )rB   r   outputitems       r   intersperser     sC     F !di ! 

Mr   ),__doc__loggingcollectionsr   typingr   r   r   urllib.parser   ujsonr|   core.feature_flagsr   core.utils.commonr	   data_manager.modelsr
   data_manager.prepare_paramsr   django.confr   rest_framework.genericsr   tasks.modelsr   TASKS	getLoggerr   rW   r   r   rn   r   r   r   r   r   r   r   boolr   r\   r   r   r   r   <module>r      s     # ' '    ' . $ 5   5 			8	$	9 	{|/d2"T	6!eCI6F 6!rx C D r   