U
    |e]                     @   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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$ ddl#m%Z% ddl#m&Z& ddl'Z'ddl(Z)ddl*T ddl#T ddlmZmZmZ dd e%D Z+ej,dd Z-ej,dd  Z.e/d!d" e%D Z0e/d#d" e%D Z1d$d% e%D Z2d&d% e%D Z3dd'l4m5Z5 ee6d(Z7dZ8dRd*d+Z9dSd-d.Z:d/d0 Z;e<e=fd1d2d3Z>dTd4d5Z?dUd6d7Z@dVd8d9ZAe<e<e=e<fd:d;d<ZBeCeDe=e<fd=d>d?ZEd@dA ZFedBdC ZGedDdE ZHedFdG ZIedHdI ZJedJdK ZKedLdM ZLee5dNdO ZMee5dPdQ ZNdS )Wz>
Appraise evaluation framework

See LICENSE for usage details
    )datetime)md5)currentframe)getframeinfo)authenticate)login)logout)login_required)Group)User)GeoIP2)redirect)render)register)BASE_CONTEXT)_get_logger)LANGUAGE_CODES_AND_NAMESPROFICIENCY_LEVELSMIN_PROFICIENCYLANGUAGE_PAIRS)UserInviteToken)generate_confirmation_token)DirectAssessmentTask)TASK_DEFINITIONS)
TaskAgendaN)*)r   r   r   c                 C   s   h | ]}|d  |d fqS )       .0tupr   r   >/var/www/rival/public_html/translation-eval/Dashboard/views.py	<setcomp>&   s     r#   c                 C   s   |r|  |S dS )zD
    usage example {{ your_dict|get_value_from_dict:your_key }}
    Nget)Z	dict_datakeyr   r   r"   get_value_from_dict)   s    r'   c                 C   s   | | S Nr   )Z	indexableir   r   r"   index1   s    r*   c                 C   s   g | ]}|d  qS )r   r   r   r   r   r"   
<listcomp>5   s     r+   c                 C   s   g | ]}|d  qS )r   r   r   r   r   r"   r+   6   s     c                 C   s   i | ]}|d  |d   qS )r   r   lowerr   r   r   r"   
<dictcomp>9   s      r.   c                 C   s   i | ]}|d    |d qS )r      r,   r   r   r   r"   r.   :   s     
 )add_deprecated_methodname404.htmlc                 C   sL   ~t d| jjpd| j t| \}}tt|}td|i|}t	| d|S )z<
    Custom HTTP 404 handler that preserves URL_PREFIX.
    z1Rendering HTTP 404 for user "%s". Request.path=%s	Anonymousui_langzDashboard/404.html
LOGGERinfouserusernamepath_get_ui_langtranslated_texts_get_lang_textsr   r   requesttemplate_namer5   _
lang_textscontextr   r   r"   _page_not_foundE   s    
 rE   500.htmlc                 C   sL   ~t d| jjpd| j t| \}}tt|}td|i|}t	| d|S )z<
    Custom HTTP 500 handler that preserves URL_PREFIX.
    z1Rendering HTTP 500 for user "%s". Request.path=%sr4   r5   Dashboard/500.htmlr6   r?   r   r   r"   _server_error]   s    
 rH   c                 C   sR   | j jr td| j j t|  t||d}t| | td| j jpFd tdS )z
    Forces SSO login for the given username:password credentials.
    If another user is already logged in, it will be logged out.
    zLogging out user "%s"r:   passwordz'Rendering SSO login view for user "%s".r4   	dashboard)r9   r:   r7   r8   r   r   r   r   )r@   r:   rJ   r9   r   r   r"   	sso_loginu   s    

rL   )returnc           
   
   C   s   d }d}| j dd }|dkrd}| jjrZ| jj }tD ]\}}|j|d r:|}q:n~zL| j	d| j	dd }t
d}||d	 }td
| | dkrd}W n0 tk
r }	 ztd|	 d}W 5 d }	~	X Y nX ||fS )NFr5   )NengrN   r1   ZHTTP_X_FORWARDED_FORREMOTE_ADDRz5/var/www/rival/public_html/translation-eval/geoip_dbsZcountry_namezCOUNTRY:)ZspainZfrancespazError finding country:T)COOKIESr%   r9   r:   groupsallr   filterexistsMETAr   countryprintr-   	Exception)
r@   r5   ip_location_faileduser_groups_src_tgtipZgeoiprW   er   r   r"   r<      s*    

r<   c           
      C   s   t |  d }d }| jrV| jd }| jd }t||d}|d k	rV|jrVt| | tdS t| \}}tt|}d|d|}|	t
 |r|	| t| d|}	|	d| |	S )	Nr:   rJ   rI   rK   zsign-in)active_pager5   zDashboard/signin.htmlr5   )r   POSTr   	is_activer   r   r<   r=   r>   updater   r   
set_cookie)
r@   extra_contextr:   rJ   r9   r5   rB   rC   rD   responser   r   r"   signin   s0    




rg   c                 C   s   t |  td}|d |S )N	frontpager5   )r   r   delete_cookie)r@   re   rf   r   r   r"   signout   s    
rj   c                 C   st   t d| jjpd t| \}}tt|}d||d|}|t |rT|| t	| d|}|sp|
d| |S )z
    Appraise front page.
    z'Rendering frontpage view for user "%s".r4   rh   )r`   r5   rZ   zDashboard/frontpage.htmlr5   )r7   r8   r9   r:   r<   r=   r>   rc   r   r   rd   )r@   re   r5   rZ   rC   rD   rf   r   r   r"   rh      s&    


rh   )	password1	password2rM   c                 C   s,   | r|sdS | |krdS t | dk r(dS dS )N)FZmissing_password)FZpasswords_not_matching   )Fpassword_too_shortTN)len)rk   rl   r   r   r"   _validate_passwords   s    rq   )	languagesproficiency_levelsrM   c                 C   s,   | sdS | D ]}| |d dkr dS qdS )N)FZno_language_selected)N )FZmissing_proficiency_levelro   r$   )rr   rs   langr   r   r"   _validate_languages   s    rv   c           !      C   s  d}d}d}g }i }d\}}t }t}	d}
| jdkrp| jdd}| jdd}| jdd}t||\}}| jdd}|d	}|\}}|| jd
d|| jddi}t||\}}|r:|r:|r:|r:ztj	j
|d}| rtd|}g }|D ]T}tj	j
|d}| r$|| tj	j
| d	||  d}| r|| qtj	j
dd}| rv|| tj	j||d}|D ]}|j| q|  t||d}t| | tdW S  tk
r } z"|jd dkrd}nd}d}W 5 d}~X Y n4 tk
r8   ddlm} t|  d}d}Y nX |sLd}
dg}n$|s`d}
d|g}n|spd}
|g}t| \}}tt|}d||
||||||||	d|d|}|t t | d|} | !d| | S )z*
    Renders the create profile view.
    N)NNZid_usernamera   r:   rk   rl   lp_code-zproficiency-level-srczproficiency-level-tgt)r:   Zusername_already_existsr1   zpublic-usersrI   rK   r   Zinvalid_username)
format_excZgeneral_password_errorZid_languageszcreate-profileZRegister)r`   errorsfocus_inputr:   rr   rw   rs   srctgtlanguage_namesproficiency_level_choicestitler5   zDashboard/create-profile.htmlr5   )"r   r   methodra   r%   rq   splitrv   r   objectsrT   rU   
ValueErrorr
   extendcreate_userrR   addsaver   r   r   argsrY   	tracebackry   rX   r<   r=   r>   rc   r   r   rd   )!r@   rz   r:   rw   rr   rs   r|   r}   r~   r   r{   rk   rl   Z_password_okZ_password_errorZ_languages_okZ_languages_errorZcurrent_userrJ   r[   codeZlanguage_groupZlanguage_level_groupZpublic_users_groupr9   groupZissuery   r5   rB   rC   rD   rf   r   r   r"   create_profile
  s    
  









r   c           3      C   s  t  }ddi}|t d}d}d}tD ]6}||| j7 }|| j\}}|| ||  }}q*d}	tD ] }
|	s~|
	| j}	|	rj|	
 }qjtd|	 g }tD ]>\}}| jjj|d r| jjj|d r|||g q|\}}dd |D }d	}|D ]j}| jjj| d
d}| r |d j}|d
d }t|ttk r td| d d}q t  }dd tD }|	sddlm} dd tD }|j D ]}td|j |D ]}
|
jj|jd||
< q|D ]6}
||
  rg ||
 |j< ||
 |j | q|D ]v}d}t}|D ]}
||
  r2|
} qRq2|||| j}|s"|D ](}
||
  rl||
 |j  | qlq"|D ]*}
||
  rt!|
 }||
 } qqqt  } ddddd}!tD ]}
|
"| j}"|"# }#|"j$}$|!d  |$7  < |!d  t%|#|$d  d 7  < |!d  t%|#|$d  d d 7  < |!d  t%|#|$d  d 7  < qt  }%i }&|& D ]\}
}'t!|
 }(t'|( })|'& D ]F\}*}+|+D ]6}t(| },|(|&krg |&|(< |&|( )||,|*|)f qqtd|(t*|&+|(d,d  qt!+|	j-d!}-td"|- t'|- }.td#|. t.| \}/}0t/0t/|/}1||! |||||	|-|.|||&|| | | |%|  |%| fd$| j1k||||/d%|1 t2| d&|}2|23d'|/ |2S )(z"
    Appraise dashboard page.
    r`   rK   r   Nz  Current task: {0}r1   c                 S   s   g | ]}t | qS r   )r   )r    	lang_coder   r   r"   r+     s     zdashboard.<locals>.<listcomp>Trx   )Zname__containszProficiency level `z` insufficientFc                 S   s   i | ]
}|i qS r   r   r    task_clsr   r   r"   r.     s      zdashboard.<locals>.<dictcomp>)Campaignc                 S   s   i | ]
}|d qS r(   r   r   r   r   r"   r.     s      zCampaign: {0})campaign__campaignName)dayshoursminutessecondsr   r   iQ i  r   <   r   z    Languages "{}": {}nonezutf-8directz  Final task type: {0}z
  URL: {0}debug)annotationshits
total_hitscurrent_taskcurrent_typecurrent_urlrr   r~   all_languagesdebug_timestemplate_debugproficiency_level_acceptedr|   r}   r5   zDashboard/dashboard.htmlr5   )4r   nowrc   r   TASK_RESULTSget_completed_for_userr9   get_hit_status_for_user
TASK_TYPESget_task_for_usermarketTargetLanguageCoderX   formatr   rR   rT   rU   r   r2   r   r   r*   r   r7   r8   Campaign.modelsr   r   rS   campaignNamer   get_next_free_task_for_languageremove
TASK_NAMESget_time_for_usertotal_secondsr   intitems	TASK_URLSr   appendstrr%   encode	__class__r<   r=   r>   GETr   rd   )3r@   _t1template_contextr   r   r   
result_clsZ_hitsZ_totalr   r   r   rr   r\   r]   r|   r}   r~   r   r   Zproficiency_group_query_setZproficiency_groupZproficiency_level_t2Zlanguages_mapr   Zcampaign_mapcampaignZnext_task_available_clsZ_typeZ
_languages_t3timesdurationZsecsr   _t4r   Zcampaign_languagesZ	task_nameZtask_urlZ	camp_nameZ
lang_codesZ	lang_namer   r   r5   rB   rC   rf   r   r   r"   rK     s    

	(


   $$


rK   c                 C   s  ddi}t | \}}tt|}|t |d|i| | jjsbtd| j d t| d|S t	j
 }g }|D ]j}g }tD ]R\}	}
|	j }d| d}t||d }|r| r|
j|jd	d	d
}|| q|| qtdddddddddddg}tj||djddd}|ddddddg }|d dd |d< ||d dk }||d dk }dd }|||||d t| d |S )!Nr`   reportr5   zNon-staff user `z` tried to access report.rG   Z	evaldata_	_campaignT)extended_csvadd_batch_infor:   targetIDitemIDitemTyper|   r}   score	startTimeZendTimebatchNoZ
realItemIDcolumnsFbyZ	ascendingc                 S   s   |  dd S )N.r   )r   )r   r   r   r"   <lambda>}      zreport.<locals>.<lambda>rN   rP   c                 S   sF   |  dd  }| jddid}| jddd}|jdddS )Nr:   Zevaluationsr   Fr   ztable table-users)r*   classes)groupbycountZto_framerenameZreset_indexsort_valuesZto_html)	df_scoresZdf_usersr   r   r"   get_users_table  s    zreport.<locals>.get_users_table)Ztable_users_en_mtZtable_users_es_euzDashboard/report.html)r<   r=   r>   rc   r   r9   is_staffrX   r   r   r   rS   CAMPAIGN_TASK_PAIRS__name__r-   getattrrU   get_system_dataidr   pdZ	DataFramer   apply)r@   r   r5   rB   rC   Zall_campaignsZ
all_scoresr   system_scoresr   r   qs_nameqs_attrqs_objZ_scoresr   r   Zdf_scores_en_mtZdf_scores_es_eur   r   r   r"   r   M  sR    
 

r   c                 C   s$   t t j}dd|}t|d S Nz#{0}.{1} deprecated as of 7/08/2019.zDashboard.viewsr   r   functionr   NotImplementedErrorr@   _method_msgr   r   r"   group_status  s    r   c                 C   s$   t t j}dd|}t|d S r   r   r   r   r   r"   multimodal_status  s    r   c                 C   s$   t t j}dd|}t|d S r   r   r   r   r   r"   system_status  s    r   c                 C   s$   t t j}dd|}t|d S r   r   r   r   r   r"   multimodal_systems  s    r   c                 C   s$   t t j}dd|}t|d S r   r   r   r   r   r"   metrics_status  s    r   c                 C   s$   t t j}dd|}t|d S r   r   r   r   r   r"   fe17_status  s    r   )r3   )rF   )N)N)N)O__doc__r   hashlibr   inspectr   r   django.contrib.authr   r   r   django.contrib.auth.decoratorsr	   django.contrib.auth.modelsr
   r   Zdjango.contrib.gis.geoip2r   django.shortcutsr   r   django.template.defaulttagsr   Appraise.settingsr   Appraise.utilsr   Dashboard.modelsr   r   r   r   r   ZDashboard.utilsr   EvalData.modelsr   r   r   r=   Zpandasr   r   r   rT   r'   r*   tupler   r   r   r   
deprecatedr0   r   r7   Z$HITS_REQUIRED_BEFORE_ENGLISH_ALLOWEDrE   rH   rL   r   boolr<   rg   rj   rh   rq   listdictrv   r   rK   r   r   r   r   r   r   r   r   r   r   r"   <module>   s   




"
"

 
 
 @
E



