U
    qc!%                     @   sn   d dl mZmZ d dlmZmZ d dlmZ d dlT d dlmZ d dl	m
Z
 d dlmZ G dd	 d	e
jZd
S )    )ListOptional)datetimetimezone)copy)*)fields)cmf_plugin_import_mixin)	CmfImportc                       s   e Zd Zdd Zdd fdd
Zdd Zd	d
 Zdd Zdd Ze	d e
eee eefdddZe	eeeefdddZe	e
ee ddddZe	eedddZe	eedddZe	eedddZ  ZS )!CmfPluginImportMixinc                 C   s   | j r| jst | _d S N)is_newZpluginmodelsZ	CmfPlugin)self r   *./common/models/cmf_plugin_import_mixin.py_init_settings   s    z#CmfPluginImportMixin._init_settingsr   )depthc                   s   |    t j|d|i|S )Nr   )r   supersave)r   r   argskwargs	__class__r   r   r      s    zCmfPluginImportMixin.savec                 O   s
   t  d S r   NotImplementedr   r   r   r   r   r   calc_import_settings   s    z)CmfPluginImportMixin.calc_import_settingsc                 O   s
   t  d S r   r   r   r   r   r   process_import   s    z#CmfPluginImportMixin.process_importc                 O   s
   t  dS )u2    Превью результата импорта Nr   r   r   r   r   preview   s    zCmfPluginImportMixin.previewc                 O   s
   t  d S r   r   r   r   r   r   calc_models_settings   s    z)CmfPluginImportMixin.calc_models_settingsN)
cmf_import
obj_fields
filter_objreturnc                 C   s  t ||\}}}| D ],\}}t j| |d |d d\}	}
|	||< q|tjkr|sd|d< d|krtjj|d dgd}|r|d	fS |d |d
< |tjkrdd|d gdd|d gg}|dr|dd|d g |r|}ng }dddg}|D ]*}||d}|r||d|g  q q|s| D ]P\}}|r.t	|t
jjs`tt||tjr.|| ddt|jg q.d}|r|j|dd |D d}|rd	nd}|r|n || |d|d|dd}t|dr|js|r| D ]\}}t||| q|jr:|r.|  n|jdd |}| D ]D\}}|j|j}|d D ]"}|||< t j| |d |d qdqF||fS )u.  
        Создание объектов на основании моделей при импорте
        :param CmfImport cmf_import: Объект импорта для хранения настроек, статуса по текущему импорту
        :param model: Модель по которой создается объект
        :param dict obj_fields: Параметры объекта
        :param Optional[list] filter_obj: Фильтр для проверки на существование объекта в БД
        modelr   )r%   r"   TZ
user_localemailz**)r&   r   FZloginstatus_typez==Zworkflownamecode Z_idNc                 S   s   g | ]}|qS r   r   ).0
field_namer   r   r   
<listcomp>X   s     zACmfPluginImportMixin.process_any_table_fields.<locals>.<listcomp>)filterr   parent)r!   r(   r/   r)   import_original)Z	only_data)r   _get_any_table_fieldsitemsprocess_any_table_fieldsr   Z	CmfPersongetZ	CmfStatusappend
isinstancecmfZ	CmfEntity
issubclassgetattrr   Z
CmfRelBasestridhasattrr0   setattrZ
is_changedr   Zbackref)r!   r%   r"   r#   related_objscurrent_objm2m_objsZmain_field_nameZrelated_infoZrelated_obj_Zexisted_personZ_filterZuniq_field_namesZuniq_field_nameZuniq_field_valuer,   valueZexisting_objr   Znew_objZm2m_infoZto_main_field_nameZ
field_infor   r   r   r3   !   st    





 
z-CmfPluginImportMixin.process_any_table_fields)r"   r$   c           
      C   s   i }i }i }|  D ]x\}}t|ttfr| j|}|dkrVdd | D d }n| d }t|trp|n|}	||d|	|< q|||< q|||fS )Nr/   c                 S   s   g | ]}|j d kr|qS )Z
CmfProject)__name__)r+   mr   r   r   r-   ~   s     
 z>CmfPluginImportMixin._get_any_table_fields.<locals>.<listcomp>r   )r%   r   )r2   r6   dictlistr   r4   Zrelated_models)
r%   r"   r>   r?   r@   r,   rB   Z
main_fieldZrelated_modelZobj_typer   r   r   r1   t   s    
z*CmfPluginImportMixin._get_any_table_fields)r!   	tag_namesr$   c                 C   s   |D ]}| dd dd}zt| tjd|i\}}W n@ tk
rx } z"td| d|  W Y qW 5 d}~X Y nX |j	| q|
  t  dS )	u{  
        Создание тегов при импорте
        :param CmfImport cmf_import: Объект импорта для хранения настроек, статуса по текущему импорту
        :param CmfTask obj: Родитель для связки тегов
        :param List[str] tag_names: Список названий тегов
         rA   #r*   r(   u*   Не удалось создать тег z: N)replacer   r3   r   ZCmfTag	ExceptionZloggingZ	exceptionZtagsr5   r   Zcommit_with_event)r!   objrG   Ztag_nameZtag_objrA   er   r   r   process_tags   s    z!CmfPluginImportMixin.process_tags)r(   r$   c                 C   sV   dgdddgdgdgdgd}|  D ]*\}}|D ]}||  kr2|    S q2q&d	S )
ue    Поиск программных типов workflow для проектов по синониму Zagilebaseu   основнu   классическZhelpdeskZservicedeskZwiki)project.agilezproject.basezproject.helpdeskzproject.servicedeskzproject.wikirP   r2   lower)r(   mappingZlogic_prefixwordswordr   r   r   get_logic_prefix   s    z%CmfPluginImportMixin.get_logic_prefixc                 C   sT   dgddgdgdddgd}|  D ]*\}}|D ]}||  kr0|    S q0q$d	S )
u+    Поиск priority по синониму u   низкu
   обычнu   нормальнu   срокu   блокирующu
   высокu
   больш)r         r   rQ   )r(   rS   priorityrT   rU   r   r   r   get_priority   s    z!CmfPluginImportMixin.get_priorityc                 C   sf   dddddgdddd	gd
dgdddddgd}|  D ]*\}}|D ]}||  krB|    S qBq6dS )Nu   открытopenu   к выполнениюZtodonewu
   работZprogressZindeterminateZactiveZreviewu
   ревьюcloseu   закрытu
   готовZdoneZarchived)OPENZIN_PROGRESSZ	IN_REVIEWZCLOSEDr_   rQ   )r(   rS   r'   rT   rU   r   r   r   get_status_type   s    
z$CmfPluginImportMixin.get_status_type)N)rC   
__module____qualname__r   r   r   r   r   r    staticmethodr
   rE   r   rF   anyboolr3   r1   r   r:   rN   rV   intr[   r`   __classcell__r   r   r   r   r      s.      Rr   N)typingr   r   r   r   r   Zcmf.includer7   r   Zcommon.fieldsr	   Zcommon.models.cmf_importr
   r   r   r   r   r   <module>   s   