
    	]j                        d Z ddlZddlmZ ddlmZ ddlmZ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 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& ddl'm(Z( ddl)m*Z* ddl+m,Z,m-Z- ddl.m/Z/m0Z0 ddl1m2Z2m3Z3m4Z4 ddl5m6Z6 ddl7m8Z8m9Z9m:Z:m;Z; ddl<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZC ddlDmEZEmFZFmGZGmHZHmIZI ddlJmKZK ddlLmMZMmNZNmOZO  ej                  eQ      ZR ed e
       r+ e&dgd d!d"eBid# e%d$eH e#d%eCd"&      g'      id(d)d*gd+,      nd- .       ed/ e
       r e&dgd0d1 e$d2e!j                  d3d45       e$d6e!j                  d3d75       e$d8e!j                  d3d95       e$d:e!j                  d;d<gd<d3d=>       e$d?e!j                  d3d@5       e$dAe!j                  d3dB5       e$d3e!j                  d3dC5      gdD e%dEdFdGdHdIdFdJdKdLdMdJdNdMdJdOdMdJdPdQR      id(dSdTdUdVd*gdWX      ndY .       G dZ d[e                    Z ed/ e&dgd\d] e$d^e!j                  d_d`5      gddD e%dae e#d%e?d"&      g'      id(d/d*gd+b      .       edc e&dgddde e$d^e!j                  d_d`5      gd"eBidD e%dfeH e#d%eCd"&      g'      id(dgd*gd+b      .       edh e&dgdidj e$d^e!j                  d_d`5      gdd(dhd*gd+k      .       G dl dme,j                                             ZW ed/ e&dgdndodD e%dp e#d%dqdrdsdtdudvdwdxidyd"&      gz      id{d|gi}      .       G d~ de,j                               ZY ed/ e&dgddddD e%deF e#d%e>d"&      g'      idd/d*gd+,      .       edc e&dgddd"e=idD e%deF e#d%e>d"&      g'      iddgd*gd+,      .       edh e&dgdddddhd*gd+      .       G d de,j                                             ZZ ed/ e&dgdd e$d^e!j                  d_d`5      gddD e%d eFd       e#d%e>gd"&      g'      iddSd*gd+b      .       ed e&dgdd e$d^e!j                  d_d`5      gd"e=id# e%deF e#d%e>d"&      g'      idd)d*gd+b      .       G d dee,j                                      Z\ e&d       G d de,j                               Z] e&d       G d de,j                               Z^ edS e&dgdd e$de!j                  d3d5       e$d6e!j                  d3d5      gddD e%d eGd       e#d%eAgd"&      g'      iddSd*gd+b      .       ed) e&dgddd"e@id# e%deG e#d%eAd"&      g'      idd)d*gd+,      .       ed e&dgdd e$d^e!j                  d_d5      gddD e%deG e#d%eAd"&      g'      idd/d*gd+b      .       edg e&dgdd e$d^e!j                  d_d5      gd"e@idD e%deG e#d%eAd"&      g'      id{d|gib      .       ed e&dgdd e$d^e!j                  d_d5      gd"e@idD e%deG e#d%eAd"&      g'      iddgd*gd+b      .       ed e&dgdd e$d^e!j                  d_d5      gdddhd*gd+k      .       G d de-j                                                                  Z` ed/ e&d      .       ed e&dgddd{d|gi      .       G d de,j                                      Zay)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)flag_set)GetParentObjectMixin)ViewClassPermissionall_permissions)is_community)bool_from_request)TaskListAPI)evaluate_predictions)PrepareParams)DataManagerTaskSerializer)transaction)Q)timezone)method_decorator)DjangoFilterBackend)OpenApiTypes)OpenApiExampleOpenApiParameterOpenApiResponseextend_schema)fill_history_annotation)Project)genericsviewsets)PermissionDeniedValidationError)
FormParser
JSONParserMultiPartParser)Response)
AnnotationAnnotationDraft
PredictionTask)annotation_request_schemaannotation_response_exampledm_task_response_exampleprediction_request_schemaprediction_response_exampletask_request_schematask_response_example)AnnotationDraftSerializerAnnotationSerializerPredictionSerializerTaskSerializerTaskSimpleSerializer)WebhookAction)api_webhookapi_webhook_for_deleteemit_webhooks_for_instancepostTaskszCreate taskz+Create a new labeling task in Label Studio.zapplication/json201zCreated taskresponse)namevalue
media_type)descriptionr8   examplestaskscreatepublic)x-fern-sdk-group-namex-fern-sdk-method-namex-fern-audiences)tagssummaryr<   request	responses
extensionsc                     | S N fs    @/root/env/lib/python3.12/site-packages/label_studio/tasks/api.py<lambda>rO   N       1     )r9   	decoratorgetzGet tasks listzq
    Retrieve a list of tasks with pagination for a specific view or project, by using filters and ordering.
    viewqueryzView ID)r9   typelocationr<   projectz
Project IDresolve_uriz*Resolve task data URIs using Cloud Storagefieldsall	task_onlyzOSet to "all" if you want to include annotations and predictions in the response)r9   rV   enumdefaultrW   r<   reviewzGet tasks for reviewincludez/Specify which fields to include in the responsea  Additional query to filter tasks. It must be JSON encoded string of dict containing one of the following parameters: `{"filters": ..., "selectedItems": ..., "ordering": ...}`. Check [Data Manager > Create View > see `data` field](#tag/Data-Manager/operation/api_dm_views_create) for more details about filters, selectedItems and ordering.

* **filters**: dict with `"conjunction"` string (`"or"` or `"and"`) and list of filters in `"items"` array. Each filter is a dictionary with keys: `"filter"`, `"operator"`, `"type"`, `"value"`. [Read more about available filters](https://labelstud.io/sdk/data_manager.html)<br/>                   Example: `{"conjunction": "or", "items": [{"filter": "filter:tasks:completed_at", "operator": "greater", "type": "Datetime", "value": "2021-01-01T00:00:00.000Z"}]}`
* **selectedItems**: dictionary with keys: `"all"`, `"included"`, `"excluded"`. If "all" is `false`, `"included"` must be used. If "all" is `true`, `"excluded"` must be used.<br/>                   Examples: `{"all": false, "included": [1, 2, 3]}` or `{"all": true, "excluded": [4, 5]}`
* **ordering**: list of fields to order by. Currently, ordering is supported by only one parameter. <br/>
                   Example: `["completed_at"]`200z
Tasks listobjectzList of tasksarrayzTask object)r<   rV   )r<   rV   itemszTotal number of tasksintegerzTotal number of annotationszTotal number of predictions)r>   totaltotal_annotationstotal_predictions)rV   
properties)r<   r8   listz$request.pagez$response.tasks)offsetresults)rA   rB   zx-fern-paginationrC   )rD   rE   r<   
parametersrG   rH   c                     | S rJ   rK   rL   s    rN   rO   rO      rP   rQ   c                   z     e Zd ZeZ eej                  ej                        Z	e
gZdgZ fdZ fdZd Z xZS )r	   GETPOSTrX   c                     t         |   |      }|j                  | j                  j                  j
                        S Nproject__organization)superfilter_querysetfilterrF   useractive_organization)selfqueryset	__class__s     rN   rx   zTaskListAPI.filter_queryset   s3    7*84T\\5F5F5Z5Z[[rQ   c                     t         |          }| j                  j                  j	                  d      }|rt        j                  t        |      |d<   |S )NrX   pk)rw   get_serializer_contextrF   datarS   r   get_object_or_404r   )r|   context
project_idr~   s      rN   r   z"TaskListAPI.get_serializer_context   sI    '02\\&&**95
!)!;!;G
!SGIrQ   c                    | j                   j                  j                  d      }t        j                  t
        |      }|j                  |      }t        | j                   j                  j                  |t        j                  |g       y )NrX   r   )rX   )rF   r   rS   r   r   r   saver4   rz   r{   r1   TASKS_CREATED)r|   
serializerr   rX   instances        rN   perform_createzTaskListAPI.perform_create   si    \\&&**95
,,WD??7?3"LL117M<W<WZbYc	
rQ   )__name__
__module____qualname__r/   serializer_classr   r   
tasks_viewtasks_createpermission_requiredr   filter_backendsfilterset_fieldsrx   r   r   __classcell__r~   s   @rN   r	   r	   7   sK    x &-&&)) ++O!{\
rQ   r	   zGet taskzt
        Get task data, metadata, annotations and other attributes for a specific labeling task by task ID.
        idpathzTask IDr$   )rD   rE   r<   rm   rF   rG   rH   patchzUpdate taskz3Update the attributes of an existing labeling task.zUpdated taskupdatedeletezDelete taskz<Delete a task in Label Studio. This action cannot be undone!)rD   rE   r<   rm   rF   rH   c                       e Zd ZeeefZ eej                  ej                  ej                  ej                        Z fdZd Zd Zd Zd Zd Zd Zd	 Z fd
Z eej0                         fd       Z ed       fd       Z xZS )TaskAPIrq   PUTPATCHDELETEc                 V    t        |   |g|i | | j                         | _        y rJ   )rw   initial
get_objecttaskr|   rF   argskwargsr~   s       rN   r   zTaskAPI.initial  s'    1$1&1OO%	rQ   c                 8    |j                  ddddddddd	d
d      S )Nannotationspredictionsannotations__completed_byrX   &io_storages_azureblobimportstoragelink io_storages_gcsimportstoragelink'io_storages_localfilesimportstoragelink"io_storages_redisimportstoragelinkio_storages_s3importstoragelinkfile_uploadproject__ml_backends)prefetch_related)r|   r}   s     rN   prefetchzTaskAPI.prefetch#  s6    (('4.50-"
 	
rQ   c                     g d}d}t        d|j                        rt        |j                  dd      }t        |j                  dd      d|v d	|v d
|v ||dS )a  Build serializer context for task retrieval.

        The resolve_uri parameter controls whether storage URLs (e.g., s3://bucket/file.jpg)
        are converted to proxy URLs (/tasks/<id>/resolve/?fileuri=...). This is useful for:
        - resolve_uri=True (default): URLs are proxied through Label Studio for security
        - resolve_uri=False: Original storage URLs are preserved, useful for debugging
          or when users need to see the actual source paths in task preview
        )draftsr   r   F+fflag_fix_all_fit_720_lazy_load_annotationsrz   annotations_stubrY   Tr   r   r   )rY   r   r   r   r   rF   )r   rz   r   rq   )r|   rF   rZ   r   s       rN   get_retrieve_serializer_contextz'TaskAPI.get_retrieve_serializer_context2  so     : !AU0>PRWX -W[[-N(F2(F2&( 0
 	
rQ   c                    | j                  |      }| j                  j                  x|d<   }|j                  s|j                  rO| j                  j
                  j                         s+t        | j                  g       | j                         | _        |j                  d      rg ndg} | j                         | j                  d||      }|j                  }t        |      S )NrX   r   zannotations.completed_byF)manyr   expand)r   r   rX   "evaluate_predictions_automaticallyshow_collab_predictionsr   existsr
   r   rS   get_serializer_classr   r    )r|   rF   r   r   rX   r   r   r   s           rN   rS   zTaskAPI.getK  s    66w?'+yy'8'88	W 66':Y:Y))''..0 $))-)DI
 {{#56=W<X0T..0PW`fg
~rQ   c                 
    ddgS )Nannotations_resultspredictions_resultsrK   r|   s    rN   "get_excluded_fields_for_evaluationz*TaskAPI.get_excluded_fields_for_evaluation_  s    %'<==rQ   c                    | j                   j                  d   j                  d      }t        j                  t
        |      }t        | j                   j                  dd      }d| j                  j                  d      gd}|rddd	gi}nd
| j                         d}| j                   j                  j                  d      xs% | j                   j                  j                  d      }|s|j                  j                  }| j                  t        j                  j                   ddt#        ||| j                         i|      S )Nr   r   r   r_   F)r[   includedfields_for_evaluation
annotatorsreviewedT)
all_fieldsexcluded_fields_for_evaluationrX   prepare_params)rX   selectedItemsrF   rK   )rF   parser_contextrS   r   r   r$   r   rq   r   r   query_paramsr   rX   r   r   preparedget_querysetr   )r|   task_idr   r_   selectedr   rX   s          rN   r   zTaskAPI.get_querysetb  s   ,,--h7;;DA))$7;"4<<#3#3XuE t{{t/D.EF-j/IJF #262Y2Y2[F ,,++//	:^dll>O>O>S>ST]>^llooG}}MM&& ,WH^b^j^jkou
 	
rQ   c                    | j                   j                  d      }t        j                  t        j
                  j                  | j                  j                  j                        j                  d      |      }| j                  | j                  |       | j                  | j                               }t        j                  ||      S )z
        Override to check permissions on a lightweight task first.

        This avoids executing the expensive PreparedTaskManager query
        when the user doesn't have permission to access the task.
        r   ru   rX   r   )r   rS   r   r   r$   objectsry   rF   rz   r{   select_relatedcheck_object_permissionsrx   r   )r|   r   	lean_taskr}   s       rN   r   zTaskAPI.get_objectw  s     ++//$' ..LLdll6G6G6[6[\kkluv
	 	%%dllI> ''(9(9(;<))(w??rQ   c                 L    | j                   j                  dk(  rt        S t        S )Nrq   )rF   methodr   r0   r   s    rN   r   zTaskAPI.get_serializer_class  s"    <<%',, ('rQ   c                 2    t        t        | 
  |g|i |S rJ   )rw   r   r   r   s       rN   r   zTaskAPI.patch  s    Wd)'CDCFCCrQ   c                 2    t        t        | 
  |g|i |S rJ   )rw   r   r   r   s       rN   r   zTaskAPI.delete  s    Wd*7DTDVDDrQ   Texcludec                 2    t        t        | 
  |g|i |S rJ   )rw   r   putr   s       rN   r   zTaskAPI.put  s    Wd'A$A&AArQ   )r   r   r   r   r   r   parser_classesr   r   r   tasks_changetasks_deleter   r   r   r   rS   r   r   r   r   r   r3   r1   TASKS_DELETEDr   r   r   r   r   s   @rN   r   r      s    P !*o>N-&&((**++	&

2(>
*@*(D M778E 9E 4 B !BrQ   r   zGet task label distributionzGet aggregated label distribution across all annotations for a task. Returns counts of each label value grouped by control tag. This is an efficient endpoint that avoids N+1 queries.zLabel distribution datad   labelrectanglelabels-         )CarPersonDog)rV   labelsrg   distributions)r<   r=   rC   internal)rD   rE   r<   rG   rH   c                   p    e Zd ZdZ eej                        Zej                  j                         Zd Zy)TaskAgreementAPIa  
    Efficient endpoint for getting label distribution without fetching all annotations.

    This endpoint aggregates annotation results at the database level to avoid N+1 queries.
    It returns pre-computed label counts for the Distribution row in the Summary view.
    )rq   c                 @   t        d|j                        st        d      	 t        j                  j                  |      }|j                  j                  |j                        st        d	      t        j                  j                  |d
      j                  dd      }t        |      }i fd}|D ]
  } ||        t        j                  j                  |      j                  dd      }|D ]  }t        |t               s ||        j#                         D ]>  \  }	}
|
d   r1t%        |
d         t        |
d         z  |
d<   t        |
d         |
d<   |
d= @ t        |d      S # t        j                  $ r t        ddid      cY S w xY w)Nr   r   zFeature not enabledr   errorzTask not foundi  )statusz,You do not have permission to view this taskF)r   was_cancelledresultT)flatc                    | rt        | t              sy| D ]1  }t        |t              s|j                  dd      }|j                  dd      }|j                  di       }|vr	|i g d|<   |j	                  d      rS|j                  |g       }t        |t              s|D ]*  }||   d   vrd|   d   |<   |   d   |xx   d	z  cc<   , |d
k(  rT|j                  d
g       }t        |t              s|D ]*  }||   d   vrd|   d   |<   |   d   |xx   d	z  cc<   , |dk(  r.|j                  d      }	|	/|   d   j                  |	       H|dk(  r.|j                  d      }
|
b|   d   j                  |
       {|dk(  rn|j                  dg       }t        |t              s|D ]C  }t        |t              s|s|d   }||   d   vrd|   d   |<   |   d   |xx   d	z  cc<   E |dk(  s|j                  d      }|s
||   d   vrd|   d   |<   |   d   |xx   d	z  cc<   4 y)zKMerge a single result (list of labeling items) into distributions in place.N	from_name rV   r:   )rV   r   valuesr   r      choicesratingr  numbertaxonomypairwiser   )
isinstancerj   dictrS   endswithappend)r   itemr   result_typer:   r   r   r  choicer  r  r  r   leafr   r   s                  rN   merge_result_into_distributionsz=TaskAgreementAPI.get.<locals>.merge_result_into_distributions  s   FD!9 7J!$- HH["5	"hhvr2"-M1 +"$"$0M), ''1"YY{B7F!&$/%+ KE$M),DX,NNLMi 8 B5 I))4X>uEJEK
 !I-#ii	26G!'40&- LF%]9-Eh-OOMNi 8 B6 J))4X>vF!KFL
 !H,"YYx0F)%i0:AA&I H,"YYx0F)%i0:AA&I J.$yyR8H!(D1$, ND)$5$'+Bx#'}Y/G/Q#QOPM)$<X$Ft$L -i 8 B4 HA M HN !J.$yy4H#=+CH+MMKLM)4X>xH%i0:8DIDo7JrQ   r   r  averagecountr   )r   rz   r   r$   r   rS   DoesNotExistr    rX   has_permissionr!   ry   values_listlenr#   r	  rj   rd   sum)r|   rF   r   r   r   rg   r  r   r   r   distr   s              @rN   rS   zTaskAgreementAPI.get  s   EGLLY"#899	E<<##r#*D
 ||**7<<8"#QRR !((// 0 
 +hT+
* 	
  ,;	J| " 	4F+F3	4
 !((//T/:FFxVZF[! 	8F&$'/7	8  -224 	OItH~"%d8n"5DN8K"KY #DN 3WX	 %6!.
 	
C    	EW&67DD	Es    E8 8"FFN)r   r   r   __doc__r   r   r   r   r$   r   r[   r}   rS   rK   rQ   rN   r   r     s3    D ./2L2LM||!Hm
rQ   r   AnnotationszGet annotation by its IDzIRetrieve a specific annotation for a task using the annotation result ID.zRetrieved annotationr   zUpdate annotationz,Update existing attributes on an annotation.zUpdated annotationzDelete annotationz2Delete an annotation. This action can't be undone!)rD   rE   r<   rF   rH   c                       e Zd ZeeefZ eej                  ej                  ej                  ej                        ZeZej                   j#                         Zd Z fdZ fdZ eej0                         ed       fd              Z eej0                         fd       Z eej:                         fd	       Z xZS )
AnnotationAPIr   c                 $    |j                          y rJ   )r   )r|   
annotations     rN   perform_destroyzAnnotationAPI.perform_destroy  s    rQ   c                    | j                         }t        j                  j                  |j                        j                  |j                         |j                  }| j                  j                  j                  d      r|j                  |j                         |j                          |j                          t        t        |   |g|i |}|j                          |j                  dg       |S )Nr   )
updated_byground_truthannotation_id
updated_at)update_fields)r   r!   r   ry   r   r   rz   r   rF   r   rS   ensure_unique_groundtruthupdate_is_labeledr   rw   r  )r|   rF   r   r   r   r   r   r~   s          rN   r   zAnnotationAPI.update  s    __&
!!Z]]!3::gll:S<<  0***G 		}d27LTLVL 			/rQ   c                 2    t        t        | 
  |g|i |S rJ   )rw   r  rS   r   s       rN   rS   zAnnotationAPI.get  s    ]D-gGGGGrQ   Tr   c                 2    t        t        | 
  |g|i |S rJ   )rw   r  r   r   s       rN   r   zAnnotationAPI.put  s!     ]D-gGGGGrQ   c                 2    t        t        | 
  |g|i |S rJ   )rw   r  r   r   s       rN   r   zAnnotationAPI.patch  s    ]D/I$I&IIrQ   c                 2    t        t        | 
  |g|i |S rJ   )rw   r  r   r   s       rN   r   zAnnotationAPI.delete  s    ]D0J4J6JJrQ   ) r   r   r   r   r   r   r   r   r   annotations_viewannotations_changeannotations_deleter   r-   r   r!   r   r[   r}   r!  r   rS   r2   r1   ANNOTATION_UPDATEDr   r   r   r3   ANNOTATIONS_DELETEDr   r   r   s   @rN   r  r  =  s    ~ !*o>N-,,..0011	 ,!!%%'H$H 1124 H ! 3H 112J 3J M==>K ?KrQ   r  zGet all task annotationsz List all annotations for a task.r!   T)r   zCreate annotationa  
        Add annotations to a task like an annotator does. The content of the result field depends on your
        labeling configuration. For example, send the following data as part of your POST
        request to send an empty annotation with the ID of the user who completed the task:

        ```json
        {
        "result": {},
        "was_cancelled": true,
        "ground_truth": true,
        "lead_time": 0,
        "task": 0
        "completed_by": 123
        }
        ```
        zCreated annotationc                        e Zd ZeeefZ eej                  ej                        Zej                  j                         ZeZ fdZ eej*                         fd       Zd Zd Zd Z xZS )AnnotationsListAPIrp   c                 2    t        t        | 
  |g|i |S rJ   )rw   r6  rS   r   s       rN   rS   zAnnotationsListAPI.get  s     '27LTLVLLrQ   c                 2    t        t        | 
  |g|i |S rJ   )rw   r6  r5   r   s       rN   r5   zAnnotationsListAPI.post  s     '3GMdMfMMrQ   c                 P   t        j                  t        j                  j	                  | j
                  j                        | j                  j                  dd            }t        j                  j                  t        |      t        d      z        j                  d      S )Nr   r   r   r  F)r   )r   r   r$   r   for_userrF   rz   r   rS   r!   ry   r   order_by)r|   r   s     rN   r   zAnnotationsListAPI.get_queryset  st    ))$,,*?*?@Q@Q*RW[WbWbWfWfgkmnWop!!((8N)NOXXY]^^rQ   c                     	 t         j                  j                  |      }|j                          y # t         j                  $ r Y y w xY w)Nr#  )r"   r   rS   r   r  )r|   draft_idr'  drafts       rN   delete_draftzAnnotationsListAPI.delete_draft  sC    	#++//8/<E
 LLN++ 		s   03 A	A	c                 .   | j                   }| j                  j                  }t        | j                  j                  dd      }| j                  j
                  j                  dd      }|xs |}|r|j                         st        ddi      |j                  j                  d      }| j                  d   |j                  d}|t        j                  j                  ||j                  j                         }	|	j#                         r&|	j%                         }	t'        |	      j
                  }
n1t(        j+                  d	| j                  j                   d
|        i }
|j-                  |
|d       d| j                  j                  v r$t        | j                  j                  dd      |d<   d|j                  vr| j                  j                  |d<   | j                  j
                  j                  d      }t.        j                  j                  |      j%                         }|rQ|j0                  |j2                  k7  s*|j5                  |      r|j6                  |j2                  k7  rt9        d|       ||j:                  |d<   t(        j+                  d	| j                  j                   d        |j<                  di |}t(        j+                  d| j                  j                          t?        j@                         | j                  j                  _!        | j                  j                  j=                          t(        j+                  d	| d|        |jE                  |       |At(        j+                  d| d|j2                          | jG                  ||j2                         | j                  j
                  j                  d      r&|jH                  jK                  |j2                         tM        |||       |S )Nr   FdetailzThis task cannot be skipped.r   r   )r   r   )r   model_versionzUser=z$: there are no predictions for task=)
predictionr$  completed_byr=  r#  z#You have no permission to draft id:draft_created_atz: save annotationzSave activity for user=z releases task=zRemove draft z after creating annotation r%  r&  rK   )'parent_objectrF   rz   r   rq   r   rS   can_be_skippedr   validated_datar   r   r#   r   ry   rX   rB  r   firstr.   loggerdebugr   r"   r   r   r  user_idr   
created_atr   r   nowactivity_atrelease_lockr?  r   r*  r   )r|   serr   rz   was_cancelled_getwas_cancelled_datais_skippingr   
extra_argsrC  prediction_serr=  r>  r   s                 rN   r   z!AnnotationsListAPI.perform_create  sW   !!||   .dll.>.>QVW!\\..22?EJ'=+=t224!8-K"LMM ##''1!%T!2$//R
 #++22DLLLfLf2gJ  "'--/
!5j!A!F!FuT\\%6%6$77[\`[abc!#^4PQdll...*;DLL<L<Lo_d*eJ'!3!33)-):):J~&<<$$((4''..(.;AAC}}'u/C/CD/IU]]^b^e^eMe&)LXJ'WXX-2-=-=J)* 	uT\\..//@ABSXX+
+
.t||/@/@.ABC(0%  	uTF/$89$ LL=
2Mjmm_]^h
6<<  0OO55JMM5RdJ7rQ   )r   r   r   r   r   r   r   r   r   r0  annotations_creater   r$   r   r[   parent_querysetr-   r   rS   r2   r1   ANNOTATION_CREATEDr5   r   r?  r   r   r   s   @rN   r6  r6    s    L !*o>N-,,// ll&&(O+M 112N 3N_	ErQ   r6  r   c                       e Zd ZeeefZeZ e	e
j                  e
j                        Zej                  j!                         Zd Zd Zy)AnnotationDraftListAPIrp   c                 D    | j                   d   }|j                  |      S )Nr   )r   )r   ry   )r|   r}   r   s      rN   rx   z&AnnotationDraftListAPI.filter_querysetd  s!    ++d#w//rQ   c                 *   | j                   d   }| j                   j                  d      }| j                  j                  }t        j                  d| d| d|        |j                  | j                   d   || j                  j                         y )Nr   r'  zUser z# is going to create draft for task=z, annotation=)r   r'  rz   )r   rS   rF   rz   rJ  rK  r   )r|   r   r   r'  rz   s        rN   r   z%AnnotationDraftListAPI.perform_createh  s{    ++d#8||  uTF"EgYm\i[jklD 1UYUaUaUfUfgrQ   N)r   r   r   r   r   r   r   r,   r   r   r   r0  rW  r   r"   r   r[   r}   rx   r   rK   rQ   rN   r[  r[  Z  sR     /:>N0-,,// &&**,H0hrQ   r[  c                       e Zd ZeeefZeZe	j                  j                         Z eej                  ej                   ej                   ej"                        Zy)AnnotationDraftAPIr   N)r   r   r   r   r   r   r   r,   r   r"   r   r[   r}   r   r   r0  r1  r2  r   rK   rQ   rN   r_  r_  p  sW     /:>N0&&**,H-,,..0011	rQ   r_  PredictionszList predictionsz#List all predictions and their IDs.r   zFilter predictions by task IDz Filter predictions by project IDzPredictions listr   zCreate predictionz(Create a prediction for a specific task.zCreated predictionretrievezGet prediction detailsz2Get details about a specific prediction by its ID.zPrediction IDzPrediction detailszPut predictionz+Overwrite prediction data by prediction ID.zUpdated predictionpartial_updatezUpdate predictionz(Update prediction data by prediction ID.destroyzDelete predictionz%Delete a prediction by prediction ID.c                   <    e Zd ZeZej                  ZegZ	g dZ
d Zy)PredictionAPI)r   task__projectrX   c                 ~    t         j                  j                  | j                  j                  j
                        S rt   )r#   r   ry   rF   rz   r{   r   s    rN   r   zPredictionAPI.get_queryset"  s,    !!((t||?P?P?d?d(eerQ   N)r   r   r   r.   r   r   predictions_anyr   r   r   r   r   rK   rQ   rN   re  re  }  s+    @ ,)99*+O;frQ   re  zConvert annotation to draft)rD   rE   r<   rH   c                   r    e Zd Z eej
                        Zej                  j                         Z
d Zd Zy)AnnotationConvertAPI)rr   c                      y rJ   rK   )r|   r   r>  s      rN   process_intermediate_statez/AnnotationConvertAPI.process_intermediate_state6  s    rQ   c                 ,   | j                         }|j                  j                  }|j                  }|j                  }t	        j
                         5  t        j                  j                  |j                  |j                  |j                  d |j                        }| j                  ||       |j                          d d d        t        ||t         j"                  |g       t%              j&                  }	t)        d|	      S # 1 sw Y   IxY w)N)r   	lead_timer   r   rz   )r      )r   r   )r   rX   organizationr   r   atomicr"   r   r?   r   rn  r   rz   rl  r   r4   r1   r4  r,   r   r    )
r|   rF   r   r   r   rp  rX   r   r>  r   s
             rN   r5   zAnnotationConvertAPI.post9  s    __&
!))66$$]]! 	 #++22!(($..__\\ 3 E ++J>	  	#<-:[:[^`]ab(%8==s..	  	 s   A/D

DN)r   r   r   r   r   r1  r   r!   r   r[   r}   rl  r5   rK   rQ   rN   rj  rj  &  s3     .?3U3UV!!%%'H/rQ   rj  )br  loggingcore.feature_flagsr   core.mixinsr   core.permissionsr   r   core.utils.commonr   core.utils.paramsr   data_manager.apir	   DMTaskListAPIdata_manager.functionsr
   data_manager.modelsr   data_manager.serializersr   	django.dbr   django.db.modelsr   django.utilsr   django.utils.decoratorsr   django_filters.rest_frameworkr   drf_spectacular.typesr   drf_spectacular.utilsr   r   r   r   !projects.functions.stream_historyr   projects.modelsr   rest_frameworkr   r   rest_framework.exceptionsr   r   rest_framework.parsersr   r   r   rest_framework.responser    tasks.modelsr!   r"   r#   r$   tasks.openapi_schemar%   r&   r'   r(   r)   r*   r+   tasks.serializersr,   r-   r.   r/   r0   webhooks.modelsr1   webhooks.utilsr2   r3   r4   	getLoggerr   rJ  INTBOOLSTRRetrieveUpdateDestroyAPIViewr   RetrieveAPIViewr   r  ListCreateAPIViewr6  r[  r_  ModelViewSetre  rj  rK   rQ   rN   <module>r     s
   l  ' , A * / 9 7 - > !  ! 4 = . b b E # - G J J , F F    *  
		8	$ 	* ~) YA 3
 ?*'(j@Ubtuv
 &-&.!)

* 
/2 	| ~{ Y  &|/?/?'_hi),2B2BWbno"!&& H	 !%%[)# m !&& 2	 !%% M	 !%% A	;.
` ?($ ,;$+/<(0&" ,C$-"
 ,I$-.
 ,I$-.##
> &-&,)," "*

g\| 
AaD
- 
Ea3v
: 	Y $\-=-=\ef
 ?"2"
:R_qr
 &-&+!)

'8 	YI$\-=-=\ef
  3
 ?*'(j@Ubtuv
 &-&.!)

#4 	YR$\-=-=\ef
 %,&.!)

"HBh33 HB#59NHBV 	Y-A ?5"'14 ',=68Br.R*". $6
* 
5 Bx
x// x
C Bx
v 	_*_?2-"
:Ubtu
 &3&+!)

. 	_#B 9
 ?0-"
:Ubtu
 &3&.!)

!2 	_#H%2&.!)


/KH99 /K3/|/Kd 	_*6$\-=-=\ef
 ?(-48"
;V:Wdvw
 &3&,!)

#4 	_#" $\-=-=\ef
  9
 ?0-"
:Ubtu
 &3&.!)

E'*Ve-x/I/I eW*5JeP thX77 h h* t	>> 	 	 	_"9!%% ;	 !%% >	
 ?.-48"
;V:Wdvw
 &3&,!)

9!$J 	_#> 9
 ?0-"
:Ubtu
 &3&.!)

!2 	_(H$\-=-=\kl
 ?0-"
:Ubtu
 &3&+!)

#4 	_ A$\-=-=\kl
  9
 ?0-"
:Ubtu
 
'4 	_#>$\-=-=\kl
  9
 ?0-"
:Ubtu
 &3&.!)

'8 	_#;$\-=-=\kl
 %2&.!)

"fH)) f#9553K$~f ud(CD	_-1
	
/833 /
 E/rQ   