U
    	d&                     @   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   setattr
is_changedr   Zbackref)r!   r%   r"   r#   related_objscurrent_objm2m_objsZmain_field_nameZrelated_infoZrelated_obj_Zexisted_person_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   r4   !   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   )r3   r7   dictlistr   r5   Zrelated_models)
r%   r"   r@   rA   rB   r,   rE   Z
main_fieldZrelated_modelZobj_typer   r   r   r2   t   s    
z*CmfPluginImportMixin._get_any_table_fields)r!   	tag_namesr$   c           	      C   s  ddl m} |sdS |j  |D ]}|dddd}||dd	d
}zXdddd| dgdd|gddd| dgg}tjj|d}|stj|d}|  W n@ t	k
r } z"t
d| d|  W Y q"W 5 d}~X Y nX |j| q"|jr|jd	d |j  dS )u{  
        Создание тегов при импорте
        :param CmfImport cmf_import: Объект импорта для хранения настроек, статуса по текущему импорту
        :param CmfTask obj: Родитель для связки тегов
        :param List[str] tag_names: Список названий тегов
        r   )translitN rC   #r*   ruT)Zlanguage_codereversedORaliasZILIKE"z"%r(   )r.   )r(   u*   Не удалось создать тег z: r1   )ZtransliteraterK   Ztagsloadreplacer   ZCmfTagr5   r   	ExceptionZloggingZwarningr6   r?   ZdpZcommit)	r!   objrJ   rK   Ztag_nameZ
name_aliasrD   Ztag_objer   r   r   process_tags   s0    
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.wikirZ   r3   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   r[   )r(   r]   priorityr^   r_   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CLOSEDri   r[   )r(   r]   r'   r^   r_   r   r   r   get_status_type   s    
z$CmfPluginImportMixin.get_status_type)N)rF   
__module____qualname__r   r   r   r   r   r    staticmethodr
   rH   r   rI   anyboolr4   r2   r   r;   rX   r`   intre   rj   __classcell__r   r   r   r   r      s.      Rr   N)typingr   r   r   r   r   Zcmf.includer8   r   Zcommon.fieldsr	   Zcommon.models.cmf_importr
   r   r   r   r   r   <module>   s   