
    	]j&              	          d 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  G d	 d
e      Zi deeeegdeeegdegdeegdeegdeegdeeegdeeegdeeegdeegdeegdeegdeegdeegdeegdeegdeegeegeegeegee ed      geegdZ ej2                  e      Z G d d      Z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)reduce)getitem)urlparse)-replace_task_data_undefined_with_config_field)extract_message)ValidationErrorc                       e Zd Zy)	SkipFieldN)__name__
__module____qualname__     G/root/env/lib/python3.12/site-packages/label_studio/tasks/validation.pyr
   r
      s    r   r
   TextHeader	HyperTextImage
ParagraphsChatTable
TimeSeriesTimeSeriesChannelListChoicesPolygonLabelsLabelsBrushLabelsEllipseLabelsHyperTextLabelsKeyPointLabels)ParagraphLabelsRectangleLabelsTimeSeriesLabelsTaxonomyRankerc                   v    e Zd ZdZddZed        Zedd       Zed        Zed        Z	d Z
ed	        Zd
 Zy)TaskValidatorziTask Validator with project scheme configs validation. It is equal to TaskSerializer from django backend.Nc                 <    || _         || _        d| _        d| _        y )Nr   )projectinstanceannotation_countprediction_count)selfr*   r+   s      r   __init__zTaskValidator.__init__0   s       ! !r   c                    |t        d      t        ||        | j                  j                         D ]  \  }}d|v }|j	                  d      d   }d|v r$|j	                  d      }	 t        t        ||      }n$||vrt        dj                  |            ||   }|rt        f}nt        j                  |t        f      }t        |t        |            rt        dj                  ||t        |      j                   ||D cg c]  }|j                    c}             |S # t        $ r t        dj                  |            w xY wc c}w )	zValidate data from task['data']zTask is empty (None)[r   .z)"{data_key}" key is expected in task data)data_keyzdata['{data_key}']={data_value} is of type '{type}', but the object tag {data_type} expects the following types: {expected_types})r3   
data_valuetype	data_typeexpected_types)r   r   
data_typesitemssplitr   r   KeyErrorformatlist_DATA_TYPESgetstr
isinstancetupler5   r   )	r*   datar3   r6   is_arraykeys	data_itemr7   es	            r   
check_datazTaskValidator.check_data6   sm    <!"8995dGD $+#5#5#;#;#=  	Hi hH~~c*1-Hh~~c*q &wd ;I 4')*U*\*\fn*\*opp N	"&!,SF!Ci~)>?%ccici!)#,!)_55"+<J'Kq

'K dj d	 	/ 	D 1   q)*U*\*\fn*\*oppq( (Ls   (D&E&%Ec                     	 t         j                  | |       y# t        $ r=}|rt        |j                  d   dz         t        |j                  d   dz         d}~ww xY w)zCheck data consistent and data is dict with task or dict['task'] is task

        :param project:
        :param data:
        :param dict_is_root:
        :return:
        r   z. [assume: item as is = task root with values] z/ [assume: item["data"] = task root with values]N)r(   rH   r   detail)r*   rC   dict_is_rootrG   s       r   check_data_and_rootz!TaskValidator.check_data_and_rootc   s_    	g$$Wd3 	g%ahhqk4d&dee%ahhqk4e&eff		gs    	A8AAc                     d| vryy)NrC   FTr   )tasks    r   check_allowedzTaskValidator.check_allowedt   s      r   c                     || v rrt        | |   |      sbt        |t              r*dj                  |D cg c]  }|j                   c}      }n|j                  }t	        dj                  ||            y y c c}w )Nz or zTask[{key}] must be {class_def})key	class_def)rA   rB   joinr   r   r<   )rN   rQ   rR   cs       r   raise_if_wrong_classz"TaskValidator.raise_if_wrong_class}   sp    $;z$s)Y?)U+"KKY(G(GH	%..	!"C"J"Js^g"J"hii  @;(Gs   A8c           	      L   t        |d      r(| j                  | j                  |j                         |S | j                  rt        | j                  d      rt        | j                  j                  t              r| j                  j                  }n}t        | j                  j                  t              r+	 t        j                  | j                  j                        }n.t        dt        | j                  j                        z   dz         | j                  | j                  j                  |       |S t        |t              st        d      | j                  |      rv| j                  |dt        t         f       | j                  | j                  |d          | j                  |dt                |j#                  dg       D ]w  }t        |t              s)t$        j'                  dt        t        |                   <d	|v }|st        d
      t        |j#                  d	g       t               rnt        d       | j                  |dt                |j#                  dg       D ]L  }t        |t              s)t$        j'                  dt        t        |                   <d	|v }|rCt        d       | j                  |dt        t         f       |S | j                  | j                  |d       d|i}|S # t        $ r}t        dt        |      z         d}~ww xY w)zRValidate whole task with task['data'] and task['annotations']. task['predictions']rC   zCan't parse task data: Nz.Field "data" must be string or dict, but not ""zOTask root must be dict with "data", "meta", "annotations", "predictions" fieldsannotationsz'Annotation must be dict, but "%s" foundresultz$Annotation must have "result" fieldsz)"result" field in annotation must be listpredictionsz'Prediction must be dict, but "%s" foundz$Prediction must have "result" fieldsmetaT)rK   )hasattrrL   r*   rC   r+   rA   dictr@   jsonloads
ValueErrorr   r   r5   rO   rU   r=   r?   loggerwarning)r.   rN   rC   rG   
annotationok
predictions          r   validatezTaskValidator.validate   s    4 $$T\\499=K ==WT]]F;$--,,d3}}))DMM..4Z::dmm&8&89D &DtDMML^L^G__bee  $$T]]%:%:DAK $%!"stt d#%%dFT4LA$$T\\4<@ %%dM4@"hh}b9 W
!*d3NN#LcRVWaRbNcd+)*PQQ "*..2">E)*UVVW %%dM4@"hh}b9 R
!*d3NN#LcRVWaRbNcd+)*PQQR %%dFT4LA  $$T\\4d$KD>Dm " Z)*CoVWFX*XYYZs   7)K> >	L#LL#c                 H   t        |      dk(  rG|d   j                  dk7  rt        |d   j                  dz         nd}dj                  || |d   |      S dj	                  |      }t        |D cg c]  }|j                   c}      }d	j                  || ||
      S c c}w )N   r   invalid  z,Error {code} at item {i}: {detail} :: {item})codeirJ   itemz, z.Errors {codes} at item {i}: {errors} :: {item})codesrm   errorsrn   )lenrl   r@   r<   rS   )rm   rJ   rn   rl   rp   dro   s          r   format_errorzTaskValidator.format_error   s    v;!28)..I2MCq	,-SUDAHHdVW`fgh`iptHuuYYv&F0A01ECJJQVZ[djquJvv 1s   0Bc                    |t        d      t        |t              st        d      t        |      dk(  rt        d      g g }}d\  | _        | _        t        |      D ]  \  }}	 | j                  |      }|j                  |       |j                  i        d|v r!| xj                  t        |d         z  c_        d|v sd| xj
                  t        |d         z  c_         t        |      r,t        j                  dt        |      z          t        |      |S # t         $ rR}| j                  ||j                  |      }|j                  |       t        |      d	k\  rd
|d<   Y d}~ Y d}~d}~ww xY w)z)Body of run_validation for all data itemsNzAll tasks are empty (None)zdata is not a listr   zdata is empty)r   r   rX   rZ   d   z...c   zCan't deserialize tasks due to )r   rA   r=   rq   r,   r-   	enumeraterf   appendrs   rJ   anyra   rb   r@   )	r.   rC   retrp   rm   rn   	validatedexcerrors	            r   to_internal_valuezTaskValidator.to_internal_value   sg   <!">??$%!"677t9>!/22"V7;4t4  	FGAtF MM$/	 

9%b! D())Sm1D-EE) D())Sm1D-EE)#	F& v;NN<s6{JK!&))
) # ))!SZZ>e$v;#%!&F2J &	s   'D  	E;)AE66E;)N)F)r   r   r   __doc__r/   staticmethodrH   rL   rO   rU   rf   rs   r~   r   r   r   r(   r(   -   s    s" * *X g g    j jDL w w$r   r(   c                     	 t        | j                               }t        |j                  |j                  g      S # t
        $ r Y yw xY w)NF)r   stripallschemenetlocr`   )stringrY   s     r   is_urlr      sA    &,,.)FMM6==122 s   9< 	AA)r   logging	functoolsr   operatorr   urllib.parser   ujsonr^   core.label_configr   core.utils.exceptionsr   rest_framework.exceptionsr   	Exceptionr
   r@   intfloatr=   r]   r5   r>   	getLoggerr   ra   r(   r   r   r   r   <module>r      s      !  K 1 5		 	
S#ud#sC # c4[	
 4+ T3K dD# 4s# $c* T3K T{ c4[ sDk C; c4[  T{!" sDk#$ T{T{ddDJ'Sk-0 
		8	$M M`r   