
    	iQ                    P   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
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 d dl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"  ej#                    Z$ddZ%ed             Z& G d de j'                  Z'dS )    N)contextmanager)deepcopy)permutations)BeautifulSoup)Path)Queue)	unidecodecmf_context)*)cmf_plugin_kaiten)KaitenClientc                       fd}|S )Nc                       fd}|S )Nc                 z   	 $| j                             d d dd d           | j                                         rdS  | g|R i |}t                       |S # t          $ rP}t                       | xj        dz  c_        | j                             drdz   nd d	|            Y d }~dS d }~ww xY w)
Nz===== T	anonymousr         Ошибка . )
cmf_importlog	is_cancel
cmf_commit	Exceptioncmf_rollback
has_errors	log_error)objargskwargsresexcfuncnames        ,./modules/kaiten/models/cmf_plugin_kaiten.pywrapperz3catch_exception.<locals>.decorator.<locals>.wrapper"   s   #N&&''C'CD'C'C6'C'Ct&TTT>++-- 1d3000000
   !#(()[d8Rd

PR)[)[VY)[)[\\\qqqqq	s   ?A  A   
B:*AB55B: )r&   r)   r'   s   ` r(   	decoratorz"catch_exception.<locals>.decorator!   s)    	 	 	 	 	 	     r*   )r'   r+   s   ` r(   catch_exceptionr-       s$        $ r,   c               #   x   K   	 dt           j        d<   d V  dt           j        d<   d S # dt           j        d<   w xY w)Nr   NO_CACHE1)osenvironr*   r,   r(   enable_cacher3   6   sJ      %!#
:!$
:
:$$$$s   ( 9c                       e Zd ZdZej        j        dz   Zej        j        dgz   Z fdZe	d             Z
e	d             Zed             Zeded	efd
            Zed             Zed             Zedefd            Zd Zd Zd Z	 dydZd Zd Zd Zd Zd ZdefdZd Z	 	 	 dzdZd Z d Z!d  Z"d! Z#d" Z$ e%d#          defd$            Z&d% Z'd& Z( e%d'          d(             Z) e%d)          d*             Z* e%d+          d,             Z+d- Z,d. Z-d{d0Z.d1 Z/d2 Z0d3 Z1d4 Z2d5 Z3d6 Z4d7 Z5d8 Z6d|d:Z7 e%d;          d<             Z8d=efd>Z9d? Z:d@ Z;dA Z<dB Z= e%dC          dD             Z>dE Z?dF Z@ e%dG          dH             ZA e%dI          dJ             ZBdK ZCdL ZDdM ZEdN ZFdO ZGdP ZHdQ ZIdR ZJdS ZKdT ZLdU ZMdV ZNdW ZOd}dYZPdZ ZQ e%            d[             ZRd\ ZSd] ZTd^ ZU	 	 d~daZVdb ZWdc ZXdd ZYde ZZdf Z[dg Z\dh Z]di Z^dj Z_dk Z`dl Za e%dm          dn             Zbdo Zcdp Zddq Zedr Zf e%ds          dt             Zg e%du          ddvehfdw            Zidx Zj xZkS )CmfPluginKaitenN)clientkaiten_fieldsget_all_projectsc                     t                      j        |i | i | _        i | _        i | _        g | _        d| _        d| _        d | _        d | _	        g | _
        ddddddd	dd
dddd| _        t          j                            d          | _        t          j                            d          | _        t          j                            d          | _        t          j                            d          | _        d S )Nr   F   ОчередьOPENz#a0a0a0)r'   typecolor   В работеIN_PROGRESSz#3f82d8   ГотовоCLOSEDz#23a055)r         softdevcodezproject.agile:defaultzdefault.system:defaultzlist.base:default)super__init__task_relationsepicssubtasksselected_projectsr   update_fields_CmfPluginKaiten__kaiten_fields_archived_tasks_service_fields_status_type_mapmodelsCmfActivityget_project_softdev_activityCmfLogicType_project_agile_typeCmfWorkflow_workflow_template_list_base_type)selfr"   r#   	__class__s      r(   rH   zCmfPluginKaiten.__init__J   s   $)&))) 
!#"##!(&9MM)=9UU&9MM!
 !

 *0);)?)?Y)?)O)O&#)#6#:#:@W#:#X#X "("4"8"8>V"8"W"W%266<O6PPr,   c                 ^   t          t          d          s|                     g d           t          t	          | j        j                  | j        j                                        | j        j	        j
        t                                                    t          _        t          j        S )u5    Клиент для работы с Kaiten REST API r6   )pluginzplugin.ext_urlzplugin.ext_tokenzplugin.verify_ssl)urltoken
verify_sslsession)hasattr
thread_ctxload_fieldsr   strr^   ext_url	ext_tokendecryptra   valuecmfutilrequests_sessionr6   )r[   s    r(   r6   zCmfPluginKaiten.clienta   s     z8,, 	       !-+,,k+3355;170022	! ! !J   r,   c                 (   | j         r| j         S | j                                                            d          }|                                rO| j        sHt          |d          5 }t                              |          | _         d d d            n# 1 swxY w Y   no| j	        
                                | _         t          |d          5 }t                              | j         |d           d d d            n# 1 swxY w Y   d| _        | j         S )Nzfields.jsonr+w+Fensure_ascii)rN   r   get_download_pathjoinpathexistsrM   openjsonloadr6   
get_fieldsdump)r[   	file_pathfs      r(   r7   zCmfPluginKaiten.kaiten_fieldss   s    	(''O5577@@OO	 	'd&8 	'i&& 4!'+yy||$4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 $(;#9#9#;#;D i&& G!		$.	FFFG G G G G G G G G G G G G G G!&D##s$   & BBB#C;;C?C?c                 "   t          |           } |                                 } t          j        dd|           } t          j        dd|           } t          j        dd|           } t          j        dd|           } |                     d          S )	N&z and z\+r   z[^\w\s-]r   z[\s_-]+-)r	   lowerresubstrip)texts    r(   _slugifyzCmfPluginKaiten._slugify   sv    zz||vdGT**veS$''vk2t,,vj#t,,zz#r,   datareturnc                    | d         }|                      d          pd}|                      d          }t          j                            | d| d          }|>t          j        t          j        |                    }|                    |          }n%|                    t          j        j                  }|                    t          j        j                  }|	                                S )	Ndatetimez00:00:00tzOffsetr   z%Y-%m-%d %H:%M:%Sminutes)tzinfo)
rT   dtdatetimestrptimetimezone	timedeltareplaceutc
astimezone	isoformat)r   date_strtime_str	tz_offsetdt_naivetzdt_objdt_utcs           r(   _dict_to_dtzCmfPluginKaiten._dict_to_dt   s    <88F##1zHHZ((	;''8(@(@h(@(@BUVV R\)<<<==B%%R%00FF%%R[_%==F""2;?33!!!r,   c                  
    g } | S Nr*   )r$   s    r(   calc_models_settingsz$CmfPluginKaiten.calc_models_settings   s    
r,   c                     |sdS |                     d          rC|                    dd          }|                     d          pi }|                    |          }n|                     |          }|S )u`   
        Метод получает значение параметра объекта
        Ncf_id_
properties)
startswithr   rT   )obj_dataattrproperty_idr   rj   s        r(   
_get_valuezCmfPluginKaiten._get_value   sw    
  	F??5!! 	',,ue44K!l339rJNN;//EELL&&Er,   
field_namec                 P    |sd S |                      |g          }|r|d         nd S )N)fields_namer   )import_shop_fields)modelr   r$   s      r(   _get_field_namezCmfPluginKaiten._get_field_name   s:     	4&&J<&@@&s1vv$&r,   c                     ddddddddd	d
dd}||v r||         S | j                             |i                               dd          S )Nu   ИмяEmailu(   Не работает/Уволенныйu   Наименованиеu   Описаниеu   Созданоu   Обновленоu   Срокu   Постановщикu   Исполнительu   Тип)	full_nameemail	activatedtitledescriptioncreatedupdateddue_dateowner_idmembersr<   r'   r   )r7   rT   )r[   r   mappings      r(   _get_setting_title_by_attrz*CmfPluginKaiten._get_setting_title_by_attr   sm    !C/-'+"0/
 
 7??4= !%%dB//33FB???r,   c           
          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           |S )uO    Сопоставление настроек для модели models.CmfTaskr'   r   model_fieldr   r   r   cmf_created_atr   cmf_modified_atr   deadliner   	cmf_ownerr   responsibler   
logic_typer<   N)r   r   	ext_field)r7   itemsappend)r[   task_settingscf_idcfs       r(   _get_task_import_settingsz)CmfPluginKaiten._get_task_import_settings   s     #G44"M::,i@@-yAA&
;;'<<)9==(&99	
 +1133 	 	IE2  #" "     r,   c                 "    dddddddddg}|S )uQ    Сопоставление настроек для модели models.CmfPersonr'   r   r   r   does_not_workr   r*   )r[   user_settingss     r(   _get_user_import_settingsz)CmfPluginKaiten._get_user_import_settings   s4     #K88#W55+[AA

 r,   c                    |                     d          r2|r/|d         }|
|dk    rdS |S |dk    r	|d         }n|d         }|dk    rg |D ]j}|d	                             t          |                    }|d
         }	|r                    |	           Jt                              |	dd          }
|
c S t          j                            d|          }fd|D             }|S |dk    rg }|D ]}t          |          t          u r	|d         }n|}	 	 |                     |          }n$# t          $ r}t          | d          d }~ww xY w|                     |dd          \  }}|st          d| d          |r|                    |           n|c S # t          $ rS}| xj        dz  c_        | j                            d|d          d| d| d| dd           |sY d }~ d S Y d }~d }~ww xY w|S |dk    r#t#          j        d d!t          |                    S |d"k    r|                     |          S n|d#k    rA||S d$| j         d$|d          d$}t          j                            d%d&d'| d'g(          }|S |d)k    rL||S | j         d$|d*         d          d$|d          }t          j                            d%d+|gd,g-          }|S |d.k    r4||S |D ]+}|d         d/k    r|                     |d                   c S ,d S |d0k    r||n|                     |          S |d1k    r| S |S )2Nr   r<   checkboxFstring	multilinemulti_selectselectselectValuesrj   r~       seplengthCmfTaskc                 (    g | ]}|d          v |S r'   r*   ).0choicevalue_namess     r(   
<listcomp>z4CmfPluginKaiten._normalize_value.<locals>.<listcomp>  s'    XXXV&.K:W:W&:W:W:Wr,   useriduJ   . Возможно пользователь был удален в Kaiten.)createupdateu   Пользователь UID 'u&   ' не найден в системе.r   u1   Не удалось присвоить полю 'r'   ' (u   ) значение ''. zERR-0002	CmfPersonobj_typephonez[^\d+]r   r   r   ::ext_idLIKE%filterstatusproject=status_typer   fieldsr   rB   r   r   )r   rT   rf   r   rk   translit_striprR   CmfCustomFieldChoicelist_choicer<   dict_get_user_data_from_dumpr   _process_personr   r   r    r   r   r   source_hashrV   	CmfStatus_get_person)r[   r   rj   r   r   custom_field_typeis_multivalue_id
value_data
value_name	value_keychoicesvaluesusers	user_datauser_id	user_infor%   person_logic_type_ext_idr   status_ext_idr   r   r   s                            @r(   _normalize_valuez CmfPluginKaiten._normalize_value   s      '' d	I d	 )& 1}$
22 5 L H,,$[1$^4 H,,  % ) )H!*>!:!>!>s8}}!M!MJ!+G!4J )#**:6666$+$:$:& ##% %; % %	
  )((( 5AA  YXXXwXXX"f,,!& ( (II$.."+D/"+((,(E(Eg(N(NII(   "+#& r r r# #  %)$8$85Y^$8$_$_	% "+ r r r r# #  $ *!LL0000#)MMM 1 % 	( 	( 	(1,11EPYZ`Pa E Efp E E1:E E?BE E&%0	 2     ( (#'444444( ( ( ( (	( "g--viSZZ888"f,,''... -<''} HT%5 H Ht H H H,00 &*B.?*B*B*BC 1  J 8##}#/]]8I3Ft3L]]PUVZP[]]M%)) #}5% *  F M=((}  ; ;6?a''++GDM::::: (4;&&!M55t/?/?/F/FF?**9s8   D21F#2
E<EEAF##
H -AG;;H c                    i }|D ]}|d         s|                     d          }|d         d         }|                     ||d                   }|                     ||||          }|||<   |rV|                    d          rA|r?|d         dk    r3|d         r+|                    d	g           }|                    |           |S )
uC    Преобразование настроек для модели r   r   r   r   r   r<   r   r   deferred_text_fields)rT   r   r  r   
setdefaultr   )	r[   r   settingsnormalized_objsettingr   r   rj   r  s	            r(   _normalize_objzCmfPluginKaiten._normalize_objZ  s    	8 	8G=) K00I /=JOOHgfo>>E))	 E */N:& 8))%0085>8 f%11i6L1'5'@'@AWY['\'\$$++J777r,   c                     g | _          j                             dg            fd}d }d } j                                                             d          }|                                rQ                                 D ]$}                     |d                   D ]} |r n%                     d          D ]} |s0d  j        	                    dd	          D             }|r|d
         }|st          d          |s j                                        }|st          d          d _         || j        t          j                    || j        t          j                                       dg d           S )Nplugin.plugin.*c                 ,    |            }|D ]h}                     | |d                   |d<                       ||d                   |d<                       |d                   |d<   |j        |d<   i                    |j        |d           d S )Nr   rj   r   r   iconr'   r   )r   r   r   r  r   verbose_name)r!   settings_funcr   obj_settingsr  resultr[   s        r(   _get_settingsz<CmfPluginKaiten.tmplt_import_settings.<locals>._get_settings}  s    (=??L' - -#'??3#H#H )-)=)=eW]E[)\)\&#'#B#B76?#S#S "'*MM5#5NNOOOOOr,   projectsr   r  c                     g | ]}|S r*   r*   )r   r  s     r(   r   z9CmfPluginKaiten.tmplt_import_settings.<locals>.<listcomp>  s    eee1Qeeer,   r   r   )additional_card_fieldslimitr   uT   Не найдено ни одной задачи, импорт невозможен!ub   Не найдено ни одного пользователя, импорт невозможен!TselectedObjects)r'   rj   )r   re   rr   rs   rt   _get_projects_get_project_tasks_simple_getr6   	get_cardsr   get_current_userrM   r   rR   r   r   r   r   )	r[   r   r%  taskr   projects_dirr   tasksr$  s	   `       @r(   tmplt_import_settingsz%CmfPluginKaiten.tmplt_import_settingsw  s   $##%6$7888	P 	P 	P 	P 	P 	P 88::CCJOO   	--//   33GDMBB  D E((11   	 ee 5 5]bc 5 d deeeE  Qx 	trsss 	2;//11D 	B  A  B  B  B " 	dD:FNKKKdD:F<LMMM 	02>>???r,   c           	         |                      dg           | j        j        | _        g }	 | j        5 }|                                D ]}t          |d                   }|d         }|}|d         r|dz  }d| j         d| d}	t          j                            ddd	|	 d	gd
ddg          }
|
r|dz  }|
j	        }n4| 
                    |          }t          j                            |          }||||d}|                    |           	 d d d            n# 1 swxY w Y   n-# t          $ r }t                              |            d }~ww xY w|S )Nzplugin.source_hashr   r   archivedu    (архивный)r   r   r   r   T--task_code_prefixr   include_deletedr   u    [импортирован])r   keyr'   original_name)re   r^   r  r6   
get_spacesrf   rR   
CmfProjectsgetr7  r   get_prefix_from_namer   r   gdebug)r[   r"   r#   r&  r6   space
project_idproject_titleproject_nameproject_ext_idr   project_keyproject_codeproject_datar%   s                  r(   r8   z CmfPluginKaiten.get_all_projects  s   ./000;2 	 2#..00 2 2E!$U4[!1!1J$)'NM#0LZ( >$(==%L$*:%L%Lj%L%L%LN$/44 (&2Gn2G2G2GH(, $&89 5  G
  [$(EE&-&>'+}}]'C'C&,&7&L&L\&Z&Z )* ,)6	$ $L OOL1111722 2 2 2 2 2 2 2 2 2 2 2 2 2 2:  	 	 	GGCLLL	 s;   D' CDD' DD' "D#D' '
E1EEc                 (   t          |          }t          j        j        }|                    | j        j         d|           }|t          j        |          S | 	                    d          D ]}t          |                    d                    |k    r|c S |                    d          |k    r|c S |                    dd          
                                |
                                k    r|c S |                    dd          
                                |
                                k    r|c S |                    dd          
                                |
                                k    r|c S t          d	|           )
N:user:r  r   uidr   r   usernamer   uH   В дампе не найдены данные пользователя )rf   APPREDIS_DBredisrT   r   r   pickleloadsr-  r   r   )r[   r  redis_dbr  s       r(   r   z(CmfPluginKaiten._get_user_data_from_dump  s   g,,<%LLDO$6!G!Gg!G!GHH	 <	***))'22 
	! 
	!I9==&&''722    }}U##w..    }}Wb))//11W]]__DD    }}Z,,2244GG    }}["--3355HH     Ilcjllmmmr,   c                 R   t          |          }t          |                              d          rd S 	 |                     |          S # t          $ r 	 |                    d          }|                                rt          |d          5 }|D ]}t                              |          }t          |d                   |k    r|c cd d d            cY S |	                    d          |k    r|c cd d d            cY S |	                    dd          
                                |
                                k    r|c cd d d            cY S 	 d d d            n# 1 swxY w Y   | j                            |          }|r^t          |d          5 }|                    t                              |d	
          dz              d d d            n# 1 swxY w Y   |cY S Y d S # t          $ r.}| j        j                            d|            Y d }~Y d S d }~ww xY ww xY w)Nr~   
users.jsonrr   rL  r   r   a+Frp   
uS   Не удалось получить данные пользователя по ID )rf   r   r   r   rs   rt   ru   rv   rR  rT   r   r6   get_userwritedumpsr   loggerwarning)r[   r  dump_dir
users_filer{   rowr  r%   s           r(   _get_user_datazCmfPluginKaiten._get_user_data  sk   g,, w<<""3'' 	F	00999 	 	 	%..|<<
$$&& 	1j#.. 1!#$ 1 1C(,

3I"9T?33w>>'0 0 0	1 1 1 1 1 1 1 1 1 1
  )}}U33w>>'0 0 01 1 1 1 1 1 1 1 1 1  )}}Wb99??AAW]]__TT'0 0 01 1 1 1 1 1 1 1 1 1  U11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 !K0099	 %j$// R1

95
 I ID PQQQR R R R R R R R R R R R R R R$$$$% % %    &..sjqss         '	s   A
 
H&9G*;E"
G*H&E"5G*H&AE"G*H&E"G*"E&	&G*)E&	*/G*3GG*G	G*G	 G*$H&*
H"4"HH&H""H&r'   c              #   $  K   | j                                                             | d          }|                                rJt	          |d          5 }|D ]}t
                              |          V  	 d d d            n# 1 swxY w Y   d S )N.jsonrn   )r   rr   rs   rt   ru   rv   rR  )r[   r'   rz   r{   r`  s        r(   r-  zCmfPluginKaiten._simple_get  s      O5577@@DPP	 	*i&& *! * *C**S//))))** * * * * * * * * * * * * * * ts   "BB	B	c              #     K   | j                                                             d          }|                                r|                                D ]}|j                            d          r|                    d          }|                                s$| j         j                            d| d           jt          |d          5 }t                              |          V  d d d            n# 1 swxY w Y   d S d S )Nr&  .dirtyz.meta	info.jsonuN   Отсутствует файл info.json в каталоге проекта ''rV  )r   rr   rs   rt   iterdirr'   endswithr\  r]  ru   rv   rw   )r[   r1  project_dir	info_filer{   s        r(   r+  zCmfPluginKaiten._get_projects  sX     88::CCJOO   	'+3355 ' '#,,-@AA '00==	 '')) O*22witwww   )S)) 'Q))A,,&&&' ' ' ' ' ' ' ' ' ' ' ' ' ' '	' 	'' 's   C::C>	C>	r   Fc              #   h  K   | j                                                             dt          |          d          }|                                s'| j         j                            d| d|            d S d}t          |                                          D ]}|	                                s|j
        }|                    d          r5|r(|                    d                                          s_|                    d                                          }	| j        d	u r|	s| j        d
u r|	r||k     r|dz  }||||z   k    r d S t          |                    d          d          5 }
t                              |
          V  d d d            n# 1 swxY w Y   |dz  }d S )Nr&  r2  u   Каталог u    отсутствует. Возможно он был удален или еще не создан. Необходимо повторно запустить импорт проекта r   re  .processing	.archivedTFr   rg  rn   )r   rr   rs   rf   rt   r\  r]  r   ri  is_dirr'   rj  rO   ru   rv   rw   )r[   rC  offsetr)  only_processing	tasks_dircounttask_dirtask_idis_archivedr{   s              r(   r,  z"CmfPluginKaiten._get_project_tasks%  s3      O5577@@J
 
	 !! 	O"**u) u uhru u   FY//11 	 	H??$$ mG 344  x'8'8'G'G'N'N'P'P "++K88??AAK#t++K+%..;.v~~
 Ufun%<%<h''44d;; #qiill"""# # # # # # # # # # # # # # #QJEE-	 	s   7F  F$	'F$	c              #   8  K   | j                                                             dt          |          d          }|                    d          D ]F}t          |d          5 }t                              |          V  d d d            n# 1 swxY w Y   Gd S )Nr&  boardsz*.jsonrV  )r   rr   rs   rf   globru   rv   rw   )r[   rC  
boards_dir
board_filer{   s        r(   _get_project_boardsz#CmfPluginKaiten._get_project_boardsO  s      _6688AAJ
 

 %//(33 	# 	#Jj#&& #!iill"""# # # # # # # # # # # # # # #	# 	#s   %BB	B	c                    t          |                              d          rt          j        S 	 |                     |          }nC# t
          $ r6}| j                            | ddd           t          j        cY d }~S d }~ww xY w|                     |dd          \  }}|s| j        j	        j
                            d          r]t          j                            | j        j	        d                   }| j                            d	| d
| t          j                   n=| j                            d	| ddd           t          j        }| xj        dz  c_        |S )Nr~   uK   . Будет установлен пользователь 'Система'zERR-0003r   r   Fdefault_user_idr   u,   Не найден пользователь 'uU   '. Будет установлен пользователь по умолчанию: )leveluL   '. Будет установлен пользователь 'Система'zERR-0004r   )rf   r   r@  system_userr   r   r   r    r   json_settingsrj   rT   rR   r   r   loggingWARNINGr   )r[   r  r   r%   r  r  s         r(   r  zCmfPluginKaiten._get_personW  s   w<<""3'' 	!= 	!0099DD 	! 	! 	!O%%ccc$ &   
 =      	! ((ue<<	 	%,2667HII %)--1NO`1a-bb##r7 r rior r!/ $     ))a7 a a a(	 *    1$s   A 
B+B;BBc                    d}d}d}d}| j                                                             dt          |          d          }|                                rjt          |                                          D ]G}|                                s|j        	                    d          r3t          |                    d          d          5 }t                              |          }	ddd           n# 1 swxY w Y   |                    d          }
|	                    d	          }|rC|d
z  }t          |
d          5 }|                    d           ddd           n# 1 swxY w Y   n|d
z  }|
                    d           |                    d                                          r|r|d
z  }B|d
z  }I||z   ||z   ||||f}|S )u  
        Возвращает статистику по сдампленным задачам проекта

        Args:
            project_id (int): ID проекта

        Returns:
            tuple: статистика задач проекта
        r   r&  r2  re  rg  rV  Nro  r5  r   wr   T
missing_okrn  )r   rr   rs   rf   rt   r   ri  rp  r'   rj  ru   rv   rw   rT   rZ  unlink)r[   rC  activer5  unprocessed_activeunprocessed_archivedrs  ru  r{   	task_dataarchived_flag_filerw  statss                r(   _get_project_tasks_statsz(CmfPluginKaiten._get_project_tasks_statsy  so     O5577@@J
 
	  	0 OO3355 0 0(( =))*=>> (++K88#>> -! $		!I- - - - - - - - - - - - - - - &.%6%6{%C%C"'mmJ77 ?MH0#66 $!$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ aKF&--->>>$$]33::<< 0" 0,1,,*a/* X!55 
 s$   C77C;	>C;	E%%E)	,E)	c                    t           j        j        }| j                            d           g }t                      }| j                                                            d          }|                                rt          |d          5 }t          |d          D ]\  }}|                                }|s	 t                              |          }	|                    t          |	d                              |                    |	           u# t"          $ r0}
| j                            d| d| d|
 d	|            Y d
}
~
d
}
~
ww xY w	 d
d
d
           n# 1 swxY w Y   |d         }|                     |          D ]l}t)          |d                                       d          }|                                s@d}t          |          5 }t          |d          D ]\  }}|                                }|s	 t                              |          }	t          |	d                   }||vrL|                    | j        j         d| t-          j        |	                     |                    |	           # t"          $ r2}
d}| j                            d| d| d|
 d	|            Y d
}
~
d
}
~
ww xY w	 d
d
d
           n# 1 swxY w Y   |s|                                 nt          |d          5 }|D ]4}	|                    t                              |	d          dz              5	 d
d
d
           d
S # 1 swxY w Y   d
S )us    Собирает пользователей из файла users.json в каталогах документов u9   Сбор пользователей из объектовrU  rV  r   r   u   Ошибка в строке u    файла : r   Nru  FrK  Tro   rp   rX  )rN  rO  rP  r   r   setrr   rs   rt   ru   	enumerater   rv   rR  addrf   r   r   r    r,  r   r   rQ  r[  r  rZ  )r[   rI  rS  current_userscurrent_user_idsall_users_filer{   line_numberliner   r%   rC  r0  task_users_fileerrorr  s                   r(   _collect_userszCmfPluginKaiten._collect_users  s   <%WXXX 55::<<EElSS  "" 	nc** a)21a  %K::<<D ! #zz$//(,,Sd__===%,,T2222$   11tKttUcttgjttnrtt                      "$'
++J77 	) 	)D"4
#344==lKKO"))++ Eo&& !)21a  %K::<<D ! #zz$//"%d4j//"*:::$LL#'?#5 F FW F F &T 2 2   *00666$    $11uKuuUduuhkuuosuu                     (  )&&(((.$'' 	E1% E E

4e
<<tCDDDDE	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	Es   -E:ADE
E&EEEEE #E -KA?JK
J?	(J:	5K:J?	?KK	K	8MMMc                     t           j        j        }|                     d          D ]N}|                    d          }|                    | j        j         d| t          j	        |                     Od S )Nr  r   rK  )
rN  rO  rP  r-  rT   r  r   r   rQ  r[  )r[   rS  r  r:  s       r(   _cache_all_usersz CmfPluginKaiten._cache_all_users  s|    <%))'22 	V 	VI--%%CLLDO.;;c;;V\)=T=TUUUU	V 	Vr,   u   Дампc                 v   | j                                                             | d          }|                                rt	          j        |           | j                                                             | d          }t          |d          5 } |            D ]I}| j         xj        dz  c_        |                    t          
                    |d          dz              J	 d d d            n# 1 swxY w Y   t          j        ||           | j         j                            d	           d S )
Nrc  z.json.dirtyrW  r   Frp   rX  T	only_data)r   rr   rs   rt   r1   removeru   json_object_countrZ  rv   r[  shutilmoverj   save)r[   api_funcr'   rz   file_tmp_pathr{   r`  s          r(   _simple_dumpzCmfPluginKaiten._simple_dump  s|   O5577@@DPP	 	!Ii   99;;DDEYEYEYZZ-&& 	D!xzz D D11Q611

3U
;;dBCCCCD	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	M9---""T"22222s   AC99C= C=c                    t          |d                   }|d         }|d         }|                    |          }| j         d| d| }t          j                            || j        g d          }	|	s't                              || j        | j                  }	||	_        ||	_        ||	_	        |	j
        s|                                s"d|	_        ||	_        |	                                 t                       d S )	Nr   r'   r_   r   )r'   hrefpath)
obj_ext_idr  r   )r  r  r   F)rf   rs   r  rR   CmfImportDownloadrT   r   r'   r  r  
is_changedrt   
downloadedimport_raw_jsonr  r   )
r[   rv  
attachmentattachments_dirattachment_id	file_namedownload_urlattachment_fileattachment_ext_iddownload_jobs
             r(   _dump_task_attachmentz%CmfPluginKaiten._dump_task_attachment  s"   Jt,--v&	!%()22=AA#/MM7MMmMM/33((+++ 4 
 

  	!33, ,? 4  L
 &(+" 	 /*@*@*B*B 	 &+L#+5L(r,   c                     t          |d                   }|                    d          }|                    d           |                    dg           D ]}|                     |d         ||            d S )Nru  attachmentsTexist_okfilesr   )r   rs   mkdirrT   r  )r[   r0  ru  r  r  s        r(   _dump_task_attachmentsz&CmfPluginKaiten._dump_task_attachments  s    Z())"++M::t,,,((7B// 	P 	PJ&&tDz:OOOO	P 	Pr,   u.   Дамп комментариев задачиc           	      D   t          |d                   }|                    d          }|                                rt          j        |           | j                            |d                   }t          |d          5 }|D ]}|                    d          r| 	                    |d         |           |
                    t                              |dd          d	z              | j                            d
           	 d d d            d S # 1 swxY w Y   d S )Nru  comments.jsonr   rW  	author_idFTrq   	sort_keysrX  comment)r   rs   rt   r1   r  r6   get_card_commentsru   rT   ra  rZ  rv   r[  r   inc_stat)r[   r0  ru  comments_filecommentsr{   r  s          r(   _dump_task_commentsz#CmfPluginKaiten._dump_task_comments  s\   Z()) ))/::!! 	%Im$$$;00d<<-&& 	4!# 4 4;;{++ H''(<hGGG

7$
OORVVWWW((3333	4	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4s   BDDDu/   Дамп журнала работ задачиc           	         t          |d                   }|                    d          }|                                rt          j        |           | j                            |d                   }t          |d          5 }|D ]f}|                    d          r| 	                    |d         |           |
                    t                              |dd          d	z              g	 d d d            d S # 1 swxY w Y   d S )
Nru  timelogs.jsonr   rW  r  FTr  rX  )r   rs   rt   r1   r  r6   get_card_time_logsru   rT   ra  rZ  rv   r[  )r[   r0  ru  time_logs_file	time_logsr{   time_logs          r(   _dump_task_time_logsz$CmfPluginKaiten._dump_task_time_logs-  s\   Z())!**?;;  "" 	&In%%%K224:>>	.$'' 	Y1% Y Y<<,, I''(=xHHH

8%4
PPSWWXXXXY	Y 	Y 	Y 	Y 	Y 	Y 	Y 	Y 	Y 	Y 	Y 	Y 	Y 	Y 	Y 	Y 	Y 	Ys   A*C;;C?C?u)   Дамп чек-листов задачиc           	         t          |d                   }|                    d          }|                                rt          j        |           t          |d          5 }|                    dg           D ]\}| j                            |d         |d                   }|	                    t                              |dd          d	z              ]	 d d d            d S # 1 swxY w Y   d S )
Nru  checklists.jsonrW  
checklistsr   FTr  rX  )r   rs   rt   r1   r  ru   rT   r6   get_card_checklistrZ  rv   r[  )r[   r0  ru  checklists_filer{   	checklistchecklist_datas          r(   _dump_task_checklistsz%CmfPluginKaiten._dump_task_checklists:  sJ   Z())"++,=>>!!## 	'Io&&&/4(( 	_A!XXlB77 _ _	!%!?!?JdO" " 

>QU
VVY]]^^^^_	_ 	_ 	_ 	_ 	_ 	_ 	_ 	_ 	_ 	_ 	_ 	_ 	_ 	_ 	_ 	_ 	_ 	_s   #A4C%%C),C)c                    t          j                    }	 t          |d          5 t          fdd          D ]}|                    |           	 ddd           n# 1 swxY w Y   |                                S # t          $ r Y dS w xY w)u:   
        Вычисляет MD5 хеш файла
        rbc                  .                          d          S )Ni    )read)r{   s   r(   <lambda>z1CmfPluginKaiten._calc_file_hash.<locals>.<lambda>O  s    !&&,, r,   r,   N)hashlibmd5ru   iterr   	hexdigestr   )r[   rz   hash_md5chunkr{   s       @r(   _calc_file_hashzCmfPluginKaiten._calc_file_hashH  s     ;==	i&& +!!"6"6"6"6<< + +EOOE****++ + + + + + + + + + + + + + + %%''' 	 	 	44	s4   A> ,AA> A##A> &A#'A> >
BBc                    i }|                     d          }|                                rX	 t          |dd          5 }t                              |          }ddd           n# 1 swxY w Y   n# t
          $ r i }Y nw xY wi }d}d}|D ]]}|                     |          }	|                     |	          }
d|
i||	j        <   |	j        |vrd	}D||	j                 d         |
k    rd	}^|rt          |d
d          5 }t                              ||dd           ddd           n# 1 swxY w Y   |                     d          }t          |d
          5 }|	                    d           ddd           dS # 1 swxY w Y   dS dS )u!  
        Проверяем изменились ли файлы в каталоге задачи
        И при наличии изменений создает файл-флаг для обработки

        Args:
            task_dir (Path): каталог задачи
        zhashes.jsonrV  utf-8encodingNF)rg  r  r  r  hashTr  rB   )indentrq   rn  r   )
rs   rt   ru   rv   rw   r   r  r'   ry   rZ  )r[   ru  saved_hashes	hash_filer{   current_hasheshas_changes
task_files	task_filerz   	file_hash	flag_files               r(   _mark_as_updatedz CmfPluginKaiten._mark_as_updatedU  s    %%m44	 	"")S7;;; 0q#'99Q<<L0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " " "!"

 $ 
	# 
	#I )))44I,,Y77I.4i-@N9>* ~\11"in-f5BB"  	iw777 K1		.!AE	JJJK K K K K K K K K K K K K K K ))-88Ii%%                  		 	sX   A2 A&A2 &A**A2 -A*.A2 2B B>D))D-0D-E<<F F d   c                 V   t          d          5  | j        5  d}|d         }|d         }	 | j        5  | j        }| xj        |z  c_        d d d            n# 1 swxY w Y   	 | j                            || j        d||          }|snm|D ](}	t          |	d                   }
|	d         }| j        j        	                    d	| d
|
 d           |
                    |
          }|
                    |
dz             }|                                rt          j        ||           |                    d           t          |          |	d<   |                     |	           |                     |	           |                     |	           |	d         r|                     |	d         |           |	                    dg           D ]}|                     |d         |           t          j        ||           t          |          |	d<   t)          |
                    d          dd          5 }t*                              |	|ddd           d d d            n# 1 swxY w Y   |dz  }| j                            d           |                     |           |                     |	           *n># t4          $ r1}| j                            d| d
| d| ddd           Y d }~nd }~ww xY w	 d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )NFinit_views_and_dsr   r   r   Tr   )space_idr5  r(  rq  r)  u   Задача 'r   )rf  r  ru  r   r   rg  r  r  r  rB   )r  rq   r  r   r0  uB   Не удалось получить задачи проекта '). zERR-0005r   ry   )
error_coder   
error_type)r   r6   _lock_offsetr.  rO   rf   r   r\  infors   rt   r  r  r  r  r  r  ra  rT   ru   rv   ry   r  r  r  r   r    )r[   rI  rs  r)  
task_countrC  rE  rq  r2  r0  rv  	task_nameru  task_tmp_dirmemberr{   r%   s                    r(   _dump_task_workerz!CmfPluginKaiten._dump_task_worker  s   5111 =	 =	4; =	 =	J%d+J'0L7Z * *!\FLLE)LL* * * * * * * * * * * * * * *2 K11!+!%!5/<%# 2  E !  %  :  :"%d4j//$(M	.334]Y4]4]SZ4]4]4]^^^#,#5#5g#>#>'0'9'9'H:L'M'M#??,, @"K,???$**D*999+.|+<+<Z(0066611$777224888
+ P //Z0@,OOO&*hhy"&=&= L LF //tlKKKKL(;;;+.x==Z(!("3"3K"@"@#PWXXX ]\] IIdAaeW[I\\\] ] ] ] ] ] ] ] ] ] ] ] ] ] ]"a
00888 --h77733D9999A :B !   O-- C]i  C  Cnx  C  C  ~A  C  C#-!*#)	 .        c7 )=	 =	 =	 =	 =	 =	 =	 =	 =	 =	 =	 =	 =	 =	 =	 =	 =	 =	 =	 =	 =	 =	 =	 =	 =	 =	 =	 =	 =	 =	 =	 =	 =	s   LLALALA L$&J9
LF*J96 I"	J9"I&&J9)I&*AJ98L9
K4'K/*L/K44L:LL
	
LL
	LL"%L"c                 2   d}t          |d                                       d          }|                    d           d| _        t	          j                    | _        g }t          | j                  D ]r}t	          j	        | j
        d|dz    ||d	          }|                    |           |                                 | j        j                            d
|            s|D ]}|                                 |                     |           |S )Nr   rk  r2  Tr  dump_tasks_r   )rI  rs  targetr'   r#   u$   Запущен обработчик )r   rs   r  r  	threadingLockr  rangedownload_threading_max_forksThreadr	  r   startr   r\  r  joinr  )r[   rI  errorsrs  threadsithreads          r(   _dump_taskszCmfPluginKaiten._dump_tasks  s+   m455>>wGG	&&&^%%
t899 	Y 	YA%-*1q5**$0!*   F NN6"""LLNNNO"''(Wv(W(WXXXX 	 	FKKMMMML)))r,   c                 ^   |                     d          }|                                rt          j        |           |                                 | j                            |          }|D ]}|d         }g |d<   | j                            || j                  D ]0}|d         	                    t          |d                              1|                     | d          }t          |d          5 }	t                              ||	d           d d d            n# 1 swxY w Y   d S )	Nry  r   cards)r5  rc  ro   Frp   )rs   rt   r  rmtreer  r6   get_space_boardsget_board_cardsrO   r   rf   ru   rv   ry   )
r[   rC  rk  r{  boards_data
board_databoard_idcardr|  r{   s
             r(   _dump_project_boardsz$CmfPluginKaiten._dump_project_boards  sq    ))(33
 	&M*%%%k22:>>% 	= 	=J!$'H"$Jw33HtG[3\\ < <7#**3tDz??;;;;#,,-?-?-?@@Jj$'' =1		*ae	<<<= = = = = = = = = = = = = = =	= 	=s   7D!!D%	(D%	c                 v   |                     d          }|                                rt          j        |           | j                            |          }t          |d          5 }|D ]4}|                    t          	                    |d          dz              5	 d d d            d S # 1 swxY w Y   d S )NrU  rW  Frp   rX  )
rs   rt   r1   r  r6   get_space_usersru   rZ  rv   r[  )r[   rC  rk  r_  
users_datar{   r  s          r(   _dump_project_usersz#CmfPluginKaiten._dump_project_users  s    )),77
 	"Ij!!![00<<
*d## 	Jq' J J	

95
AADHIIIIJ	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	Js   (8B..B25B2c                 
   | j                                                             d          }|                    d           t	          | j                  }t          d|z            }| j        D ]}|d         }|d         }|d         }	 | j                                         r d S | j         xj        dz  c_        | j         j	        
                    d	| d
| d           |                    |          }|                    | d          }	|                                rt          j        ||	           n|	                    d           | j                            |          }
t!          |
d                   |
d<   ||
d<   t!          |	          |
d<   |                     ||	           |
                    d          r6|                     |
d         | j                                                   |
d<   |                     ||	           t+                      5  | j         xj        |z  c_        | j         j                            d           t3                       d d d            n# 1 swxY w Y   t          j        |	|           t!          |          |
d<   |
d          d}t5          |d          5 }t6                              |
|d           d d d            n# 1 swxY w Y   d}||                     |
          z  }| xj        |z  c_        # t>          $ r?}| xj        dz  c_        | j                              d| d| ddd           Y d }~d }~ww xY w| j         !                    d           d S )Nr&  Tr  P   r   r:  r;  r   u   Дамп проекта 'r   r  rf  rk  
author_uidauthorr  z
/info.jsonro   Frp   r   )rI  u2   Не удалось получить проект r   zERR-0006r=  ry   )r   r  u*   Дамп проектов завершен)"r   rr   rs   r  lenrL   intr   r  r\  r  rt   r  r  r6   	get_spacerf   r'  rT   ra  r#  r3   progressrj   r  r   ru   rv   ry   r  r   r   r    r   )r[   r1  cntstepr   rC  rG  rE  rk  project_tmp_dirrI  	data_filer{   dump_task_errorsr%   s                  r(   _dump_projectszCmfPluginKaiten._dump_projects  sR   88::CCJOOD)))$())28}}- 9	 9	G J!%.K"?3L5?,,.. FF11Q611&++,f,f,fYc,f,f,fggg*33J??"."7"7:8M8M8M"N"N%%'' 9K_====#))4)888#{44Z@@%(d);%<%<T"&1U#.1/.B.B]+((_EEE##L11 -1-@-@$\299;;. .L* ))*oFFF!^^ ! !O,,4,,O)...>>>LLL! ! ! ! ! ! ! ! ! ! ! ! ! ! !
 O[999.1+.>.>]++M:FFF	)T** CaIIlAEIBBBC C C C C C C C C C C C C C C $%  D$4$4,$4$O$OO #33   1$))YYYTWYY)%	 *         	HIIIIIsi   L(E6LAI."L.I2	2L5I2	6AL;K%L%K)	)L,K)	-.L
M&'4M!!M&c                    t                               d          }| j        j        j        |_        |                    | j        j        j                   | j                                        }t          j	        |          \  }}}||z  dz  }| j        j        
                    d| d           | j        j        
                    d           | j        5  | j        j        
                    d           |                     | j        j        d           | j        j        
                    d           |                     | j        j        d	           | j        j        
                    d
           |                     | j        j        d           t!                      5  d| j        _        | j        j                                         t)                       ddd           n# 1 swxY w Y   | j        j        
                    d           |                                  ddd           dS # 1 swxY w Y   dS )u^   
        Загружает все данные из API, кроме вложений
        z'modules.kaiten.kaiten_client.connectionr  u   Свободно места: r   u5   Скачивание данных через API ... u#   Дамп пользователейr  u   Дамп типов задач
task_typesu   Дамп метокtags   Nu,   Дамп выбранных проектов)r  	getLoggerr   r\  handlerssetLevelr  rr   r  
disk_usager  r6   r  get_company_usersget_card_typesget_tagsr3   r/  rj   r  r   r5  )r[   r\  download_pathtotalusedfreefree_percents          r(   download_datazCmfPluginKaiten.download_data?  sz    ""#LMM/09.455599;;"-m<<tTe|c)##$SL$S$S$STTT##$[\\\[ 	" 	"O"''(MNNNdk;WEEEO"''(HIIIdk8,GGGO"''(=>>>dk2F;;;  +-(%**,,,              
 O"''(VWWW!!!!	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"s7   CH3#9G(H3(G,	,H3/G,	06H33H7:H7c                    t          j                    j        }t          j                    j        }d}d}d}d}d}	t	          d          5  | j        5  	 | j                                        rn|                                }
|
dk    rnt          j
        t          j        dd                     	 t          j                            |
g d	          }t          |j                  }t          |j                  }t          |j                  }t          |j                                      d
          }t)          |          dk    rd|d          dnd}d| d}|}|j        j        }|r>|                    d          }|r't/          |t0                    r|dz  }|d|dd| dz  }| j        j                            | d| d| d           t          j                    }| j                            ||t:          j                   t          j                    }|}t?          |          }|                                 j!        }|dz  }|d|dd| dz  }| j        j                            | d| d| d           d|_"        |#                                 tI                       | j        %                    d           |dz  }||z  }|	||z
  z  }	nT# tL          $ rG}tO                       |dz  }| j        (                    | d| d| d| ddd |!           Y d }~nd }~ww xY w|dz  }n
# |dz  }w xY w|dz  }|	dk    r||	z  nd}|||||	f}|)                    |           | j        j                            d"| d#| d$| d%| d&| d'|d(d)|dd*| d+           d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S ),Nr   Fr  TDONEg?      ?)r'   r  r  r  r  r   r   r   r   u   [Задача ID: z] r   rh  size    (.3fu    MБ / u
    байт)u   Скачивание z: ')timeoutu	   Файл u    сохранен в 'r  u"   Ошибка скачивания r   zERR-0007r  ry   )r   r   r  ext_hrefu   Поток 'z' (ID: uU   ) завершен. Скачано файлов (успешно/неуспешно): /    из 8   . Средняя скорость скачивания: .2f)    МБ/с. Скачанный объем:     МБ / 	    байт)*r  current_threadr'   identr   r6   r   r   rT   r   sleeprandomuniformrR   r  rf   r  r  r  splitr,  r  rj   
isinstancer-  r\  r  perf_counterdownload_fileconfigIMPORT_DOWNLOAD_TIMEOUTr   statst_sizer  r  r   r  r   r   r    put)r[   download_queueresult_queuethread_name	thread_iderror_countdownloaded_counttotal_countdownloaded_bytestotal_download_timedownload_job_iddownload_objr  file_urlrz   ext_id_splittask_id_msgfile_msg	file_datafile_size_bytesfile_size_mbr  enddownloaded_filer%   downloaded_mb
speed_mb_sr  s                               r(   _download_file_workerz%CmfPluginKaiten._download_file_worker`  s   .005,..4	5111 a	 a	4; a	 a	L%?,,.. "0"4"4"6"6"f,, 
6>#s33444@%#)#;#?#?*      $@ 	$ 	$L !$L$5 6 6I"<#455H #L$5 6 6I#&|'>#?#?#E#Ed#K#KLNQR^N_N_bcNcNc"J|A"J"J"J"JikK 0I 0 0 0I(H , < BI  b*3--*?*?* bz/3/O/O b+:W+DL$(a\(a(a(ao(a(a(aaHO*//;0m0mU]0m0mbj0m0m0mnnn -//EK-- ! & > .   
 +--C(H&*9ooO&5&:&:&<&<&DO#2W#<L Y\ Y Y Yo Y Y YYHO*//&]]]]QZ]]]   /3L+ %%'''LLLO,,\:::$)$$7$'C%K8''  	 	 	 NNN1$KO--&jj)jjX`jjehjj#-!4#)!) .        	  1$KKK1$KKKKKYL%\ -w6M@SWX@X@X)<<<^_J   #E U###O"''i{ i i9 i i#i i&1i i9Di i JTci i 3@h	i i N^	i i i  wa	 a	 a	 a	 a	 a	 a	 a	 a	 a	 a	 a	 a	 a	 a	 a	 a	 a	 a	 a	 a	 a	 a	 a	 a	 a	 a	 a	 a	 a	 a	 a	 a	su   OA N84H)KL8
L/(=L*%L8*L//L82N88L??A-N8,O8N<	<O?N<	 OOOc                    dd| j         gg dg}| j                                                            d          }d}g }| j        D ]}t          |d                   }|                    |          }t          |                              d          st          |          dz   }dd	| d
gg}||z   }	t          j        	                    |	          }
|
r||
z  }|
                    |	           |s!| j        j                            d           dS | j        j                            d|            t                      }t                      }d}d}d}d}d}g }t          | j                  D ]r}t!          j        | j        d|dz    ||d          }|
                    |           |                                 | j        j                            d|            s|D ]B}t          j                            |ddg          D ]}|                    |j                   Ct/                       |D ]}|                    d           |D ]}|                                 | j                                        r| j        j                            d           |                                sG|                                \  }}}}}||z  }||z  }||z  }||z  }||z  }|                                G|dz  }|dk    r||z  nd}| j        j                            d| d| d| d|dd|dd| d           |S ) Nr  ==)r  r~  Fr&  r   r   rQ  r  r   r   r   u3   Нет вложений для скачиванияu'   Скачивание вложений: _download_file_worker_r   )rf  rg  r  u   Запущен поток r6  r   rH  u   Импорт прерванrL  uj   Скачивание завершено. Скачано файлов (успешно/неуспешно): rR  rS  rT  rU  rN  rV  rW  )r  r   rr   rs   rL   rf   rj  rR   r  rt  r   r\  r  r   r  r  r  r  r|  r  slistre  r   r   r  r   r]  emptyrT   )r[   main_filterprojects_pathattachment_countfiltersrI  rC  project_pathpath_filterdownload_filterdownload_countrf  rg  
main_counttotal_downloadedtotal_errorstotal_downloaded_bytesrn  r  r  r  filter_r  rl  rk  rj  rm  download_timetotal_downloaded_mbr{  s                                 r(   download_fileszCmfPluginKaiten.download_files  sT   D$"23'''
 99;;DDZPP 2 
	0 
	0L\$/00J(11*==L|$$--c22 7"<0036"F|,>,>,>?@K)K7O#5;;?;SSN 0 N2 /// 	fO"''(]^^^1O"''(dRb(d(deeeww
!"t899 	O 	OA%15a!e55&4$0   F NN6"""LLNNNO"''(MV(M(MNNNN 	4 	4G & 8 > >gW[]aVb > c c 4 4""<?33334 	' 	'Fv&&&& 	 	FKKMMMM?$$&& 	JO"**+HIII$$&& 	1   ""  +%J 00K'L"&66"=0 $$&& 	1 5w>BUYZBZBZ(+>>>`a
##qq q".q q6@q q FP_q q /Bp	q q Pf	q q q	
 	
 	
 r,   c                     | j         d         d         d         }|d         st          d          d |d         D             | _        d S )Nr*  rj   r   	isCheckedu8   Не выбраны проекты для импортаc                 >    g | ]}|d          
|d         |d          S )r!   r  r*   )r   ss     r(   r   z:CmfPluginKaiten._set_selected_projects.<locals>.<listcomp>+  sB     "
 "
 "
x"
kN"
eH"
 "
 "
r,   children)r  r   rL   )r[   root_selecteds     r(   _set_selected_projectsz&CmfPluginKaiten._set_selected_projects&  sb    &78A!D[) 	XVWWW"
 "
+J7"
 "
 "
r,   Tc           	      	   |                      || j        t          j        j                 d                   }d| j         d|d          d}|d                             dd          }d}|D ]$}t          |          |k    rt          |          }%t          t          j        j	        j
        t          j        j        j
        t          j        j        j
                  }	||	k    rt          |          dk    r|d         |d	<   d
|d<   d
|d<   nct          |          dk    r|d         |d	<   |d         |d<   d
|d<   n4t          |          dk    r!|d         |d	<   |d         |d<   |d         |d<   ddg}
t          j                            ddd| dg|
          }|sdddd| j         dgg dg}t          j                            dd|d         g|g|
          }|sht          j                            dd|d         g|g|
          }t          |          dk    rg }|sdd|d         g|g}t          j                            ||
          }|sdg}t          |t          |                    D ]}t          |          dk    rd	d|d         g}!t          |          dk    r*|                    dd|d         gd	d|d         gg           ^t          |          dk    r3|                    d	d|d         gdd|d         gdd|d         gg           ||g}t          j                            ||
          }|r|d         }d}|s|rd}d}|d         }t          j                            dd|                                g|
          rc|d                             d          \  }}| d| d| }|dz  }t          j                            dd|                                g|
          ct                              ||d           }nd |fS |rt%          j        d!t'          |j                            }d" |D             }t          |          dk    r|d         |d<   |j        r|D ]}t-          ||||                    |j        r||j        vr|j         | |_        n||_        d|_        |j        r|                    d#           ||fS )$Nr   r   r   r'   r   rB   r   r   	last_namer   
first_namesecond_namerC   r   rg_member_ofr   r   r   r   ORzNOT LIKE%::::%)r   r~  NloginILIKEr   FT@+)r   r  import_originalz[,;\s]+c                 ^    g | ]*}|                                 |                                 +S r*   r   )r   r   s     r(   r   z3CmfPluginKaiten._process_person.<locals>.<listcomp>  s-    III5;;==IekkmmIIIr,   save_import)r  r  rR   r   r!  r  r]  r,  minr  
max_lengthr  r  rT   listr   r   r   r   rf   r  r  setattrr   
user_localr  r  )r[   r   r   r   	user_dictr   r   current_length_namer'   max_length_namer   r  not_source_hash_filterpersons_filter
name_combo
is_creatednr  prefix_emaildomainemailsr:  s                          r(   r   zCmfPluginKaiten._process_person0  s   ''M&*78B
 
	 9d&88$t*888f%++C33	   	0 	0D4yy...&)$ii#'2&1(3
 

 /119~~"")21	+&*,	,'+-	-((Y1$$)21	+&*3A,	,'+-	-((Y1$$)21	+&*3A,	,'+4Q<	-(~&!%%fm&mmm4 & 
 

  9	( :'BT-='B'B'BC&&&&"
 %))gy'9:*  *  F  '( *// '9W+=>. " 0   w<<!## G W)F*;<.G %.33763RRG" W#'&*6y#i..*Q*Q # #J"9~~22+6A*O!$Y1!4!4 '%17JqM$J%0':a=$I0" !# !# !# !# "%Y1!4!4 '%0':a=$I%17JqM$J%2GZ]$K0" !# !# !# $2# #)"2"7"7wv"7"V"V ($QZF
 	( (!
!'*&**7GU[[]]2S\b*cc +4W+=+C+CC+H+H(L&+::a::&::EFA &**7GU[[]]2S\b*cc   ))!$(	 *   Z'' 	. Xj#fl*;*;<<FIIIIIF6{{Q%.w%7	'" % 9$ 9 9CFC38888 } '..'-}$>f$>$>FM & $F  .---z!!r,   u-   Обработка пользователейc                 $   | j         j        j                            dd          s!| j         j                            d           d S t                      }|                     d          D ]}	 | j                                         r d S | 	                    |          \  }}| j         xj
        dz  c_
        |j        rB|j        s;|j                            d          s!|r|                    |j        j                   #  | xj        dz  c_        | j                             d| dd	
           Y xY w|rU| j         j        j                            dd          r2t#          t$          j        j        t+          |          g           d S d S d S )N
load_usersTu8   Отключен импорт пользователейr  r   z.evateam.ruu@   Не удалось загрузить пользователя zERR-0008r   r   send_invitesF)r"   )r   r  rj   rT   r\  r]  r  r-  r   r   imported_object_countr   r   rj  r  r   r    schedule_deferred_jobrR   r   register_personsr  )r[   new_user_emailsr   r  r  s        r(   _process_userszCmfPluginKaiten._process_users  s   ,266|TJJ 	O"**+efffF%%$$W-- 	 	D?,,.. FF%)%9%9$%?%?"
55:55 L<"0< #L11-@@< #	< $''(:;;;1$))]W[]]( *       	ct<BFF~W\]] 	c!&"2"C4P_K`K`Jabbbbbb	c 	c 	c 	cs   -D 	A6D  2D4r   c           
      X   |d         }|dk    r	|d         }n|d         }|dk    r|rdnd}n}|dk    rd}nt|dk    rd}nk|d	k    rd	}nb|d
k    r|rdnd}nU|dk    rd}nL|dk    rd}nC|dk    r|rdnd}n6|dk    rd}n-t          d|d          d|d          d|d          d|           |S )Nr<   r   r   r   r   rf   r_   r   r   r   choice_multi
choice_strnumberfloatr   r   r   r  r   u<   Не удалось сопоставить тип поля 'r'   r   r   u   ). Тип 'u%   ' не поддерживается: )r   )r[   r   ext_field_typer  field_custom_types        r(   _map_field_typezCmfPluginKaiten._map_field_type  sj   "6*X%% -HH 0HX%%*2 =u$$ %w&& 'w&& 'x''2: Lx'' 'v%% *v%%+3 ?z)) * _yY_O` _ _enoset _ _$V,_ _S\_ _  
 ! r,   c           	      N   ddddddddd	iid
dddddi g ddddiid
g| _         | j         D ]}|d         d         }|d         d         }t          j                            |          }|su| j        j                            d| d| d           t          j        di |d         }d|_        | j        |_        d|_        |	                    d           d| _
        n&| j        j                            d| d| d           ||d<   | j
        rt                       dS dS )u]   
        Создает служебные пользовательские поля
        cf_kaiten_card_idz	Kaiten IDu   ID карточки в KaitenTrf   )r'   captionr  field_readonlyr  positionorderno  )paramsscreencf_kaiten_board_laneu   Дорожкаu(   Дорожка на доске в KaitenFr  )r'   r  r  r  r  r
  disabled_choicesafter_fieldlistsr  r  r'   r      Создание поля 'r   r  r     Найдено поле 'fieldNr*   )rP   rR   CmfCustFieldrT   r   r\  r  dirtyr  r  _gen_field_metarA  r   )r[   
field_datafield_captionr   service_fields        r(   _process_service_fieldsz'CmfPluginKaiten._process_service_fields  s    0*>&*).  D 1  3/I&+)5!(*   8  
8 . 	0 	0J&x0;M#H-f5J"/333DDM  	j&++,i-,i,i\f,i,i,ijjj & 3 K Kj6J K K&*#+/?(04-""t"444'+$$&,,-h-h-h[e-h-h-hiii"/Jw 	LLLLL	 	r,   c                    d| _         |                                  d | _        | j        D ]N}| j        t
          j        j                 d         D ])}d|vr|d         d         |k    r| j        |         |d<   *O| j        j	        
                    d           d t
          j                                        D             }g }g }| j        t
          j        j                 d         D ] }|d         }|                    d          }|s$| j        j	                            d| d	           F|d
         r$| j        j	                            d| d           r	 |                     |          }nD# t          $ r7}	| xj        dz  c_        | j                            |	dd           Y d }	~	d }	~	ww xY w|d         }d| d| j                                         }
|
|d<   | j         d| }t
          j                            |g dd          }|s,t
                              ||d         |d|| j        d          }|j        }|j        r2| j        j	                            d|j         d|j         d           |
|v r||
         d         |j        j        k    r[| xj        dz  c_        | j                            d|d          d|d          d|j         d||
         d          d| 
dd           ||
         |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 ]M}|d%         }tB          "                    |d&d'(          }||<   |d)         d*k    r|#                    |           Nfd+|D             }|$                    |           |$                               ||_        tK          tM          |                    |_'        n|d,k    r|(                    |           |j)        rd|_*        |(                    |           |+                    d-           |d.k    r+|r)d/|_,        |j,        |_        |+                    d0           t[                       |rd| _         | j         r| j        j	        
                    d1           t
          j        .                    t^          j0        1                                2                    d2          d3dd4           t
          j        3                    d5d3i           d6 t
          j                                        D             }|D ]}||d                  |d
<   |D ]}t
          j        j4        |d
         d7                  }tk          t
                    |j6                 }|d         d$                                          D ]t}|d%         }|                    |8          }|s ||8          }to          |                    d)          d*k              |_8        |j)        r|+                                 u| j        j9        j        }|d9         D ]B}|d         t
          j        j        k    r%| j        t
          j        j                 d         |d<   C|| j        _9        tu                      5  d| j        j9        _)        | j        j        +                    d0           t[                       d d d            d S # 1 swxY w Y   d S ):NFr   r   r   u>   Обработка пользовательских полейc                      i | ]}|d          |S r   r*   r   r{   s     r(   
<dictcomp>z:CmfPluginKaiten._process_custom_fields.<locals>.<dictcomp>Z      WWWaqWWWr,   r   u
   Поле 'u'   ' не пользовательскоеr   u!   ' уже сопоставленоr   zERR-0009	CmfUiFormr   r   r  r'   r   )widgetr
  r  r  cmf_deletedr  Tr   r   r9  )r  r'   r  r  r   r   r  r   u   ) удаленоr  u5   Не удалось сопоставить поле 'u   ). widget поля 'u7   ' не совпадает с существующим 'z': zERR-0010r  r  r  r  r   rj   r~   r   r   	conditionr  c                     h | ]}|v|	S r*   r*   )r   r:  default_choicess     r(   	<setcomp>z9CmfPluginKaiten._process_custom_fields.<locals>.<setcomp>  s.     ( ( ( #o55 555r,   r  r  r   	CmfMarkupr  u&   Генерация меты полей%Y%m%d%H%M%Sr   meta_version
model_nameforcecmf_model_namec                      i | ]}|d          |S r  r*   r  s     r(   r  z:CmfPluginKaiten._process_custom_fields.<locals>.<dictcomp>  s    [[[!1\?A[[[r,   r   r   import_settings);r  r  rN   r7   r  rR   r   r!  r   r\  r  r   rT   rA  r  r   r   r    r  r   r  is_newr  r]  r'   r  r  rj   r  r  r
  r  r  rk   r   r  r   sortedr  r  r   r  r  r  
field_typer   custom_fields_gen_metar   r   nowstrftimecustom_field_sync_update_modelsr   varsr   bool
cmf_hiddenr  r3   )r[   ext_field_idr  shop_fields
new_fields
m2m_fieldsfield_titler   r  r%   r   cust_field_ext_id
cust_fieldis_new_cust_fieldcurrent_choicesdefault_disabled_choicesrj   r  r	  r  field_classchoice_modelr   r  r  r  s                            @r(   _process_custom_fieldsz&CmfPluginKaiten._process_custom_fieldsI  s   $ 	$$&&&  $ . 	J 	JLv~'BCHM J Je++%d+|;;)-);L)IE+&	J 	##$deeeWW6>3T3T3V3VWWW

]6>#>?I w	 w	E.K		+..I &,,-n+-n-n-nooo]# &,,-h+-h-h-hiii	$($8$8$C$C!!   1$))( *   
  %T?L@|@@d.>@@FFHHJ&E&M#'#3 E E| E E,00(   !% 1  J  	#00'v&7,#$( 1  
 !+ 1% &..YYYZ5GYYY   [((z*84
8I8OOOOOq(OOO--j%f-j j2;D/j j,6,=j j 9DJ8OPX8Yj j _hj j #!, .    '2:'>m$&,,MMM
MMM    &++O+OO*OOO   ) (4%0
"-6
*$44&0&8&>&D"O&(O/2uu,!*>!:!A!A!C!C 	D 	D%*7^
$+$:$:& ##% %; % %	
 6@	2 -99488CCC( ( ( ('6( ( ($ %++,DEEE#**?;;;)8J&28>N9O9O2P2PJ//&.88%%e,,,( -'+J$%%e,,,D111$..3D.,7J)(2(=J%OOdO333LLLL 	(#'D  	BO"''(PQQQN11$&KOO$5$5$>$>~$N$N"+"    N::<Li;XYYY[[v~7X7X7Z7Z[[[K# B B'25='Am$$   
	" 
	"E ./m0D\0RSK<<(9:L{+N;BBDD " ""7^
%))z):: ;)\z:::F$(;)?)?8)K$L$L!$ "KKMMM" ?06+, 	S 	SAyFN777"mFN,GHR((0%^^ 	 	7;DO)4O!&&&666LLL		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s+   E00
F1:-F,,F1A ]((],/],c                    dddddddddd	d
dg}|D ]}|d         }|d         }| j         j                            d| d| d           dd|gdd|gg}t          j                            |          }|s9t                              ||| j         d          }|                    d           |c S t                       d S )Nr   r:   r;   )r   r'   r<   rB   r>   r?   rC   r@   rA   r'   r<   #   Обработка статуса 'r   r  r   r   r   Tr'   r   r   r  r  )r   r\  r  rR   CmfStatusCoderT   r  r   )r[   statuses_datastatus_datastatus_namer   status_filterglobal_statuss          r(   _process_global_statusesz(CmfPluginKaiten._process_global_statuses  s!    .??/GGnh??
 ) 	! 	!K%f-K%f-KO"''(lk(l(l^i(l(l(lmmm k*[1M #044M4JJM  5 & 4 4$ +#$(	 !5 ! ! ""t"444    r,   c                    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                            ddd| dg          }|rh|                    |d                   }|rft
          j                            dd|d         gdg          }|j        rd| |j         |_        nd| d|_        |	                    d           dd|d         
                                g}t
          j                            |dg          }|r<|j        rd| |j         |_        nd| d|_        |	                    d           h| j        j                            d|d          d           d}t
          j                            dd|gd g          }t
                              |d         |d!t          |j                  d| d| j        "          }|	                    d#           t                       d$S )%u#    Маппинг Type в logic_type    Подзадачаztask.sub:default)r'   rF   	UserStoryztask.userstory:defaultz
Task Agileztask.agile:defaultBugztask.bug:defaultEpicztask.epic:default)r  SubtaskzSub-tasku   ИсторияStoryu   Задачаu   ЗаданиеTaskr   u   Багr  u   Эпикu   Вехаr  r7  u*   Обработка типа задачи 'r'   rh  r   r   r   r   r  r  r   rF   r~  r   Tr  r  u   Тип 'u.   ' не найден и будет созданui_colorr   )r'   templater  r"  r   r   r  N)r-  r   r\  r  r  rR   rV   rT   r   r  r   rf   r"  r   )	r[   	name2code	task_typer  r   logic_type_dictr  template_codelogic_type_templates	            r(   _process_task_typesz#CmfPluginKaiten._process_task_types!  s    ,@I["\"\ 4>PQQ!5?QRR'2<TUU)3KLL%1;OPP'3=QRR)3GHH%*4FGG$.@AA!+=>>!'1DEE!'1DEE#-@AA
 
	" )),77 9	. 9	.IO"''(iU^_eUf(i(i(ijjj $(#3 H Hy H H,00 &*F0A*F*F*FG 1  J   (mmIf,=>>O 
#044"D/&*AB$: 5  
 $ C(S->(S
@Q(S(SJ%%(B->(B(B(BJ%$/// w	&(9(?(?(A(ABG,00 z 1  J  $ C(S->(S
@Q(S(SJ%%(B->(B(B(BJ%$///O"''\9V,\\\   1M"("5"9"9m4"| #: # #
  ,,v&,(09::1-111? -  J OOO----r,   u   Обработка теговc           
      ^   ddl m} |                     d          D ]}|d         }|d         }	 |                    dd                              dd	          } ||d
d          }ddd|gddd| dgddd| dgg}t          j                            |          }|s?t                              |          }|                    d           t                       # t          $ r?}	t                       | j                            d| d| d|	 dd           Y d }	~		d }	~	ww xY wd S )Nr   translitr8  r   r'   r   r  #r   ruTlanguage_codereversedr  r  alias""%r   r   r  u+   Не удалось создать тег 'r   r  zERR-0011CmfTagr   r   )transliterater,  r-  r   rR   r5  rT   r  r   r   r   r   r    )
r[   r,  tag_datatag_idtag_namer'   r2  
tag_filtertag_objr%   s
             r(   _process_tagszCmfPluginKaiten._process_tagsq  s   ******((00 	 	Hd^F'H''S1199#rBB MMMWd+g|4|||4g}5}}}5	
 !-++:+>> !$mmm66GLLTL222LLL   ))_(__v__Z]__)% *        #	 	s   B0C!!
D*+4D%%D*c           	      d   | j         d         }d |                     d          D             }i }| j         d         pg }|D ]G}|                    |          }|s$| j        j                            d| d           =||i dd||<   H|                     |          D ]}|d	         }|                    |d         |d         |d
         |d         pi dd          }	|                    d          pi }
|
                                D ]}||	d         vrd|	d         |<   |	dxx         dz  cc<   |S )uh   
        Получает все используемые в проекте типы задач
        r   c                 ,    i | ]}|d          |d         S )r   r'   r*   )r   r%  s     r(   r  z;CmfPluginKaiten._get_project_task_types.<locals>.<dictcomp>  s3     
 
 
 dOYv.
 
 
r,   r7  allowed_card_type_idsu=   Не удалось найти разрешенный тип u5   . Возможно он был удален в Kaitenr   )r   r'   r   r  r<   r'   r   Fr  r   )	_project_datar-  rT   r   r\  r]  r,  r  keys)r[   rC  all_task_typesr7  r@  type_id	type_namer  r%  task_type_datatask_propertiesr   s               r(   _get_project_task_typesz'CmfPluginKaiten._get_project_task_types  s    '-

 
!--l;;
 
 
 
 !% 23J K Qr, 	 	G&**733I &..KT[ K K K   ! 	# #Jw 00<< 	. 	.I "&)I'22$#D/%f-"+L"9"?R"#	  N (mmL99?RO.3355 F Fn\&BBB@EN<0= <(((A-((((r,   c                 8   d t           j                                        D             }| j        d         }| j        d         }|d         }|d         }|dk    rd| }| j         d| d| }t           j                            |dd	g
          }| d| }	|s| j        j        	                    d|	 d           t                               |	d|| j        d          }|
                                 g d}
t           j                            |          }|D ])}|j        |
vrd|_        |
                    d           *|j        r||_        |
                                 n#| j        j                            d| d           dddddddddddddddd}|                                D ]M\  }}dd|gdd|d         gdd|gg}t           j                            ||d         dg          }|||         d <   N| j        D ]`}|                    d!          }|s|d"         }|d#         }t           j                            d$d|gdd|ggd%          }|s	t                               ||j        ||d&         d          | j        d'          }d }|                    d(          r	|d(         }na|                    d)          rLt           j                            dd|d)         gdd|gd*d|d&         d          ggd(g+          }|r
|j        d,z   }|||_        |
                    d           | j        j        	                    d-| d.|j         d/|j         d0           b|d1                                         D ]\  }                    d2d3          d4 d5| j                                         }||vr@t3          fd6| j        t           j        j                 d7         D             d           }|s| j         d|d8         d          }t           j                            |d9d:g
          }t           j                            d$d|gdd|ggd;g+          }|rA|j        s:| j        j                            d<| d=|j         d>|j        j         d?           '|st           j                            d$d|gdd|gg d@g dAgd%          }|r-| j        j                            d<| d=|j         dB           t                               |||| j        dC          }|j        dDv r|dE         d          |_        n|j        dFv r|dG         d          |_        n|j        dHk    rt|dI                             d           sEt                               dId|| j        dJ          }|
                    d           ||dI         d <   |dI         d          |_        n|dK         d          |_        ||_        |j         rj|j        j!        }|j        j        }| j        j        	                    d-| dL|dk    rdMndN dO| dP|j         d/| d0           |
                    d           |"                                 tG                       |S )QNc                      i | ]}|d          |S r  r*   r  s     r(   r  z3CmfPluginKaiten._process_screen.<locals>.<dictcomp>  r  r,   r   r:  r'   default   для типа r   r   r   r   r   u   : Экран задач u   Создание экрана 'rh  r   T)r'   r  r   r   r  )	_main   Участники   Датыu   Планu   Разработкаu
   Связи_addon_custom_descrparentr  u   Экран u|    был изменен пользователем. Изменения из импорта не будут примененыgroup)r<   systemtabF)rN  rO  rP  rR     Дополнительноеr   r<   rU  rW  )r   rW  r   r!   r  r  r  r	  r   r9  rN  )r	  r'   rU  ui_form_groupr   r  r  r  r[  r   i  u   На экран uA    в группу 'Основные' добавлено поле 'r   z) r   r   r   r   r  c              3      K   | ]:}|                     d           r#|d          d         t                    k    6|V  ;dS )r   r   N)rT   r-  )r   r  r   s     r(   	<genexpr>z2CmfPluginKaiten._process_screen.<locals>.<genexpr>O  sa        #yy--272DT2JcR]N^N^2^2^ 2^2^2^2^ r,   r   r   r  r  zui_form_group.typeu   На экране u    поле 'um   ' было изменено или уже добавлено пользователем во вкладку 'uL   '. Изменения из импорта не будут примененыr  r   Tr   !=Nu   ' было удалено пользователем. Изменения из импорта не будут применены)r	  r'   rU  r   r  )r   r  rO  )r   r   rP  r   rY  )r'   r<   rU  r   r  rR  r   u   во вкладкуu   в группуz 'u   ' добавлено поле ')$rR   r   r   rA  r  r  rT   r   r\  r  r  CmfUiFormGroupr  r'   rW  r  r  r]  r   rP   CmfUiFormFieldr  r  r   r   nextr  r!  r  r[  r  required_changer  r<   invalidate_cacher   )r[   rF  r  rC  rG  task_type_idtask_type_namescreen_ext_idui_formscreen_namedefault_groupsui_form_groupsr[  
group_name
group_datar  service_field_datar  r  screen_positionui_form_fieldr  r  requiredr   r  r  r	  
group_typer   s                                @r(   _process_screenzCmfPluginKaiten._process_screen  sE	   WW6>3T3T3V3VWWW'-
(/%d+'/9$$@@@N+KKzKK\KK"&& & ' 
 
 %NNnNN 	5O"''(X+(X(X(XYYY&& ($? $ '  G LLNNN
 
 
N $277w7GGN!/ 5 5 %^;;'+$""t"4444" 	&4G#LLNNNNO"**]g ] ] ]   &66+2d"C"C!(D99 '488 6;e,L,L
 
 '5&:&:&<&< 	> 	>"J
j)j013(G
 #155!(+x 6  M
 1>N:&u--
 #'"6 *	 *	.227;;M  '1F$Z0O"155!36sG, !% 6  M !  & 5 5,&+""0"9%"@#$( !6 ! ! "&&y11 <-i8GG$((77 
<"("7";";#S/-*HI%sG4,c>'3J53QR 
 !*{ #< # #K # <"-"5";&,3M)""t"444&++ew e e4A4Ie eN[N`e e e   &4L%A%G%G%I%I g	5 g	5!K%--eR88K?{??T-=??EEGGJ,,   '+}V^5P'QRZ'[    E  #'#3 Q Qu[7I$7O Q Q,00(' 1  J #155!3
3sG,
 ) 6  M  ]%B &..a a a!+!3a a -:,G,La a a      & 5 9 9%sJ7!30222222	 %) !: ! ! ! O*22eW e e%/%7e e e  
  & 5 5)#"#$( !6 ! ! +/@@@.<=Q.RSX.Y++-1EEE.<Z.H.O++-77%&DEII%PP 	Z$*$9$9;"&#'?(, %: % %M "&&4&888LYN#AB5I.<=[.\]b.c++ /=Y.G.N+,4M)' 5*8=
*8=
&++Zw Z Z0:e0C0C,,IZZ Z^hZ Z4>4FZ ZKUZ Z Z  
 ""t"444  """r,   u,   Обработка схемы экрановc                    | j         d         }| j         d         }| j         d         }| j         d| }t          j                            |dg          }|s>t                              | d| || j        d	          }|                    d
           |j        r|j        s9t          j	        
                    |          D ]}|                    d           d}d }	t          |          }ddi d|d<   |                                D ]f\  }
}|d         }|
dk    rw|                    d          s*d| j         d|
 d}t          j                            ddd| dg          }|s%| j                            d| d|
 ddd           d| }	 |                     |          }n:# t"          $ r-}| j                            d| d| d d           Y d }~d }~ww xY w||d!d| j        d"}t          j	        j        d(i |d#d$d%gi}|st          j	        d(i |}|
dk    r|j                            |           n|}	|                    d
           t)          |j        |          }h|	r+|	j        |k     r |d&z   |	_        |	                    d
           n"| j        j                            | d'           |S ))Nr   r:  r   r   r   rM  u+   : Схема экранов проекта Tr'   r   r   r  r  )ui_form_schemeTEXKOM_db_deleter   rK  u   по умолчанию)r   r'   r   r'   r   r   r   r   r   <   Не удалось найти логический тип 'r   r  ERR-0012CmfUiFormSchemer   rL  u:   Не удалось импортировать экран r   zERR-0013r   )rw  r  r  crud_choicer   r   logic_typesr  r  e    была изменена. Изменения из импорта не будут примененыr*   )rA  r  rR   r|  rT   r   r  r  r  CmfUiFormSchemeRuler  deleter   r   rV   r    rt  r   r~  r   maxr  r\  r]  )r[   r7  rC  rG  rD  ui_form_scheme_ext_idrw  rulemax_ordernodefault_rulerf  rF  rg  r  r   ri  r%   	rule_dicts                     r(   _process_screen_schemez&CmfPluginKaiten._process_screen_scheme  s   '-
(/*73#'#3 C Cz C C/33(5 4 
 
  	2#33#__P]__,? $	 4  N D111) H	!( 7"6;;>;ZZ 7 7DKKK6666KL!*--J  1 % %Jy!
 1;0@0@0B0B 0= 0=,n!/!79,, *--l;; ! (QT-=(Q(Q(Q(Q(Q%!'!4!8!8 (&2J6G2J2J2JK "9 " "J & !11}[i}}nz}}}&%6 2   
 !%H%H%HN"22>BBGG    O--lUcllgjll"!2 .   
 HHHH '5%&/#,"&/ 	 15   )95    C!5BB	BBD9,,$++J7777#'L		d	+++!$,<< 4 4{ B B'2T'9$!!d!333O"**! ] ] ]  
 s   F00
G':#G""G'uA   Обработка схемы конфигурации полейc                 T   | j         d         }| j         d         }| j         d         }| j         d| }t          j                            |dg          }|s;t                              | d| || j        d	          }|                    d
           t          j                            |dg          }|stt                              | d|d| j                  }|                    d
           t                              dd|d| j                  }|                                 t          	                    ||g | j        dd          }|                    d
           |
                                 |                    d
           |                                 |S )Nr   r:  r   r   r   rM  u@   : Схема конфигурации полей проекта Trv  r  u=   : Конфигурация полей по умолчанию)r'   r   r  r      Спискиr  )r  r'   rU  rr  r   r   )cust_field_confrU  r~  r   r  r  )rA  r  rR   CmfCustFieldConfSchemerT   r   r  CmfCustFieldConfCmfCustFieldConfFieldCmfCustFieldConfSchemeRule
calc_cachere  )	r[   rC  rG  rD  r   field_config_schemafield_configfield_config_fieldr  s	            r(   _process_field_config_schemaz,CmfPluginKaiten._process_field_config_schema	  s   '-
(/*73$44
44$;??vWZV[?\\" &	0"("?"?#ttertt? $	 #@ # #  $$$666!266fcU6SSL *%66'fff!$(#	  7     !!d!333%+%A%A* '!# &B & &" #'')))44 ,*? $ 5  D II$I'''##%%%$///,,...""r,   c                    | j         d         }| j         d         }| j         d| d}t          j                            |          }|s,t                              | d| j        || j        d          }|j        r0|                    d	           | j        j	        
                    d
|            | ddddd| ddddd| dddddg}g }|D ]U}| j                            |d                   |d<   |                     ||          }	|                    |	j                   Vt          j                            dd|gdd|gg dgdgd          }
|
D ]O}t          j                            dd|j        gdd|j        gdd|gg          s9|                    d           Pn#| j        j	                            d| d            | j         d| }t          j                            |          }|sGt          j                            d!"          }t                              | d#||| j        d          }|j        r||_        ||_        ||_        d$}g }|                                D ]\  }}|d%         }|d&         }d| j         d| d}t          j                            d'd(d)| d)g          }|s%| j                            d*| d+| d,d-d./           q|                    |           ||k    r	|}||_        ||_        |                    d	           t          j                            |0          D ]}|                    d1           n#| j        j	                            d2| d3           |S )4Nr   r:  r   z	::defaultr   u@   : Бизнес-процесс задач по умолчаниюT)r'   r#  r   r   r  r  B   Обработка статусов бизнес-процесса z::1r:   r   )r   r   r<   
sort_orderz::2r>   rB   z::3r@   rC   r<   NOT INworkflowr   r   r   Nr   r   r   r9  r`  r   r     Бизнес-процесс a    был изменен. Изменения из импорта не будут примененыzsoftdev:defaultrE   u@   : Simple-схема бизнес-процесса проектаr   r'   r  r   r   r   rz  r   r  r{  CmfSchemeWfr   )	scheme_wfrx  u)   Схема бизнес-процесса r  )rA  r  rR   rX   rT   rY   r   r  r  r\  r  rQ   _process_workflow_statusr   r   r  r  r   r  r]  r  default_epic_workflowdefault_task_workflowdefault_subtask_workflowr   rV   r    default_task_logic_typestrict_task_logic_typeCmfSchemeWfRule)r[   r7  rC  rG  workflow_ext_idr  r  current_statusesr  workflow_statusworkflow_statusesr   scheme_ext_idschemescheme_templatemax_tasks_countr  rf  rF  rg  r  r  r   r  s                           r(   _process_workflow_schemaz(CmfPluginKaiten._process_workflow_schemaJ	  s   '-
(/!-FFFFF%)))AA 	))#eee0&? $ *  H # +	MMdM+++O"''(wmu(w(wxxx %)))4Da_`aa$)))4Eq`abb$)))NA]^__M
  ", < <&*&;&?&?F@S&T&TF#"&"?"?X"V"V ''(:;;;; !' 0 5 58%56h/)))
 & $ !6 ! ! , * * '++tVY/&V-?@#S(3 ,    D))))* O"**]x ] ] ]    +;;z;;#''}'== 	$044:K4LLO''#eee($? $ (  F ! '	+3F(+3F(.6F+O%'"0:0@0@0B0B @ @,n!/!7+L9
$M)9$M$M\$M$M$M!#044$f.F2C.F.F.FG 5  
 " O--yWeyyjvyyy"!. .   
 &--j999 //&0O5?F2,BF)KKDK))) .33f3EE 3 3T22223 O"**]F ] ] ]  
 r,   c                    |                     d          }|sd S | j                            t          j         dd           t          |d                                       d          }|D ]O}|d         r	 t          |d                   }|d	         }| j         d
| }|                    |          }	|		                                st          d          t          j                             |          }
|
s#t                              ||| j        d          }
|
j        r||
_        |                     d          |
_        |                     d          r!|                     |d                   |
_        nt$          j        |
_        |
j        |
_        ||
_        |
                    d           t/          |	d          5 }|
                    |                                d           d|
_        |
                    d           d d d            n# 1 swxY w Y   t5                       | j                            dd           # t          $ r`}t9                       | j                            t          j         d| d| d| d|           t          xj        dz  c_        Y d }~Id }~ww xY wd S )Nr  u$    Обработка вложенийTr   ru  r  
comment_idr   r'   r   w   Не найден файл вложения. Возможно при скачивании возникли ошибкиr  rU  r   r   r  r   r  r  r  smart_backupr  	processedu<    Не удалось обработать вложение 'r   r  zERR-0014r!   r   )rT   r   r   rd   task_msgr   rs   rf   r  rt   r   rR   CmfAttachmentr  r'   r   r  
cmf_authorr@  anonymous_userr   r  r  ru   upload_filer  r   r  r   r    r  )r[   task_objr  r  r  attachment_datar  attachment_namer  r  r  r{   r%   s                r(   _process_task_attachmentsz)CmfPluginKaiten._process_task_attachments	  s]   ]]7++
 	Fz2XXXdhiiiy455>>}MM) ,	' ,	'O|, )' #OD$9 : :"1&"9'+'7$J$J=$J$J!"1":":="I"I&--// # R   $155=N5OO
! !'!5!5'0#'?(,	 "6 " "J - :&5JO0?0C0CI0N0NJ-&**;77 A040@0@Q\A]0^0^
--010@
-+5+@J(1@J.OOO555ot44 :"..qvvxxd.KKK59
2"D999: : : : : : : : : : : : : : : (({CCCC ' ' '))!* D D'D D,9D D>AD D 	 *    !!Q&!!!!!!!'I,	' ,	's?   :EIAHIH	I"H	#,I
J;AJ66J;c                 @   |                     dg           }|r)| j                            t          j         dd           g }|D ]W}|                     |d                   }|s ||j        k    s||j        k    s||j        k    rB|	                    |           X|S )Nr   u,    Обработка наблюдателейTr   r   )
rT   r   r   rd   r  r  r   r  r   r   )r[   r  r  task_members
spectatorsr  r  s          r(   _get_task_spectatorsz$CmfPluginKaiten._get_task_spectators	  s     }}Y33 	O&TTT     
 
" 	& 	&F%%fTl33F  (...X000X///f%%%%r,   c           	         ddl m} |                    dg           }|r)| j                            t
          j         dd           g }|D ]}|d                             dd	                              d
d          } ||dd          }	 dddd| dgdd|gddd| dgg}t          j	                            |          }	|	st          d| d          |                    |	           # t          $ rK}
| j                            t
          j         d|
 d|           t
          xj        dz  c_        Y d }
~
d }
~
ww xY w|S )Nr   r+  r8  u    Обработка теговTr   r'   r   r  r-  r   r.  r/  r  r2  r  r3  r4  r   u   Тег 'u   ' не найденzERR-0015r   r!   r   )r7  r,  rT   r   r   rd   r  r   rR   r5  r   r   r    r  )r[   r  r  r,  	task_tagsr8  labelr2  r  tagr%   s              r(   _get_task_tagszCmfPluginKaiten._get_task_tags

  s   ******MM&"--	 	O&FFF     
  	' 	'E&M))#s33;;CDDEHU$FFFE'g}5}}}5We,g}5}}}5	 m''w'77 K#$Iu$I$I$IJJJC     ' ' '))!*22S22)  *   
 !!Q&!!!!!!!' s   A!C//
E9AD??Ec                    t          |d                                       d          }|                                sD| j                            t
          j         d| dd|           t
          xj        dz  c_        d S |                                j	        dk    r7| j        
                    t
          j         d	d
           t          |d          5 }	 |D ]i}t                              |          }| j         d|d          ||                    dd          d|d         |d         d|| j        d	}|                    d          r6|                     |                    d                    |d<   |d         |d<   |                    d          r+|                     |                    d                    |d<   t"          j                            |d                   }|sBt#          j        d i |}|j        j        t+          j        |j        j                  z   |_        |                    d
           kt5                       nf# t6          $ rY}	t9                       | j                            t
          j         d|	 d|           t
          xj        dz  c_        Y d }	~	nd }	~	ww xY wd d d            d S # 1 swxY w Y   d S d S )!Nru  r  u7    Файл журнала работ не найден 'u]   '. Возможно при дампе журнала работ возникли ошибкиzERR-0016r  r   r   u-    Обработка журнала работTr   rn   r   r   r  r   closedfor_date
time_spent)	r   rU  r   r   
start_dater  remaining_estimater  r   r  r  r   
updater_idcmf_modified_byr   r  r   r  uC    Не удалось обработать журнал работ. zERR-0017r*   )r   rs   is_filer   r    rd   r  r  rc  rd  r   ru   rv   rR  r  rT   r  rR   CmfTimeTrackerHistoryr  rj   r   r   r  end_dater  r   r   r   )
r[   r  r  r  r{   r`  r  timetracker_historyhistoryr%   s
             r(   _process_task_worklogz%CmfPluginKaiten._process_task_worklog,
  s}   i
344==oNN%%'' 	O%%& m m_m m m m	 &    "F  (1,,O&UUU     
 nd++ #+q"+  7 7#'::c??)-)9&M&MXd^&M&M&.$,LLB$?$?&.*2:*>*2<*@23/7*./
/ 
/+ $<<44 a@D@P@PQYQ]Q]^iQjQj@k@k/=?RS_?`/<#<<55 rEIEUEUV^VbVbcoVpVpEqEq/0AB"(">"B"BJ]^fJg"B"h"h& y&,&B&Y&YEX&Y&YG/6/A/G",_f_q_wJxJxJx/xG,6666LLLL  + + + NNNO--%.xxsvxx"$ .   
 %%*%%%%%%%+9#+ #+ #+ #+ #+ #+ #+ #+ #+ #+ #+ #+ #+ #+ #+ #+ #+ #+ -,s>   K	E;IK	
J9 AJ4/K	4J99K		KKc                    |                     d          }|sd S |d         }t          j         d| }| j                            | dd           t          |d                                       d          }g }|D ]}}	|	d	         |k    r	 t          |	d                   }
|	d
         }| j         d|
 }|                    |
          }|	                                st          d          t          j                             |          }|s#t                              ||| j        d          }|j        r||_        |	                     d          |_        |	                     d          r!|                     |	d                   |_        nt$          j        |_        |j        |_        |	|_        |                    d           t/          |d          5 }|                    |                                d           d|_        |                    d           d d d            n# 1 swxY w Y   t5                       |                    t          |                                                     | j                            dd           # t          $ rV}t=                       | j                            | d| d|
 d| d|           t          xj         dz  c_         Y d }~wd }~ww xY w|S )Nr  r   u    Комментарий u%   . Обработка вложенийTr   ru  r  r  r'   r   r  r  r  r   r  r  r  r  r  r  u=   . Не удалось обработать вложение 'r   r  zERR-0018r  r   )!rT   rd   r  r   r   r   rs   rf   r  rt   r   rR   r  r  r'   r   r  r  r@  r  r   r  r  ru   r  r  r   r   create_preview_tagr  r   r    r  )r[   comment_objcomment_datar  r  r  r  r  r  r  r  r  r  r  r  r{   r%   s                    r(   _process_comment_attachmentsz,CmfPluginKaiten._process_comment_attachmentsc
  s   ]]7++
 	F!$'
 )OO:OO>>> 	 	
 	
 	

 y455>>}MM) -	' -	'O|,
::*' #OD$9 : :"1&"9'+'7$J$J=$J$J!"1":":="I"I&--// # R   $155=N5OO
! !'!5!5*0#'?(,	 "6 " "J - :&5JO0?0C0CI0N0NJ-&**;77 A040@0@Q\A]0^0^
--010@
-+5+@J(1@J.OOO555ot44 :"..qvvxxd.KKK59
2"D999: : : : : : : : : : : : : : : ""3z'D'D'F'F#G#GHHH(({CCCC ' ' ')) D D'D D,9D D>AD D#	 *    !!Q&!!!!!!!' s@   EJAH0$J0H4	4J7H4	8A J
K:$AK55K:c           
         t          |d                                       d          }|                                sD| j                            t
          j         d| dd|           t
          xj        dz  c_        d S |                                j	        dk    r| j        
                    t
          j         d	d
           t          |d          5 }|D ]`}	 t                              |          }| j         d|d          }t          j                            |          }|s$t                              ||| j        d
          }n|                    dg           |j        s|                    d          pd|_        |                    d          r,|                     |d                   |_        |j        |_        |d         |_        |d         |_        ||_        ||_        |                    d
           t;                       |                     |||          }	|d         dk    rdnd}
|                     |j        j         |||
          }|	r!|dz   d!                    |	          z   |_        n||_        |j"        r$|                    d
           t;                       | j        #                    dd           # tH          $ r]}tK                       | j                            t
          j         d| d| d |           t
          xj        dz  c_        Y d }~Zd }~ww xY w	 d d d            d S # 1 swxY w Y   d S d S )!Nru  r  u6    Файл комментариев не найден 'u\   '. Возможно при дампе комментариев возникли ошибкиzERR-0019r  r   r   u,    Обработка комментариевTr   rn   r   r   r  r  z**r   r   r  r   r   r  r<   markdownhtmlz<p></p>r  r  uB    Не удалось обработать комментарий: r   zERR-0020)&r   rs   r  r   r    rd   r  r  rc  rd  r   ru   rv   rR  r  rR   
CmfCommentrT   re   r  r   r  r  r   r   r   rU  r  r  r   r  _convert_textrj   r  r  r  r   r   )r[   r  r  r  r{   r`  r  comment_ext_idr  r  	text_typer   r%   s                r(   _process_task_commentsz&CmfPluginKaiten._process_task_comments
  s$   Yz233<<_MM$$&& 	O%%& l l^k l l l	 &    "F'!++O&TTT     
 mT** 2/a 1/ 1/C0/'+zz#,0,<)T)TT@R)T)T"("3"7"7~"7"N"N& 8&,&7&7'/'5+/?04	 '8 ' 'GG $//777&6 %$'3'7'7'?'?'E2'++K88 C151A1A,{B[1\1\G.070BG-2>y2I/1=i1H.)12>/666"&*&G&G#(%' '
 3?v2F!2K2KJJQW	#11',2DgyZcdd& 0+/)+;bggk>R>R+RGLL+/GL"- )#LLTL:::&LLL00KHHHH$ / / /$11)2  C  Cvy  C  C  ~A  C  C& ( 2   
 #))Q.)))))))/U1/2/ 2/ 2/ 2/ 2/ 2/ 2/ 2/ 2/ 2/ 2/ 2/ 2/ 2/ 2/ 2/ 2/ 2/ ,+sK   MBK.M/E"KM
L:AL5/M5L::MMMc           
         t          |d                                       d          }|                                sD| j                            t
          j         d| dd|           t
          xj        dz  c_        d S t          j	        j
        j        }|                                j        dk    r| j                            t
          j         d	d
           t          |d          5 }|D ]|}	 t                               |          }| j         d|d          }t          j                            dd|gg ddd|ggd
dg          }	|	r|	j        r|	j        ro|	s9t                              ||| j        d
          }	|	                    d
           t          j	                            dd|	gdg dg dggd
          }
|
rt          j	                            |	          D ]}|                    d
           d}d}t7          |                    dg           d           }|D ]}|dz  }|d          r|dz  }t          	                    ||	|d          sd!nd"d
|#          }|d$         }t9          |          |k    r|d |         |_
        ||_        n||_
        |                    d
           |d%         |	_
        ||	_        ||	_        ||	_         |	                    d
           tC                       # tD          $ r]}tG                       | j                            t
          j         d&| d'| d(|           t
          xj        dz  c_        Y d }~vd }~ww xY w	 d d d            d S # 1 swxY w Y   d S d S ))Nru  r  u1    Файл чек-листов не найден 'uW   '. Возможно при дампе чек-листов возникли ошибкиzERR-0021r  r   r   u'    Обработка чек-листовTr   rn   r   r   rU  r   r_  r   r  r8  r  r  r  )r  r   Fr^  rZ  rT  rx  r   c                     | d         S Nr  r*   )xs    r(   r  z:CmfPluginKaiten._process_task_checklists.<locals>.<lambda>+  s
    !L/ r,   r:  checkedr;   rH  )
cache_taskrU  r   r  r  r   r'   u;    Не удалось обработать чек-лист: r   zERR-0022)$r   rs   r  r   r    rd   r  r  rR   CmfChecklistItemr'   r  rc  rd  r   ru   rv   rR  r  CmfChecklistrT   r  r  r  r>  r  r  r  r,  r   checklist_items_countchecklist_items_done_countr  r   r   r   )r[   r  r  r  max_item_name_lengthr{   r`  r  r   r  modified_itemitemitems_countitems_done_count
items_data	item_data	item_textr%   s                     r(   _process_task_checklistsz(CmfPluginKaiten._process_task_checklists
  s   y455>>?PQQ&&(( 	O%%& g gYh g g g	 &    "F%6;F!!)A--O&OOO     
 ot,, R/ Q/ Q/CP/)-C$($4!N!Nt8L!N!N$*$7$;$;!)3 9 : : :!)3 7$
 -1$1? %< % %	 % 	=i.G 	=9K` 	=$!* =(.(;(;'/'-+/?04	 )< ) )I &NNtN<<<(.(?(D(D!)3	 :$($C$C$C$>$>$>!"$ -1 )E 
) 
) ) %$$*$;$@$@	$@$R$R ? ?D KKK>>>>&'+,(%+*..w;; 9 9& & &
 *4 8 8I'1,K(3 6 0A 5 0#)#:#:+3'05>y5I'Uvvv0409 $; $ $D )2&(9I"9~~0DDD,56K7K6K,L	,5		,5	 II$I7777)7)?	:E	7?O	<4B	1!4888"$ / / /$11)2{{or{{vy{{& ( 2   
 #))Q.)))))))/UQ/R/ R/ R/ R/ R/ R/ R/ R/ R/ R/ R/ R/ R/ R/ R/ R/ R/ R/ .-sX   .M=5A*LM= A*L
M=D8LM=
M,AM'!M='M,,M==NNc           	         |                     d          }|sd S | j                            t          j         dd           t
          j        j        j        }| j	        j
                            d          }t          j        d| d          }|D ]O}|d         }|                    |          }	|	r#	 | j         d	|d
          }
t
          j                             |
          }|s#t
                              ||
| j        d          }|j        rd|d         }t#          |          |k    r|d |         |_        n||_        ||_
        ||_        |                    d           t)                       # t*          $ r]}t-                       | j                            t          j         d| d| d|           t          xj        dz  c_        Y d }~Id }~ww xY wd S )Nexternal_linksu=    Обработка ссылок на веб-страницыTr   rQ  ^/(\d*)$r_   r   r   r  r  r  uU    Не удалось обработать ссылку на веб-страницу 'r   zERR-0023r  r   )rT   r   r   rd   r  rR   CmfLinkr'   r  r6   r_   rstripr   compilematchr  r  r,  r  r  r   r   r   r    r  )r[   r  r  r  max_link_name_lengthapp_urlpatternexternal_linkr_   r  external_link_ext_idlinklink_urlr%   s                 r(   _process_task_remotelinksz)CmfPluginKaiten._process_task_remotelinksP  sO   "'788 	F"aaa 	 	
 	
 	

  &~2=+/((--*2'22233+ "	' "	'M&CMM#&&E '*.*:'S'SmD>Q'S'S$~))1E)FF !>>'3#'?(,	 *  D ' 	!,U3H8}}';;;$,-B.B-B$C		$,	'DH+8D(II$I///LLL ' ' '))!* C C58C C=@C C 	 *    !!Q&!!!!!!!'5"	' "	's   6CE99
G AGG c                    |j         dv rd}nd}|                    dddi          D ]}	 |                    d          r|                     |d                   }nt	          d	          t          |                    t          |j                  t          |j	                  t          |j
                  t          |j                  
          d          }|                    |j                   # t          $ rC}t          xj        dz  c_        | j                            d| d| d|           Y d}~d}~ww xY w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   Не найден аттрибут для определения пользователя)	person_idperson_loginperson_hrefperson_namehtml.parserr   uR   Ошибка конвертации упоминания пользователя r  zERR-0024r  N)
class_namefind_allrT   r  r   r   formatrf   r   r  r  r'   replace_with
currentTagrd   r  r   r    )r[   	text_soupr!   TMPLr  r  new_tages           r(   _convert_mentionsz!CmfPluginKaiten._convert_mentions  s    >l++DD D: %%fWn4M%NN 	 	C77+,, A!--c2B.CDDFF#$  A  A  A'KK"%fi..%(%6%6$'$4$4$'$4$4	     "    !34444   !!Q&!!))silsspqss *        #	 	s   C	C66
E 8D>>Ec           
      @   t           j                            | j        j                  }|                    d           D ]}|j                            d          r|                    d          r!|j        d         	                    d          rT| j
        j                            t          j         d|            |                    d          r|j        d         }n|j        d         }t           j                            |          }|j        }|r|dk    rt           j                            |          rdv r|                    d	g           }t%          fd
|D             d           }	|	r"t'          |	d                   }
| j         d|
 }nd }dg}|r"t*          j                            ||          }n(t*          j                            ddd dg|          }|rE|                    d          r|j        d         |j        d<   |j        |j        d<   d|j        d<   t1          j        |j        d                   }|rH|d         r@|d         	                    d          r%d|_        d|j        d<   d|j        d<   d|j        d<   |                    d          r.|j        d         |j        d<   |j        |j        d<   d|j        d<   | j
        j                            t          j         d| dt           j                            |j                   d           |j        r|j        |j        k    rt;          j        d |j                  }|r|                    d!          }| j         d| }t*          j                             |"          }|rg|j        d         |j        d<   |j!        |j        d<   d|j        d<   | j
        j                            t          j         d| d|j!         d           ||d#<   d S )$Nc                 V    |                      d          p|                      d          S )Nr  src)has_attr)r  s    r(   r  z0CmfPluginKaiten._convert_links.<locals>.<lambda>  s$    #,,v2F2F2]#,,W\J]J] r,   cmf_convertedr  r-  u2    Конвертация ссылки в теге: r"  rQ  ).z..r  c              3   0   K   | ]}|d          v |V  dS )r_   Nr*   )r   attr  s     r(   r]  z1CmfPluginKaiten._convert_links.<locals>.<genexpr>  s2      #Z#ZC)sSXzBYBYCBYBYBYBY#Z#Zr,   r   r   r_   rM  r  r   z%"url":"http%/r4  r   src_origTr   videocontrolsz100%widthheight	href_origu    URL заменен: 'u   ' на 'rh  z	/(\d+)/?$r   r  zdata-issue-id)"urllibparseurlparser6   r_   r  r  rT   r#  r   r   r\  r  rd   r  r  r1   basenamerc  rf   r  rR   r  r>  	mimetypes
guess_typer'   unquote_plushostnamer   searchrV  r   r  )r[   r  r  
kaiten_urlr  r_   
parsed_urlurl_pathr  r  r  r  attachment_fields
attach_obj	mime_type
path_matchrv  task_ext_idr0  r  s                      @r(   _convert_linkszCmfPluginKaiten._convert_links  s   \**4;?;;
%%&]&]^^ P	3 P	3Cy}}_-- ||F## 	&(9(D(DS(I(I O"'':+>(w(wru(w(wxxx||F## 'i'i&..s33J!H x3((22I 	[ 8 8#--44K"#Z#Z#Z#Z;#Z#Z#Z\`aaO ) #OD$9 : :'+'7$J$J=$J$J!!$(!!&  	#166,, 7  


 $166-v7U	7U7U7UV, 7  

  <<&& 	5,/Ie,<CIj)'1~CIe$15CIo. ) 4SYu5E F FI  5Yq\ 5il6M6Mg6V6V 5#*0:	*--3	'*.4	(+<<'' 6-0Yv->CIk*(2CIf%15CIo.&++!* R RR R%+\%>%>z~%N%NR R R   " z':j>Q'Q'Q <AAJ 3$**1--!%!1>>W>>~)))== 3-0Yv->CIk*(,	CIf%15CIo.O*//%.__c__SWS\___    ,3C(aP	3 P	3r,   c                     |                     d          D ]<}|                    d          }|r#|                    d          r|d         |d<   |d= =dS )uF   
        Конвертирует "Фрагмент кода"
        prerF   r  N)r  findr#  )r[   r  rA  rF   s       r(   _convert_code_blockz#CmfPluginKaiten._convert_code_block!  sl     %%e,, 	" 	"C88F##D "g.. "#G}GM		" 	"r,   c           	      <   d}|                     dddi          D ]}	 |                    dddi          }|                    d          }t          j                            |t          |j                            }t          |	                    d	||
          d          }|
                    |j                   # t          $ rN}	| j                            t          j         d| d|	 d|           t          xj        dz  c_        Y d }	~	d }	~	ww xY w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>
        divr  zplantuml-diagramr  zplantuml-codeTr  z{})r  umlsvgr  u/    Не удалось получить svg из r   zERR-0025r  r   )r  rB  get_textrR   CmfDocumentconvert_uml2svgrf   r   r   r  r  r  r   r   r    rd   r  r  )
r[   r  r!   r  r  uml_code_taguml_coderG  r  r%   s
             r(   _convert_plantumlz!CmfPluginKaiten._convert_plantuml+  s]   &P %%eG=O3P%QQ 	' 	'C'"xxg5OxPP'00t0<<(883sv;;OO'KKtsKCC!    !34444 ' ' '))!*ll[cllgjll) *   
 !!Q&!!!!!!!'	' 	's   B!C
DADDr  c                 z   |s|S 	 |dk    rt          j         || j                  }n|}t          |d          }|                     ||           |                     ||           |                     ||           |                     |           |j        r)d                    d |j        j	        D                       n|}nw# t          $ rj}t          |j        dk              }| j                            t          j         d|rdnd d	| d
|           t          xj        dz  c_        Y d }~nd }~ww xY w|S )Nr  
extensionslxmlr   c                 ,    g | ]}t          |          S r*   rf   )r   cs     r(   r   z1CmfPluginKaiten._convert_text.<locals>.<listcomp>z  s    DDDqCFFDDDr,   r  u4    Не удалось обработать текстu    комментарияr   zERR-0026r  r   )r  _markdown_extensionsr   r  rM  r?  rC  bodyr  r  r   r  r  r   r    rd   r  r  )	r[   r   r!   r   r  	html_textr  r%   
is_comments	            r(   r  zCmfPluginKaiten._convert_textf  s    	K	#J&&$-#8  		
 !	%i88I""9c222""9c222	4000$$Y///IRa277DDIN,CDDDEEE]aDD 	# 	# 	#cn<==JO%%& [ [?IQ;;r[ [UX[ [	 &    "	# s   B=C 
D8A D33D8c                 D   t          |d                   }| j         d| }|                     || j        t          j        j                 d                   }|                    | j        d||j	        j
        |||                    dd          d           |d         |d	<   t          j        j        j        }t          |d
                   |k    r|d
         d|         |d
<   |d         d         }|d         d         }| j         d| d}	t          j                            |	          }
|
r|
|d<   |d         d         }|d         d         }| j         d| }t          j                            |dg          }|r||d<   |j        |d<   nc| j                            t(          j         d| d| d|
 dd           n0| j                            t(          j         d| d| ddd           |d          }|d         rt          |d                   nd}||d!<   |S )"u
  
        Нормализует данные задачи

        Args:
            task_data (dict): сырые данные
            project_obj (CmfProject): проект

        Returns:
            dict: нормализованные данные
        r   r   r   Tr5  F)activityapprovedrU  r  r   r  cmf_archivedr   r  r'   Nboardr   ::boardr  r  columnr   rM  r   cache_status_typeu!    Не найден статус 'r   u#   ) в бизнес-процессе zERR-0028r  r6  u=    Не найден бизнес-процесс списка 'r  zERR-0027rX   laner  )rf   r  r  r  rR   r   r!  r   default_activityr  rj   rT   r'   r  r,  rX   r  r   r   r    rd   r  )r[   r  project_objrv  r>  normalized_datamax_task_name_lengthr!  board_titler  r  	status_idstatus_titler  r   	task_laneboard_lane_keys                    r(   _get_normalized_dataz$CmfPluginKaiten._get_normalized_data  s    io&&)66W66--M&.56x@
 

 	-!$.4!!(%MM*e<< 
  
 	 	 	 )8(D%
  &~2=v&''*>>>&5f&=>S?S>S&TOF# W%d+(1!-BBBBB%)))AA 	*2OJ'!(+D1I$X.w7L#/>>9>>M%)))WWF 	,2)7=7I 344))!* C C\ C C^g C C8@C C)(	 *     O%%& = =!,= =19= = =%&	 &    f%	1:71CMYt_---2@./r,   c                    dt           _        t          |d                   }d| dt           _        | j                            t           j         dd           | j         d| }t          j        	                    |d	          }|s#t                              || j        d|
          }|j
        r?|                     ||          }|                    dg           }| j                            t           j         d|j        rdnd d|            |                    d |D                        |                                D ]\  }}	t!          |||	           |                     ||          |_        |                     ||          |_        ||_        |                    d           t/                       |                     ||           |                     ||           |                     ||           |                     ||           |                     |j        j        pd||          }
t?          |d                   t          j        j         j!        k    rd|d          d|
 }
|
|_        |D ]?}tE          ||          j        }|                     |||          }t!          |||           @|j#        r|                    d           | $                    ||           n,| j        j%        &                    t           j         d           | j                            t           j         dt           j         d           | j        '                    dd           t           j        setQ          |d                   )                    d          }tU          |d          5 }|+                    d           d d d            n# 1 swxY w Y   t           j        S )Nr   r   u   [Задача ]u     Начало обработкиTr   r   r   include_archived)rU  r   r  r   r  r   u   Созданиеu   Обновлениеr  c                     g | ]}|S r*   r*   )r   r   s     r(   r   z1CmfPluginKaiten._process_task.<locals>.<listcomp>  s    !O!O!O*!O!O!Or,   r  r   r   z<p><strong>z</strong></p><p></p>u    была изменена пользователем. Изменения из импорта не будут примененыu8    Завершение обработки. Ошибок: r0  r  ru  .successr  ),rd   r  rf   r  r   r   r  rR   r   rT   r  rk  popr  re   r   r  r  r  r  r8  r  r  r   r  r  r  r  r  r   rj   r,  r'   r  getattrr  r  r\  r]  r  r   rs   ru   rZ  )r[   r  rc  rv  r>  r  rd  r  r   rj   r   
text_fieldfield_valueconverted_textr  r{   s                   r(   _process_taskzCmfPluginKaiten._process_task  s   
io&&9w999
z2TTT`deee)66W66>%%! & 
 
  	~~"? $"	 &  H # /	"77	;OOO#2#6#67Mr#R#R O& j j)1T%%>Tj jXgj j  
   !O!O!O!O!OPPP%4%:%:%<%< 5 5!
E*e4444"&";";Hi"P"PH //)DDHM'0H$MMdM+++LLL))(I>>>&&x;;;**8Y???**8Y??? %%hm&9&?R9UUD9W%&&)<)GGG)G"4    
 !HM2 > >
%h
;;A!%!3!3K9!U!U*n====" 0$///'')<<<<O"**& ] ] ]  
 	"oo\f\moo 	 	
 	
 	
 	  555   	Yz233<<ZHHIi%%                  s   4OOOc                    d}t          d          5  	 | j                                        rn|                                }|dk    rn~t	          |                              d          }t          |d          5 }t                              |          }d d d            n# 1 swxY w Y   || 	                    ||          z  }d d d            n# 1 swxY w Y   |
                    |           d S )Nr   Fr  TrH  rg  rn   )r   r   r   rT   r   rs   ru   rv   rw   rw  re  )	r[   
task_queuetask_queue_errorsr   r  r0  r  r{   r  s	            r(   _process_task_threadz$CmfPluginKaiten._process_task_thread%  s   5111 	A 	AA?,,.. !~~''6>> JJ//<<	)T** -a $		!I- - - - - - - - - - - - - - - $,,Y@@@A	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	f%%%%%s6   A)C<B#C#B'	'C*B'	+CCCc                    ddl m} ddlm} d}t                                          5  t                                          5  ddd|                                |                                |	                                g| _
        t          j                            |ddg	          | _        | j        j        j        j        | _        |                     | j        j        d
                   | _        | j        j        j                            dt*          j                  | _        | j        j        j                            dt*          j                  | _        t5          j                    }d| d}	| j        j                            |	 d| d| d           | j         d| }
t          j                            ddd|
 dgddg          }|st?          d|
           tA          | j!        |          }| j        j                            |	 d|            tE                      }tE                      }g }tG          j$                    }tK          |          D ]u}tM          j'        | j(        d| d| |||d          }|)                    |           |*                                 | j        j                            |	 d |            vd}| +                    |||| j        !          }|D ]=}| j        ,                                r n!|-                    |d"                    |d#z  }>|D ]}|-                    d$           | j        j                            |	 d%|            |D ]}|.                                 tG          j$                    |z
  }| j        j                            |	 d&||z  d'd(           d}|/                                s+||                                z  }|/                                +| j        j                            |	 d)|            ||z  }d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |S )*Nr   r
   rO  extra
sane_liststocr   r  rJ  r  process_new_or_updatedarchived_tasks[PID rm  u'    Процесс запущен (offset=, limit=r  r   r   r   r  r  r  r  r   u)   Не найден проект с ext_id uE    Обработка задач в несколько потоков: _process_task_thread_r  )ry  rz  r   r  u>    Запущен параллельный обработчик )rq  r)  rr  ru  r   rH  u1    Ожидание обработки задач: u%    Скорость обработки rN  u    задач в секундуuA    Обработка задач завершена. Ошибок: )0cmf.appr   modules.kaiten.markdownrP  rk   disable_acldisable_notifyPlantUMLExtensionMentionExtensionStrikethroughExtensionrU  rR   	CmfImportrT   r   r^   r  _normalize_settingsr  r  rj   ra  IMPORT_ONLY_NEW_OR_UPDATED_process_new_or_updatedIMPORT_ARCHIVED_TASKSrO   r1   getpidr\  r  r=  CmfErrorr  threading_max_forksr   r   r_  r  r  r  r{  r   r  r,  r   re  r  r  )r[   cmf_import_idrC  rq  r)  r   rP  r  process_pidprocess_msgrF  r   thread_country  rz  task_threadst1r  r  r  r2  r0  t2r   s                           r(   process_task_forkz!CmfPluginKaiten.process_task_fork9  s   ''''''666666  "" g	! g	!G$:$:$<$< g	! g	!,,..++--1133)D% %.22 ./ 3  DO  $5<HD 44T_5RSd5effDM+/?+H+N+R+R(1, ,D( $(?#@#F#J#J ,$ $D 
 )++K0+000KO"''__v__W\___   !% 0@@J@@N'++ &*C*C*C*CD% ,  G  ][>[[\\\ t7??LO"''sseqss   J %L"$$B<((  ")4BBBqBB&0->#*    ##F+++&++"jjbhjj    J++U $ < ,  E
     ?,,.. EtJ/000a

& ' 'v&&&&O"'';(u(uis(u(uvvv&  "$$r)BO"''wwZRT_wwww   J'--// 6/33555
 (--// 6 O"''mmakmm   j FOg	! g	! g	! g	! g	! g	! g	! g	! g	! g	! g	! g	! g	! g	! g	! g	! g	! g	! g	! g	! g	! g	! g	! g	! g	! g	! g	! g	! g	! g	!R s6   QO3Q5QQ	QQ		QQQc                    dd l }|                    dddd| j        j        j         d| j        j         d| d| d	| d
gdd|j        |j                  }| j                            d|j         d| d| d           |S )Nr   z/usr/bin/python3z	manage.pyshellz(plugin = models.CmfPluginKaiten.get(id='z'');retcode = plugin.process_task_fork('z', 'z', z, z);T)	close_fdsstart_new_sessionstdoutstderrr  u(   ] Запуск процесса (offset=r  r  )
subprocessPopenr   r^   r   DEVNULLr   pid)r[   rC  rq  r)  r  procs         r(   _execute_taskzCmfPluginKaiten._execute_task  s    "K4?;Q;T  * 0: ?E IN   "%%   
 
 	^DH^^f^^V[^^^	
 	
 	
 r,      r  c                    ||k    rd|fgS t          j        ||z            }t          dt          j        ||z                      }t	          |t          ||                    }t          ||          }||z  }	||z  }
g }d}t          |          D ];}|	}||
k     r|dz  }t	          ||          }|                    ||f           ||z  }<|S )u  
        Рассчитывает распределение задач между процессами

        Args:
            total_tasks (int): количество задач
            max_processes (int): максимальное количество одновременных процессов
            threads_per_process (int, optional): количество потоков в процессе. Defaults to 25.
            max_tasks_per_process (int, optional): максимальное количество задач
                                                   обрабатываемых в процессе. Defaults to 1000.

        Returns:
            list[tuple]: список кортежей (offset, limit)
        r   r   )mathceilr  floorr  r  r   )r[   total_tasksmax_processesthreads_per_processmax_tasks_per_processmin_processes_by_limitprocesses_by_threadsmin_processes_to_useprocesses_to_use
base_tasks	remainderdistributionrq  r  r)  s                  r(   _calc_task_distributionz'CmfPluginKaiten._calc_task_distribution  s   * ---$%% "&;9N+N!O!O  #1dj?R1R&S&STT  #=#6LNb2c2cdd35KLL !$44
"22	'(( 	 	AE9}}
455E000eOFFr,   c                    d}d}| j                                                             dt          |          d          }|                                rt          |                                          D ]}|                                s|j        	                    d          r2|                    d                                          }| j
        du r|se| j
        du r|rq|                    d                                          r5d	D ]-}|                    |          }|                    d
           .|dz  }|                    d                                          r|dz  }||fS )u  
        Получает количество успешно и неуспешно обработанных задач.
        Неуспешно - были ошибки при обрабоке саймой задачи или
        связанных объектов(комментарии, чек-листы, журнал работ и т.д.).

        Для успешно обработанных задач удаляет файл-флаги.
        r   r&  r2  re  ro  TFrq  )rn  rq  r  r   rn  )r   rr   rs   rf   rt   r   ri  rp  r'   rj  rO   r  )	r[   rC  success_countfailed_countrs  ru  rw  file_flag_namer  s	            r(   _get_processed_countz$CmfPluginKaiten._get_processed_count  s    O5577@@J
 
	  	& OO3355 & &(( =))*=>> &//<<CCEE'4///)U22{2$$Z007799 '*E : :$,$5$5n$E$E	!((D(9999!Q&M $$]33::<< & A%Ll**r,   c                 
   | j         d         }| j         d         }d| d| d}|                                 }|                     |          \  }}}}}	}
| j                            | d| d| d|	 d	| d| d|
 dd
           | j        j                            d           | j        d
u r| j        r|
n|	}n | j        du r| j        r|n|}n| j        r|n|}|s,| j                            | dt          j
        d
           d S d}| j        s| j        .|dz  }| j        r|dz  }| j        d
u r|dz  }n| j        du r|dz  }|d| d| z  }| j                            | d| t          j
        d
           | j                            | d| t          j
        d
           |                     ||| j        t          j                  }t          j        }d |D             }|                                }i }t#          j                    }|s|rQt'          |          |k     r*|r'|                    d          }||         dz   }| j        j                            d| d| d|            |\  }}	 |                     |||          }||f||<   |||<   n# t,          $ r~}||k     rA| j        j                            d|dz    d| d |            |                    |           n-| j                            d!|j         d"| d#| d$| d%&           Y d }~nd }~ww xY wt#          j        d'           t'          |          |k     r|'g }|                                D ]\  }\  }}|                                }||                    |           |dk    r)| j                            d!|j         d(| d|            b||k     rA| j        j                            d|dz    d| d)|            |                    |           | j                            d!|j         d"| d#| d*| d%&           |D ]}||= |s|rt#          j        d+           |N|Qt#          j                    }||z
  }t=          |d,          \  }}t=          |d-          \  }} |                     |          \  }!}"| j        j                            | d.tA          |          d/d0tA          |          d/d0| d1           | j        j                            d2|! d|" d|            | j        j                            d3||z  d4d5           | j        j                            d6|            d S )7Nr   r      Проект 'r   r  uT   . Всего выгруженных задач (активных/архивных): rM  rQ  uA   ). Необработано (активных/архивных): Tr   u   Для настройки обработки задач измените параметры 'IMPORT_ONLY_NEW_OR_UPDATED' и 'IMPORT_ARCHIVED_TASKS'Fu-   . Нет задач для обработки)r  r   u0   Будет выполнена обработкаu    толькоu"    новых/обновленныхu    архивныхu    активныхu    задач: rR  r   u[   . Ограничение одновременных процессов обработки: c                     i | ]}|d S )r   r*   )r   
task_chunks     r(   r  z2CmfPluginKaiten._process_tasks.<locals>.<dictcomp>j  s    LLLz1LLLr,   r   r   u   Попытка r  u0   Повторный запуск (попытка z): u4   . Ошибка предыдущей попытки: r  uC   ] Процесс завершился с ошибкой после u    попыток: u   . Ошибка: zERR-0034r   rI  uE   ] Процесс завершился успешно (попытка u?   . Код возврата предыдущей попытки: u   . Код возврата:    i  <   u8   . Обработка задач завершена за 02d:z06.3fuE   Обработано задач (успешно/неуспешно): u%   Скорость обработки: rN  u    задач/секu)   Всего задач в проекте: )!rA  r  r  r   r   r\  r  rO   r  r  r  r  r  ra  IMPORT_OBJ_CNTIMPORT_PROCESS_RETRYcopyr   r_  r,  rr  r  r   r]  r   r    r  rZ  r   polldivmodr  r-  )#r[   rC  rD  project_msgr  rB  unprocessedr  r  r5  r  r  process_tasks_msgr  max_retriestask_chunk_attemptspending_task_chunksactive_processesr  r  attemptrq  r)  processr%   processes_to_removereturn_coderx  diffhoursr  r   secondssuccess_tasksfailed_taskss#                                      r(   _process_taskszCmfPluginKaiten._process_tasks  s   '-
*73F}FFFFF**,, ))*55	
  K KK KK K!)K K K K 1K K 4HK K K  	 	
 	
 	
 	##F	
 	
 	

 4''151M[--S[JJ!U**/3/KW++QWJJ(,(DO%J 	OMMMo     
 FN' 	94+?+K0+ J!%II!#t++!%88!!%..!%88!FZFFuFFF11/11/ 	 	
 	
 	
 	  G  G  xE  G  G/ 	 	
 	
 	
 33$!	
 
 1 ML|LLL +//11!##! ?	%5 ?	&''-77<O7044Q77
-j9A=&++,cg,c,c,c,cWa,c,cddd !+"00VUKKG1;W0E$W-6='
33    ,,.66WwYZ{ W W_i W WQTW W   ,22:>>>>113GK 3 3*13 3DN3 3-03 3 (2	 2    
35 &''-77<O7: #%2B2H2H2J2J  ..*g%llnn*'..w777"a''++HGK H H/6H H;EH H   
 #[00 O2::!nSZ]^S^ !n !ncm !n !n`k!n !n   066zBBBB O55!J !J !J.5!J !JHR!J !J<G!J !J ,6	 6    / . .$W--   #6 
1 " ?	%5 ?	B !!U{!$--y!)R00&*&?&?
&K&K#|## C C5zzBC C #GBC C3:BC C	
 	
 	
 	## ETa  E  Edp  E  E  yC  E  E	
 	
 	
 	##$wZZ^M^$w$w$w$wxxx##$WPU$W$WXXXXXs   :#J 
L&(A4L!!L&c                     dd|gdd|gg}t           j                            |          }|s9t                               ||| j        d          }|                    d           |S )u,  
        Возвращает глобальный статус

        Args:
            status_name (str): имя статуса
            status_type (str): тип статуса (OPEN, IN_PROGRESS, CLOSED)

        Returns:
            CmfStatusCode: глобальный статус
        r'   r   r   r   Tr  r  )rR   r  rT   r   r  )r[   r  r   r  r  s        r(   _get_global_statusz"CmfPluginKaiten._get_global_status  s     S+&C-
 ,000FF 	1"00 '? $	 1  M 4000r,   c                    |d         }|d         }|d         }| j         j                            d| d| d|            | j         d| }t          j                            |          }|s-d	d
|gdd
|gg dg}t          j                            |          }|s"t                              || j         d          }|j        s|j        s||_	        | 
                    ||d                   |_        d|_        |d         |_        ||_        t          |d         dz  d          |_        ||_        d|_        |                    d           n&| j         j                            d| d| d           |S )u  
        Обрабатывает статус бизнес-процесса

        Для бизнес-процессов для списков:
            Колонка доски в Kaiten, это статус бизнес-процесса
            Каждая колонка имеет тип:
            1 - очередь (OPEN)
            2 - в работе (IN_PROGRESS)
            3 - готово (CLOSED)

        Args:
            status_data (dict): сырые данные статуса
            workflow (CmfWorkflow): бизнес-процесс

        Returns:
            CmfStatus: статус бизнес-процесса
        r   r   r<   r  r   u    ) бизнес-процесса r   r  r'   r   r  r  r   T)r  r   r  r=   r  r     r  u   Статус u    бизнес-процесса r  )r   r\  r  r  rR   r  rT   r  r   r'   r  status_codeallow_empty_transitionr=   r  roundr  r  r]  )	r[   r  r  rg  r  r   r  r  r  s	            r(   r  z(CmfPluginKaiten._process_workflow_status  s   $  %	!'*!&)##w+ww)wwmuww	
 	
 	
  +::y:: *..m.DD 	Ik*S(+%%%M
 %.22-2HHO 	$..!? $ /  O
 * 	/2H 	#.O *.*A*A+{[aOb*c*cO'59O2$/$8O!'/O$&+K,E,La&P&PO#%2O".2O+  T 2222O"**] ] ]PX ] ] ]  
 r,   c                    |d         }|d         }|d         }| j         j                            d| d| d           | j         d| d}t          j                            |	          }|s(t                              | j        || j         d
          }|j        r&| j	        d         }| j	        d         }| d| |_
        d| d| d| |_        |                    d
           | j         j                            d|            g }	|D ]2}
|                     |
|          }|	                    |j                   3t          j                            dd|	gdd|gg dgdgd
          }|D ]O}t          j                            dd|j        gdd|j        gdd|gg          s9|                    d
           Pn#| j         j                            d| d           |S )u  
        Обрабатывает бизнес-процесс для задач списка

        Args:
            board_data (dict): сырые данные доски(списка)

        Returns:
            CmfWorkflow: бизнес-процесс для задач
        r   r   columnsuQ   Обработка бизнес-процесса задач для списка 'r   r  r   r^  r  T)r#  r   r   r  r:  u%   : Бизнес-процесс для u0   Бизнес-процесс для списка u    проекта r  r  r  r  r  r   r  r   r  r`  r   r  r  r  )r   r\  r  r  rR   rX   rT   rY   r  rA  r'   r   r  r  r   r   r  r  r   r  r]  )r[   r   r!  rf  r  r  r  rG  rD  r  r  r  r  r   s                 r(   _process_list_task_workflowz+CmfPluginKaiten._process_list_task_workflow  s    d# )"9-##{`k{{px{{{	
 	
 	
 "-BBBBB%)))AA 	))0&? $	 *  H # *	,U3K .w7M*^^Q\^^HM K{  K  Klw  K  K  |I  K  KHMMMdM+++O"''(wmu(w(wxxx!, < <"&"?"?X"V"V ''(:;;;; !' 0 5 58%56h/)))
 & $ !6 ! ! , * * '++tVY/&V-?@#S(3 ,    D))))* O"**]x ] ] ]  
 r,   c                    |                      |          }|d         }|d         }| j        j                            d| d| d           | j         d| }t
          j                            |          }|s"t
                              || j        d	          }|j        r||_	        | j
        |_        ||_        ||_        |d
         }|dk    r<d| j         d| d}	t
          j                            ddd|	 dg          }
|
|_        |                    d           n#| j        j                            d| d           |S )u  
        Обрабатывает список задач для доски

        Args:
            board_data (dict): сырые данные доски(списка)
            list_folder (CmfRegistry): каталог для списков задач в структуре проекта

        Returns:
            CmfList: список задач для доски
        r   r   u3   Обработка списка для доски 'r   r  r   r  Tr   r   r  default_card_type_idr   r   r   r   r   r  u   Список r  )r  r   r\  r  r  rR   CmfListrT   r  r'   rZ   r   r  tree_parentrV   r  r  r]  )r[   r   list_foldertask_workflowr!  rf  list_ext_id
board_listr  r  r   s              r(   _process_board_listz#CmfPluginKaiten._process_board_liste  s    88DDd# )##$uZe$u$ujr$u$u$uvvv)77X77^''{';;
 	"? $ (  J
 % 	)JO$($8J!/<J,%0J"#-.D#E #q(($U)9$U$U=Q$U$U$U!#044$f.F2C.F.F.FG 5  
 6@
2OOO----O"**]
 ] ] ]  
 r,   c           	          t           j                            d| j        dg          }|sDt                               d| j        | j        dd| j        d          }|                                 |S )u   
        Получает/Создает каталог для досок в структуре проекта

        Returns:
            CmfFolder: объекта каталога для досок
        u
   Доскиtree_node_is_branch)r'   r  r   Ni_ T)r'   rU  r  sys_typer  r   r  )rR   	CmfFolderrT   _projectr   r  )r[   board_folders     r(   _get_board_folderz!CmfPluginKaiten._get_board_folder  s     '++)* , 
 

  
	 !++!} M? $ ,  L r,   c                    | j         j                            d| d| d           | j         d| }t          j                            |ddg          }|s"t                              || j         d	          }|j        rd
| |_        | j	        |_
        d|_        d|_        d| j	        j         d|j         |_        dddt          | j	        j                  ggddt          |j                  ggg}t                               |d          |_        |                    d           n#| j         j                            d| d           |S )u  
        Обрабатывает основной фильтр для доски
        Фильтр по списку (поле lists)

        Args:
            board_id (int, str): id доски
            board_title (str): название доски
            board_list (CmfList): список задач для доски

        Returns:
            CmfBqlFilter: основной фильтр для доски
        u5   Обработка фильтра для доски 'r   r  r   r'   r  rM  Tr  u   Фильтр для fullcommonproject in (z) and lists = ANDproject.codeIN
lists.codeFrp   r  u   Фильтр r  )r   r\  r  r  rR   CmfBqlFilterrT   r  r'   r  rU  perm_policy
view_scoperF   ubqlrf   rv   r[  bqlr  r]  )r[   r!  rf  r  board_filter_ext_idboard_filterr  s          r(   _process_board_filterz%CmfPluginKaiten._process_board_filter  s    	##$w\g$w$wlt$w$w$wxxx!%!1??X??*..&! / 
 
  	!..*? $ /  L
 ' 	 D{ D DL"&-L'-L$&.L# bt}/A b bQ[Q` b bLDM,>(?(?'@Atc*/&:&:%;<C
  $zz#EzBBL$////O"**] ] ] ]  
 r,   c                    |d         }|d         }t          |d         d d          }| j        j                            d| d| d	           g }t	          |d
          D ]\  }}|d         }	|d         }
|
s| j        j                            d|
 d|	 d| d| d		           | d|
 }t          |	          }|| j        |<   | j         d| d|	 }t          j	        
                    |ddg          }|s"t          	                    || j        d          }|j        r|
|_        d|_        d|j         d| d|_        dddt          |j                  ggdd|gg}t                               |d          |_        |dz  |_        ||_        |                    d           n&| j        j                            d | d!| d"           |                    |           |S )#u  
        Обрабатывает дорожки доски
        Фильтр по списку (поле lists) и полю Дорожка (поле cf_kaiten_board_lane)

        Args:
            board_data (dict): сырые данные доски(списка)
            board_list (CmfList): список задач для доски

        Returns:
            list: список дорожек
        r   r   lanesc                     | d         S r  r*   )ra  s    r(   r  z:CmfPluginKaiten._process_board_swimlanes.<locals>.<lambda>  s    T,/ r,   T)r:  reverseu.   Обработка дорожек доски 'r   r  r   u#   Обработка дорожки 'u   ) доски 'z / r   r'   r  rM  r  embeddedzlists = z and cf_kaiten_board_lane = "r3  r  r  r  r  r   Frp   r  r  u   Дорожка u    доски 'uf   ' была изменена. Изменения из импорта не будут применены)r  r   r\  r  r  rf   
_swimlanesr  rR   r   rT   r  r'   r  rF   r  rv   r[  r  r  r  r  r]  r   )r[   r   r  r!  rf  board_lanes	swimlanesr  	lane_datalane_id
lane_titleswimlane_valueswimlane_keyswimlane_ext_idswimlaner  s                   r(   _process_board_swimlanesz(CmfPluginKaiten._process_board_swimlanes  s    d# )w//
 
 
 	##$pU`$p$pem$p$p$pqqq	"+K";"; 3	' 3	'GYoG"7+J O"'';j ; ;W ; ;*; ;/7; ; ;   !,<<
<<Nw<<L,:DOL)!%!1JJXJJJJO*..&% /  H  !..*#$( /  
 '  *&0#Ez E E3AE E E 
 !4#jo*>*>)?@+S,?
  $zz#EzBB#*T> +4($////&..ah a a[ a a a   X&&&&r,   c                    |d         }|d         }| j         j                            d| d| d|            | j         d| }t          j                            |ddgd	
          }|s#t                              ||| j         d	          }|j        ru||_        t          j	                            |dg          }|r%|j
                            |j        j                   nK| j                             d| d| ddd           n&| j         j                            d| d| d           t!          |d         dz  d          |_        |                    d	           dS )u   
        Обработка колонки доски

        Args:
            column_data (dict): сырые данные колонки
            board (CmfKanbanBoard): доска
        r   r   u#   Обработка колонки 'r   u   ) доски r   mapped_status_codesr  Tr  r  r  rM  u>   Не найден статус бизнес-процесса 'r  zERR-0029r  r6  u   Колонка u    доски r  r  r  r  r  N)r   r\  r  r  rR   CmfKanbanBoardColumnrT   r  r'   r  r  r   r  rj   r    r]  r  r  r  )r[   column_datar]  	column_idcolumn_namecolumn_ext_idboard_columnr   s           r(   _process_board_columnz%CmfPluginKaiten._process_board_column2  s     %	!'*##a+aa)aaZ_aa	
 	
 	
  +::y::266 % ! 7 
 
  	!66$? $	 7  L ' 	 +L%)))WWF 0778J8PQQQQ))qU`qqenqqq)( *     O"**], ] ]E ] ] ]  
  %[%>%EqIId+++++r,   c                    |d         }|d         }|                      |||          }|                     ||          }| j        j                            d| d| d           | j         d| }t          j                            |g d          }	|	s#t                              d	|| j        d
          }	|	j	        rJ||	_
        | j        |	_        ||	_        ||	_        ||	_        |rdnd|	_        |	                    d
           n#| j        j                            d|	 d           | j        j                            d| d| d           |d         D ]}
|                     |
|	           dS )u>  
        Обрабатывает доску

        Args:
            board_data (dict): сырые данные доски
            board_list (CmfList): список задач для доски
            board_folder (CmfFolder): каталог для досок в структуре проекта
        r   r   u   Обработка доски 'r   r  r   )rU  r  kanban_bql_filterkanban_board_columnsrM  zboard.kanban:defaultT)r   r   r   r  z	1 queriesz7 noner  u   Доска r  u.   Обработка колонок доски 'r  N)r  r  r   r\  r  r  rR   CmfKanbanBoardrT   r  r'   r  rU  r  r"  swimlane_bql_filtersswimlane_typer  r]  r   )r[   r   r  r  r!  rf  r  r  board_ext_idr]  r  s              r(   _process_boardzCmfPluginKaiten._process_boardg  s    d# ) 11(KTT 11*jII	##$ak$a$aV^$a$a$abbb*88h88%))   * 
 
  	))1#? $	 *  E   	$EJ=EL ,E&2E#)2E&1:"H++EJJ4J((((O"**]e ] ] ]  
 	##$pU`$p$pem$p$p$pqqq%i0 	; 	;K&&{E::::	; 	;r,   u   Обработка досокc           
         |                                  }t          j                            dd| j        gg dg dg dgdg          }|                     | j        d                   D ]}|d         }|d	         }|d
         }|D ]>}| j                            |d                   |d<   |d	         s|d         d         |d	<   ?||d
<   	 |                     ||          }| 	                    |||           t                       # t          $ r>}	t                       | j                            d| d| d|	 dd           Y d }	~	d }	~	ww xY w|t          j        f|t          j        fg}
|
D ]Q\  }}dd|g}t#          |                    |dg                    |_        |j        r|                    d           Rd S )Nr  r   )r'   r   r  )r<   r   r  )rW  r   Tr  r   r   r   r  r<   r'   u/   Не удалось создать доску 'r   r  zERR-0033r  r6  r6  Tr  )r  rR   CmfRegistryrT   r  r}  rA  rQ   r  r(  r   r   r   r   r    r$  r  r  r>  r  r  r  )r[   r  r  r   r!  rf  board_columnsr  r  r%   foldersfolderr   model_filters                 r(   _process_boardszCmfPluginKaiten._process_boards  sZ    --// (,,T]3---(((%%%	 ** - 
 
 2243Ed3KLL 	 	J!$'H$W-K&y1M, G G&*&;&?&?F@S&T&TF# #7+ G+6v+>v+FK($1Jy!!55j+NN
##J
LIII   ))hkhhV^hhcfhh)& *         601&.)
 % 	. 	.MFE)37L)-ejjVZU[j.\.\)])]F&  .---		. 	.s   
;D
E4E		Ec                    | j         d         }| j         d| }t          j                            |dg          }t          j                            dg d          }t          j                            ||          }|s#t                              ||| j        d	
          }|j        r|j	        j
        pi }t          |j        j
                  pt                      }d |                                D             }| j                                        D ]I\  }	}
|	|v r!||	         }||v r||         |	k    r||= |
||	<   n|
|v r||
         }||= |
||	<   n|
||	<   |	||
<   J| j                                        D ]}|                    |           t#          t%          |                                d                     |_	        t'          |          |_        |j        rd	|_        |                    d	           | j        |_	        g |_        |                                 |j        rut          j                            t2          j                                                            d          ddd           t          j                            ddi           dS dS | j        j                            d| d           dS )u   
        Обрабатывает конфигурацию для поля 'Дорожка'
        Собранные значения дорожек добавляются в конфигурацию поля
        r   r   r   rM  r  )r  r
  r  r  r   )r	  rU  T)r	  rU  r   r  c                     i | ]\  }}||	S r*   r*   )r   kvs      r(   r  zBCmfPluginKaiten._process_swimlane_field_config.<locals>.<dictcomp>  s    EEETQAqEEEr,   c                     | d         S )Nr   r*   )r  s    r(   r  z@CmfPluginKaiten._process_swimlane_field_config.<locals>.<lambda>  s    W[\]W^ r,   r  r  r  r   Fr  r  u"   Конфигурация поля r  N) rA  r  rR   r  rT   r  r  r   r  r
  rj   r  r  r   r  rB  r  r   r  r  r  r  r  r   r  r   r   r  r  r  r\  r]  )r[   rC  field_config_ext_idr  r	  config_cust_fieldr  r  value_to_keynew_key	new_value	old_valueold_keyr:  s                 r(   _process_swimlane_field_configz.CmfPluginKaiten._process_swimlane_field_config  s^   
 '-
!%!1AAZAA.22:MWZV[2\\(,,'   - 
 

 #8<<! = 
 
 ! 	 & < <%#? $	 != ! ! , .	(06<"O'*:+F+L'M'M'VQTQVQV$ FE_-B-B-D-DEEEL&*o&;&;&=&= 2 2"o-- / 8I L00\)5LPW5W5W(3/8OG,,,..*95G'0/8OG,,/8OG,*1Y''++-- 2 2(,,S1111!%f_-B-B-D-DJ^J^&_&_&_!`!`J*./G*H*HJ'$ 2#'
 D111(,%13.""$$$ ^55(*(9(9(B(B>(R(R&/!&    >>@PR[?\]]]]]^ ^ O"**]5F ] ] ]    r,   c           
         t                      }|                     | j        d                   D ]b}|d         }|d         }| j         d| }t          j                            |          }|s%| j                            d| d| ddd	
           f| j        j	        
                    d| dt          |d                               |d         D ]p}| j         d| }t          j                            |d          }	|	r|j                            |	           L| j                            d| d| dd|           q|                    d           |                    t#          |j                             t'                       dt          j                            t+          |                     dS )uC   
        Добавляет задачи в списоки
        r   r   r   r  u   Список 'r   u   ) не найденzERR-0030r  r6  u0   Добавление задач в список r  r  Trn  u   В список u3    не удалось добавить задачу u"   . Задача не найденаzERR-0031r  r  )list_idsN)r  r}  rA  r  rR   r  rT   r   r    r\  r  r,  r   r   r   r  r  rf   r   r   recalculate_count_cacher  )
r[   r>  r   list_id
list_titler  r  card_idr>  r0  s
             r(   _add_tasks_to_listz"CmfPluginKaiten._add_tasks_to_list   s    552243Ed3KLL  	  	J &G#G,J!-::::K++;+??J ))PZPPGPPP)& *   
 O"''k:kkQTU_`gUhQiQikk   &g.  !%!1>>W>>~))t)TT &--d3333O--<: < <jq < < <#-&	 .     OOO---LLZ]++,,,LLLL 	..X.GGGGGr,   c                    t           j                            dd| j        gg dgd          }|r| j        j                            d|            t          | j        j                  }t           j	        
                    |          }|sdd	d
t          | j        j                  ggg dg}t           	                    d| j        ddd| j        j         dt                              |d          d|| j        d
  
        }|                                 d| j        _        d| j        _        | j                            d           dS dS )u  
        Проверяет наличие архивных задач и настраивает их отображение
        Для отображения архивных задач создается фильтр в разделе "Архив"
        r   r   )r\  r   TT)r   ro  u8   Импортировано архивных задач: r  r  r  r  )r\  r`  Fu   Задачиreadonlyr  z) and cmf_archived is not emptyFrp   )
r'   r  r  r  r  r  r\  r   r   r  r  N)rR   r   rt  r  r   r\  r]  rf   r   r   rT   rF   rv   r[  r  show_archivehas_children_archived)r[   archived_tasks_countfilter_ext_idarchived_tasks_filterr  s        r(   _configure_archived_tasksz)CmfPluginKaiten._configure_archived_tasksK  s   
  &~33C/+++ "  4  
  
   	1O"**+|fz+|+|}}}   455M$*$7$;$;=$;$Q$Q!( -#TC0B,C,C+DE111
 )/(;(;' $ *([(:[[[

3U
;;!%(#$( )< ) )% &**,,,)-DM&26DM/M4000009	1 	1r,   c                    | j         j                            d| j        d                     t          j                            dd|d         gddg          }|r|j        |d         k    s|j        rW|d         |j        vrH|d          d|d          d	|d<   | j         j        	                    d
|j
         d|d                     n(|j        s!|d         |_        |                                 d|d<   d|d<   d|d<   d|d<   |                                 }|                     |          |d<   |                     |          |d<   |                                 |d<   t          j                            ddd|d          dg|                                          }|s/t                              |d         |d         | j         d          }|j        }|j        r|D ] }|dk    r	t'          ||||                    !| j                            dd          sd|_        |                                 |j        g|_        d|_        d|_        d|_        d|_        d|_        |                    d           n#| j         j        	                    d| d           |r9t          j                            |          D ]}|                    d           t?                       || _         i | _!        | "                                 | #                                 | $                                 | %                                 | &                                 t?                       |S )Nu"   Обработка проекта r   r'   r~  r   r   r   rM  r  u   Проект с именем u8    уже существует! Переименуем в Ttask_allow_multiple_sprintsFsl_only_owner_approvesl_deny_no_approvesl_task_only_owner_closer  rw  cust_field_conf_schemer   r   rv  	is_publicprivater  u"   Настройки проекта u    были изменены пользователем. Изменения из импорта не будут примененыrT  rx  )'r   r\  r  rA  rR   r=  rT   r   r   r]  r'   r  rH  r  r  r  rB  r  r  r  r  r   cmf_project_admins
show_lists	show_blog
show_pfeed	show_disk	show_chatr   r  r  r   r  r  r/  r<  r  rC  rK  )r[   project_structrc  r7  r  r:  r0  s          r(   _process_projectz CmfPluginKaiten._process_projectu  s,   ##$fI[\cId$f$fggg '++D."89 (+ , 
 
  	#&.*FFF& G 'x0&-. . -;6,B)a)anU]F^)a)a)av&&..JK4D J J1?1GJ J    !' #%3H%="  """ 9=45 38.//4+,5:12 1133
 '+&C&CJ&O&O{#+/+F+Fz+R+R'(373T3T3V3V/0 '++f&E.*B&E&E&EF!&&(( , 
 
  	 ++#F+%h/? $	 ,  K #& 	% ? ?(??S.*=>>>>%))+t<< 4*3' /:.C-DK*%)K"$)K!%*K"$)K!$)K!....O"**][ ] ] ]  
  	3++;+?? 3 3T2222# ++--- 	 	!!! 	&&(((r,   u#   Обработка проектовc           
      2   d | j         D             }|                                 D ]o}t          |d                   }|d         }	 | j                                        r	 d | _        d | _         d S ||vr	 d | _        d | _        `|                    d          r"|                     |d         d                   }nt          j
        }d| j         d| d}||d<   d|| j        | j        |d         |||d	}|| _        |                     |           t                       nR# t           $ rE t#                       | xj        d
z  c_        | j                            d| d| ddd           Y nw xY wd | _        d | _        ^# d | _        d | _        w xY wd S )Nc                 8    g | ]}t          |d                    S r  rS  r   ps     r(   r   z5CmfPluginKaiten._process_projects.<locals>.<listcomp>  s"     N N N!QtW N N Nr,   r   r   r+  r   r   r   r:  )project_typer'   r   rZ  r7  r   r   r  r   u=   Не удалось импортировать проект 'r   r  zERR-0032r=  r   )rL   r+  rf   r   r   r  rA  rT   r  r@  r  r  rW   rU   r[  r   r   r   r   r    )r[   selected_projects_idsrI  rC  rE  r   rF  rZ  s           r(   _process_projectsz!CmfPluginKaiten._process_projects  s$    N Nt7M N N N ..00 ,	* ,	*L\$/00J'0L(*?,,.. J !%%)""""I %:::D !%%)""C  ##H-- . $ 0 0h1G1M N NII !I!Hd&6!H!H*!H!H!H)7X&$-("&": $ >(4U(;!*,'3	" 	" &2"%%n555   1$))rT`rreorrr) *     	 !%%)"" !%%)"))))Y,	* ,	*s8   D"2D"BD"!F"AE1.F0E11FFu3   Обработка связей всех задач
is_processc                    |s!| j         j                            d           d S | j        j                            d          }t          j        d| d          }t          j	        
                    d          }t          j	        
                    d          }|                                 D ]O}|d         }|                     |          D ]-}| j                                         r  d S |d         }	t          |
                    d	g                     D ]c\  }
}|d         }|
d
k    r;| j        
                    |g           }|                    |	           || j        |<   N| d|	 }||	|d| j        |<   d|
                    dg           D ]g}|d         }|                    |          }|s"|                    d          }|	 d| }|| j        v rH| d|	 }|| j        v rY||	|d| j        |<   h/Qt)          | j                  }t+          d | j                                        D                       }| j                             d| d|            t          | j                                        d          D ]\  }
\  }}|
dz  d
k    r%| j         j                            d|
 d|            | j         d| }t          j        
                    |dg          }|s$| j         j                            d| d           |D ]v}| j         d| }t          j        
                    |ddg          }|s$| j         j                            d| d           X	 |j        |j        k    r%||_        |j        r|                    d           n| j         j                            d | d!| d"           t          j         
                    |||#          }|sat                               |||| j         $          }|                    d           | j         j        !                    d%| d&| d'|            ;# tD          $ r0}| j         #                    d(| d)| d*| d+,           Y d }~pd }~ww xY wtI                       t)          | j        %                                          }| j                             d-|            t          | j                                        d          D ]\  }
\  }}|
dz  d
k    r3| j         j                            d.|
 d|            tI                       	 |d/         }|d0         }|d1         } t          j        
                    | j         d| 2          }!|!s$| j         j                            d3| d           t          j        
                    | j         d|  2          }"|"s$| j         j                            d4|  d           t          j         
                    |!|"|#          }|sat                               |!|"|| j         $          }|                    d           | j         j        !                    d%| d&|! d'|"            # tD          $ r, | j         j                            d5| d6| d7|             Y w xY wtI                       d S )8NuF   Отключена обработка связей всех задачrQ  r  r  zsystem.additional_parentrE   zsystem.linkr   parentsr   z:additional_parent:)r<   
outward_id	inward_idr  r_   r   z:link:c              3   4   K   | ]}t          |          V  d S r   )r,  )r   rK   s     r(   r]  z5CmfPluginKaiten._process_relations.<locals>.<genexpr>Q  s(      RRxS]]RRRRRRr,   u%   Родительских задач: u   . Подзадач: 2   u9   Обработано родительских задач rR  r   r   rM  uE   Не удалось найти родительскую задачу u   . Возможно задача не попала в импорт или находится в проекте, который еще не импортирован.parent_tasku=   Не удалось найти дочернюю задачу Tr  u!   У дочерней задачи u'    родительская задача uy    из другого проекта. Будет создана связь 'Дополнительный родитель')in_linkout_linkrelation_type)rk  rl  rm  r   u   Создана связь. r  z - u   Не удалось создать связь между родительской и дочерней задачами. Родительская: u   , Дочерняя: u   Ошибка: zERR-0035r  u   Связи задач: u"   Обработано связей r<   rf  rg  r  u=   Не удалось найти входящую задачу u?   Не удалось найти исходящую задачу u.   Не удалось создать связь z. in_link: z, out_link: )&r   r\  r]  r6   r_   r  r   r  rR   CmfRelationTyperT   r+  r,  r   r  rK   r   rI   r  rV  r,  sumr  r   r   r  r  r   r   rj  r  r  CmfRelationOptionrA  r   r    r   rB  )#r[   rc  r  r  additional_parent_type	link_typer   rC  r  rv  r  rU  	parent_id	child_idsrelation_idr  r_   r  linked_task_idtotal_parent_taskstotal_subtasksparent_ext_idrj  child_idchild_ext_id
child_taskrelation_optionr%   total_relationstask_relationrm  rf  rg  rk  rl  s#                                      r(   _process_relationsz"CmfPluginKaiten._process_relations  s		    	O"**+stttF+/((--*2'22233 "(!7!;!;A[!;!\!\*..M.BB	))++ ,	 ,	G J!44Z@@ * *	?,,.. FFF#D/!*9==B+G+G!H!H  IAv &tI
 Avv$(M$5$5i$D$D	!((1113<i0 %."L"L7"L"LK 6&-%.8 8D'44 &/]]3CR%H%H  M'.C#MM#..E  ! %*[[^^N%,"D"DN"D"DK"d&999 %3"D"D7"D"DK"d&999  )&-%38 8D'443*X !//RR4=;O;O;Q;QRRRRR24F 2 2!/2 2	
 	
 	
 *34=3F3F3H3H!)L)L C	 C	%A%	92v{{&++mPQmmYkmm    $/>>9>>M .,,M9+,VVK &..r\e r r r  
 % 4 4"&"2@@h@@#^//')95 0  
 " O*22vX` v v v  
 &
 #*j.@@@1<
.%0 >&OOO===.66t
 t tEPt t t  
 +1*B*F*F$.%0*@ +G + +
  / 
.4.F.F(2)4.D+/?	 /G / /O ,00T0BBB O288 t>T t tXb t tgr t t   !   O--/5@/ /-7/ / *-/ / $. .         LLLLd1668899GoGGHHH/89L9R9R9T9TVW/X/X 0	 0	+A+]2v{{&++,kQR,k,kZi,k,klll, -f 5*<8
)+6	 .,,t7G4W4W:4W4W,XX O*22vXb v v v  
 !>--8H5W5WI5W5W-XX O*22uZc u u u  
 "(":">">#%"/ #? # #
 ' 
&,&>&> '!)&3#'?	 '? ' 'O $((T(:::O*00]m]]w]]S[]]      &..-] - - *- -!*- -     	s:   1C Q
R%RRA'Z8AZBZ2[[c                 	   d| _         || _        t                      5  d| j        _        | j        j                                         t                       d d d            n# 1 swxY w Y   | j        j        | _        | j        j	        j	        j
        | _
        |                     | j        j        d                   | _        | j        j        j                            dt          j                  | _        | j        j        j                            dt          j                  | _        |                                  | j        j        j                            dt          j                  pg }t-          d|v           }t-          d|v           }t-          d	|v           }|s|                                  n| j        j                            d
           |s|                                  n| j        j                            d           |s2|                                  |                                  |                                  |                                  |                                  |                                   | !                                 | "                    | j        j        j                            dd                     | j        j        j                            dd          r(| xj         | j        #                                z  c_         n?| j        j                            d           n| j        j                            d           t                      5  d| j        _$        | j        j                                         t                       d d d            n# 1 swxY w Y   |s| j        %                    d           d | j&        D             }| '                                D ]}|d         }||vrd| j
         d| d}	tP          j)        *                    ddd|	 dgd          }
|
r-| j        j        +                    d|d          d| d           t| j        j                            d|d          d| d           | j        %                    d | j        j,                    | j          S )!Nr   u   Импорт из Kaitenr  r  r  
skip_stager   rB   rC   u&   Пропуск дампа данныхuA   Пропуск скачивания файлов вложенийprocess_task_linksT)rc  process_linksu2   Отключена обработка ссылокu.   Пропуск обработки данныхr  z2--------------------------------------------------c                     g | ]
}|d          S r  r*   r^  s     r(   r   z2CmfPluginKaiten.process_import.<locals>.<listcomp>  s    #L#L#LAdG#L#L#Lr,   r   r   r   r   r   rZ  r  r   r   u   ) импортированu6   ) сдамплен, но не импортированu-   Импортировано объектов: )-r   r   r3   r'   rj   r  r   get_max_processesr  r^   r  r  r  r  rT   ra  r  r  r  rO   r  IMPORT_SKIP_STAGEr  rF  r\  r]  r  r  r  r  r  r)  r=  rb  r  process_cross_linksr/  r   rL   r+  rR   r=  r>  r  r  )r[   r   r  	skip_dumpskip_downloadskip_processselected_project_idsr   rC  rF  rc  s              r(   process_importzCmfPluginKaiten.process_import  sY   $^^ 	 	#=DO O!&&(((LLL	 	 	 	 	 	 	 	 	 	 	 	 	 	 	
 "_>?18D001NO`1abb'+'D'J'N'N$-(
 (
$  $<BFF( 
  
 	##%%% _28<<\6Kcddjhj
j))	Q*_--AO,, 	U    O"**+STTT 	p!!!!O"**+nooo 	]!!###!!!'')))))+++$$&&&   ""$$$##?8>BBCWY]^^ $    ,266MM e4?#F#F#H#HH&../cddddO"**+[\\\^^ 	 	'*DO$O!&&(((LLL	 	 	 	 	 	 	 	 	 	 	 	 	 	 	
  	yO)))#L#LT5K#L#L#L --//  $T]
%999!Hd&6!H!H*!H!H!H$/44$f.C..C.C.CD$( 5    O*//d)9ddjddd    O*22 A)9  A  Aj  A  A  A    O wPTP_Pu w wxxx?""s#   9A""A&)A&19N66N:=N:r   )r   NF)r  )TT)r  )r  r  )T)l__name__
__module____qualname___CmfPluginKaiten__clientr   r5   ui_meta_skipapi_methodsrH   propertyr6   r7   staticmethodr   r   rf   r   r   r   r   r   r   r   r  r  r3  r8   r   ra  r-  r+  r,  r}  r  r  r  r  r-   r  r  r  r  r  r  r  r  r	  r  r#  r'  r5  rF  r|  r  r  r   r  r  r  r  r  r)  r=  rH  rt  r  r  r  r  r  r  r  r  r  r  r  r  r?  rC  rM  r  rk  rw  r{  r  r  r  r  r  r  r  r  r  r  r  r  r   r(  r/  r<  rC  rK  r[  rb  r  r  r  __classcell__)r\   s   @r(   r5   r5   @   s       H$4A E L $3?C KQ Q Q Q Q. ! ! X!" $ $ X$    \ "$ "3 " " " \"   \   \  '3 ' ' ' \'@ @ @&  ,   m m m m^  :4 4 4l' ' 'Rn n n(     D    ' ' '( ( ( ( (T# # #     D4 4 4l8E 8E 8EtV V V _Z  33 3 3 3 ! 3  4P P P _EFF4 4 GF4 _FGG
Y 
Y HG
Y _@AA_ _ BA_  , , ,\> > > >@  <= = = J J JBJ BJ BJH" " "Bk k kZW W Wr
 
 
K" K" K" K"Z _DEEc c FEcB4! 4! 4! 4! 4!l2 2 2hw w wr  >N N N` _455  6589 9 9vk k kZ _CDD] ] ED]~ _XYY1# 1# ZY1#fp p pd5' 5' 5'n  .     D5+ 5+ 5+n= = =~D/ D/ D/Lf/ f/ f/P/' /' /'bI I IVS3 S3 S3j" " "9' 9' 9'v   BH H HT _Q! Q! Q!f& & &(o o ob  2 "4 4 4 4l%+ %+ %+NfY fY fYP  6: : :xH H HT0 0 0d  40 0 0dM M M^3, 3, 3,j5; 5; 5;n _4551. 1. 651.fL L L\)H )H )HV(1 (1 (1Tl l l\ _:;;.* .* <;.*` _JKKy yT y y y LKyvW# W# W# W# W# W# W#r,   r5   r   )(r   r   r  rQ  r  r1   r   r  r   r  r.  r2  r[  r  
contextlibr   r  r   	itertoolsr   bs4r   pathlibr   queuer   text_unidecoder	   r  r   cmf.includemodules.kaiten.fieldsr   modules.kaiten.kaiten_clientr   localrd   r-   r3   r5   r*   r,   r(   <module>r     s          				 				              % % % % % %       " " " " " "                   $ $ $ $ $ $           3 3 3 3 3 3 5 5 5 5 5 5Y_
   , % % %gK# gK# gK# gK# gK#'7 gK# gK# gK# gK# gK#r,   