U
    ThS                    @   s   d dl Zd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
mZ d dlmZ d dlmZ d dlmZ d dlmZmZ d dl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 dd Z G dd dej!Z!dS )    N)permutations)BeautifulSoup)Path)Queue)LockThread)	unidecodecmf_context)*)cmf_plugin_kaiten)KaitenClient
extensionsc                    s    fdd}|S )Nc                    s    fdd}|S )Nc                    s   zL| j jd d dd dd | j  r2W dS  | f||}t  |W S  tk
r   t  |  jd7  _| j d  Y dS X d S )Nz===== T)Z	anonymousr      u   Ошибка )
cmf_importlog	is_cancel
cmf_commit	Exceptioncmf_rollback
has_errors	log_error)objargskwargsres)funcname ,./modules/kaiten/models/cmf_plugin_kaiten.pywrapper   s     
z3catch_exception.<locals>.decorator.<locals>.wrapperr    )r   r"   r   )r   r!   	decorator   s    z"catch_exception.<locals>.decoratorr    )r   r$   r    r#   r!   catch_exception   s    r%   c                       s@  e Zd ZdZejjd Zejjdg Z fddZe	dd Z
e	dd	 Zed
d ZeeedddZedd Zedd ZeedddZdd Zdd Zdd ZdddZdd Zd d! Zd"d# Zd$d% Zd&d' Zed(d)d*Zd+d, Zdd/d0Zd1d2 Z dd4d5Z!d6d7 Z"e#d8ed(d9d:Z$d;d< Z%d=d> Z&e#d?d@dA Z'e#dBdCdD Z(e#dEdFdG Z)ddIdJZ*dKdL Z+dMdN Z,dOdP Z-dQdR Z.dSdT Z/dUdV Z0dWdX Z1ddZd[Z2e#d\d]d^ Z3ed_d`daZ4dbdc Z5ddde Z6dfdg Z7e#dhdidj Z8dkdl Z9dmdn Z:e#dodpdq Z;drds Z<dtdu Z=e#dvdwdx Z>e#dydzd{ Z?e#d|d}d~ Z@e#ddd ZAe#ddd ZBe#ddd ZCe#ddd ZDe#ddd ZEe#ddd ZFdd ZGdd ZHdd ZIdd ZJe#ddd ZKdd ZLdd ZMdd ZNdd ZOdd ZPe#ddd ZQdd ZRdd ZS  ZTS )CmfPluginKaitenN)clientkaiten_fieldsget_all_projectsc                    sZ   t  j|| i | _i | _i | _g | _d| _d| _d | _dddt	
 t	 t	 g| _d S )Nr   FZextraZ
sane_listsZtoc)super__init__task_relationsZepicssubtasksselected_projectsr   update_fields_CmfPluginKaiten__kaiten_fieldsr   ZPlantUMLExtensionZMentionExtensionZStrikethroughExtension_markdown_extensions)selfr   r   	__class__r    r!   r+   9   s    zCmfPluginKaiten.__init__c                 C   sJ   | j sD| ddddg tt| jj| jj | jjj	t
 d| _ | j S )u5    Клиент для работы с Kaiten REST API pluginzplugin.ext_urlzplugin.ext_tokenzplugin.verify_ssl)urltoken
verify_sslZsession)_CmfPluginKaiten__clientload_fieldsr   strr5   Zext_urlZ	ext_tokenZdecryptr8   valuecmfutilZrequests_session)r2   r    r    r!   r'   M   s    

zCmfPluginKaiten.clientc              	   C   s   | j r| j S | j d}| rN| jsNt|d}t|| _ W 5 Q R X n:| j	
 | _ t|d}tj| j |dd W 5 Q R X d| _| j S )Nzfields.jsonr+w+Fensure_ascii)r0   r   get_download_pathjoinpathexistsr/   openjsonloadr'   Z
get_fieldsdump)r2   	file_pathfr    r    r!   r(   _   s    zCmfPluginKaiten.kaiten_fieldsc                 C   sR   t | } |  } tdd| } tdd| } tdd| } tdd| } | dS )	N&z and z\+r   z[^\w\s-] z[\s_-]+-)r   lowerresubstrip)textr    r    r!   _slugifyp   s    zCmfPluginKaiten._slugify)datareturnc                 C   s   | d }|  dpd}|  d}tj| d| d}|d k	r`ttj|d}|j|d}n|jtjjd}|tjj}|	 S )	Ndatetimez00:00:00ZtzOffsetr   z%Y-%m-%d %H:%M:%SZminutes)Ztzinfo)
getdtdatetimestrptimetimezone	timedeltareplaceZutcZ
astimezoneZ	isoformat)rT   Zdate_strZtime_strZ	tz_offsetZdt_naiveZtzZdt_objZdt_utcr    r    r!   _dict_to_dtz   s    
zCmfPluginKaiten._dict_to_dtc                  C   s   g } | S )Nr    )r   r    r    r!   calc_models_settings   s    z$CmfPluginKaiten.calc_models_settingsc                 C   sF   |sdS | dr8|dd}| dp*i }||}n
| |}|S )u`   
        Метод получает значение параметра объекта
        Ncf_id_
properties)
startswithr_   rY   )obj_dataattrproperty_idrd   r<   r    r    r!   
_get_value   s    

zCmfPluginKaiten._get_value
field_namec                 C   s&   |sd S | j |gd}|r"|d S d S )N)Zfields_namer   )import_shop_fields)modelrk   r   r    r    r!   _get_field_name   s    zCmfPluginKaiten._get_field_namec                 C   sB   ddddddddd	d
dd}||kr,|| S | j |i ddS )Nu   ИмяZEmailu(   Не работает/Уволенныйu   Наименованиеu   Описаниеu   Созданоu   Обновленоu   Срокu   Постановщикu   Исполнительu   Тип)	full_nameemail	activatedtitledescriptioncreatedupdateddue_dateowner_idresponsibletyper   rL   )r(   rY   )r2   rg   mappingr    r    r!   _get_setting_title_by_attr   s    z*CmfPluginKaiten._get_setting_title_by_attrc              
   C   sn   ddddddddddd	dd
dddddddddddg}| j  D ]\}}|d||d qN|S )uO    Сопоставление настроек для модели models.CmfTaskr   rr   model_fieldrg   rR   rs   cmf_created_atrt   cmf_modified_atru   Zdeadlinerv   	cmf_ownerrw   rx   members
logic_typery   N)r}   rg   	ext_field)r(   itemsappend)r2   Ztask_settingsZcf_idcfr    r    r!   _get_task_import_settings   s     
z)CmfPluginKaiten._get_task_import_settingsc                 C   s    dddddddddg}|S )uQ    Сопоставление настроек для модели models.CmfPersonr   ro   r|   rp   does_not_workrq   r    )r2   Zuser_settingsr    r    r!   _get_user_import_settings   s
    z)CmfPluginKaiten._get_user_import_settingsc                    sX  | dr4|r4|d }|d kr2|dkr.dS |S |dkrD|d }n|d }|dkrg  |D ]F}|d	 t|}|d
 }	|r |	 q\tj|	ddd}
|
  S q\tjd|} fdd|D }|S |dkr g }|D ]}t	|t
kr|d }n|}zz| |}W n2 tk
r< } zt| dW 5 d }~X Y nX | j|ddd\}}|shtd| d|rz|| n
|W   S W q tk
r } zR|  jd7  _| jjd|d  d| d| d| ddd |sW Y 
 d S W 5 d }~X Y qX q|S |d krtd!d"t|S |d#krT| |S n |d$kr|d krL|S d%| j d%|d  d%}tjjd&d'd(| d(gd)}|S |d*kr|d kr|S | j d%|d+ d  d%|d  }tjjd&d,|gd-gd.}|S |d/kr"|d kr|S |D ]&}|d d0kr| |d   S qd S |d1krD|d kr:|S | |S |d2krT| S |S )3Nrb   ry   checkboxFstring	multilinemulti_selectselectselectValuesr<   rM       seplengthCmfTaskc                    s   g | ]}|d   kr|qS r#   r    ).0choiceZvalue_namesr    r!   
<listcomp>   s      z4CmfPluginKaiten._normalize_value.<locals>.<listcomp>useriduJ   . Возможно пользователь был удален в Kaiten.)createupdateu   Пользователь UID 'u&   ' не найден в системе.r   u1   Не удалось присвоить полю 'r   ' (u   ) значение ''. ERR-0038	CmfPersonobj_typephonez[^\d+]rL   rV   r   ::ext_idLIKE%filterstatusproject=status_typer   fieldsrx      r   r   )re   rY   r;   r   r=   translit_stripmodelsZCmfCustomFieldChoiceZlist_choicery   dict_get_user_data_from_dumpr   _process_personr   r   r   rO   rP   r`   source_hashCmfLogicType	CmfStatus_get_person)r2   rf   r<   rk   r   Zcustom_field_typeis_multiZvalue_idZ
value_data
value_name	value_keychoicesvaluesusers	user_datauser_idZ	user_infoexcperson_logic_type_ext_idr   status_ext_idr   r   r    r   r!   _normalize_value   s    





 





"



z CmfPluginKaiten._normalize_valuec           	      C   s   i }|D ]}|d sq| d}|d d }| ||d }| ||||}|||< |r|dr|r|d dkr|d r|d	g }|| q|S )
uC    Преобразование настроек для модели r}   r   rk   rg   rb   ry   r   r   deferred_text_fields)rY   ri   r   re   
setdefaultr   )	r2   rf   settingsZnormalized_objsettingr   rk   r<   r   r    r    r!   _normalize_objF  s6    

zCmfPluginKaiten._normalize_objc                    s  g  |_ j dg  fdd}d }d }j  d}| r D ]$}|d D ]} qjq`|rN qtqNdD ]} qq~|sdd jj	d	d
D }|r|d }|st
d|sʈj }|st
dd_||jtj ||jtj  dg d  S )Nplugin.plugin.*c                    sj   | }|D ]H} | |d |d< ||d |d< |d |d< |j|d< q
 |j|d d S )Nrg   r<   r}   rr   icon)r   r   )ri   rn   r{   r   r   verbose_name)r   Zsettings_funcrm   Zobj_settingsr   resultr2   r    r!   _get_settingsi  s    z<CmfPluginKaiten.tmplt_import_settings.<locals>._get_settingsprojectsr   r   c                 S   s   g | ]}|qS r    r    )r   r   r    r    r!   r     s     z9CmfPluginKaiten.tmplt_import_settings.<locals>.<listcomp>r   limitr   uT   Не найдено ни одной задачи, импорт невозможен!ub   Не найдено ни одного пользователя, импорт невозможен!TselectedObjects)r   r<   )r   r:   rB   rC   rD   _get_projects_get_project_tasks_simple_getr'   	get_cardsr   Zget_current_userr/   r   r   r   r   r   r   )r2   r   r   taskr   projects_dirr   tasksr    r   r!   tmplt_import_settingsc  s<    	
z%CmfPluginKaiten.tmplt_import_settingsc              
   O   s  |  dg | jj| _g }z| j}| D ]}t|d }|d }|}|d rX|d7 }d| j d| d}	tjjddd	|	 d	gd
ddgd}
|
r|d7 }|
j	}n| 
|}tj|}||||d}|| q,W 5 Q R X W n0 tk
r } zt|  W 5 d }~X Y nX |S )Nzplugin.source_hashr   rr   Zarchivedu    (архивный)r   r   r   r   T--task_code_prefixr   include_deletedr   u    [импортирован])r   keyr   original_name)r:   r5   r   r'   Z
get_spacesr;   r   
CmfProjectsgetr   rS   Zget_prefix_from_namer   r   gdebug)r2   r   r   r   r'   space
project_idZproject_titleproject_nameproject_ext_idr   project_keyZproject_codeproject_datar   r    r    r!   r)     s@    


z CmfPluginKaiten.get_all_projectsc                 C   s   t |}| j| jj d| }|d k	r4t|S | dD ]}t |d|kr\|  S |d|krr|  S |dd | kr|  S |dd | kr|  S |dd | kr>|  S q>t	d	| d S )
N:user:r   r   uidrp   rL   usernamero   uH   В дампе не найдены данные пользователя )
r;   redis_dbrY   r   r   pickleloadsr   rN   r   )r2   r   r   r    r    r!   r     s     

z(CmfPluginKaiten._get_user_data_from_dumpc                 C   sz  t |}z| |W S  tk
rt   z|d}| rt|d}|D ]}t|}t |d |kr|  W  5 Q R  W  Y S |d|kr|  W  5 Q R  W  Y S |dd	 |	 krL|  W  5 Q R  W  Y S qLW 5 Q R X | j
|}|r4t|d}|tj|dd	d
  W 5 Q R X |W  Y S W n8 tk
rn } z| jjd|  W 5 d }~X Y nX Y nX d S )N
users.jsonrr   r   rp   rL   a+Fr@   
uS   Не удалось получить данные пользователя по ID )r;   r   r   rC   rD   rE   rF   r   rY   rN   r'   Zget_userwritedumpsr   loggerwarning)r2   r   Zdump_dir
users_filerJ   rowr   r   r    r    r!   _get_user_data  s2    

&"zCmfPluginKaiten._get_user_datar#   c              	   c   sN   | j  | d}| rJt|d}|D ]}t|V  q.W 5 Q R X d S )N.jsonr>   )r   rB   rC   rD   rE   rF   r   )r2   r   rI   rJ   r   r    r    r!   r     s    zCmfPluginKaiten._simple_getc              
   c   sf   | j  d}| rbt|D ]>}|dr2q"t| d| dd}t	|V  W 5 Q R X q"d S )Nr   .dirtyz.meta/
/info.jsonr>   )
r   rB   rC   rD   oslistdirendswithrE   rF   rG   )r2   project_dirr   rJ   r    r    r!   r     s    
zCmfPluginKaiten._get_projectsr     c           	   
   c   s   | j  d|d}| s:| j jd| d|  d S d}t| D ]r}| sXqJ|j	}|
drjqJ||k r||d7 }qJ||| kr qt|dd	}t|V  W 5 Q R X |d7 }qJd S )
Nr   r   u   Каталог u    отсутствует. Возможно он был удален или еще не создан. Необходимо повторно запустить импорт проекта r   r  r   	info.jsonr>   )r   rB   rC   rD   r   r   r   iterdiris_dirr   r  rE   rF   rG   )	r2   r   startr   	tasks_dircounttask_dirtask_idrJ   r    r    r!   r     s*    
z"CmfPluginKaiten._get_project_tasksc                 C   s   z|  |}W n,   | jjd| dddd tj Y S X | |dd\}}|s| jjjdrt	j
j| jjd d}| jjd| d	| tjd
 n.| jjd| dddd tj}|  jd7  _|S )Nu6   Не найден пользователь user_id = "u9   ", в дампе, указываем системногоzERR-0045ZCmfUserr   FZdefault_user_idr   uA   ", ставим пользователя по умолчанию )levelub   ", указываем системного, в дампе, указываем системногоr   )r   r   r   r   system_userr   json_settingsr<   rY   r   r   r   loggingZWARNINGr   )r2   r   r   r   r   r    r    r!   r     s2    

zCmfPluginKaiten._get_personFc                 C   sj   d}| j  d|d}| rft| D ]8}| s:q,|jdrHq,|r\|d s\q,|d7 }q,|S )Nr   r   r   r  z.processingr   )	r   rB   rC   rD   r   r  r  r   r  )r2   r   Zonly_processingr  r  r  r    r    r!   _count_project_tasks8  s    
z$CmfPluginKaiten._count_project_tasksc                 C   s,  | j d g }t }| j  d}| rt|d}t|dD ]\}}| }|sZqDz*t	
|}|t|d  || W qD tk
r }	 z"| j d| d|	 d|  W 5 d	}	~	X Y qDX qDW 5 Q R X t|d }
| j|
| |
d
D ]}t|d d}| sqt|}t|dD ]\}}| }|sBq(zPt	
|}t|d }||kr| j| j j d| t| || W nB tk
r }	 z"| j d| d|	 d|  W 5 d	}	~	X Y nX q(W 5 Q R X |  qt|d*}|D ]}|t	j|ddd  qW 5 Q R X d	S )us    Собирает пользователей из файла users.json в каталогах документов u9   Сбор пользователей из объектовr   r   r   r   u   Ошибка в строке : . Nr   r  r   r?   Fr@   r   )r   r   setrB   rC   rD   rE   	enumeraterQ   rF   r   addr;   r   r   r   r   r  r   r   r   r   r   unlinkr   )r2   r   Zcurrent_usersZcurrent_user_idsZall_users_filerJ   Zline_numberliner   r   r   r   Ztask_users_filer   r    r    r!   _collect_usersF  s`    
"




$
zCmfPluginKaiten._collect_usersu   Дампc              	   C   s   | j  | d}| r(t| | j  | d}t|d:}| D ],}| j  jd7  _|t	j
|ddd  qPW 5 Q R X t|| | j jjdd	 d S )
Nr   z.json.dirtyr   r   Fr@   r   TZ	only_data)r   rB   rC   rD   r  removerE   json_object_countr   rF   r   shutilmover<   save)r2   Zapi_funcr   rI   Zfile_tmp_pathrJ   r   r    r    r!   _simple_dump~  s    

$zCmfPluginKaiten._simple_dumpc           
      C   s   t |d }|d }|d }||}| j d| d| }tjj|| jdddgd}	|	sntj|| j| jd}	||	_||	_||	_	|	j
s| sd	|	_||	_|	  t  d S )
Nr   r   r6   r   hrefpath)
obj_ext_idr   r   )r)  r   r   F)r;   rC   r   r   CmfImportDownloadrY   r   r   r'  r(  
is_changedrD   
downloadedimport_raw_jsonr%  r   )
r2   r  
attachmentattachments_dirattachment_id	file_nameZdownload_urlattachment_fileattachment_ext_iddownload_jobr    r    r!   _dump_task_attachment  s0    
z%CmfPluginKaiten._dump_task_attachmentc                 C   sJ   t |d }|d}|jdd |dg D ]}| |d || q.d S )Nr  attachmentsTexist_okfilesr   )r   rC   mkdirrY   r5  )r2   r   r  r/  r.  r    r    r!   _dump_task_attachments  s
    
z&CmfPluginKaiten._dump_task_attachmentsu.   Дамп комментариев задачиc              	   C   s   t |d }|d}| r(t| | j|d }t|dN}|D ]B}|drf| 	|d | |
tj|ddd  | jd	 qHW 5 Q R X d S )
Nr  comments.jsonr   r   	author_idFr@   r   comment)r   rC   rD   r  r!  r'   Zget_card_commentsrE   rY   r   r   rF   r   r   inc_stat)r2   r   r  comments_fileZcommentsrJ   r>  r    r    r!   _dump_task_comments  s    


z#CmfPluginKaiten._dump_task_commentsu/   Дамп журнала работ задачиc              	   C   s   t |d }|d}| r(t| | j|d }t|dB}|D ]6}|drf| 	|d | |
tj|ddd  qHW 5 Q R X d S )	Nr  timelogs.jsonr   r   r=  Fr@   r   )r   rC   rD   r  r!  r'   Zget_card_time_logsrE   rY   r   r   rF   r   )r2   r   r  time_logs_fileZ	time_logsrJ   time_logr    r    r!   _dump_task_time_logs  s    


z$CmfPluginKaiten._dump_task_time_logsu)   Дамп чек-листов задачиc              	   C   s   t |d }|d}| r(t| t|dF}|dg D ]2}| j|d |d }|	t
j|ddd  q@W 5 Q R X d S )	Nr  checklists.jsonr   Z
checklistsr   Fr@   r   )r   rC   rD   r  r!  rE   rY   r'   Zget_card_checklistr   rF   r   )r2   r   r  checklists_filerJ   	checklistchecklist_datar    r    r!   _dump_task_checklists  s    

z%CmfPluginKaiten._dump_task_checklistsd   c                 C   s
  t dd d}|d }|d }| j | j}|  j|7  _W 5 Q R X zd| jj|||d}|shW q|D ]<}	t|	d }
|	d }| jjd| d|
 d	 |	|
}|	|
d
 }|
 rt|| |jdd t||	d< | |	 | |	 | |	 |	d r| |	d | |	dg D ]}| |d | q*t|| t||	d< t|	dddd}tj|	|ddd W 5 Q R X |d7 }| jd | |	 qlW q" tk
r } z*| jjd| d| d| dddd W 5 d }~X Y q"X q"W 5 Q R X d S )NFZinit_views_and_dsr   r   rr   )Zspace_idoffsetr   u   Задача 'r   )r  Tr7  r  rw   r   r
  wzutf-8)encodingr   )indentrA   r   r   uB   Не удалось получить задачи проекта '). zERR-0025r   rH   )
error_coder   
error_type)r
   _lock_offsetr'   r   r;   r   r   inforC   rD   r#  r$  r:  rA  rE  rJ  r   rY   rE   rF   rH   r?  r;  r   r   )r2   r   r  r   
task_countr   r   rM  r   r   r  Z	task_namer  Ztask_tmp_dirmemberrJ   r   r    r    r!   _dump_task_worker  s\    





z!CmfPluginKaiten._dump_task_workerc                 C   s   d}t |d d}|jdd d| _t | _g }t| jD ]J}t| j	d|d  ||dd	}|
| |  | jjd
|  q>|D ]}|  q| | |S )Nr   r  r   Tr7  Zdump_tasks_r   )r   r  targetr   r   $   Запущен обработчик )r   rC   r:  rV  r   rU  rangedownload_threading_max_forksr   rZ  r   r  r   r   rW  joinr  )r2   r   errorsr  threadsithreadr    r    r!   _dump_tasks  s*    


zCmfPluginKaiten._dump_tasksc              	   C   sd   | d}| rt| | j|}t|d(}|D ]}|tj	|ddd  q8W 5 Q R X d S )Nr   r   Fr@   r   )
rC   rD   r  r!  r'   Zget_space_usersrE   r   rF   r   )r2   r   r  r   Z
users_datarJ   r   r    r    r!   _dump_project_users0  s    

z#CmfPluginKaiten._dump_project_usersc                 C   sL  | j  d}|jdd t| j}td| }| jD ] }|d }|d }|d }z| j  rlW  d S | j  jd7  _| j j	
d	| d
| d ||}|| d}	| rt||	 n|	jdd | j|}
t|
d |
d< ||
d< t|	|
d< | ||	 |
dr6| |
d | j  |
d< dtjd< | j  j|7  _| j jjdd | j j  dtjd< t|	| t||
d< |
d  d}t|d}tj|
|dd W 5 Q R X d}|| j|
d7 }|  j|7  _W q8 t k
r8 } z2|  jd7  _| j j!d| d| dddd W 5 d }~X Y q8X q8| j "d  d S )!Nr   Tr7  P   r   r   r   r   u   Дамп проекта 'r   rN  r  r  Z
author_uidauthorrL   NO_CACHEr   1r  r?   Fr@   r   )r   u2   Не удалось получить проект r  zERR-0058r   rH   )r   rT  u*   Дамп проектов завершен)#r   rB   rC   r:  lenr.   intr   r"  r   rW  rD   r#  r$  r'   Z	get_spacer;   rf  rY   r   r  environprogressr<   r%  ZdpZcommitrE   rF   rH   re  r   r   r   r   )r2   r   Zcntstepr   r   r   r   r  Zproject_tmp_dirr   Z	data_filerJ   Zdump_task_errorsr   r    r    r!   _dump_projects:  sd    




zCmfPluginKaiten._dump_projectsc                 C   s  t d}| jjj|_|| jjj | j }t	|\}}}|| d }| jj
d| d | jj
d | jj
d | | jjd | jj
d | | jjd	 | jj
d
 | | jjd dtjd< d| j_| jj  t  dtjd< | jj
d |   dS )u^   
        Загружает все данные из API, кроме вложений
        z'modules.kaiten.kaiten_client.connectionrK  u   Свободно места: r   u5   Скачивание данных через API ... u#   Дамп пользователейr   u   Дамп типов задач
task_typesu   Дамп метокtagsrL   ri     rj  u,   Дамп выбранных проектовN)r  Z	getLoggerr   r   ZhandlersZsetLevelr  rB   r#  
disk_usagerW  r&  r'   Z	get_usersZget_card_typesZget_tagsr  rm  rn  r<   r%  r   rp  )r2   r   Zdownload_pathtotalusedfreeZfree_percentr    r    r!   download_data}  s*    



zCmfPluginKaiten.download_datac                 C   s  d}t dd | j r q| }|dkr4qtjj|ddddd	gd
}t|j}t|j}t|j	}t|j
d}	t|	dkrd|	d  dnd}
d| d}|jr|jd }|d }| d|dd}| jj|
 d| d| d zX| jj||tjd | jj|
 d| d| d d|_|  t  | jd W q tk
r } z>t  | jj|
 d| d| d| dd d!|d" |d7 }W 5 d }~X Y qX q|| W 5 Q R X d S )#Nr   FrL  DONEr   r'  r(  r)  r-  r   r   r   r   u   [Задача ID: z] rL   'sizei    (.3fz MB)u   Скачивание z: ')timeoutu	   Файл u    сохранен в 'Tr.  u"   Ошибка скачивания r   zERR-0027r*  rH   )rS  r   rT  Zext_href)r
   r   r   rY   r   r*  r;   r   r'  r(  r)  splitrk  r-  r   rW  r'   Zdownload_fileconfigZIMPORT_DOWNLOAD_TIMEOUTr,  r%  r   r?  r   r   r   put)r2   download_queue
done_queuera  Zdownload_job_idZdownload_objr1  Zfile_urlrI   Zext_id_splitZtask_id_msg	file_sizeZfile_size_mbr   r    r    r!   _download_file_worker  sf    




 
 z%CmfPluginKaiten._download_file_workerc                 C   s  t  }t  }d}dd| jgdddgg}| j d}d}g }| jD ]r}t|d }	||	}
t|
dsxt|
d }
d	d
|
 dgg}tj	j
|| d}|rD||7 }|||  qD|s| jjd |S | jjd|  g }t| jD ]J}t| jd|d  ||dd}|| |  | jjd|  q|D ],}tj	j|dgdD ]}||j qVq@t  |D ]}|d qx| s|D ]}|  q| j r| jjd | s|| 7 }q| jjd|  |S )Nr   r   ==r,  Fr   r   r  r(  r   r   r   u3   Нет вложений для скачиванияu'   Скачивание вложений: Z_download_file_worker_r   )r  r  r[  r]  r   r   ry  u   Импорт прерванuD   Скачивание файлов завершено. Ошибок: )r   r   r   rB   rC   r.   r;   r  r   r*  r  r   r   rW  r^  r_  r   r  r  Zslistr  r   r   emptyr`  r   r   rY   )r2   r  r  r   Zmain_filterZprojects_pathZattachment_countfiltersr   r   Zproject_pathZpath_filterZdownload_countrb  rc  rd  filter_r4  r    r    r!   download_files  sd    





zCmfPluginKaiten.download_filesc                 C   s:   | j d d d }|d s"tddd |d D | _d S )	Nr   r<   r   	isCheckedu8   Не выбраны проекты для импортаc                 S   s$   g | ]}|d  r|d r|d  qS )r   r  r    )r   sr    r    r!   r     s    z:CmfPluginKaiten._set_selected_projects.<locals>.<listcomp>children)r   r   r.   )r2   Zroot_selectedr    r    r!   _set_selected_projects  s    z&CmfPluginKaiten._set_selected_projectsTc              	   C   s  |  || jtjj d }d| j d|d  d}|d dd}d}|D ]}t||krJt|}qJttjj	j
tjjj
tjjj
}	||	krt|dkr|d |d	< d
|d< d
|d< n`t|dkr|d |d	< |d |d< d
|d< n2t|dkr|d |d	< |d |d< |d |d< ddg}
tjjddd| dg|
d}|sdddd| j dgddd gg}tjjdd|d g|g|
d}|stjjdd|d g|g|
d}t|dkrg }|sdd|d g|g}tjj||
d}|sdg}t|t|D ]}t|dkrd	d|d g}nnt|dkrL|dd|d gd	d|d gg n<t|dkr|d	d|d gdd|d gdd|d gg q||g}tjj||
d}|r|d }d}|s:|r2d}d}|d }tjjdd| g|
dr |d d\}}| d| d| }|d7 }qtj||dd }nd |fS |rtd!t|j}d"d# |D }t|dkrz|d |d< |jr|D ]}t||||  q|jr||jkr|j | |_n||_d|_|jr|jdd$ ||fS )%Nr   r   r   r   r   r   r   r   	last_namerL   
first_namesecond_name   r   Zrg_member_ofr   r   r   r   ORzNOT LIKE%::::%r  loginILIKErp   FT@+)r   r  import_originalz[,;\s]+c                 S   s   g | ]}|  r|  qS r    rQ   )r   rp   r    r    r!   r     s      z3CmfPluginKaiten._process_person.<locals>.<listcomp>Zsave_import)r   r   r   r   r   r   r  rk  minr  
max_lengthr  r  rY   listr   r   rN   rO   r;   r  r  setattrr   Z
user_localr+  r%  )r2   r   r   r   Z	user_dictr   ro   Zcurrent_length_namer   Zmax_length_namer   r   Znot_source_hash_filterZpersonsZ_filterZ
name_combo
is_creatednr  Zprefix_emaildomainZemailsr   r    r    r!   r   $  s    




zCmfPluginKaiten._process_personu-   Обработка пользователейc              	   C   s   t  }| dD ]}z^| j r(W  d S | |\}}| j jd7  _|jrp|jsp|jdsp|rp|	|jj
 W q   |  jd7  _| jjd| ddd Y qX qd S )Nr   r   z.evateam.ruu@   Не удалось загрузить пользователя r   r   r   )r  r   r   r   r   imported_object_countrp   r   r  r  r<   r   r   )r2   Znew_user_emailsr   r   r  r    r    r!   _process_users  s.    	

zCmfPluginKaiten._process_users)r   c              	   C   s   |d }|dkr|d }n|d }|dkr8|r2dnd}n|dkrFd}n|dkrTd}n|d	krbd	}n|d
krx|rrdnd}nl|dkrd}n^|dkrd}nP|dkr|rdnd}n:|dkrd}n,t d|d  d|d  d|d  d| |S )Nry   r   r   r   rR   r;   r6   rp   r   r   choice_multi
choice_strnumberfloatrV   r[   r   r   r   u<   Не удалось сопоставить тип поля 'r   r   r   u   ). Тип 'u%   ' не поддерживается: )r   )r2   r   Zext_field_typer   field_custom_typer    r    r!   _map_field_type  s4    
&zCmfPluginKaiten._map_field_typec                    s  d}d}t jj|d}|sLt jd|dddd| jdd}|jdd	 t  d}|| _d | _| jD ]D}| j	t j
j d
 D ],}d|krqt|d d |krt| j| |d< qtq^| jjd dd t j
 D }g }g }| j	t j
j d
 D ]2}|d }	|d}
|
s| jjd|	 d q|d r8| jjd|	 d qz| |
}W nL tk
r } z,|  jd7  _| jj|ddd W Y qW 5 d }~X Y nX |
d }d| d| j  }||d< | j d| }t jj|dddd d!gdd"}|s
t j|	|d |d|| jdd#}|j}|jr:| jjd|j d$|j d% q||kr|| d |jjkr|  jd7  _| jjd&|
d  d$|
d  d'|j d(|| d  d)|
 
d*dd q|| |d< | jjd+|	 d$| d, n| jjd-|	 d$| d, |jr|	|_|
|_|d.kr|jjpi }i  t  }|
d/ ! D ]>}|d0 }t"j#|d1d2d3}| |< |d4 d5kr4|$| q4 fd6d7|D }|%| |%  ||_t&||_'n|d8kr|(| |j)rd|_*|(| |jdd	 |d9kr|rd:|_+|j+|_|jdd; t  q|r d}|rt j
,t-j./ 0d<d=dd> t j
1d?d=i d@d t j
 D }|D ]}||d  |d< qn|D ]}t j
j2|d dA  }t3t |j4 }|d d/ ! D ]N}|d0 }|j|d}|s||d}t5|d4d5k|_6|j)r|  qq| jj7j}|dB D ].}|d t j
jkr&| j	t j
j d
 |d
< q&|| j_7dCt8j9dD< | jj  t  dEt8j9dD< d S )FNFcf_kaiten_card_idr#   z	Kaiten IDu   ID карточки в Kaitenr;   T)captionr   r>  r  Zfield_readonlydirtyr   r  r  r   r   r   u>   Обработка пользовательских полейc                 S   s   i | ]}|d  |qS rj   r    r   rJ   r    r    r!   
<dictcomp>-  s      z:CmfPluginKaiten._process_custom_fields.<locals>.<dictcomp>rr   u
   Поле 'u'   ' не пользовательскоеr}   u!   ' уже сопоставленоr   zERR-0064	CmfUiFormr   rb   r   r   r   widgetr   r  disabled_choicescmf_deleted)r   r   r   )r  r   r  r  r   r   r  r   u   ) удаленоu5   Не удалось сопоставить поле 'u   ). widget поля 'u7   ' не совпадает с существующим 'z': zERR-0065u   Найдено поле 'rN  u   Создание поля 'r  r   r<   rM   r   r   Z	conditionZactivec                    s   h | ]}| kr|qS r    r    )r   r   Zdefault_choicesr    r!   	<setcomp>  s   z9CmfPluginKaiten._process_custom_fields.<locals>.<setcomp>r  rR   Z	CmfMarkupr   z%Y%m%d%H%M%Sr   )Zmeta_versionZ
model_nameforcecmf_model_namec                 S   s   i | ]}|d  |qS rj   r    r  r    r    r!   r    s      rk   import_settingsrL   ri  rj  ):r   CmfCustFieldrY   r   r%  r   kaiten_card_id_fieldr0   r(   r   r   r   r   rW  rl   r   r  r   r   r   r   rN   is_newr  r   r   r  r  r<   r  r-  r   r  r   r=   r   r  r   r  r  r   r+  r  Z
field_typeZcustom_fields_gen_metarZ   r[   ZnowstrftimeZcustom_field_sync_update_modelsr   varsrm   boolZ
cmf_hiddenr  r  rm  )r2   Zgen_field_metark   
cust_fieldZext_field_idfieldshop_fieldsZ
new_fieldsZ
m2m_fieldsZfield_titler   r  r   cust_field_ext_idZis_new_cust_fieldZcurrent_choicesZdefault_disabled_choicesr<   r   r   r  Zfield_classZchoice_modelr   r   r  r    r  r!   _process_custom_fields  sD   



	
2









z&CmfPluginKaiten._process_custom_fieldsc                 C   s   dddddddddd	d
dg}|D ]v}| j jd|d  d | j d| d|d  }tjj|d}|stj|d || j d}|d |_|jdd q&t	  d S )Nr      ОчередьOPENr   r   ry   r      В работеIN_PROGRESSr     ГотовоCLOSEDu#   Обработка статуса 'r   r{  r   r   r   )r   r   r   ry   Tr  )
r   r   rW  r   r   CmfStatusCoderY   r   r%  r   )r2   r   states_datastateZstate_ext_idstatus_coder    r    r!   _process_statuses  s"    



z!CmfPluginKaiten._process_statusesc           	      C   s  dddddddddddddddddddddddddd	ddd	ddd	dd
ddd
ddd
ddd}|  dD ]}| jjd|d  d | j d|d  }tjjddd| dgd}|rq||d }|r>tjjdd|d gdgd}|jr"d| |j |_nd| d|_|j	dd qdd|d 
 g}tjj|dgd}|r|jrd| |j |_nd| d|_|j	dd q| jjd|d  d d}tjjdd|gd gd}tj|d |d!t|jd| d| jd"}|j	dd# qt  d$S )%u#    Маппинг Type в logic_type    Подзадачаztask.sub:default)r   codeZ	UserStoryztask.userstory:defaultz
Task Agileztask.agile:defaultBugztask.bug:defaultEpicztask.epic:default)r  ZSubtaskzSub-tasku   ИсторияZStoryu   Задачаu   ЗаданиеZTasku   Ошибкаu   Багr  u   Эпикu   Вехаr  rq  u*   Обработка типа задачи 'r   r{  r   r   r   r   r  r  r   r  r  r   Tr   r  u   Тип 'u.   ' не найден и будет созданui_colorr   )r   templater  r  r   r   r  N)r   r   r   rW  r   r   r   rY   r   r%  rQ   r;   r  r   )	r2   Z	name2code	task_typer   r   Zlogic_type_dictr  Ztemplate_codeZlogic_type_templater    r    r!   _process_task_types  s~    
z#CmfPluginKaiten._process_task_typesu   Обработка теговc           
      C   s  ddl m} | dD ]}|d }|d }z|dddd	}||d
dd}ddd|gddd| dgddd| dgg}tjj|d}|stj|d}|jdd t  W q t	k
r }	 z.t
  | jjd| d| d|	 ddd W 5 d }	~	X Y qX qd S )Nr   translitrr  r   r   r   r   #rL   ruTZlanguage_codereversedr  r  alias""%r   r#   r  u+   Не удалось создать тег 'r   rR  ERR-0134CmfTag)rS  r   )transliterater  r   r_   r   r  rY   r%  r   r   r   r   r   )
r2   r  Ztag_dataZtag_idZtag_namer   r  Z
tag_filterZtag_objr   r    r    r!   _process_tags9  s0    
zCmfPluginKaiten._process_tagsc           	      C   s   i }t |d }| |}| j||dD ]j}|ds8q(|d }||d |d |d |d p`i d}|d  D ]}||d krtd|d |< qtq(|S )u   
        Собирает все используемые в проекте поля задач и группирует их по типам задач
        для создания экранов для каждого типа
        r   r   rd   ry   r   )r   r   rd   F)r;   r  r   rY   r   keys)	r2   r   task_type_propertiesr   rX  	task_datar  Ztask_type_propertyrh   r    r    r!   _get_task_type_propertiesV  s$    


z)CmfPluginKaiten._get_task_type_propertiesc                    s  dd t j D }|d }|d }|d }|d }| j d| d| }t jj|ddgd	}	| d
| }
|	s| jjd|
 d t j|
d|| jdd}	|		  dddddddddg	}t j
j|	d}|D ]"}|j|krqd|_|j	dd q|	jr||	_|		  n| jjd|	 d dddddddddddddd dd!}| D ]N\}}dd"|gd#d"|d# gd$d"|	gg}t j
j||d% d#gd&}||| d'< qT| jrt jjd(d"| jgd$d"|	ggdd)}|st j| j| jj|	|d d' | jdd*}|j	dd |d+  D ]n\ } d,d- d.  d/| j  }||krLqt fd0d1| jt jj d2 D d }|s|q| j d|d3 d  }t jj|d4d5gd	}t jjd(d"|gd$d"|	ggd6gd7}|r|js| jjd8|	 d9|j d:|jj d; q|sxt jjd(d"|gd$d"|	gd<d"dgdd=d ggdd)}|rb| jjd8|	 d9|j d> qt j|||	| jdd?}|jd@kr|d d' |_n|jdAkr|d d' |_nh|jdBkr
|dC d'st j
dCd|	| jddD}|j	dd ||dC d'< |dC d' |_n|d d' |_||_|jr|jj}|jj}| jjdE|	 dF|j dG| dH|dkrbdIndJ dK| d |j	dd q|	   t!  |	S )LNc                 S   s   i | ]}|d  |qS rj   r    r  r    r    r!   r  t  s      z3CmfPluginKaiten._process_screen.<locals>.<dictcomp>r   r   r   r   r   r   r   r   u(   : Экран задач для типа u   Создание экрана 'r{  r   T)r   r  r   r   r  _main   Участники   Датыu   Планu   Разработкаu
   СвязиZ_addon_customZ_descrparentr  u   Экран u|    был изменен пользователем. Изменения из импорта не будут примененыgroup)ry   systemZtabF)r  r  r  r     Дополнительноеr   ry   r  r  )r   r  r   r   r  r   r   )r  r   r  ui_form_groupr   r  rd   rc   rL   rb   r   c                 3   s0   | ](}| d r|d  d t kr|V  qdS )r   r   N)rY   rl  )r   r  rh   r    r!   	<genexpr>  s   
 z2CmfPluginKaiten._process_screen.<locals>.<genexpr>r   r   r  r  zui_form_group.typer   u   На экране u    поле 'um   ' было изменено или уже добавлено пользователем во вкладку 'uL   '. Изменения из импорта не будут примененыr  !=u   ' было удалено пользователем. Изменения из импорта не будут применены)r  r   r  r   r  )r   r   )rV   r[   rR   r  )r   ry   r  r   r  u   На экран u    добавлено поле 'r   z) u   во вкладкуu   в группуz ')"r   r   rl   r   r  rY   r   r   rW  r%  ZCmfUiFormGroupr  r   r  r  r-  r   r   r  ZCmfUiFormFieldr_   rN   nextr   r   r  r  r  r  Zrequired_changer+  ry   Zinvalidate_cacher   )r2   task_type_datar   r  r   r   task_type_idtask_type_nameZscreen_ext_idui_formZscreen_nameZdefault_groupsZui_form_groupsr  Z
group_nameZ
group_datar  Zui_form_fieldrequiredrk   r  r  r  Z
group_typer    r  r!   _process_screens  s<   






			2zCmfPluginKaiten._process_screenu,   Обработка схемы экрановc                 C   s  |d }| j  d| }tjj|dgd}|s`tj|d  d|d  || jdd	}|jdd
 |jr|jstjj	|dD ]}|j
dd q|| |}| D ]\}}|d }	d| j  d| d}
tjjddd|
 dgd}|s
| jjd|	 d| dddd qz| ||}W nJ tk
rd } z*| jjd|	 d| ddd W Y qW 5 d }~X Y nX ||dd| jd}tjjf |ddgi}|stjf |}|j| |jdd
 qn| jj| d  |S )!Nr   r   r   r  r   u+   : Схема экранов проекта rr   Tr   r   r   r  r  )ui_form_schemeTEXKOM_db_deleter   r   r   r   r   u<   Не удалось найти логический тип 'r   rN  zERR-0067CmfUiFormSchemer   uJ   Не удалось импортировать экран для типа r  zERR-0068r   default)r  r\  r  Zcrud_choicer   r   logic_typesue    была изменена. Изменения из импорта не будут применены)r   r   r  rY   r   r%  r  r  ZCmfUiFormSchemeRuler  deleter  r   r   r   r  r   r  r   r   r   )r2   r   r   Zui_form_scheme_ext_idr  ruler  r  r  r  r   r   r  r   	rule_dictr    r    r!   _process_screen_schemeB  sp    
z&CmfPluginKaiten._process_screen_schemec           	      C   s   | j  d|d  d|d  }tjj|d}|j d|d  }tjjdd|gd}|s~tjjdd|gdd|gddd ggd}|sd	d|d	 g}tjj|dd|gddd ggd}|stj||| jd
}|d	 |_||_d|_	||_|j
dd |S )Nr   r   r  r   r  r   r  workflowr   )r  r  r   Tr  )r   r   r  rY   r   r   r   r   r  Zallow_empty_transitionr%  )	r2   Zstatus_datar  r   r   r  r   r   Zfilter_namer    r    r!   _create_status  s:    
zCmfPluginKaiten._create_statusc              
   C   s  | j  d|d  }tjj|dgd}|sbtjjdd}tj|d  d||| jd	}|jd
d z>ddddddddddddg}|D ]}| ||| qW n: tk
r   | jj	d|d  d|d  d Y d S X tj
jdd|gddd ggdgd}|D ]B}tj
jdd|jgdd|gddd ggd s4q|jd
d
d! q| j  d"|d  }	tjj|	d#}
|
stjjd$d}tj|d  d%||	| jd	}
||
_||
_||
_|
jd
d tjj|
d&D ]}|jd
d' qd(||
| jd)}tjf |}|jd
d |
S )*Nr   r   r   r  zdefault.system:defaultr  r   u3   : Simple бизнес-процесс проекта)r   r  r   r   Tr  r   r  r  r  r   r  r  r  r  r  u   Проект Z	shortNamer  r   u-    не имеет статусов задач.r  r  r   r   r  r   )r  r  z
::SIMPLE::r  zsoftdev:defaultu@   : Simple-схема бизнес-процесса проекта)	scheme_wfr  r   )r  Ztarget_workflowr  r   )r   r   ZCmfWorkflowrY   r   r%  r  r   r   r   r   r  r   r	  ZCmfSchemeWfZdefault_epic_workflowZdefault_task_workflowZdefault_subtask_workflowZCmfSchemeWfRule)r2   r   Zworkflow_ext_idr  Zworkflow_templater  r  Zworkflow_statusesr   Zscheme_ext_idschemeZscheme_templater
  r  r    r    r!   _create_scheme_wf_for_project  s|    



z-CmfPluginKaiten._create_scheme_wf_for_projectu0   Обработка вложений задачиc                 C   s  t |d d}|dg D ]b}|d r.qzt|d }| j d| }||}| sdW q|d }tjj|d}	|	stj||| jd	d
}	|	j	r"||	_
|d|	_|dr| |d |	_ntj|	_||	_|	jd	d t|d0}
|	j|
 d	d d	|	_	|	jd	d t  W 5 Q R X | jdd W q tk
r } z.t  | jjd| d| d| d|d W 5 d }~X Y qX qd S Nr  r6  r9  Z
comment_idr   r   r   r  Tr  r   r   r  rt   r=  r  rb)Zsmart_backupr.  	processedu;   Не удалось обработать вложение 'r   rR  zERR-0029r   )r   rC   rY   r;   r   rD   r   CmfAttachmentr   r  r   r~   r   
cmf_authorr   anonymous_userr-  r%  rE   upload_filereadr   r?  r   r   r   )r2   task_objr  r/  attachment_datar0  r3  r2  attachment_namer.  rJ   r   r    r    r!   _process_task_attachments  sP    

z)CmfPluginKaiten._process_task_attachmentsu8   Обработка наблюдателей задачиc                 C   s^   g }| dg D ]B}| |d }|s(q||jks||jks||jkrHq|| q||_d S )Nr   r   )rY   r   rx   r  r   r   
spectators)r2   r  r  r!  Zwatcherr   r    r    r!   _process_task_watchers'  s    z&CmfPluginKaiten._process_task_watchersu*   Обработка тегов задачиc           
      C   s   ddl m} g }|dg D ]}|d dddd}||d	d
d}z^dddd| dgdd|gddd| dgg}tjj|d}|std| d|| W q tk
r }	 z| jj	|	d|d W 5 d }	~	X Y qX q||_
d S )Nr   r  rr  r   r   r   r  rL   r  Tr  r  r  r  r  r  r   u   Тег 'u   ' не найденr  rS  r   )r  r  rY   r_   r   r  r   r   r   r   rr  )
r2   r  r  r  rr  Zlabelr  r  tagr   r    r    r!   _process_task_tags4  s,    z"CmfPluginKaiten._process_task_tagsu9   Обработка журнала работ задачиc           	      C   s
  t |d d}t|d}|D ]}t|}| j d|d  ||ddd|d	 |d
 d|| jd	}|dr| |d|d< |d |d< |dr| |d|d< t	j
j|d d}|s"t	j
f |}|jjtj|jjd |_|jdd q"W 5 Q R X d S )Nr  rB  r>   r   r   r>  rL   closedZfor_date
time_spentr   )	r   r  rR   r   
start_dater'  Zremaining_estimater-  r   r=  r  r   Z
updater_idZcmf_modified_byr   r  rX   Tr  )r   rC   rE   rF   r   r   rY   r   r   r   ZCmfTimeTrackerHistoryr(  r<   rZ   r^   r'  Zend_dater%  )	r2   r  r  rC  rJ   r   rD  Ztimetracker_historyhistoryr    r    r!   _process_task_worklogO  s0    



z%CmfPluginKaiten._process_task_worklogu:   Обработка вложений комментарияc                 C   s  t |d d}g }|dg D ]|}|d |d kr:q"zt|d }| j d| }||}	|	 spW q"|d }
tjj|d}|stj||| jd	d
}|j	r.|
|_
|d|_|dr| |d |_ntj|_||_|jd	d t|	d0}|j| d	d d	|_	|jd	d t  W 5 Q R X |t|  | jdd W q" tk
r } z.t  | jjd|
 d| d| d|d W 5 d }~X Y q"X q"|S r  )r   rC   rY   r;   r   rD   r   r  r   r  r   r~   r   r  r   r  r-  r%  rE   r  r  r   r   Zcreate_preview_tagr?  r   r   r   )r2   Zcomment_objcomment_datar  r/  r6  r  r0  r3  r2  r  r.  rJ   r   r    r    r!   _process_comment_attachmentsn  sV    

z,CmfPluginKaiten._process_comment_attachmentsu8   Обработка комментариев задачиc              	   C   sJ  t |d d}t|d"}|D ]}t|}| j d|d  }tjj|d}|sptj||| j	dd}n|
d	g |jsq$|d
r| |d
 |_|j|_|d |_|d |_||_||_|jdd | |||}	| |dd||}
|	r|
d d|	 |_n|
|_|jr,|jdd | j	dd q$W 5 Q R X d S )Nr  r<  r>   r   r   r  Tr  z**r=  ru   rt   r  rR   rL   z<p></p>r>  r  )r   rC   rE   rF   r   r   r   
CmfCommentrY   r   r:   r  r   r  r   r   r~   r  r-  r%  r,  _convert_textr`  rR   r+  r?  )r2   r  r  r@  rJ   r   r+  Zcomment_ext_idr>  r6  rR   r    r    r!   _process_task_comments  s@    




z&CmfPluginKaiten._process_task_commentsu3   Обработка чек-листов задачиc                 C   s  t |d d}t|d}|D ]}t|}| j d|d  }tjjdd|gdd	d gd
d|ggddgd}|r|j	r|j
r W 5 Q R  d S |stj||| jdd}|jdd tjjdd|gddddgdddgggdd}	|	r W 5 Q R  d S tjj|dD ]}
|
jdd qd}d}t|d dd d}|D ]T}|d7 }|d rX|d7 }tj|||d |d stdndd|d }
|
jdd q:|d! |_||_||_||_|jdd q$W 5 Q R X d S )"Nr  rF  r>   r   r   r  r   r   r  r   Tr  r   r  r  r  r  Fr  r  r  r   r   c                 S   s   | d S )NZ
sort_orderr    )xr    r    r!   <lambda>      z:CmfPluginKaiten._process_task_checklists.<locals>.<lambda>)r   r   checkedrR   r  ry  )Z
cache_taskr  r   r   r  r-  r   )r   rC   rE   rF   r   r   r   ZCmfChecklistrY   r  r  r   r%  ZCmfChecklistItemr   r  r	  sortedr   Zchecklist_items_countZchecklist_items_done_countr-  )r2   r  r  rG  rJ   r   rI  r   rH  Zmodified_itemitemZitems_countZitems_done_countZ
items_dataZ	item_datar    r    r!   _process_task_checklists  sr    

	

z(CmfPluginKaiten._process_task_checklistsuI   Обработка ссылок на веб-страницы задачиc           
      C   s   | j jd}td| d}|dg D ]}|d }||}|rHq,| j d|d  }tj	j|d}	|	stj	||| j
d	d
}	|	jr,|d |	_|d |	_||	_|	jd	d q,d S )Nr  ^/(\d*)$external_linksr6   r   r   r  Tr  r  )r'   r6   rstriprO   compilerY   matchr   r   ZCmfLinkr   r  r   r-  r%  )
r2   r  r  app_urlpatternexternal_linkr6   r<  Zexternal_link_ext_idlinkr    r    r!   _process_task_remotelinks	  s*    


z)CmfPluginKaiten._process_task_remotelinksuB   Обработка упоминаний пользователейc                 C   s   |j dkrd}nd}|jdddidD ]}zb|drF| |d }ntd	t|jt|jt|j	t|j
t|jd
d}||j W q& tk
r } z0|  jd7  _| jjd| d| d|d W 5 d}~X Y q&X q&dS )uA   
        Упоминания пользователей
        r-  a  
                <a
                    class="external"
                    href="{person_href}"
                    rel="noopener"
                    target="_blank"
                    data-macros="mentions"
                    data-mention-type="person"
                    data-object-id="{person_id}"
                    data-title="{person_login}"
                    cmf_converted="true"
                >
                    @{person_name}
                </a>
            u	  
                <span class="macros-panel mentions-macros" contenteditable="false" data-id>
                    <span class="extension-container" data-layout="default" data-id>
                        <span class="extension-title" data-id>
                            @Упоминания <span class="excerpt-title" data-id>| {person_login}</span>
                        </span>
                        <span class="macros-actions" data-id>
                            <span class="macros-delete" data-id>
                                <svg viewbox="0 0 18 18" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                                    <path fill="#222" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                    <path fill="#222" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                    <path fill="#222" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                </svg>
                            </span>
                        </span>
                    </span>
                    <span class="ak-renderer-wrapper" data-id>
                        <a class="external" data-macros="mentions" data-mention-type="person" data-object-id="{person_id}" data-title="{person_login}" rel="noopener" data-id cmf_converted="true">
                            <span class="lds-ring" data-id>
                                <span data-id></span>
                                <span data-id></span>
                                <span data-id></span>
                                <span data-id></span>
                            </span>
                        </a>
                    </span>
                </span>
            spanclasszuser-mentionattrszdata-user-nameuY   Не найден аттрибут для определения пользователя)Z	person_idZperson_loginZperson_hrefZperson_namehtml.parserr   uR   Ошибка конвертации упоминания пользователя r  zERR-0036r  N)
class_namefind_allrY   r   r   r   formatr;   r   r  r'  r   replace_with
currentTagr   r   r   )r2   	text_soupr   TMPLr$  r   new_tager    r    r!   _convert_mentions!	  s2    

	z!CmfPluginKaiten._convert_mentionsc              	      s  t j| jj}|dd D ]}|jdr2q|drN|jd 	drNq| j
jd|  |drx|jd }n
|jd }t j|}|j}|r|dkrqtj|  r d	krq|d
g }t fdd|D d }	|	rt|	d }
| j d|
 }nd }dg}|r&tjj||d}ntjjddd  dg|d}|r*|dr|jd |jd< |j|jd< d|jd< t|jd }|r|d r|d 	drd|_d|jd< d|jd< d|jd< |dr|jd |jd< |j|jd< d|jd< | j
jd| d t j|j d! q|jrB|j|jkrBqtd"|j}|r|d#}| j d| }tjj|d$}|r|jd |jd< |j|jd< d|jd< | j
jd%|j  | j
jd| d |j d! q||d&< qd S )'Nc                 S   s   |  dp|  dS )Nr'  src)has_attr)r$  r    r    r!   r1  p	  r2  z0CmfPluginKaiten._convert_links.<locals>.<lambda>Zcmf_convertedr'  r  u%   Конвертация ссылки: rQ  r  ).z..r9  c                 3   s   | ]} |d  kr|V  qdS )r6   Nr    )r   Zattr1  r    r!   r  	  s      z1CmfPluginKaiten._convert_links.<locals>.<genexpr>r   r   r6   r  r-  r   z%"url":"http%/r  r   Zsrc_origTr   ZvideoZcontrolsz100%widthZheightZ	href_origu   URL заменен: 'u   ' на 'r{  z	/(\d+)/?$r   r  u   Заменили на zdata-issue-id) urllibparseurlparser'   r6   rH  rE  rY   rR  re   r   r   rW  r(  r  basenamer  r;   r   r   r  r   	mimetypesZ
guess_typer   unquote_plushostnamerO   searchr  r   r'  )r2   rL  r  Z
kaiten_urlr$  r6   Z
parsed_urlZurl_pathr6  r  r0  r3  Zattachment_fieldsZ
attach_objZ	mime_typeZ
path_matchr  task_ext_idr   r    rT  r!   _convert_linksm	  s    


 





 zCmfPluginKaiten._convert_linksc                 C   s>   | dD ].}|d}|r
|dr
|d |d< |d= q
dS )uF   
        Конвертирует "Фрагмент кода"
        prer  rC  N)rH  findrR  )r2   rL  r`  r  r    r    r!   _convert_code_block	  s
    
z#CmfPluginKaiten._convert_code_blockc           
      C   s   d}|j dddidD ]}zP|jdddid}|jdd}tj|}t|jd	||d
d}||j	 W q t
k
r }	 z"| jjd| d|	 d|d W 5 d }	~	X Y qX qd S )Nu  
        <div class="macros-panel plantuml" contenteditable="false" data-macros-parameters="{params}"
            style="display: inline-flex; flex-direction: column; position: relative; width: 100%;"
            data-rendered="true" data-macros="plantuml">
            <div data-layout="default" class="extension-container" contenteditable="false">
                <span role="img" aria-label="Макрос PlantUML">
                    <svg xmlns="http://www.w3.org/2000/svg" id="Layer_1" data-name="Layer 1" viewBox="0 0 24 24" width="16" height="16">
                        <path d="M22,15h2v7h-7v-2h5v-5Zm2-10v6.731l-2-1.976v-.755H7v11h4.738c.033,.036,.057,.078,.092,.113l1.887,1.887H0V5c0-1.654,1.346-3,3-3H21c1.654,0,3,1.346,3,3ZM2,5v2h3v-3H3c-.551,0-1,.448-1,1Zm3,4H2v11h3V9Zm17-2v-2c0-.552-.448-1-1-1H7v3h15Zm-9.715,9.292c-.38,.391-.38,1.025,0,1.416l2.715,2.792v-2.5h2c1.654,0,3-1.346,3-3v-2.023h2.455l-2.756-2.711c-.386-.386-1.012-.386-1.398,0l-2.756,2.711h2.455v2.023c0,.552-.448,1-1,1h-2v-2.5l-2.715,2.792Z"></path>
                    </svg>
                </span>
                <span class="extension-title">
                    <span class="excerpt-title">PlantUML</span>
                </span>
                <span class="macros-actions">
                    <span class="macros-refresh">
                        <svg viewBox="0 0 24 24" style="width: 14px; height: 14px; color: rgb(32, 32, 32);"><path fill="#202020" d="M12,2a10.032,10.032,0,0,1,7.122,3H16a1,1,0,0,0-1,1h0a1,1,0,0,0,1,1h4.143A1.858,1.858,0,0,0,22,5.143V1a1,1,0,0,0-1-1h0a1,1,0,0,0-1,1V3.078A11.981,11.981,0,0,0,.05,10.9a1.007,1.007,0,0,0,1,1.1h0a.982.982,0,0,0,.989-.878A10.014,10.014,0,0,1,12,2Z"></path><path fill="#202020" d="M22.951,12a.982.982,0,0,0-.989.878A9.986,9.986,0,0,1,4.878,19H8a1,1,0,0,0,1-1H9a1,1,0,0,0-1-1H3.857A1.856,1.856,0,0,0,2,18.857V23a1,1,0,0,0,1,1H3a1,1,0,0,0,1-1V20.922A11.981,11.981,0,0,0,23.95,13.1a1.007,1.007,0,0,0-1-1.1Z"></path></svg>
                    </span>
                    <span class="macros-edit" style="margin-right: 7px;">
                        <svg _ngcontent-aiw-c17="" viewbox="0 0 24 24" class="ng-star-inserted" style="width: 14px; height: 14px; color: #444444;">
                            <path _ngcontent-aiw-c17="" fill="#444" d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                        </svg>
                    </span>
                    <span class="macros-delete">
                        <svg viewbox="0 0 18 18" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                            <path fill="#222" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            <path fill="#222" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            <path fill="#222" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                        </svg>
                    </span>
                </span>
            </div>
            <div data-fabric-macro="null" data-macro-body="" class="ak-renderer-wrapper" contenteditable="true">
                <textarea class="puml-code">{uml}</textarea>
            </div>
            <div class="macros-preview" contenteditable="true">
                {svg}
            </div>
        </div>
        ZdivrC  zplantuml-diagramrD  zplantuml-codeTr  z{})paramsZumlsvgrF  u.   Не удалось получить svg из r  zERR-0002r#  )rH  ra  Zget_textr   ZCmfDocumentZconvert_uml2svgr   rI  rJ  rK  r   r   r   )
r2   rL  r   rM  r$  Zuml_code_tagZuml_coderd  rN  r   r    r    r!   _convert_plantuml	  s"    (z!CmfPluginKaiten._convert_plantumlc                 C   sl   |s|S t j || jd}t|d}| || | || | || | | ddd |jj	D }|S )Nr   ZlxmlrL   c                 S   s   g | ]}t |qS r    r;   )r   cr    r    r!   r   
  s     z1CmfPluginKaiten._convert_text.<locals>.<listcomp>)
markdownr1   r   rP  re  r_  rb  r`  Zbodyr  )r2   rR   r   rT   Z	html_textrL  r    r    r!   r.  
  s    

zCmfPluginKaiten._convert_textu   Обработка задачиc              
   C   s  d}t |d }| j d| }| || jtjj d }| j d|d d d  d|d  }tjjdd	|gd
gd}|r|j	nd }	|
| jd|||||	d |d |d< |dg }
tjjj}t|d |kr|d d | |d< | jd| d|  tjj|dd |D d}|s8tj|d | jd|d}|jrZ| D ]\}}t||| qH|jrt|jdd | || | || | || | || | || | || | |jjpd||}t|d |krd|d  d| }||_|
D ],}t ||j}| |||}t||| q||_!|jrL|jdd | "|| n| jj#$d| d t%  | j&dd  |S )!Nr   r   r   r   Z	path_datar   r  r   r   r   r   T)activityZapprovedr  r   r  r   cache_status_typer   r  r   r   u   Создание задачи r  c                 S   s   g | ]}|qS r    r    )r   rk   r    r    r!   r   A
  s     z1CmfPluginKaiten._process_task.<locals>.<listcomp>r  )r   r   r  r   r  rL   rr   z<p><strong>z</strong></p><p></p>u   Задача u    была изменена пользователем.Изменения из импорта не будут примененыr   r  )'r;   r   r   r   r   r   r   r   rY   r   r   Zdefault_activitypopr   r  rk  r   r   r  r   r  r+  r%  r   r"  r%  r6  r*  rA  r.  rR   r<   getattrr-  r/  r   r   r   r?  )r2   r  project_objra  r  r^  Znormalized_taskr   r   rj  r   Zmax_task_name_lengthr  rk   r<   rR   Z
text_fieldZfield_valueZconverted_textr    r    r!   _process_task
  s    &	

zCmfPluginKaiten._process_taskc              	   C   sX   d}t dd6 | j rq@| }|dkr.q@|| ||7 }qW 5 Q R X || d S )Nr   FrL  ry  )r
   r   r   rY   rn  r  )r2   
task_queuetask_queue_errorsr   ra  r   r    r    r!   _process_task_threadz
  s    
z$CmfPluginKaiten._process_task_threadc              
   C   s"  ddl m} d}t  t  tjj| _t	j
j|ddgd| _| jjjj| _| | jjd | _| j d| }t	jjdd	d
| dgdgd}|std| | jjd| j  t }	t }
g }t }t| jD ]H}t| jd| |	|
|dd}|| |  | jjd|  qd}| |||D ]*}| j  rV ql|	!| |d7 }q@|D ]}|	!d qp| jjd |D ]}|"  qt | }| jjd d|| dd d}|
# s||
 7 }q| jjd|  ||7 }W 5 Q R X W 5 Q R X |S )Nr   r	   r   r   rz  r  r   r   r   r  r  r-  r   u)   Не найден проект с ext_id uD   Обработка задач в несколько потоков: Z_process_task_thread_)ro  rp  r   r[  u=   Запущен параллельный обработчик r   ry  u3   Ожидание обработки задач ... z-----u&    скорость обработки: r~  u    задач в секундуu@   Обработка задач завершена, ошибок: )$cmf.appr
   r=   Zdisable_aclZdisable_notifyAPPREDIS_DBredisr   r   Z	CmfImportrY   r   r5   r   _normalize_settingsr  r   r   ZCmfErrorr   rW  Zthreading_max_forksr   rW   perf_counterr^  r   rq  r   r  r   r   r  r`  r  )r2   Zcmf_import_idr   skipr   r
   ra  r   r   ro  rp  Ztask_threadst1rc  rd  rX  r   t2r   r    r    r!   process_task_fork
  sp    
	


z!CmfPluginKaiten.process_task_forkc                 C   s   dd l }|jdddd| jjj d| jj d|d  d	| d
| dgddtddtddd}| jd|j d| d| d | j  |S )Nr   z/usr/bin/python3z	manage.pyshellz(plugin = models.CmfPluginKaiten.get(id='z'');retcode = plugin.process_task_fork('z', 'r   z', z, z);Tz"/var/log/eva-import-subprocess.logr   z&/var/log/eva-import-subprocess.err.log)Z	close_fdsZstart_new_sessionstdoutstderru"   Запущен процесс PID z (start=z, limit=rN  )	
subprocessPopenr   r5   r   rE   r   pidZ
log_detail)r2   r   r  r   r  procr    r    r!   _execute_task
  s      0"
zCmfPluginKaiten._execute_taskc                    sz  d|d  d|d  d}|  t|d }|sH| jj| d d S |  }| jj| d| d|   fd	d
 d} ||}g }t|D ]0}| |||}	||7 }||	 ||kr qq||k r2t	
d t|D ]L}	|	 }
|
d k	r|  j|
7  _||	 | |||}||7 }|| qqt|D ]&}	|	  |	jr:|  j|	j7  _q:| jj| d d S )Nu   Проект 'rr   r   r   rN  uO   . Нет новых/обновленных задач для обработкиuJ   . Обработка задач в несколько процессов: r  c                    s.   t | | }|tjkr& | |d S |S d S )Nr   )mathZceilr  ZIMPORT_OBJ_CNT)rX  max_processesZ
chunk_sizecalc_obj_limitr    r!   r  
  s    
z6CmfPluginKaiten._process_tasks.<locals>.calc_obj_limitr   r   u2   . Закончили обработку задач)r  r;   r   r   rW  r  r^  r  r   rW   sleepr  Zpollr   r!  Zcommunicate
returncode)r2   r   Zproject_msgZtask_cntr  r  r   Z	processesr   r  r  Znew_procr    r  r!   _process_tasks
  sD    




zCmfPluginKaiten._process_tasksc                 C   s   | j jd|d   tjjdd|d gddgd}|r|jj|d ks^|jr|d |jkr|d  d|d  d	|d< | j j	d
|j
 d|d   n|js|d |_|  d|d< d|d< d|d< d|d< | ||d< tjjddd|d  dg| d}|s*tj|d |d | j dd}|j}|jr|D ]$}|dkrNq<t||||  q<|ddsvd|_|  n| j j	d| d |rtjj|dD ]}|jdd qt  | |}||_|jrd|_d|_d|_d|_d|_|jdd t  | | t  |S )Nu"   Обработка проекта rr   r   r  r   r   r   r}  rN  u   Проект с именем u8    уже существует! Переименуем в TZtask_allow_multiple_sprintsFZsl_only_owner_approveZsl_deny_no_approveZsl_task_only_owner_closer  r   r   r  Z	is_publicZprivateu"   Настройки проекта u    были изменены пользователем. Изменения из импорта не будут примененыr  r  r  )r   r   rW  r   r   rY   r   r   r   r   r   r%  r  r  r  r  r  Zperm_policyr   r  r	  r   r  r  Z
show_listsZ	show_blogZ
show_pfeedZ	show_diskZ	show_chatr  )r2   project_structr   rm  r  r   r   r  r    r    r!   _process_project  s    





z CmfPluginKaiten._process_projectu#   Обработка проектовc           
   
   C   s@  t jjddjj}t jjdd}dd | jD }|  D ] }t|d }|d }z| j	
 rfW  d S ||krrW q8d| j d| d}| | |d	r| |d	 d }ntj}||d
< d||jj||d |||d}	| |	| t  W q8 tk
r8   t  |  jd7  _| j	jd| d| dddd Y q8X q8d S )NZsoftdevr  zproject.agile:defaultc                 S   s   g | ]}t |d  qS r  rf  r   pr    r    r!   r     s     z5CmfPluginKaiten._process_projects.<locals>.<listcomp>r   rr   r   rh  r   r   r   )Zproject_typer   r   ri  r   r   r   r-  r   u=   Не удалось импортировать проект 'r   rN  zERR-0104r   r   )r   ZCmfActivityrY   r   r<   r   r.   r   r;   r   r   r   r  r   r   r  r  r   r   r   r   r   )
r2   ri  r   Zselected_projects_idsr   r   r   r   r   r  r    r    r!   _process_projects~  sH    



z!CmfPluginKaiten._process_projectsc                 C   s  | j jd}td| d}|  D ]}t|d }| j|| |dD ]p}| j	
 rf  d S t|d }| j d| }t|dg D ]\}}	|dkr| j d|	d  }
| j|
g }|| || j|
< qt|	d }| d	| }d
||d| j d| |dd| j|< q|dg D ]}|d }||}|sLq,|d}| d| }|| jkrtq,| d| }|| jkrq,d||d| j d| |dd| j|< q,qNq(| j	dt| j  tjjd
d}| jD ]}
tjj|
d}|s | j	jd|
  q| j|
 D ]H}tjj|dgd}|s^| j	jd|  q*||_|jdd q*qt  | j	dt| j   | j D ]^\}}z|d }tjj|d}tjj|d d d}|s| j	jd|d d  d|d d  d  W qtjj|d! d d}|sb| j	jd"|d! d  d|d! d  d  W qtjj|d}|stj|d}||_ ||_!||_"|jdd W n^   | j	jd#|d  d$|d d  d|d d  d%|d! d  d|d! d  d& Y nX qt  d S )'Nr  r7  r8  r   r   r   parentsr   z::additional_parent::zsystem.additional_parent)r   r   )r  outwardIssueinwardIssuer9  r6   r   :zsystem.linku   Подзадачи: r  r  uq   Не удалось связать задачи, возможно задача не попала в импорт parent_taskr  Tr  u   Связи задач: r  r  r   u=   Не удалось найти входящую задачу r}  u   ). Возможно задача не попала в импорт или находится в проекте, который еще не импортирован.r  u?   Не удалось найти исходящую задачу u.   Не удалось создать связь z. in_link: z), out_link: rN  )#r'   r6   r:  rO   r;  r   r;   r   r  r   r   r   r  rY   r-   r   r,   r<  r  r   rk  r   ZCmfRelationTyper   r   r   r  r%  r   r  r   ZCmfRelationOptionin_linkout_linkrelation_type)r2   r=  r>  r   r   r  r  r^  rc  r  Zparent_ext_idZ	sub_tasksZ	parent_idZrelation_ext_idr?  r6   r<  Zboth_issue_idr  r  Zchild_ext_idZ
child_taskZtask_relationZrelation_coder  r  Zrelation_optionr    r    r!   _process_relations  s    





  Fz"CmfPluginKaiten._process_relationsc                 C   s  d| _ tjj| _|| _d| j_d| j_d| j_| jj	
  t  | jj| _| jjjj| _| | jjd | _|   |   |   | j  |   |   |   |   |   |   | jjj	ddr|  j | j 7  _ n| jj !d d| j_| jj	
  t  | j"d d	d
 | j#D }| $ D ]<}|d }||krLq2| jj %d|d  d| d q2| j"d| jj  | j  S )Nr   u   Импорт из Kaitenr  Zprocess_linksTu2   Отключена обработка ссылокrK  z2--------------------------------------------------c                 S   s   g | ]}|d  qS r  r    r  r    r    r!   r   R  s     z2CmfPluginKaiten.process_import.<locals>.<listcomp>r   u'   Импортирован проект 'rr   r   rN  u-   Импортировано объектов: )&r   rs  rt  ru  r   r   r   r  rn  r<   r%  r   Zget_max_processesr  r5   r   rv  r  r   r  rx  r  r'   closer  r  r  r  r  r  rY   Zprocess_cross_linksr   r   r   r.   r   rW  )r2   r   Zselected_project_idsr   r   r    r    r!   process_import-  sH    



$zCmfPluginKaiten.process_import)N)r   r	  )F)rK  )TT)U__name__
__module____qualname__r9   r   r&   Zui_meta_skipZapi_methodsr+   propertyr'   r(   staticmethodrS   r   r;   r`   ra   ri   rn   r{   r   r   r   r   r   r)   r   r   r   r   r   r   r  r  r%   r&  r5  r;  rA  rE  rJ  rZ  re  rf  rp  rx  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r   r"  r%  r*  r,  r/  r6  rA  rP  r_  rb  re  r.  rn  rq  r{  r  r  r  r  r  r  __classcell__r    r    r3   r!   r&   /   s   


	

 
o6)


8



;
C!>>

 
$6 GP
 P
C%O
,



/
$
D

KS
:
bK6_
0~r&   )"r[   rZ   r  r   rO   r#  rW   rh  rV  rZ  	itertoolsr   Zbs4r   pathlibr   Zqueuer   	threadingr   r   Ztext_unidecoder   rr  r
   Zcmf.includeZmodules.kaiten.fieldsr   Zmodules.kaiten.kaiten_clientr   Zmodules.kaiten.markdownr   r%   r&   r    r    r    r!   <module>   s*   