
    Xj1                         d dl m Z  d dl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mZ  ee          Z G d dee          Z G d	 d
ee          Z G d d          Zde
defdZdS )    )datetime)Enum)Any)and_casefunc)Session)
get_loggerlog_executionc                       e Zd ZdZdZdZdZdS )
TaskStatuspendingin_progress	completedreviewedN)__name__
__module____qualname__PENDINGIN_PROGRESS	COMPLETEDREVIEWED     V/lsinfo/ai/hellotax_ai/training_center/backend/app/services/annotation_task_manager.pyr   r      s"        GKIHHHr   r   c                       e Zd ZdZdZdZdZdS )TaskPrioritylowmediumhighurgentN)r   r   r   LOWMEDIUMHIGHURGENTr   r   r   r   r      s"        
CFDFFFr   r   c                      e Zd ZdefdZ ee          ej        ddddfde	de	de	de	ded	e
dz  d
edz  dededz  dee	ef         fd            Zdedededee	ef         fdZdedededee	ef         fdZdedee	ef         dedee	ef         fdZd)dedede	dededee	ef         fdZd*dededz  deee	ef                  fdZd+de	dz  dedz  deee	ef                  fd Z ee          d!ee         dede	dededeee	ef                  fd"            Z ee          d!ee         d#ee         dedee	ef         fd$            Zd,d%e
dz  d&e
dz  dedz  de	dz  dedz  dee	ef         fd'Zdee	ef         fd(ZdS )-AnnotationTaskManagerdbc                     || _         d S Nr(   )selfr(   s     r   __init__zAnnotationTaskManager.__init__   s    r   Ntitledescriptioncontent	task_typeprioritydeadlineassigned_to
created_bymetadatareturnc
                 ^   ddl m}
  |
||||t          j        |||||	pi 
  
        }| j                            |           | j                                         | j                            |           t          	                    d|j
         d|            |                     |          S )Nr   AnnotationTask)
r.   r/   r0   r1   statusr2   r3   r4   r5   	meta_datazCreated annotation task z: )
app.modelsr:   r   r   r(   addcommitrefreshloggerinfoid_task_to_dict)r,   r.   r/   r0   r1   r2   r3   r4   r5   r6   r:   tasks               r   create_taskz!AnnotationTaskManager.create_task   s    ------~E{G_hq{  rD  OW  bj  xC  PZ  fn  ft  rt  u  u  uDAtwAA%AABBB!!$'''r   task_id	expert_idassigned_byc                    ddl m} | j                            |                              |j        |k    |j                                                   }|st          d| d          ||_	        ||_
        |j        t          j        k    rt          j        |_        | j                                         | j                            |           t"                              d| d|            |                     |          S )Nr   r9   Task 
 not foundzAssigned task z to expert )r=   r:   r(   queryfilterrC   
is_deletedfirst
ValueErrorr4   rI   r;   r   r   r   r?   r@   rA   rB   rD   )r,   rG   rH   rI   r:   rE   s         r   assign_taskz!AnnotationTaskManager.assign_task&   s    ------w}}^,,33N4E4PVdVoRoppvvxx 	:8W888999$&;*,,,$0DKDWDDDDEEE!!$'''r   r;   
updated_byc                    ddl m} | j                            |                              |j        |k    |j                                                   }|st          d| d          ||_	        t          j                    |_        |t          j        k    rt          j                    |_        n(|t          j        k    rt          j                    |_        | j                                         | j                            |           t(                              d| d|            |                     |          S )Nr   r9   rK   rL   zUpdated task z status to )r=   r:   r(   rM   rN   rC   rO   rP   rQ   r;   r   utcnow
updated_atr   r   completed_atr   reviewed_atr?   r@   rA   rB   rD   )r,   rG   r;   rS   r:   rE   s         r   update_statusz#AnnotationTaskManager.update_status4   s&   ------w}}^,,33N4E4PVdVoRoppvvxx 	:8W888999"/++Z))) ( 1 1Dz***'00D@G@@@@AAA!!$'''r   annotation_datasubmitted_byc                     ddl m} | j                            |                              |j        |k    |j                                                   }|st          d| d          ||_	        t          j        |_        t          j                    |_        | j                                         | j                            |           t$                              d|            |                     |          S )Nr   r9   rK   rL   zSubmitted annotation for task )r=   r:   r(   rM   rN   rC   rO   rP   rQ   rZ   r   r   r;   r   rU   rW   r?   r@   rA   rB   rD   )r,   rG   rZ   r[   r:   rE   s         r   submit_annotationz'AnnotationTaskManager.submit_annotationD   s    ------w}}^,,33N4E4PVdVoRoppvvxx 	:8W888999. *$O-->W>>???!!$'''r   Tquality_scorefeedbackreviewed_byapprovedc                    ddl m} | j                            |                              |j        |k    |j                                                   }|st          d| d          |j	        t          j        k    rt          d| d|j	         d          ||_        ||_        ||_        ||_        t!          j                    |_        |rt          j        nt          j        |_	        | j                                         | j                            |           t.                              d| d| d	|            |                     |          S )
Nr   r9   rK   rL   z1 must be in completed status to review (current: )zAdded review for task z: score=, approved=)r=   r:   r(   rM   rN   rC   rO   rP   rQ   r;   r   r   r^   ra   reviewer_feedbackr`   r   rU   rX   r   r   r?   r@   rA   rB   rD   )r,   rG   r^   r_   r`   ra   r:   rE   s           r   
add_reviewz AnnotationTaskManager.add_reviewQ   sV   ------w}}^,,33N4E4PVdVoRoppvvxx 	:8W888999;*...mWmm_c_jmmmnnn* !)&#?,,-5Qj)):;QbWbbmbbX`bbccc!!$'''r   c                     ddl m}  j                            |                              |j        |k    |j                   }|r|                    |j        |k              }|                    |j	        
                                |j                                                                                  } fd|D             S )Nr   r9   c                 :    g | ]}                     |          S r   rD   .0rE   r,   s     r   
<listcomp>z=AnnotationTaskManager.get_tasks_by_expert.<locals>.<listcomp>i   '    ;;;T""4((;;;r   )r=   r:   r(   rM   rN   r4   rO   r;   order_byr2   descr3   ascall)r,   rH   r;   r:   rM   taskss   `     r   get_tasks_by_expertz)AnnotationTaskManager.get_tasks_by_expertc   s    ------n--44^5OS\5\bpb{^{|| 	BLL!6&!@AAE~6;;==~?V?Z?Z?\?\]]aacc;;;;U;;;;r   c                 
    ddl m}  j                            |                              |j        t          j        k    |j        	                    d                     }|r|                    |j
        |k              }|r|                    |j        |k              }|                    |j                                        |j                                                                                  } fd|D             S )Nr   r9   c                 :    g | ]}                     |          S r   ri   rj   s     r   rl   z=AnnotationTaskManager.get_available_tasks.<locals>.<listcomp>s   rm   r   )r=   r:   r(   rM   rN   r;   r   r   r4   is_r1   r2   rn   ro   
created_atrp   rq   )r,   r1   r2   r:   rM   rr   s   `     r   get_available_tasksz)AnnotationTaskManager.get_available_tasksk   s   ------n--44^5JjN`5`bpb|  cA  cA  BF  cG  cG  H  H 	HLL!9Y!FGGE 	FLL!8H!DEEE~6;;==~?X?\?\?^?^__ccee;;;;U;;;;r   task_idsc                 F    ddl m}  j                            |                              |j                            |          |j                                                   }t          |          t          |          k    r,d |D             fd|D             }t          d|           d |D             }	|	rt          d|	           t          j                    }
|D ]D}||_        ||_        ||_        ||_        |
|_        |rt$          j        nt$          j        |_        E j                                         |D ]} j                            |           t0                              dt          |           d	| d
|             fd|D             S )Nr   r9   c                     h | ]	}|j         
S r   rC   rk   rE   s     r   	<setcomp>z5AnnotationTaskManager.batch_review.<locals>.<setcomp>z       333T333r   c                     g | ]}|v|	S r   r   rk   rG   	found_idss     r   rl   z6AnnotationTaskManager.batch_review.<locals>.<listcomp>{   #    SSS7':R:Rw:R:R:Rr   Tasks not found: c                 F    g | ]}|j         t          j        k    |j        S r   )r;   r   r   rC   r}   s     r   rl   z6AnnotationTaskManager.batch_review.<locals>.<listcomp>}   s)    ZZZTdkZEY6Y6Y6Y6Y6Yr   zTasks not completed: zBatch reviewed z tasks: score=rd   c                 :    g | ]}                     |          S r   ri   rj   s     r   rl   z6AnnotationTaskManager.batch_review.<locals>.<listcomp>   rm   r   )r=   r:   r(   rM   rN   rC   in_rO   rq   lenrQ   r   rU   r^   ra   re   r`   rX   r   r   r   r;   r?   r@   rA   rB   )r,   ry   r^   r_   ra   r`   r:   rr   missinginvalid_tasksrX   rE   r   s   `           @r   batch_reviewz"AnnotationTaskManager.batch_reviewu   s   ------n--44^5F5J5J85T5TZhZsVsttxxzzu::X&&33U333ISSSShSSSG:::;;;ZZUZZZ 	FD]DDEEEo'' 	V 	VD!.D$DM%-D"*D*D19U*--z?UDKK 	" 	"DGOOD!!!!dc%jjddddZbddeee;;;;U;;;;r   reviewer_idsc                    ddl m} |sdg iS |st          d          | j                            |                              |j                            |          |j                   	                                }t          |          t          |          k    r,d |D             fd|D             }t          d|           | j                            |j        t          j        |j                                      d                                        |j                            |          |j        t           j        k                                  |j                  	                                }d	 |D             fd
|D             }g }	|D ]y}
t'          ||j                  }||
_        ||
_        |
j        t           j        k    rt           j        |
_        ||xx         dz  cc<   |	                    |
j        |d           z| j                                         |D ]}
| j                            |
           t4                              dt          |           d           d|	iS )Nr   r9   assignedzReviewer list is emptyc                     h | ]	}|j         
S r   r|   r}   s     r   r~   z;AnnotationTaskManager.assign_by_workload.<locals>.<setcomp>   r   r   c                     g | ]}|v|	S r   r   r   s     r   rl   z<AnnotationTaskManager.assign_by_workload.<locals>.<listcomp>   r   r   r   countc                 (    i | ]}|j         |j        S r   )r4   r   rk   rows     r   
<dictcomp>z<AnnotationTaskManager.assign_by_workload.<locals>.<dictcomp>   s    LLLsLLLr   c                 >    i | ]}|                     |d           S )r   )get)rk   reviewer_idworkload_maps     r   r   z<AnnotationTaskManager.assign_by_workload.<locals>.<dictcomp>   s+    ccc{[,"2"2;"B"Bcccr   )key   )rG   r4   z	Assigned z tasks by workload)r=   r:   rQ   r(   rM   rN   rC   r   rO   rq   r   r4   r   r   labelr;   r   r   group_byminr   rI   r   appendr?   r@   rA   rB   )r,   ry   r   rI   r:   rr   r   workload_rows	workloadsassignmentsrE   r   r   r   s               @@r   assign_by_workloadz(AnnotationTaskManager.assign_by_workload   s   ------ 	$## 	75666n--44^5F5J5J85T5TZhZsVsttxxzzu::X&&33U333ISSSShSSSG:::;;;n&@$*^M^B_B_BeBefmBnBnoovv  xF  xR  xV  xV  Wc  xd  xd  ft  f{  I  U  fU  V  V  _  _  `n  `z  {  {      A  ALLmLLLccccVbccc	,. 	Q 	QDiY];;;K*D*D{j000(4k"""a'"""47;OOPPPP 	" 	"DGOOD!!!!>E

>>>???K((r   
start_timeend_timec                 
   ddl m} |j        t          j        k    |j         g}|r|                    |j        |k               |r|                    |j        |k               |r|                    |j        |k               |r|                    |j	        |k               |r|                    |j
        |k                | j                            t          j        |j                                      d          t          j        t#          |j                            d          dfd                                        d          t          j        |j                                      d	                    j        |                                 } | j                            t          j        t          j        d
|j        |j        z
                                          d          t          j        t#          t7          |j                            d           |j        |j        k              dfd                                        d                    j        |                                 }	 | j                            |j                            d          t          j        |j                                      d          t          j        |j                                      d                    j        |                     |j                  }
|
                    t          j        |j                                                             !                                } | j                            |j	        t          j        |j                                      d                    j        |                     |j	                  !                                } | j                            |j
        t          j        |j                                      d                    j        |                     |j
                  !                                }tE          |j#        pd          tE          |j$        pd          tK          |j&        pd          dtE          |	j'        pd          tK          |	j(        pd          dd |D             d |D             d |D             ddS )Nr   r9   avg_quality_scoreTg      ?g        )else_approval_ratetotal_reviewsepochavg_review_secondsr   overdue_countr`   review_countr   )r   r   r   )r   r   c                 p    g | ]3}|j         t          |j                  t          |j        pd           d4S )r   )r`   r   r   )r`   intr   floatr   r   s     r   rl   z>AnnotationTaskManager.get_review_analytics.<locals>.<listcomp>   s      ~X  ~X  ~X  CF  OR  O^  ps  tw  tD  pE  pE  \a  be  bw  b|  {|  \}  \}  ~  ~  ~X  ~X  ~Xr   c                 F    g | ]}|j         t          |j                  d S ))r1   r   )r1   r   r   r   s     r   rl   z>AnnotationTaskManager.get_review_analytics.<locals>.<listcomp>   sr      xI
  xI
  xI
  s	v	  G	J	  G	T	  _	b	  c	f	  c	l	  _	m	  _	m	  yn	  yn	  xI
  xI
  xI
r   c                 F    g | ]}|j         t          |j                  d S ))r2   r   )r2   r   r   r   s     r   rl   z>AnnotationTaskManager.get_review_analytics.<locals>.<listcomp>   sr      W
e  W
e  W
e  PS  e
h
  e
q
  |

  @C  @I  |
J  |
J  X
K  X
K  W
e  W
e  W
er   )r1   r2   )quality_metricsefficiency_metricsreviewer_rankingdistribution))r=   r:   r;   r   r   rO   r   rX   r`   r1   r2   r(   rM   r   avgr^   r   r   ra   rv   r   rC   rN   oneextractrW   sumr   r3   isnotr   rn   ro   rq   r   r   r   r   r   r   r   )r,   r   r   r`   r1   r2   r:   base_filtersquality_rowefficiency_rowreviewer_queryreviewer_rowstask_type_rowspriority_rowss                 r   get_review_analyticsz*AnnotationTaskManager.get_review_analytics   sF   ------&-1DD.JcFcd 	J :j HIII 	H :h FGGG 	K :k IJJJ 	G 8I EFFF 	E 78 CDDD @dgmmDH^-I$J$J$P$PQd$e$egkgopt  wE  wN  wR  wR  SW  wX  wX  Z]  v^  fi  qj  qj  qj  hk  hk  hq  hq  rA  hB  hB  DH  DN  O]  O`  Da  Da  Dg  Dg  hw  Dx  Dx  y  y  @  BN  O  S  S  U  U {txWnF`cqc~F~00  (A  (A  (G  (G  H\  (]  (]  _c  _g  hl  nr  sA  sJ  sP  sP  QU  sV  sV  Xf  Xr  uC  uL  XL  nM  nM  OP  mQ  YZ  h[  h[  h[  _\  _\  _b  _b  cr  _s  _s  t  t  {  }I  J  N  N  P  P W~'A'G'G'V'VX\XbcqctXuXuX{X{  }K  YL  YL  NR  NV  We  Ws  Nt  Nt  Nz  Nz  {N  NO  NO  P  P  W  Ye  f  o  o  p~  pJ  K  K&//
>;L0M0M0R0R0T0TUUYY[[u~'?NL]A^A^AdAdelAmAmnnu  xD  E  N  N  O]  Og  h  h  l  l  n  nsn&=tz.J[?\?\?b?bcj?k?klls  vB  C  L  L  M[  Md  e  e  i  i  k  k9>{?\?a`a9b9buz  |G  |U  |Z  YZ  v[  v[  nq  r}  rK  rP  OP  nQ  nQ  $R  $R  AF  GU  Gh  Gm  lm  An  An  AD  ES  Ea  Ef  ef  Ag  Ag  jh  jh  ~X  ~X  JW  ~X  ~X  ~X  xI
  xI
  z	H
  xI
  xI
  xI
  W
e  W
e  Wd  W
e  W
e  W
e  jf  jf  g  g  	gr   c                 Z   i d|j         d|j        d|j        d|j        d|j        d|j        d|j        d|j        r|j                                        nd d	|j	        d
|j
        d|j        d|j        r|j                                        nd d|j        r|j                                        nd d|j        r|j                                        nd d|j        r|j                                        nd d|j        d|j        |j        |j        |j        |j        dS )NrC   r.   r/   r0   r1   r;   r2   r3   r4   rI   r5   rw   rV   rW   rX   r`   r^   )ra   re   rZ   r<   )rC   r.   r/   r0   r1   r;   r2   r3   	isoformatr4   rI   r5   rw   rV   rW   rX   r`   r^   ra   re   rZ   r<   )r,   rE   s     r   rD   z#AnnotationTaskManager._task_to_dict   s    ]dg  ]w
  ]M4CS  ]U^`d`l  ]ny{  |J  ]  LT  VZ  Va  ]  cm  os  o|  ]  ~H  gk  gt  J~  JN  JW  Ja  Ja  Jc  Jc  Jc  z~  ]  @M  OS  O_  ]  an  pt  p@  ]  BN  PT  P_  ]  am  NR  N]  og  os  o~  oH  oH  oJ  oJ  oJ  cg  ]  iu  VZ  Ve  wo  w{  wF  wP  wP  wR  wR  wR  ko  ]  q  bf  bs  A}  AE  AR  A\  A\  A^  A^  A^  y}  ]  L	  n	r	  n	~	  N	H
  N	R	  N	^	  N	h	  N	h	  N	j	  N	j	  N	j	  D
H
  ]  J
W
  Y
]
  Y
i
  ]  k
z
  |
@  |
N  ]  \`  \i  @D  @V  ko  k  NR  N\  ]  ]  ]  	]r   )Tr*   )NN)NNNNN)r   r   r   r	   r-   r   rA   r   r#   strr   r   dictr   rF   rR   r   rY   r]   r   boolrf   listrs   rx   r   r   r   rD   r   r   r   r'   r'      s       7     ]6my  nA  ]a  {  QU  mq ( ( (3 ( (QT (`l (  MU  X\  M\ (  ps  vz  pz (  MP (  ae  hl  al (  vz  {~  @C  {C  vD ( ( ( ((3 (3 (S (TRUWZRZ^ ( ( ( ((S (* (# (RVWZ\_W_R` ( ( ( ( ( (tCH~ (]` (eijmorjres ( ( ( (( (# (e (s (Y\ (hl (vz{~  AD  |D  wE ( ( ( ($< <S <*t:K <UYZ^_bdg_gZhUi < < < << <S4Z <W[H[ <eijnortwowjxey < < < < ]6<T#Y <u <PS <_c <ru <z~  @D  EH  JM  EM  @N  {O < < < <0 ]6)49 )DI )\_ )dhilnqiqdr ) ) ) ):g gx$ gxZ^ grux|r| g  OR  UY  OY g  jv  y}  j} g  GK  LO  QT  LT  GU g g g g*]T#s(^ ] ] ] ] ] ]r   r'   r(   r7   c                      t          |           S r*   )r'   r+   s    r   get_annotation_task_managerr      s     $$$r   N)r   enumr   typingr   
sqlalchemyr   r   r   sqlalchemy.ormr	   common_loggingr
   r   r   rA   r   r   r   r'   r   r   r   r   <module>r      sP                     ' ' ' ' ' ' ' ' ' ' " " " " " " 4 4 4 4 4 4 4 4	H		    d       3   k] k] k] k] k] k] k] k]Z%G %0E % % % % % %r   