U
    ¿d                     @   s   d 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 ddlmZ ddlmZ ddlmZ dZdZdddZdd ZdS )z>
Appraise evaluation framework

See LICENSE for usage details
    )defaultdict)datetime)md5)floor)sqrt)UUID)mannwhitneyu)
SECRET_KEY)DataAssessmentResult)DirectAssessmentContextResult)DirectAssessmentDocumentResult)DirectAssessmentResult)MultiModalAssessmentResult) PairwiseAssessmentDocumentResult)PairwiseAssessmentResult)RESULT_TYPESg{Gz?iX  Tc                 C   sX   |dkr&t | rdnd}t|  | }nt|  d }t }||d t| }|S )a<  
    Generates a confirmation token for completed work.

    Returns a valid token if the quality control (QC) is successful, otherwise
    an invalid token if the user failed the QC or it cannot be run due to
    unsufficient annotation data.
    If performing QC is disabled, a valid token is always returned.
    TSUCCESSFAILEDzutf-8)run_quality_controlr	   r   updateencoder   	hexdigest)usernamerun_qcstatusseedtokenZnew_uuid r   >/var/www/rival/public_html/translation-eval/Dashboard/utils.pygenerate_confirmation_token    s    	r   c              	      sx  d}d}t D ] }|jj| dd}|r|} q.q|dkr:dS |tksJ|tkrb|dddddd	d
}n|dddddd	d
}ttdd |D }tdd |D |pd |d  d} dkrt	t fdd|D }t
|dkrd}tt}tt}|D ]^}|d dkr|}	n|d dkr|}	nq|d  | }
d|d |d }|	| |
 qg }g }tt| t| D ]V}|t|| tt|| pd  |t|| tt|| pd  qd}|r|rzt||dd\}}|}W n tk
r   Y nX dd |D }|r6t|nd}td| t||| |dk	ov|tkov|dk	ov|tkS )z
    Runs quality control for the user.

    It is passed if p-value of the Wilcoxon test on annotated (TGT, BAD) pairs,
    and the total annotation times are in pre-defined thresholds.

    Code extracted from Campaign/views.py:campaign_status()
    NT)createdBy__username	completed
start_timeend_timescore1item__itemIDitem__target1IDitem__itemTypeitem__idscoreitem__targetIDc                 S   s   g | ]}|d  qS )   r   .0xr   r   r   
<listcomp>b   s     z'run_quality_control.<locals>.<listcomp>c                 S   s   g | ]}|d  qS )   r   r,   r   r   r   r/   d   s        r   c                 3   s"   | ]}|d   d    V  qdS )r0   Nr   r,   _cs
_user_meanr   r   	<genexpr>i   s     z&run_quality_control.<locals>.<genexpr>TGTBADr0   z{0}-{1}      less)alternativec                 S   s   g | ]}|d  |d  qS )r1   r   r   r,   r   r   r   r/      s     z+User '{}', items= {}, p-value= {}, time= {})r   objectsfilterr   r   values_listlensetsumr   intr   listformatappendintersectionkeysfloatr   
ValueErrorprintMAX_WILCOXON_PVALUEMIN_ANNOTATION_TIME)r   _dataresult_type_type_annotations_user_stdev_tgt_bad_x_dst_z_score_key_ypvalue_tZ_pvalue
_durationsannotation_timer   r2   r   r   5   s    	

 (,   
r   N)T)__doc__collectionsr   r   hashlibr   mathr   r   uuidr   scipy.statsr   Appraise.settingsr	   EvalData.modelsr
   r   r   r   r   r   r   r   rL   rM   r   r   r   r   r   r   <module>   s(   
