U
    Eh-                     @   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                    s>  d dd} fdd t ||\}}}| D ],\}}	t j| |	d |	d d\}
}|
||< q0| D ]\}}	||d	krg ||< t|	d tr|	d D ]*}t j| |	d |d\}
}|| |
 qqft j| |	d |	d d\}
}|| |
 qf|tj	krH|sHd
|d< d|krHt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|sN| D ]`\}}t||sq|rt|tjjs.tt||tjr|| ddt|jg qd	}|rdd |D }||} |dkr|j|d}|r||| n|j||d}|rdnd
}|r|n || |d|d|dd}t|dr|js|r| D ]\}}t||| q|jr2|jd
d |}||fS )!u.  
        Создание объектов на основании моделей при импорте
        :param CmfImport cmf_import: Объект импорта для хранения настроек, статуса по текущему импорту
        :param model: Модель по которой создается объект
        :param dict obj_fields: Параметры объекта
        :param Optional[list] filter_obj: Фильтр для проверки на существование объекта в БД
        @  c                 S   s6   t dt||D ] }||||  }| j|d qd S )Nr   r   )rangelenZload_fields)objZ
all_fieldsZ
batch_sizeiZbatchr   r   r   safe_load_fields+   s    zGCmfPluginImportMixin.process_any_table_fields.<locals>.safe_load_fieldsc                    s8   d}|   D ]&\}}|d7 }t|tr| |7 }q|S )Nr      )items
isinstancedict)dtotalkeyvaluecount_all_keysr   r   r5   /   s    
zECmfPluginImportMixin.process_any_table_fields.<locals>.count_all_keysmodelr	   )r6   r#   NTZ
user_localemailz**)r7   r	   FZloginstatus_typez==Zworkflownamecode Z_idc                 S   s   g | ]}|qS r   r   ).0
field_namer   r   r   
<listcomp>r   s     zACmfPluginImportMixin.process_any_table_fields.<locals>.<listcomp>filter)r@   r	   parent)r"   r9   rA   r:   import_original)Zsave_import)r&   )r   _get_any_table_fieldsr-   process_any_table_fieldsgetr.   listappendr   Z	CmfPersonZ	CmfStatushasattrcmfZ	CmfEntity
issubclassgetattrr	   Z
CmfRelBasestridZ_build_load_planrB   setattr
is_changedr   )r"   r6   r#   r$   r+   related_objscurrent_objm2m_objsZmain_field_nameZrelated_infoZrelated_obj_valZexisted_person_filterZuniq_field_namesZuniq_field_nameZuniq_field_valuer=   r3   Zexisting_obj_fieldsZfull_fields_loadr   Znew_objr   r4   r   rD   !   s    








 

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 )NrA   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   )r6   r	   )r-   r.   r/   rF   r	   rE   Zrelated_models)
r6   r#   rP   rQ   rR   r=   r3   Z
main_fieldZrelated_modelZobj_typer   r   r   rC      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 rS   #r;   ruT)Zlanguage_codereversedORaliasZILIKE"z"%r9   r?   )r9   u*   Не удалось создать тег z: )Z	only_data)ZtransliteraterZ   Ztagsloadreplacer   ZCmfTagrE   r   	ExceptionZloggingZwarningrG   rO   ZdpZcommit)	r"   r)   rY   rZ   Ztag_nameZ
name_aliasrU   Ztag_objer   r   r   process_tags   s0    
z!CmfPluginImportMixin.process_tags)r9   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.wikirh   r-   lower)r9   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   ri   )r9   rk   priorityrl   rm   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CLOSEDrv   ri   )r9   rk   r8   rl   rm   r   r   r   get_status_type   s    
z$CmfPluginImportMixin.get_status_type)N)rW   
__module____qualname__r   r   r   r   r    r!   staticmethodr   r/   r   rF   anyboolrD   rC   r   rL   rf   rn   intrr   rw   __classcell__r   r   r   r   r      s.      qr   N)typingr   r   r   r   r   Zcmf.includerI   r	   Zcommon.fieldsr
   Zcommon.models.cmf_importr   r   r   r   r   r   <module>   s   