U
    ¿d'                     @   s$  d Z ddlmZ ddlmZ ddl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 ddlm Z  G dd de
Z!dddZ"dddZ#dS )z>
Appraise evaluation framework

See LICENSE for usage details
    )datetime)pathN)File)ContentFile)BaseCommand)CommandError)_create_context)_init_campaign)_process_campaign_data)_validate_campaign_data)Campaign)CampaignData)CampaignTeam)Market)Metadata)_identify_super_users)_load_campaign_manifest)_process_market_and_metadata)generate_confirmation_token)_update_eval_data_modelsc                   @   s    e Zd ZdZdd Zdd ZdS )CommandzCA single command for creating a new campaign based on manifest filec                 C   s   |j ddtdd |j dtg dddd	 |j d
td ddd |j dtd ddd |j ddddd |j ddddd |j dtdddd d S )Nmanifest_jsonzmanifest-jsonz%Path to manifest file in JSON format.)metavartypehelpz--batches-jsonJSON+z(List of paths to batches in JSON format.)r   defaultr   nargsr   z--csv-outputZCSVz4Path used to create CSV file containing credentials.)r   r   r   r   z--xlsx-outputZXLSXz6Path used to create Excel file containing credentials.z--include-completed
store_trueFz5Include completed tasks in task agenda re-assignment.)actionr   r   z--task-confirmation-tokenszaGenerate valid task confirmation tokens needed for integration with external crowd sourcing apps.z--max-countINTEGERz1Defines maximum number of batches to be processed)add_argumentstrint)selfparser r(   \/var/www/rival/public_html/translation-eval/Campaign/management/commands/StartNewCampaign.pyadd_arguments"   s^    	zCommand.add_argumentsc              
   O   s  |d }| j d| |d }| j d| |rT| dsTtd||d }| j d| |r| d	std
|t|}t|| j d}|d  }|d }	| j d t|||||	d| j d t	 d }
| j d |d }|d }|
dd}td|s"td|rt|d |
||d}t|t|krftdt|t|g }t||D ]:\}\}}| j d| |t||
||| j d qt| j d| t||||
| j d}n0tjj|d}| r|d }ntd || j d! | j d|j t|| j  | j d" |d# }|d$ }|jsft||
|| | j d% t| j  | j d& t|||||	d'| j d |s|r| j d( n| j d) d S )*Nr   zJSON manifest path: {0!r}
csv_outputzCSV output path: {0!r}z.csvz,csv_output {0!r} does not point to .csv filexlsx_outputzExcel output path: {0!r}z.xlsxz.xlsx_output {0!r} does not point to .xlsx file)stdoutZinclude_completedZtask_confirmation_tokensz### Running InitCampaignT)Zskip_agendasr-   r   z### Creating a new campaignbatches_jsonCAMPAIGN_NAMEZTASK_OPTIONS z[a-zA-Z0-9]+$z4Campaign name must contain only letters and numbers.ZALL_LANGUAGES)Zdomain_nameZcorpus_namez:Mismatch of number of markets ({0}) and JSON batches ({1})z- {0!r})marketmetadatar-   zCampaign name: {})campaignNamezXCampaign {0!r} does not exist and no JSON file with batches provided via --batches-json.z ### Running validatecampaigndataz### Running ProcessCampaignDataZ	TASK_TYPE	max_countz ### Running UpdateEvalDataModelsz### Running init_campaign againFz.Done. Credentials exported to a CSV/XLSX file.zDone.)r-   writeformatlowerendswithr   r   r   r	   r   getrematchr   len
ValueErrorzipappend_upload_batches_json_create_campaignr   objectsfilterexistsr3   r   	activatedr
   r   )r&   argsoptionsr   r+   r,   manifest_datacontextZonly_activatedZconfirmation_tokensownerr.   campaign_nameZcampaign_optsZmarkets_and_metadatacampaign_dataZ_batches_jsonZ_market_metaZ	_campaignZ_campaign_typeZ
_max_countr(   r(   r)   handle[   s    

  
    



zCommand.handleN)__name__
__module____qualname__r   r*   rN   r(   r(   r(   r)   r      s   9r   c           	   	   C   s   | d|  | d| | d| t|||d}t| }t| d }t| }|j	|| W 5 Q R X |	  | d|j |S )z0Upload batches and return a CampaignData object.z	Batch: {}z  Market: {}z  Metadata: {})r1   r2   	createdByrbzUploaded file name: {})
r5   r6   r   r   basenameopenr   readdataFilesave)	r.   rJ   r1   r2   r-   rL   	_filename_reader_filer(   r(   r)   r@      s    
r@   c                 C   s@   t | |d}|r||_|  |D ]}|j| q"|  |S )zCreate a new campaign.)r3   rR   )r   campaignOptionsrX   batchesadd)rK   rL   Zcampaign_optionsrJ   r-   campaignZ_campaign_datar(   r(   r)   rA     s    rA   )N)N)$__doc__r   osr   r:   django.core.filesr   django.core.files.baser   django.core.management.baser   r   Z*Campaign.management.commands.init_campaignr   r	   Z0Campaign.management.commands.ProcessCampaignDatar
   Z1Campaign.management.commands.validatecampaigndatar   Campaign.modelsr   r   r   r   r   ZCampaign.utilsr   r   r   ZDashboard.utilsr   Z1EvalData.management.commands.UpdateEvalDataModelsr   r   r@   rA   r(   r(   r(   r)   <module>   s4    N
 