o
    "i-                     @   s  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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 d dlmZ e Zejd	ed
eeeefdede	defddZejd	ee d
ededededed d deddddeefdee  dee  dee  dee! de!de!de	fddZ"ejdee d
eeeefdede	defd d!Z#ejd"ed
eeeefdede	defd#d$Z$ejd%ed
edededededeefd&ee  d'ee  d(ee! dee  dee  de	fd)d*Z%ejd+ed
eefd,e!de	fd-d.Z&ej'd/ed
eeeefd,e!d0e!de	defd1d2Z(ej'd3ed
eeeefd,e!d4ede	defd5d6Z)ejd7ed
eeeefd,e!d8ede	defd9d:Z*ed;ed<ed=eeeefd>ee! d?e!d@e de	def
dAdBZ+edCed<ed=eeeefd,e!d?e!d@e de	def
dDdEZ,ejdFed
eeeefd,e!dGede	defdHdIZ-dS )J    )datetime)Optional)	APIRouterDependsHTTPExceptionQuery)Session)Userget_current_user)get_db)	AnnotationCreateBatchAssignResponseBatchReviewRequestReviewAnalyticsResponse
TaskCreateTaskResponse
TaskReview
TaskUpdateWorkloadAssignRequest)get_annotation_task_manager/)response_modeltaskdbcurrent_userc                    s8   t |}|j| j| j| j| j| j| j| j|j	| j
d	S )N)	titledescriptioncontent	task_typeprioritydeadlineassigned_to
created_bymetadata)r   create_taskr   r   r   r   r   r    r!   id	meta_data)r   r   r   manager r(   B/lsinfo/ai/hellotax_ai/training_center/backend/app/api/v1/tasks.pyr$      s   r$   N)ge2         )r*   lestatusr   r   r!   skiplimitc           
         s   ddl m} t| |r || S |||jdk}| r(||j| k}|r2||j|k}|r<||j	|k}|
|j	 |j || }	 fdd|	D S )Nr   AnnotationTaskFc                    s   g | ]}  |qS r(   )_task_to_dict).0r   r'   r(   r)   
<listcomp>G   s    zlist_tasks.<locals>.<listcomp>)
app.modelsr3   r   get_tasks_by_expertqueryfilter
is_deletedr/   r   r   order_bydesc
created_atoffsetr1   all)
r/   r   r   r!   r0   r1   r   r3   r:   tasksr(   r6   r)   
list_tasks-   s   
(rC   z/batch-reviewrequestc              
      sT   t |}z|j| j| j| j| j|jdW S  ty) } ztdt	|dd }~ww )N)task_idsquality_scorefeedbackapprovedreviewed_by  status_codedetail)
r   batch_reviewrE   rF   rG   rH   r%   
ValueErrorr   strrD   r   r   r'   er(   r(   r)   batch_review_tasksJ   s   rS   z/assign-by-workloadc              
      sL   t |}z|j| j| j|jdW S  ty% } ztdt|dd }~ww )N)rE   reviewer_idsassigned_byrJ   rK   )r   assign_by_workloadrE   rT   r%   rO   r   rP   rQ   r(   r(   r)   rV   ]   s   rV   z/review-analytics
start_timeend_timerI   c           
   
      sp   t |}z| rt| nd }|rt|nd }W n ty- }	 ztdt|	dd }	~	ww |j|||||dS )NrJ   rK   )rW   rX   rI   r   r   )r   r   fromisoformatrO   r   rP   get_review_analytics)
rW   rX   rI   r   r   r   r'   start_dtend_dtrR   r(   r(   r)   review_analyticsn   s    	r]   z
/{task_id}task_idc                    sR   ddl m} |||j| k|jdk }|s tdddt|}|	|S )Nr   r2   F  Task not foundrK   )
r8   r3   r:   r;   r%   r<   firstr   r   r4   )r^   r   r3   r   r'   r(   r(   r)   get_task   s   

rb   z/{task_id}/assign	expert_idc              
      sH   t |}z
|j| ||jdW S  ty# } ztdt|dd }~ww )NrU   r_   rK   )r   assign_taskr%   rO   r   rP   )r^   rc   r   r   r'   rR   r(   r(   r)   re      s   re   z/{task_id}/statusupdatec              
      s   t |}za|jd ur|j| |j|jd |jr#|j| |j|jdW S |jd ur\ddlm} |	|
|j| k|jdk }|sItd|  d|j|_|  || ||W S |j| |j|jdW S  tyz } ztdt|d	d }~ww )
Nrd   )
updated_byr   r2   FzTask z
 not foundr_   rK   )r   r!   re   r%   r/   update_statusr   r8   r3   r:   r;   r<   ra   rO   commitrefreshr4   r   rP   )r^   rf   r   r   r'   r3   r   rR   r(   r(   r)   update_task_status   s4   



rk   z/{task_id}/submit
annotationc              
      sJ   t |}z|j| |j|jdW S  ty$ } ztdt|dd }~ww )N)submitted_byr_   rK   )r   submit_annotationannotation_datar%   rO   r   rP   )r^   rl   r   r   r'   rR   r(   r(   r)   rn      s   rn   z/batch-import-to-dataset.trainrE   
dataset_idsplitc              
      s  ddl m}m}m} dd l}|||j|k }	|	s$t	ddd|||j
| |jdk|jdk|jdk }
d	d
 ||j|j|k|j
|  D }g g }}|
D ]0}|j|v rk||j q]|||j|jdd|j||j|j|jdd}|| ||j q]|r|	 jt|7  _|dkr|	 jt|7  _n|dkr|	 jt|7  _n|dkr|	 jt|7  _|  ||	j|t|t|||dS )Nr   r3   DatasetSampleTrainingDatasetr_   Dataset not foundrK   FreviewedTc                 S   s   h | ]}|j qS r(   )source_task_id)r5   rowr(   r(   r)   	<setcomp>   s    z*batch_import_to_dataset.<locals>.<setcomp>ensure_asciirF   
task_titlerq   r   labelrr   rx   r&   rp   
validationtest)rq   dataset_namerr   imported_countskipped_countimported_task_idsskipped_task_ids)r8   r3   rt   ru   jsonr:   r;   r%   ra   r   in_r<   r/   rH   rA   rx   rq   appenddumpsro   r   rF   r   addtotal_sampleslentrain_samplesvalidation_samplestest_samplesri   name)rE   rq   rr   r   r   r3   rt   ru   _jsondatasetrB   existing_task_idsimportedskippedr   sampler(   r(   r)   batch_import_to_dataset   sj   





r   z/{task_id}/import-to-datasetc              	      s  ddl m}m}m} |||j| k|jdk }|s$t	ddd|j
dkr/t	dd	d|js8t	dd
d|||j|k }	|	sMt	ddd|||j|k|j| k }
|
rft	ddddd l}|||j|jdd|j|| |j|jdd}|| |	 jd7  _|dkr|	 jd7  _n|dkr|	 jd7  _n|dkr|	 jd7  _|  || |j||	j|| dS )Nr   rs   Fr_   r`   rK   rw   rJ   u;   只有已审核（reviewed）的任务才能导入数据集u0   只有审核通过的任务才能导入数据集rv   i  u   该任务已导入此数据集r{   r}   r   r,   rp   r   r   )	sample_idrq   r   rr   r^   )r8   r3   rt   ru   r:   r;   r%   r<   ra   r   r/   rH   rq   rx   r   r   ro   r   rF   r   r   r   r   r   r   ri   rj   r   )r^   rq   rr   r   r   r3   rt   ru   r   r   alreadyr   r   r(   r(   r)   import_task_to_dataset  sd   




r   z/{task_id}/reviewreviewc              
      sR   t |}z|j| |j|j|j|jdW S  ty( } ztdt|dd }~ww )N)r^   rF   rG   rI   rH   r_   rK   )	r   
add_reviewrF   rG   r%   rH   rO   r   rP   )r^   r   r   r   r'   rR   r(   r(   r)   review_annotationQ  s   r   ).r   typingr   fastapir   r   r   r   sqlalchemy.ormr   app.api.depsr	   r
   app.core.databaser   app.schemasr   r   r   r   r   r   r   r   r   $app.services.annotation_task_managerr   routerpostr$   getlistrP   intrC   rS   rV   r]   rb   putre   rk   rn   r   r   r   r(   r(   r(   r)   <module>   sH   ,
A<