U
    !4j                     @   s@   d dl T d dlT d dlmZ d dlmZ G dd deejZdS )    )*)cmf_testcycle)EvaTestCodeMixinc                       sl   e Zd Zejjdg ZdZdd Zdd Zdd Z	 fd	d
Z
 fddZdd Zed fdd	Z  ZS )CmfTestcyclecomplete)openZin_progressc                 C   s$   | j r
d S tjjdddgd| _ d S )Nztestcycle.base:defaultTZsave_eval_code)codeZcache_inmemoryfields)workflowmodelsZCmfWorkflowgetself r   )./modules/evatest/models/cmf_testcycle.py_calc_workflow   s    zCmfTestcycle._calc_workflowc                 C   sD   | j jsd S tjjdd| gddd ggdD ]}| j |_|  q*d S )Nparentz==responsible)filter)Zdefault_responsible
is_changedr   ZCmfTestcaseRunlistr   save)r   Ztest_case_runr   r   r   _apply_responsible   s    zCmfTestcycle._apply_responsiblec                    s    j jsdS  j jdkr. j jdkr*d _dS  jrL jjt jjkrLdS  jjpVi } fdd|	 D }|svdS |dhkrd _n|dhkrd _nd	 _dS )
u  Рассчитывает результат EvaTest только при смене статуса цикла.

        Ручные результаты из вариантов поля ``resolution`` сохраняются.
        Открытые прогоны и прогоны в работе не учитываются; если финальных
        статусов нет, результат не устанавливается.
        NCLOSEDc                    s&   h | ]\}}|d kr| j kr|qS )r   )NON_FINAL_TESTCASE_RUN_STATUSES).0statuscountr   r   r   	<setcomp>.   s    
z0CmfTestcycle._calc_resolution.<locals>.<setcomp>ZpassedsuccessZfailedZfailZpart_success)
Zcache_status_typer   newoldZ
resolutionvaluetypechoicestestcase_run_cacheitems)r   Z	run_cacheZstatusesr   r   r   _calc_resolution   s&    


zCmfTestcycle._calc_resolutionc                    s   t   dg S )u  Предзагружает кэш прогонов для расчета результата при сохранении.

        RPC-метод объекта ``complete`` загружает только id, но
        ``_calc_resolution()`` нужен ``testcase_run_cache``; предзагружаем его,
        чтобы избежать неявной ленивой загрузки при сохранении.
        r%   )supersave_preload_fieldsr   	__class__r   r   r)   <   s    z CmfTestcycle.save_preload_fieldsc                    s0   | j r| jr| jj| d |   t j||S )N)Z	testcycle)Zis_newZtestplanrunr   r(   r   r   argskwargsr*   r   r   r   E   s    zCmfTestcycle.savec                 O   s    | j  jdd| _|   d S )Nr   )Zstatus_type)r
   loadZget_default_statusr   r   r-   r   r   r   r   M   s    zCmfTestcycle.completeNc                    s>   |dkr$| j |f||||d|S t j||||||f|S )Nrelease)object_fieldsr   r	   order_by)Zreleases_options_listr(   field_options_list)clsZrelation_field_nameZmodels_filtersr	   r2   r   r3   r/   r*   r   r   r4   Q   s    zCmfTestcycle.field_options_list)NNNNN)__name__
__module____qualname__r   r   Zapi_methodsr   r   r   r'   r)   r   r   classmethodr4   __classcell__r   r   r*   r   r      s   !	r   N)Zcmf.includeZ
cmf.fieldsZmodules.evatest.fieldsr   Z-modules.evatest.models.cmf_evatest_code_mixinr   r   r   r   r   r   <module>   s   