Ë
    I»j.  ã                   óH   — d Z ddlmZ ddlmZmZmZ ddlmZ  G d„ d«      Z	y)z)Browser proctoring / anti-cheat analysis.é    )Ú	JobStatus)ÚProctoringAnalyzeRequestÚProctoringAnalyzeResponseÚProctoringFlag)Úgenerate_jsonc                   ó   — e Zd Zdedefd„Zy)ÚProctoringServiceÚpayloadÚreturnc              ƒ   óÂ  ‡K  — d}d‰j                   › d‰j                  › d‰j                  › �}dt        fˆfd„}t	        |||¬«      ƒ d {  –—† \  }}}|j                  d«      xs g D �cg c]~  }t        |t        «      rlt        t        |j                  d	d
«      «      t        |j                  dd«      «      t        |j                  d«      xs d«      |j                  d«      ¬«      ‘Œ€ }	}t        ‰j                  ‰j                   t        j                  |d|› �|j                  d«      |j                  d«      |	|j                  d«      ¬«	      S 7 �Œc c}w ­w)NzªAnalyze proctoring events for integrity risk. Return JSON: {"risk_score":0-1,"integrity_passed":bool,"flags":[{"event_type","severity","count","notes"}],"recommendation"}zInterview: z
Duration: z	
Events: r   c            
      óX  •— i } ‰j                   D ]x  }t        |t        «      sŒt        |j	                  d«      xs |j	                  d«      xs d«      }| j	                  |d«      t        |j	                  d«      xs d«      z   | |<   Œz g }d}| j                  «       D ]b  \  }}|dv r|dk\  rd	n|d
k(  r|dk\  rdnd}|d	k(  r|dz  }n|dk(  r|dz  }n|dt        |d«      z  z  }|j                  |||d|› d|› �dœ«       Œd t        d|«      }|dk  }t        |d«      |||rddœS ddœS )NÚ
event_typeÚtypeÚunknownr   Úcounté   gš™™™™™¹?>   Ú
copy_pasteÚ
multi_faceÚhighÚ
tab_switché   ÚmediumÚlowgffffffÖ?g333333Ã?gš™™™™™©?z	Detected zx ©r   Úseverityr   Únotesg®Gáz®ï?gš™™™™™á?é   ÚacceptÚmanual_review)Ú
risk_scoreÚintegrity_passedÚflagsÚrecommendation)
ÚeventsÚ
isinstanceÚdictÚstrÚgetÚintÚitemsÚminÚappendÚround)	ÚcountsÚeÚetr"   Úriskr   r   Úpassedr
   s	           €ú1/var/www/html/TJ-AI/tj/app/services/proctoring.pyÚlocalz(ProctoringService.analyze.<locals>.local   s`  ø€ Ø%'ˆFØ—^”^�Ü˜a¤Õ&Ü˜QŸU™U <Ó0ÒN°A·E±E¸&³MÒNÀYÓO�BØ!'§¡¨B°Ó!2´S¸¿¹¸w»Ò9LÈ1Ó5MÑ!M�F˜2’Jð $ð ˆEØˆDØ#Ÿ\™\ž^‘	��EØ%'Ð+GÑ%GÈEÐUVÊJ™6Ø " lÒ 2°uÀ²z‘HÀuð ð ˜vÒ%Ø˜D‘L‘DØ Ò)Ø˜D‘L‘Dà˜D¤3 u¨a£=Ñ0Ñ0�DØ—‘à&(Ø$,Ø!&Ø#,¨U¨G°2°b°TÐ!:ñ	õð ,ô$ �t˜T“?ˆDØ˜D‘[ˆFä# D¨!›nØ$*ØÙ.4 (ñ	ð ð ;Jñ	ð ó    )ÚsystemÚuserÚlocal_factoryr"   r   r   r   r   r   r   r   r   zProctoring analysis via r    r!   r#   )	Úcorrelation_idÚinterview_idÚstatusÚstubÚmessager    r!   r"   r#   )r:   Úduration_secondsr$   r&   r   r(   r%   r   r'   r)   r   r9   r   Ú	SUCCEEDED)
Úselfr
   r6   r7   r4   Údatar<   ÚproviderÚfr"   s
    `        r3   ÚanalyzezProctoringService.analyze   sk  øè ø€ ðVð 	ð ˜'×.Ñ.Ð/¨|¸G×<TÑ<TÐ;Uð VØ—~‘~Ð&ð(ð 	ð
!	”tõ !	ôF &3Ø °Eô&
÷  
Ñˆˆd�Hð —h‘h˜wÓ'Ò-¨2Ð-ó	
ñ .�Ü˜!œTÔ"ô Ü˜qŸu™u \°9Ó=Ó>Ü˜QŸU™U :¨uÓ5Ó6Ü˜!Ÿ%™% ›.Ò-¨AÓ.Ø—e‘e˜G“nö	ð .ð 	ð 	
ô )Ø"×1Ñ1Ø ×-Ñ-Ü×&Ñ&ØØ.¨x¨jÐ9Ø—x‘x Ó-Ø!ŸX™XÐ&8Ó9ØØŸ8™8Ð$4Ó5ô

ð 
	
ð 
ûò	
ùs&   ƒA	EÁEÁEÁ,BEÃ/A)EÅEN)Ú__name__Ú
__module__Ú__qualname__r   r   rD   © r5   r3   r	   r	      s   „ ðE
Ð%=ð E
ÐB[ô E
r5   r	   N)
Ú__doc__Úapp.schemas.commonr   Úapp.schemas.proctoringr   r   r   Úapp.services.ai_generater   r	   rH   r5   r3   Ú<module>rM      s&   ðÙ /å (÷ñ õ
 3÷F
ò F
r5   