U
    \hSJ                     @   sv   d dl mZ d dlZd dlZd dlT d dlmZ d dlmZ d dl	m
Z
 d dl mZmZmZmZ G dd	 d	ejZdS )
    )OptionalN)*)fields)cmf_import_plugin)	CmfImport)DictUnionListr   c                       sB  e Zd Z fddZeeedddZeeedddZedd	 Z	eeedd
dZ
eeeeefdddZed4eeee eefdddZdd Zddddd fdd
Zdd fdd
Zdd Zdd  Zd!d" Zed#d$ Zd%d& Zd'd( Zd)d* Zed+d, Zd-d. Zd/d0 Z ee!e ed1d2d3Z"  Z#S )5CmfImportPluginc                    s2   t  j|| tjjdd| _tj| _tj	| _
d S )NZsoftdev)code)super__init__modelsZCmfActivitygetZdefault_activityZconfigZIMPORT_THREADSZthreading_max_forksZIMPORT_DOWNLOAD_THREADSZdownload_threading_max_forksselfargskwargs	__class__ $./common/models/cmf_import_plugin.pyr      s    zCmfImportPlugin.__init__)namereturnc              	   C   st   ddddddddgd	d
dddddgddgddddddgd}|  D ]*\}}|D ]}||  krP|    S qPqDdS )Nu   открытopenu   к выполнениюZtodonewZpausedu
   зарегZsubmitu
   работZprogressZindeterminateZactiveZ
inProgressu   обсуждZdiscusZreviewu
   ревьюcloseu   закрытu
   готовZdoneZarchivedZ	cancelled)OPENZIN_PROGRESSZ	IN_REVIEWZCLOSEDr   itemslower)r   mappingstatus_typewordswordr   r   r   calc_status_type   sB    
#z CmfImportPlugin.calc_status_typec                 C   sZ   dgdgddgddgddd	gd
}|  D ]*\}}|D ]}||  kr6|    S q6q*dS )u+    Поиск priority по синониму u   минu   низкu
   обычнu   нормальнu   срокu
   высокu   блокирующu
   большu   крит)r         r   r   )r   r!   priorityr#   r$   r   r   r   calc_priority?   s    zCmfImportPlugin.calc_priorityc                 C   s^   | r|sdS t |   }| D ]4\}}|t |  t |  fkr$|  S q$| S )u  
        Находит ключ по значению или ключу в атрибуте choices у field
        Args:
            value: Значение для поиска
            choices: значения поля
        
        Returns:
            Найденный ключ или исходное значение, если ничего не найдено
        N)strstripr    r   )valuechoicesZ	str_valuekeyZchoice_valuer   r   r   calc_choicesO   s    $
zCmfImportPlugin.calc_choicesc                 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.wikir3   r   )r   r!   Zlogic_prefixr#   r$   r   r   r   calc_logic_typee   s    zCmfImportPlugin.calc_logic_type)
obj_fieldsr   c           	      C   s   i }i }i }|  D ]\}}t|ttfr| j|}|dkrVdd | D d }n,|dkrvdd | D d }n| d }t|tjj	r||d||< q||d||< q|||< q|||fS )Nparentc                 S   s   g | ]}|j d kr|qS )
CmfProject__name__.0mr   r   r   
<listcomp>   s     
 z9CmfImportPlugin._get_any_table_fields.<locals>.<listcomp>r   )Z	executorsZ
spectatorsc                 S   s   g | ]}|j d kr|qS )	CmfPersonr8   r:   r   r   r   r=      s     
 )modelr   )
r   
isinstancedictlistr   r   Zrelated_models
issubclasscmfZ
CmfM2MBase)	r?   r5   related_objscurrent_objm2m_objs
field_namer.   Z
main_fieldZrelated_modelr   r   r   _get_any_table_fieldsu   s     
z%CmfImportPlugin._get_any_table_fieldsNF)
cmf_importr5   
filter_objr   c               	   C   s  |  ||\}}}	| D ],\}
}| j||d |d d\}}|||
< q|	 D ]\}
}||
dkrng ||
< ddddd	g}|D ]}|d |d
}|rtd|}|D ]t}|| i}|
d}| j||d ||d\}}|dkr|jd|  d|
 dd|d j	d ||
 
| q qPqqP|tjkr|sd|d< dd |dg D }d|krpd|d< d|d< d|krd	|krtjjdd|d gdgd}|r|dfS |d |d	< |tjkrdd|d gd d|d  gg}|dr|
dd|d g |tjkrNd!d|d! gd"d|d" gd#dtjj|d# dd$gd%d|d% gg}|rZ|}ng }ddddd	g}|D ]V}||d
}|rp|dkr|
d&|d|gdd|gg n|
|d|g  qȐqp|s(| D ]P\}}|rt|tjjstt||tjr|
| d'dt|jg qd}|rXd(d |D }|
d) |j||d}|s|tjkrd	|kr|jd*| d+d,d-d d.S |rdnd}|r|r||fS i }|d!r|d! |d!< |r|n|f ||ddd/|}| D ]\}}t||| q|rb|jrbd}|f ||ddd/|}| D ]\}}t||| qJ|jr|jr|jr|j	d0kr|  |jdd1 |}||fS )2u  
        Создание объектов на основании моделей при импорте
        :param CmfImport cmf_import: Объект импорта для хранения настроек, статуса по текущему импорту
        :param model: Модель по которой создается объект
        :param dict obj_fields: Параметры объекта
        :param Optional[list] filter_obj: Фильтр для проверки на существование объекта в БД
        :param bool dont_create: Не создавать объект
        :param bool dont_update: Не обновлять объект
        r?   r   )r?   r5   NZext_idr   r   ZemailZlogin z[,;]Zcf_)r?   r5   dont_createu&   Не найдено значение 'u   ' поля ''zERR-0135)Zobj_typeTZ
user_localc                 S   s   g | ]}|j jqS r   )r   r.   )r;   Zpgr   r   r   r=      s     z<CmfImportPlugin.process_any_table_fields.<locals>.<listcomp>Zrg_member_ofZServiceDeskClientFZemail_if_self_changesZILIKEz**filterr   r"   ==Zworkflowr6   Z
cmf_authorZcmf_created_at)ZdayfirsttextORZ_idc                 S   s   g | ]}|qS r   r   )r;   rH   r   r   r   r=      s     r   uN   Не удается найти или создать пользователя uf   . Проверьте правильность ввода логина/email пользователя. zERR-0115r>   )NF)rJ   r   import_originalr7   )Zsave_import) rI   r   process_any_table_fieldsr   resplitr-   
startswithZ	log_error
class_nameappendr   r>   Z	CmfStatusZ
CmfCommentdateutilparserparser@   rD   Z	CmfEntityrC   getattrr   Z
CmfRelBaser,   idsetattrZ
is_changedrT   is_newsave) clsrJ   r?   r5   rK   rM   Zdont_updaterE   rF   rG   Zmain_field_nameZrelated_infoZrelated_obj_field_namesrH   Zfield_valuevaluesr.   Zrelated_obj_fieldsZrelated_dont_createZrg_member_of_codeZexisted_personZ_filterZuniq_field_namesZuniq_field_nameZuniq_field_valueZexisting_obj_fieldsra   r   Znew_objr   r   r   rU      s    







 

z(CmfImportPlugin.process_any_table_fieldsc              	   K   s@   | j r
dS tjf | j| j| j|||d|}|  || _ dS )u3   
        Дает доступ из вне
        N)r   typetokenext_url	ext_login	ext_token)pluginr   	CmfPluginr   rY   r_   rb   )r   rj   rk   rl   r   rm   r   r   r   _init_secret;  s      zCmfImportPlugin._init_secretr   )depthrj   rk   rl   c                   s*   | j r| ||| t j|d|i|S )Nrp   )ra   ro   r   rb   )r   rp   rj   rk   rl   r   r   r   r   r   rb   F  s    zCmfImportPlugin.save)forcec                   s>   t jjdd| jgddddgd}|  t j|d|i|S )Nri   rQ   rj   rk   rl   rO   rq   )r   rn   r   r_   deleter   )r   rq   r   r   rm   r   r   r   rr   K  s
    
zCmfImportPlugin.deletec                 C   s
   t  dS )uJ   
        Формирование шаблона настроек
        NNotImplementedr   rJ   r   r   r   tmplt_import_settingsQ  s    z%CmfImportPlugin.tmplt_import_settingsc                 C   s
   t  dS )u9   
        Предпросмотр импорта
        Nrs   ru   r   r   r   previewW  s    zCmfImportPlugin.previewc                 C   s
   t  dS )u-   
        Запуск импорта
        Nrs   ru   r   r   r   process_import]  s    zCmfImportPlugin.process_importc                   C   s
   t  dS )uC   
        Маппинг полей по умолчанию
        Nrs   r   r   r   r   calc_models_settingsc  s    z$CmfImportPlugin.calc_models_settingsc                 O   s
   t  dS )uK   
        Тестирование подключения к апи
        Nrs   r   r   r   r   testj  s    zCmfImportPlugin.testc                 C   s
   t  d S Nrs   r   r   r   r   download_datap  s    zCmfImportPlugin.download_datac                 C   s
   t  d S r{   rs   r|   r   r   r   download_filess  s    zCmfImportPlugin.download_filesc                    s  ddl m  dd l}dd l} fdd}t| j| jjd| jj| j	d} dd}|j
d	d
|d dd}||}|j
ddd}d|d< d|d< d|d< ||d< d|d< d|d< || |j
dd| jjd}	|
d}
|
|| j	 |j
ddd}|| jj d| jj  |	|
 |	| ||	 t| tjr~|j
dd| j jjj d d}d!|d< | jjjj|_|	| |S )"Nr   BeautifulSoupc                    s2   ddd}d}| |kr||  } d| dddS )	NztM6,2A2,2 0 0,0 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2H6M6,4H13V9H18V20H6V4M8,12V14H16V12H8M8,16V18H13V16H8Za	  M19,3H14.82C14.4,1.84 13.3,1 12,1C10.7,1 9.6,1.84 9.18,3H5A2,2 0 0,0 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5A2,2 0 0,0 19,3M12,3A1,1 0 0,1 13,4A1,1 0 0,1 12,5A1,1 0 0,1 11,4A1,1 0 0,1 12,3M7,7H17V5H19V19H5V5H7V7M7.5,13.5L9,12L11,14L15.5,9.5L17,11L11,17L7.5,13.5Z)ZCmfDocumentCmfTaska  M6.2 12.3a1 1 0 011.4 1.4l-2.1 2a2 2 0 102.7 2.8l4.8-4.8a1 1 0 000-1.4 1 1 0 111.4-1.3 2.9 2.9 0 010 4L9.6 20a3.9 3.9 0 01-5.5-5.5l2-2zm11.6-.6a1 1 0 01-1.4-1.4l2-2a2 2 0 10-2.6-2.8L11 10.3a1 1 0 000 1.4A1 1 0 119.6 13a2.9 2.9 0 010-4L14.4 4a3.9 3.9 0 015.5 5.5l-2 2zz<svg viewBox="0 0 24 24" class="ng-star-inserted" style="width: 20px; height: 20px; margin-bottom: -4px;"><path fill="currentColor" d="z"></path></svg>html.parserZfeaturesr   )Z
model_nameZ	icon_pathpathr   r   r   get_icon_model{  s    z7CmfImportPlugin.create_tag_link.<locals>.get_icon_modelrR   )hreftitleZviewModeZobjIdZ	modelNamer   r   aZinheritr   T)contenteditabler   Zcmf_convertedspanZfalse)r   zdata-renderedtruezdata-internal-linkzwiki-link-presentationzdata-macroszdata-macros-parameterszwiki-link-wrapclasszwiki-card-textz$inline-card-icon-and-title link-view)class_r   zpadding-right: 5px;)Zstylez: zbackground-color: z; color: #fff;zcard-status)Zbs4r   jsonrandomrA   r   r   r.   r_   rY   Znew_tagdumpsrZ   r   r@   r   r   statusloadZcolorstring)objr   r   r   Zlink_paramsZsouplinkZlink_params_strZspan_wrapperr   Z	icon_spanZ	name_spanZstatus_spanr   r   r   create_tag_linkv  sH    	







zCmfImportPlugin.create_tag_linkc                 C   s   d S r{   r   r   r   r   r   r   calc_ext_href  s    zCmfImportPlugin.calc_ext_hrefc                 C   s   d S r{   r   r   r   r   r   calc_dump_path  s    zCmfImportPlugin.calc_dump_path)settingsr   c                 C   s   dd | D S )Nc                 S   s   i | ]}|d  |qS )r   r   )r;   sr   r   r   
<dictcomp>  s      z7CmfImportPlugin._normalize_settings.<locals>.<dictcomp>r   )r   r   r   r   _normalize_settings  s    z#CmfImportPlugin._normalize_settings)NFF)$r9   
__module____qualname__r   staticmethodr,   r%   intr+   r1   r4   rA   rI   classmethodr   r   rB   anyboolrU   ro   rb   rr   rv   rw   rx   ry   rz   r}   r~   r   r   r   r	   r   __classcell__r   r   r   r   r
      sN   +
    -

3r
   )typingr   r[   rV   Zcmf.includerD   r   Zcommon.fieldsr   Zcommon.models.cmf_importr   r   r   r	   r
   r   r   r   r   <module>   s   