U
    mhb,                     @   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(  ddd}t ||\}}}| D ],\}}	t j| |	d |	d d\}
}|
||< q$| D ]\}}	||dkrxg ||< t|	d tr|	d D ]*}t j| |	d |d\}
}|| |
 qqZt j| |	d |	d d\}
}|| |
 qZ|tj	kr<|s<d|d	< d
|kr<tj	j|d
 dgd}|r0|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|sB| D ]`\}}t||sq|rt|tjjs"tt||tjr|| ddt|jg qd}|rdd |D }t|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r|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_fieldsmodelr	   )r,   r#   NTZ
user_localemailz**)r-   r	   FZloginstatus_typez==Zworkflownamecode Z_idc                 S   s   g | ]}|qS r   r   ).0
field_namer   r   r   
<listcomp>k   s     zACmfPluginImportMixin.process_any_table_fields.<locals>.<listcomp>filter)r6   r	   parent)r"   r/   r7   r0   import_original)Zsave_import)r&   )r   _get_any_table_fieldsitemsprocess_any_table_fieldsget
isinstancelistappendr   Z	CmfPersonZ	CmfStatushasattrcmfZ	CmfEntity
issubclassgetattrr	   Z
CmfRelBasestridr(   r8   setattr
is_changedr   )r"   r,   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_valuer3   valueZexisting_obj_fieldsr   Znew_objr   r   r   r;   !   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 )Nr7   c                 S   s   g | ]}|j d kr|qS )Z
CmfProject)__name__)r2   mr   r   r   r4      s     
 z>CmfPluginImportMixin._get_any_table_fields.<locals>.<listcomp>r   )r,   r	   )r:   r=   dictr>   r	   r<   Zrelated_models)
r,   r#   rH   rI   rJ   r3   rN   Z
main_fieldZrelated_modelZobj_typer   r   r   r9      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 rK   #r1   ruT)Zlanguage_codereversedORaliasZILIKE"z"%r/   r5   )r/   u*   Не удалось создать тег z: )Z	only_data)ZtransliteraterT   Ztagsloadreplacer   ZCmfTagr<   r   	ExceptionZloggingZwarningr?   rG   ZdpZcommit)	r"   r)   rS   rT   Ztag_nameZ
name_aliasrM   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.wikirb   r:   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   rc   )r/   re   priorityrf   rg   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CLOSEDrq   rc   )r/   re   r.   rf   rg   r   r   r   get_status_type   s    
z$CmfPluginImportMixin.get_status_type)N)rP   
__module____qualname__r   r   r   r   r    r!   staticmethodr   rR   r   r>   anyboolr;   r9   r   rD   r`   rh   intrm   rr   __classcell__r   r   r   r   r      s.      ir   N)typingr   r   r   r   r   Zcmf.includerA   r	   Zcommon.fieldsr
   Zcommon.models.cmf_importr   r   r   r   r   r   <module>   s   