
    oiQ                    R   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 d dlm Z  d dl!m"Z"  ejF                         Z$ddZ%ed        Z& G d de jN                        Z'y)    N)contextmanager)deepcopy)permutations)BeautifulSoup)Path)Queue)	unidecodecmf_context)*)cmf_plugin_kaiten)KaitenClientc                       fd}|S )Nc                       fd}|S )Nc                 t   	 %| j                   j                  d d dd d       | j                   j                         ry | g|i |}t                |S # t        $ rQ}t                | xj                  dz  c_        | j                   j                  drdz   nd d	|        Y d }~y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    #NN&&'!D66('Ct&T>>++-3000
 !#((<dd
PR7SSUVYUZ)[\	s   AA A 	B7&AB22B7 )r&   r)   r'   s   ` r(   	decoratorz"catch_exception.<locals>.decorator!   s    	     r*   )r'   r+   s   ` r(   catch_exceptionr-       s    $ r,   c               #      K   	 dt         j                  d<   d  dt         j                  d<   y # dt         j                  d<   w xY ww)Nr   NO_CACHE1)osenvironr*   r,   r(   enable_cacher3   6   s8     %!#

:!$

:

:s   A/ AAA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	 drdZd Zd Zd Zd Zd ZdefdZd Z	 	 	 dsd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-dtd-Z.d. Z/d/ Z0d0 Z1d1 Z2d2 Z3d3 Z4d4 Z5d5 Z6dud6Z7 e%d7      d8        Z8d9efd:Z9d; Z:d< Z;d= Z<d> Z= e%d?      d@        Z>dA Z?dB Z@ e%dC      dD        ZA e%dE      dF        ZBdG ZCdH ZDdI ZEdJ ZFdK ZGdL ZHdM ZIdN ZJdO ZKdP ZLdQ ZMdR ZNdS ZOdvdTZPdU ZQ e%       dV        ZRdW ZSdX ZTdY ZU	 	 dwdZZVd[ ZWd\ ZXd] ZYd^ ZZd_ Z[d` Z\da Z]db Z^dc Z_dd Z`de Za e%df      dg        Zbdh Zcdi Zddj Zedk Zf e%dl      dm        Zg e%dn      dxdoehfdp       Zidq Zj xZkS )yCmfPluginKaitenN)clientkaiten_fieldsget_all_projectsc                    t        |   |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                  j                  d      | _        t        j                   j                  d      | _        t        j$                  j                  d      | _        t        j                   j                  d      | _        y )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)=9U&9M!

 *0););)?)?Y)?)O&#)#6#6#:#:@W#:#X "("4"4"8"8>V"8"W%2266<O6Pr,   c                 v   t        t        d      s| j                  g d       t        t	        | j
                  j                        | j
                  j                  j                         | j
                  j                  j                  t        j                               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,   !-++,kk++335;;1177002	!J    r,   c                 J   | j                   r| j                   S | j                  j                         j                  d      }|j	                         rG| j
                  s;t        |d      5 }t        j                  |      | _         d d d        | j                   S | j                  j                         | _         t        |d      5 }t        j                  | j                   |d       d d d        d| _        | j                   S # 1 sw Y   | j                   S xY w# 1 sw Y   3xY w)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    '''OO557@@O	d&8&8i& 4!'+yy|$4 ### $(;;#9#9#;D i& G!		$..	FG!&D###4 ###	G Gs   *D#DDD"c                    t        |       } | j                         } t        j                  dd|       } t        j                  dd|       } t        j                  dd|       } t        j                  dd|       } | j	                  d      S )	N&z and z\+r   z[^\w\s-]r   z[\s_-]+-)r	   lowerresubstrip)texts    r(   _slugifyzCmfPluginKaiten._slugify   sl    zz|vvdGT*vveS$'vvk2t,vvj#t,zz#r,   datareturnc                    | d   }| j                  d      xs d}| j                  d      }t        j                  j                  | d| d      }|<t        j                  t        j
                  |            }|j                  |      }n*|j                  t        j                  j                        }|j                  t        j                  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*AhZ(@BUV R\\)<=B%%R%0F%%R[[__%=F""2;;??3!!r,   c                  
    g } | S Nr*   )r$   s    r(   calc_models_settingsz$CmfPluginKaiten.calc_models_settings   s    
r,   c                     |sy|j                  d      r:|j                  dd      }| j                  d      xs i }|j                  |      }|S | j                  |      }|S )u`   
        Метод получает значение параметра объекта
        Ncf_id_
properties)
startswithr   rT   )obj_dataattrproperty_idr   rj   s        r(   
_get_valuezCmfPluginKaiten._get_value   sc    
 ??5!,,ue4K!l39rJNN;/E  LL&Er,   
field_namec                 @    |sy | j                  |g      }|r|d   S d S )N)fields_namer   )import_shop_fields)modelr   r$   s      r(   _get_field_namezCmfPluginKaiten._get_field_name   s.    &&J<&@s1v&$&r,   c                     ddddddddd	d
dd}||v r||   S | j                   j                  |i       j                  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   sc    !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                   j                         D ]  \  }}|j                  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"M:,i@-yA&
;'<)9=(&9	
 ++11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   s+     #K8#W5+[A

 r,   c                    |j                  d      rs|rp|d   }||dk(  ry|S |dk(  r|d   }n|d   }|dk(  rg }|D ]S  }|d	   j                  t        |            }	|	d
   }
|r|j                  |
       9t        j                  |
dd      }|c S  t        j                  j                  d|      }|D cg c]  }|d   |v s| }}|S |dk(  rwg }|D ]n  }t        |      t        u r|d   }n|}	 	 | j                  |      }| j                  |dd      \  }}|st        d| d      |r|j                  |       n|c S p |S |dk(  r t#        j$                  dd t        |            S |d!k(  r| j'                  |      S |S |d"k(  rC||S d#| j(                   d#|d    d#}t        j*                  j                  d$d%d&| d&g'      }|S |d(k(  rH||S | j(                   d#|d)   d    d#|d    }t        j,                  j                  d$d*|gd+g,      }|S |d-k(  r*||S |D ]   }|d   d.k(  s| j/                  |d         c S  y |d/k(  r||S | j/                  |      S |d0k(  r| S |S c c}w # t        $ r}t        | d      d }~ww xY w# t        $ rU}| xj                  dz  c_        | j                  j!                  d|d    d| d| d| dd       |sY d }~ y Y d }~d }~ww xY w)1Nr   r<   checkboxFstring	multilinemulti_selectselectselectValuesrj   r~       seplengthCmfTaskr'   useriduJ   . Возможно пользователь был удален в Kaiten.)createupdateu   Пользователь UID 'u&   ' не найден в системе.r   u1   Не удалось присвоить полю '' (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_namesvalue_id
value_data
value_name	value_keychoiceschoicevaluesusers	user_datauser_id	user_infor%   person_logic_type_ext_idr   status_ext_idr   r   s                              r(   _normalize_valuez CmfPluginKaiten._normalize_value   s      'I )& 1}$
2  L H,$[1$^4 H,  % )H!*>!:!>!>s8}!MJ!+G!4J#**:6$+$:$:& ##% %; %	
  )() !55AA 07XV&.K:W&XX"f,!& (II$."+D/"+((,(E(Eg(NI
 %)$8$85Y^$8$_	%"+"@Kq r#  $!LL0#)M 1%(> "g-vviSZ88"f,''..< ; <'}"$T%5%5$6btR H,,00 &A.?-@*BC 1 J 8#}#//08I3Ft3L2MRPUVZP[}]M%%)) #}5% * F M=(}  ;6?a'++GDM::; ;&!M5Ft/?/?/FF?*9M Y  ) "+#&%'q r#  % 	(1,11OPYZ`PaObbefpeq r11:3seE&%0	 2   (#'  (	(sC   8I.I.4I3=J3	J<J

JJ	K0AK++K0c                 F   i }|D ]  }|d   s	|j                  d      }|d   d   }| j                  ||d         }| j                  ||||      }|||<   |sS|j                  d      se|sh|d   dk(  sq|d   sw|j	                  d	g       }|j                  |        |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     	8G=)K0I /=JOOHgfo>E))	E */N:& ))%0Yf%1i6L'5'@'@AWY['\$$++J7-	80 r,   c                    	 g 	| _          j                   j                  dg       	 fd}d }d } j                   j                         j                  d      }|j	                         rJ j                         D ]   } j                  |d         D ]  } n |s  n  j                  d      D ]  } n |s1 j                  j                  dd      D cg c]  }| }}|r|d	   }|st        d
      |s j                  j                         }|st        d      d _         || j                  t        j                          || j                   t        j"                         	j%                  dg d       	S c c}w )Nplugin.plugin.*c                 
    |       }|D ]X  }j                  | |d         |d<   j                  ||d         |d<   j                  |d         |d<   |j                  |d<   Z j	                  |j
                  |d       y )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 )-)=)=eW]E[)\&#'#B#B76?#S "'**	-
 MM5#5#5NOr,   projectsr   r  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   r  tasksr   s
   `        @r(   tmplt_import_settingsz%CmfPluginKaiten.tmplt_import_settingsw  s   $##%6$78	P 88:CCJO --/  33GDMB D	
 ((1   $ 5 5]bc 5 de1QeEeQxrss;;//1D  A  B  B " 	dD::FNNKdD::F<L<LM 	02>?/ fs   	E?c           	         | j                  dg       | j                  j                  | _        g }	 | j                  5 }|j	                         D ]  }t        |d         }|d   }|}|d   r|dz  }d| j                   d| d}	t        j                  j                  ddd	|	 d	gd
ddg      }
|
r|dz  }|
j                  }n0| j                  |      }t        j                  j                  |      }||||d}|j                  |        	 d d d        |S # 1 sw Y   |S xY w# t        $ r}t        j                  |        d }~ww xY w)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sgetr2  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  sx   ./0;;22 	 2#..0 2E!$U4[!1J$)'NM#0LZ($(==')$*:*:);2j\%LN$//44 (&An5EQ2GH(, $&89 5 G
 $(EE&-&>&>'+}}]'C&,&7&7&L&L\&Z )* ,)6	$L OOL1722B C2B 	  	GGCL	s5   D$ CDD$ D!D$ !D$ $	E-EEc                    t        |      }t        j                  j                  }|j	                  | j
                  j                   d|       }|t        j                  |      S | j                  d      D ]  }t        |j	                  d            |k(  r|c S |j	                  d      |k(  r|c S |j	                  dd      j                         |j                         k(  r|c S |j	                  dd      j                         |j                         k(  r|c S |j	                  dd      j                         |j                         k(  s|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,<<%%LLDOO$6$6#7vgY!GH	 <<	**))'2 
	!I9==&'72  }}U#w.  }}Wb)//1W]]_D  }}Z,224G  }}["-335H  
	! bcjbklmmr,   c                    t        |      }t        |      j                  d      ry 	 | j                  |      S # t        $ r 	 |j	                  d      }|j                         rt        |d      5 }|D ]  }t        j                  |      }t        |d         |k(  r|c cd d d        cY S |j                  d      |k(  r|c cd d d        cY S |j                  dd      j                         |j                         k(  s|c cd d d        cY S  	 d d d        n# 1 sw Y   nxY w| j                  j                  |      }|rOt        |d      5 }|j                  t        j                  |d	
      dz          d d d        n# 1 sw Y   nxY w|cY S Y y # t        $ r3}| j                  j                   j#                  d|        Y d }~Y y d }~ww xY ww xY w)Nr~   
users.jsonrr   rG  r   r   a+Frp   
uS   Не удалось получить данные пользователя по ID )rf   r   r   r   rs   rt   ru   rv   rM  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  s   g, w<""3'	0099 	%..|<
$$&j#. 1!#$ 1C(,

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

95
 ID PQR R R$$   &&..ijqirs '	s   9 
G-F1/D 	F)G,D	FG1DD	FGD	FD$	 0F*F:	FF	FG	G(GGGGr'   c              #     K   | j                   j                         j                  | d      }|j                         r5t	        |d      5 }|D ]  }t
        j                  |        	 d d d        y y # 1 sw Y   y xY ww)N.jsonrn   )r   rr   rs   rt   ru   rv   rM  )r[   r'   rz   r{   r[  s        r(   r(  zCmfPluginKaiten._simple_get  sw     OO557@@D6P	i& *! *C**S/)** * s   A	BA5+
B5A>:Bc              #   T  K   | j                   j                         j                  d      }|j                         r_t	        j
                  |      D ]F  }|j                  d      rt        | d| dd      5 }t        j                  |       d d d        H y y # 1 sw Y   TxY ww)Nr"  .dirtyz.meta/
/info.jsonrn   )
r   rr   rs   rt   r1   listdirendswithru   rv   rw   )r[   project_dirr>  r{   s       r(   r&  zCmfPluginKaiten._get_projects  s     oo779BB:N jj5 '
&&':;[M:,jA4H 'A))A,&' '	'  
' 's   A6B(8BB(B%	!B(c              #     K   | j                   j                         j                  dt        |      d      }|j	                         s,| j                   j
                  j                  d| d|        y d}t        |      j                         D ]  }|j                         s|j                  }|j                  d      r2|r |j                  d      j	                         sT|j                  d      j	                         }	| j                  d	u r|	s| j                  d
u r|	r||k  r|dz  }|
|||z   k\  r y t        |j                  d      d      5 }
t        j                  |
       d d d        |dz  } y # 1 sw Y   xY ww)Nr"  r-  u   Каталог u    отсутствует. Возможно он был удален или еще не создан. Необходимо повторно запустить импорт проекта r   r`  .processing	.archivedTFr   	info.jsonrn   )r   rr   rs   rf   rt   rW  rX  r   iterdiris_dirr'   re  rO   ru   rv   rw   )r[   r>  offsetr$  only_processing	tasks_dircounttask_dirtask_idis_archivedr{   s              r(   r'  z"CmfPluginKaiten._get_project_tasks  s     OO557@@J
	 !OO""**!) -hhrgsu Y//1 	H??$mmG 34x'8'8'G'N'N'P"++K8??AK##t+K%%.;v~
 Ufun%<h''4d; #qiil"#QJE-	(# #s   EF	E=-F	=F	F	c              #     K   | j                   j                         j                  dt        |      d      }|j	                  d      D ].  }t        |d      5 }t        j                  |       d d d        0 y # 1 sw Y   ;xY ww)Nr"  boardsz*.jsonrQ  )r   rr   rs   rf   globru   rv   rw   )r[   r>  
boards_dir
board_filer{   s        r(   _get_project_boardsz#CmfPluginKaiten._get_project_boardsH  s{     __668AAJ

 %//(3 	#Jj#& #!iil"# #	## #s   ABA:/B:B	?Bc                    t        |      j                  d      rt        j                  S 	 | j	                  |      }| j                  |dd      \  }}|s| j                  j                  j                  j                  d      rjt        j                  j                  | j                  j                  d         }| j                  j                  d	| d
| t        j                          |S | j                  j                  d	| ddd       t        j                  }| xj"                  dz  c_        |S # t
        $ r;}| j                  j                  | ddd       t        j                  cY d }~S d }~ww xY w)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_personP  sn   w<""3'== 	!009D ((ue<	,,22667HI))--1N1NO`1a-b##B7) Liiohpr!// $   ))B7) L` a(	 *  1$3  	!OO%%%bc$ & 
 == 	!s   D7 7	E; 0E60E;6E;c                    d}d}d}d}| j                   j                         j                  dt        |      d      }|j	                         rt        |      j                         D ]  }|j                         s|j                  j                  d      r0t        |j                  d      d      5 }t        j                  |      }	ddd       |j                  d      }
	j                  d	      }|r,|d
z  }t        |
d      5 }|j                  d       ddd       n|d
z  }|
j                  d       |j                  d      j	                         s|r|d
z  }|d
z  } ||z   ||z   ||||f}|S # 1 sw Y   xY w# 1 sw Y   TxY w)u  
        Возвращает статистику по сдампленным задачам проекта

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

        Returns:
            tuple: статистика задач проекта
        r   r"  r-  r`  rj  rQ  Nri  r0  r   wr   T
missing_okrh  )r   rr   rs   rf   rt   r   rk  rl  r'   re  ru   rv   rw   rT   rU  unlink)r[   r>  activer0  unprocessed_activeunprocessed_archivedro  rq  r{   	task_dataarchived_flag_filers  statss                r(   _get_project_tasks_statsz(CmfPluginKaiten._get_project_tasks_statsr  s     OO557@@J
	  O335 0(==))*=>(++K8#> -! $		!I- &.%6%6{%C"'mmJ7MH0#6 $!$ $ aKF&--->$$]3::<",1,*a/*/04 X!55 
 7- -$ $s   2E6F6E?	F	c                    t         j                  j                  }| j                  j	                  d       g }t               }| j                  j                         j                  d      }|j                         rt        |d      5 }t        |d      D ]\  \  }}|j                         }|s	 t        j                  |      }	|j                  t        |	d                |j!                  |	       ^ 	 d
d
d
       |d   }| j'                  |      D ]  }t)        |d         j                  d      }|j                         s1d}t        |      5 }t        |d      D ]  \  }}|j                         }|s	 t        j                  |      }	t        |	d         }||vrO|j                  | j                  j*                   d| t-        j.                  |	             |j!                  |	        	 d
d
d
       |r|j1                           t        |d      5 }|D ]+  }	|j3                  t        j/                  |	d      dz          - 	 d
d
d
       y
# t"        $ r2}
| j                  j%                  d| d| d|
 d	|        Y d
}
~
d
}
~
ww xY w# 1 sw Y   xY w# t"        $ r4}
d}| j                  j%                  d| d| d|
 d	|        Y d
}
~
zd
}
~
ww xY w# 1 sw Y   xY w# 1 sw Y   y
xY w)us    Собирает пользователей из файла users.json в каталогах документов u9   Сбор пользователей из объектовrP  rQ  r   r   u   Ошибка в строке u    файла : r   Nrq  FrF  Tro   rp   rS  )rI  rJ  rK  r   r   setrr   rs   rt   ru   	enumerater   rv   rM  addrf   r   r   r    r'  r   r   rL  rV  r  rU  )r[   rD  rN  current_userscurrent_user_idsall_users_filer{   line_numberliner   r%   r>  r+  task_users_fileerrorr
  s                   r(   _collect_userszCmfPluginKaiten._collect_users  s   <<%%WX 5::<EElS  "nc* a)21a %K::<D #zz$/(,,Sd_=%,,T2 "$'
++J7 	)D"4
#34==lKO"))+Eo& !)21a %K::<D #zz$/"%d4j/"*::$LL#'??#5#5"6fWI F &T 2 *006( &&(5	)8 .$' 	E1% E

4e
<tCDE	E 	EG % 11;K=UcTddfgjfkkmnrmst  F %  $11;K=UdTeeghkgllnosntu  .	E 	Esz   &J.AI1J&K7A6J-K1K+	J'J
J
JJJ	K	()K	KK	KK(	+K4c                    t         j                  j                  }| j                  d      D ]Q  }|j	                  d      }|j                  | j                  j                   d| t        j                  |             S y )Nr  r   rF  )
rI  rJ  rK  r(  rT   r  r   r   rL  rV  )r[   rN  r	  r5  s       r(   _cache_all_usersz CmfPluginKaiten._cache_all_users  sh    <<%%))'2 	VI--%CLLDOO../vcU;V\\)=TU	Vr,   u   Дампc                 b   | j                   j                         j                  | d      }|j                         rt	        j
                  |       | j                   j                         j                  | d      }t        |d      5 } |       D ]J  }| j                   xj                  dz  c_        |j                  t        j                  |d      dz          L 	 d d d        t        j                  ||       | j                   j                  j                  d	       y # 1 sw Y   FxY w)
Nr^  z.json.dirtyrR  r   Frp   rS  T	only_data)r   rr   rs   rt   r1   removeru   json_object_countrU  rv   rV  shutilmoverj   save)r[   api_funcr'   rz   file_tmp_pathr{   r[  s          r(   _simple_dumpzCmfPluginKaiten._simple_dump  s    OO557@@D6P	IIi 99;DDv[EYZ-& 	D!z D11Q61

3U
;dBCD	D 	M9-""T"2	D 	Ds   
AD%%D.c                    t        |d         }|d   }|d   }|j                  |      }| j                   d| d| }t        j                  j                  || j                  g d      }	|	s,t        j	                  || j                  | j                        }	||	_        ||	_        ||	_	        |	j                  s|j                         sd|	_        ||	_        |	j                          t                y )	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[   rr  
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#//07)2m_M//33(((+ 4 

 !33, ,,?? 4 L
 &(+""/*@*@*B&+L#+5L(r,   c                     t        |d         }|j                  d      }|j                  d       |j                  dg       D ]  }| j	                  |d   ||        y )Nrq  attachmentsTexist_okfilesr   )r   rs   mkdirrT   r  )r[   r+  rq  r  r  s        r(   _dump_task_attachmentsz&CmfPluginKaiten._dump_task_attachments  sd    Z()"++M:t,((7B/ 	PJ&&tDz:O	Pr,   u.   Дамп комментариев задачиc           	         t        |d         }|j                  d      }|j                         rt        j                  |       | j
                  j                  |d         }t        |d      5 }|D ]m  }|j                  d      r| j                  |d   |       |j                  t        j                  |dd      d	z          | j                  j                  d
       o 	 d d d        y # 1 sw Y   y xY w)Nrq  comments.jsonr   rR  	author_idFTrq   	sort_keysrS  comment)r   rs   rt   r1   r  r6   get_card_commentsru   rT   r\  rU  rv   rV  r   inc_stat)r[   r+  rq  comments_filecommentsr{   r  s          r(   _dump_task_commentsz#CmfPluginKaiten._dump_task_comments  s    Z() ))/:!IIm$;;00d<-& 	4!# 4;;{+''(<hG

7$
ORVVW((3	4	4 	4 	4s   /A3C,,C5u/   Дамп журнала работ задачиc           	         t        |d         }|j                  d      }|j                         rt        j                  |       | j
                  j                  |d         }t        |d      5 }|D ]R  }|j                  d      r| j                  |d   |       |j                  t        j                  |dd      d	z          T 	 d d d        y # 1 sw Y   y xY w)
Nrq  timelogs.jsonr   rR  r  FTr  rS  )r   rs   rt   r1   r  r6   get_card_time_logsru   rT   r\  rU  rv   rV  )r[   r+  rq  time_logs_file	time_logsr{   time_logs          r(   _dump_task_time_logsz$CmfPluginKaiten._dump_task_time_logs&  s    Z()!**?;  "IIn%KK224:>	.$' 	Y1% Y<<,''(=xH

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

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

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

 $ 
	#I )))4I,,Y7I.4i-@N9>>* ~~\1"inn-f5B"
	# iw7 K1		.!AE	JK ))-8Ii%  	 70 0 "!"4K K s@   D1 D%	D1 
E	E%D.*D1 1D?>D?EEc                    t        d      5  | j                  5  d}|d   }|d   }	 | j                  5  | j                  }| xj                  |z  c_        d d d        	 | j                  j	                  || j
                  d|      }|sn|D ]  }	t        |	d         }
|	d   }| j                  j                  j                  d	| d
|
 d       |j                  |
      }|j                  |
dz         }|j                         rt        j                  ||       |j                  d       t        |      |	d<   | j                  |	       | j!                  |	       | j#                  |	       |	d   r| j%                  |	d   |       |	j'                  dg       D ]  }| j%                  |d   |        t        j                  ||       t        |      |	d<   t)        |j                  d      dd      5 }t*        j-                  |	|ddd       d d d        |dz  }| j                  j/                  d       | j1                  |       | j3                  |	        	 :	 d d d        d d d        y # 1 sw Y    xY w# 1 sw Y   pxY w# t4        $ r2}| j                  j7                  d| d
| d| ddd       Y d }~cd }~ww xY w# 1 sw Y   ixY w# 1 sw Y   y xY w)NFinit_views_and_dsr   r   r   Tr   )space_idr0  r#  rm  r$  u   Задача 'r   )ra  r  rq  r   r   rj  r  r  r  rB   )r  rq   r  r   r+  uB   Не удалось получить задачи проекта '). zERR-0005r   ry   )
error_coder   
error_type)r   r6   _lock_offsetr)  rO   rf   r   rW  infors   rt   r  r  r  r  r  r  r\  rT   ru   rv   ry   r  r  r  r   r    )r[   rD  ro  r$  
task_countr>  r@  rm  r-  r+  rr  	task_namerq  task_tmp_dirmemberr{   r%   s                    r(   _dump_task_workerz!CmfPluginKaiten._dump_task_worker|  s   51 =	4;; =	J%d+J'0LZZ *!\\FLLE)L*2 KK11!+!%!5!5/<%# 2 E ! %  :"%d4j/$(M	..33nYKsSZR[[\4]^#,#5#5g#>'0'9'9'H:L'M#??,"KK,?$**D*9+.|+<Z(00611$72248
+ //Z0@,O&*hhy"&= LF //tlKL L(;+.x=Z(!("3"3K"@#PWX ]\] IIdAaeW[I\]"a
008 --h733D9A :!  )=	 =	 =	* *N] ] ! OO--\]i\jjmnxmyy|  ~A  }B  C#-!*#)	 .  o=	 =	 =	 =	s   KK"I4K,JKE*J7J	AJK#K4I>9KJ
J	K(K>KKKK	KK c                    d}t        |d         j                  d      }|j                  d       d| _        t	        j
                         | _        g }t        | j                        D ]v  }t	        j                  | j                  d|dz    ||d	      }|j                  |       |j                          | j                  j                  j                  d
|        x |D ]  }|j!                           | j#                  |       |S )Nr   rf  r-  Tr  dump_tasks_r   )rD  ro  targetr'   r#   u$   Запущен обработчик )r   rs   r  r  	threadingLockr  rangedownload_threading_max_forksThreadr  r   startr   rW  r  joinr  )r[   rD  errorsro  threadsithreads          r(   _dump_taskszCmfPluginKaiten._dump_tasks  s    m45>>wG	&^^%
t889 	YA%%--"1q5'*$0!*F NN6"LLNOO""''*Nvh(WX	Y  	FKKM	 	L)r,   c                    |j                  d      }|j                         rt        j                  |       |j	                          | j
                  j                  |      }|D ]  }|d   }g |d<   | j
                  j                  || j                        D ]"  }|d   j                  t        |d                $ |j                  | d      }t        |d      5 }	t        j                  ||	d       d d d         y # 1 sw Y   xY w)	Nru  r   cards)r0  r^  ro   Frp   )rs   rt   r  rmtreer  r6   get_space_boardsget_board_cardsrO   r   rf   ru   rv   ry   )
r[   r>  rf  rw  boards_data
board_databoard_idcardrx  r{   s
             r(   _dump_project_boardsz$CmfPluginKaiten._dump_project_boards  s     ))(3
MM*%kk22:>% 	=J!$'H"$Jw33HtG[G[3\ <7#**3tDz?;<#,,z-?@Jj$' =1		*ae	<= =	== =s   DD
	c                 J   |j                  d      }|j                         rt        j                  |       | j                  j                  |      }t        |d      5 }|D ]+  }|j                  t        j                  |d      dz          - 	 d d d        y # 1 sw Y   y xY w)NrP  rR  Frp   rS  )
rs   rt   r1   r  r6   get_space_usersru   rU  rv   rV  )r[   r>  rf  rZ  
users_datar{   r	  s          r(   _dump_project_usersz#CmfPluginKaiten._dump_project_users  s     )),7
IIj![[00<
*d# 	Jq' J	

95
ADHIJ	J 	J 	Js   1BB"c                    | j                   j                         j                  d      }|j                  d       t	        | j
                        }t        d|z        }| j
                  D ]c  }|d   }|d   }|d   }	 | j                   j                         r y | j                   xj                  dz  c_        | j                   j                  j                  d	| d
| d       |j                  |      }|j                  | d      }	|j                         rt        j                  ||	       n|	j                  d       | j                  j                  |      }
t!        |
d         |
d<   ||
d<   t!        |	      |
d<   | j#                  ||	       |
j%                  d      r0| j'                  |
d   | j                   j                               |
d<   | j)                  ||	       t+               5  | j                   xj,                  |z  c_        | j                   j.                  j1                  d       t3                d d d        t        j                  |	|       t!        |      |
d<   |
d    d}t5        |d      5 }t6        j9                  |
|d       d d d        d}|| j;                  |
      z  }| xj<                  |z  c_        f | j                   jC                  d       y # 1 sw Y   xY w# 1 sw Y   `xY w# t>        $ rE}| xj<                  dz  c_        | j                   jA                  d| d| ddd       Y d }~d }~ww xY w)Nr"  Tr  P   r   r5  r6  r   u   Дамп проекта 'r   r  ra  rf  
author_uidauthorr  rc  ro   Frp   r   )rD  u2   Не удалось получить проект r   zERR-0006r8  ry   )r   r  u*   Дамп проектов завершен)"r   rr   rs   r  lenrL   intr   r  rW  r  rt   r  r  r6   	get_spacerf   r!  rT   r\  r  r3   progressrj   r  r   ru   rv   ry   r  r   r   r    r   )r[   r,  cntstepr   r>  rB  r@  rf  project_tmp_dirrD  	data_filer{   dump_task_errorsr%   s                  r(   _dump_projectszCmfPluginKaiten._dump_projects  s   88:CCJOD)$(()28}-- 9	G J!%.K"?3L5??,,.11Q61&&++.G~UXYcXdde,fg*33J?"."7"7:,f8M"N%%'KK_=#))4)8#{{44Z@%(d);%<T"&1U#.1/.B]+((_E##L1-1-@-@$\299;.L* ))*oF!^ !OO,,4,OO))...>L!
 O[9.1+.>]++M:;:F	)T* CaIIlAEIBC $%  D$4$4,$4$OO #33c9	v 	HI3! !C C  1$))H	QSTWSXY)%	 *  sQ   ?LEL2AK.A LK:4L.K7	3L:L	?L	M:MMc                    t         j                  d      }| j                  j                  j                  |_        |j                  | j                  j                  j                         | j                  j                         }t        j                  |      \  }}}||z  dz  }| j                  j                  j                  d| d       | j                  j                  j                  d       | j                  5  | j                  j                  j                  d       | j                  | j                  j                  d       | j                  j                  j                  d       | j                  | j                  j                  d	       | j                  j                  j                  d
       | j                  | j                  j                  d       t!               5  d| j                  _        | j                  j$                  j'                          t)                ddd       | j                  j                  j                  d       | j+                          ddd       y# 1 sw Y   GxY w# 1 sw Y   yxY w)u^   
        Загружает все данные из API, кроме вложений
        z'modules.kaiten.kaiten_client.connectiond   u   Свободно места: r   u5   Скачивание данных через API ... u#   Дамп пользователейr  u   Дамп типов задач
task_typesu   Дамп метокtags   Nu,   Дамп выбранных проектов)r  	getLoggerr   rW  handlerssetLevelr|  rr   r  
disk_usager  r6   r  get_company_usersget_card_typesget_tagsr3   r)  rj   r  r   r/  )r[   rW  download_pathtotalusedfreefree_percents          r(   download_datazCmfPluginKaiten.download_data8  s    ""#LM//0099..44599;"--m<tTe|c)##&CL>QR$ST##$[\[[ 	"OO""''(MNdkk;;WEOO""''(HIdkk88,GOO""''(=>dkk22F; +-(%%**,
 OO""''(VW!!	" 	" 	" 	"s&   ?C,I=+A I1+=I=1I:	6I==Jc                    t        j                         j                  }t        j                         j                  }d}d}d}d}d}	t	        d      5  | j
                  5  	 | j                  j                         rns|j                         }
|
dk(  rn\t        j                  t        j                  dd             	 t        j                  j                  |
g d	      }t        |j                        }t        |j                         }t        |j"                        }t        |j$                        j'                  d
      }t)        |      dkD  r	d|d    dnd}d| d}|}|j*                  j,                  }|r5|j                  d      }|r"t/        |t0              r|dz  }|d|dd| dz  }| j                  j2                  j5                  | d| d| d       t        j6                         }| j
                  j9                  ||t:        j<                         t        j6                         }|}t?        |      }|jA                         jB                  }|dz  }|d|dd| dz  }| j                  j2                  j5                  | d| d| d       d|_"        |jG                          tI                | j                  jK                  d       |dz  }||z  }|	||z
  z  }	|dz  }|dz  }|	dk7  r||	z  nd}|||||	f}|jS                  |       | j                  j2                  j5                  d"| d#| d$| d%| d&| d'|d(d)|dd*| d+       d d d        d d d        y # tL        $ rD}tO                |dz  }| j                  jQ                   d d d| ddd |!       Y d }~d }~ww xY w# |dz  }w xY w# 1 sw Y   lxY w# 1 sw Y   y xY w),Nr   Fr  TDONEg?      ?)r'   r  r  r  r  r   r   r   r   u   [Задача ID: z] r   'size    (.3fu    MБ / u
    байт)u   Скачивание z: ')timeoutu	   Файл u    сохранен в 'r  u"   Ошибка скачивания r   zERR-0007r  ry   )r  r   r  ext_hrefu   Поток 'z' (ID: uU   ) завершен. Скачано файлов (успешно/неуспешно): rb      из 8   . Средняя скорость скачивания: .2f)    МБ/с. Скачанный объем:     МБ / 	    байт)*r  current_threadr'   identr   r6   r   r   rT   r   sleeprandomuniformrR   r  rf   r  r  r  splitr&  r  rj   
isinstancer'  rW  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_workerY  s_   ..055,,.44	51 a	4;; a	??,,."0"4"4"6"f, 

6>>#s34@%#)#;#;#?#?*  $@ 	$L !$L$5$5 6I"<#4#45H #L$5$5 6I#&|'>'>#?#E#Ed#KLNQR^N_bcNc$6|A6Gr"JikK"#I;a 0I(H , < < B BI *3--*?*z/3/O+:W+DL$"\#,>goEVV`(aaHOO**//;-?TU]T^^abjakkl0mn --/EKK-- ! & > > . 
 ++-C(H&*9oO&5&:&:&<&D&DO#2W#<L"\#$6go=Nj YYHOO**//&-y
:PQZP[[\] /3L+ %%'LOO,,\:$)$$7$'C%K8'  1$KY \ -w6M@SWX@X)<<^_J   #E U#OO""''{m79+ >T#$Ak]& FIISTWHX Y22?1DHM]L^^g	iwa	 a	 a	D ! 	 N1$KOO--&-'I)TWX`Waadehdij#-!4#)!) .  	  1$K[a	 a	 a	 a	s]   O AO?H+M+*A0OO+	N84:N3.N;3N88N;;OOO	
OOc                 z   dd| j                   gg dg}| j                  j                         j                  d      }d}g }| j                  D ]  }t        |d         }|j                  |      }t        |      j                  d      st        |      dz   }dd	| d
gg}||z   }	t        j                  j                  |	      }
|
s{||
z  }|j                  |	        |s&| j                  j                  j                  d       y| j                  j                  j                  d|        t               }t               }d}d}d}d}d}g }t        | j                        D ]v  }t!        j"                  | j$                  d|dz    ||d      }|j                  |       |j'                          | j                  j                  j                  d|        x |D ]E  }t        j                  j)                  |ddg      D ]  }|j+                  |j,                          G t/                |D ]  }|j+                  d        |D ]  }|j1                           | j                  j3                         r%| j                  j                  j5                  d       |j7                         s@|j9                         \  }}}}}||z  }||z  }||z  }||z  }||z  }|j7                         s@|dz  }|dk7  r||z  nd}| j                  j                  j                  d| d| d| d|dd|dd| d       |S ) Nr   ==)r  ry  Fr"  r   r   rb  r  r   r   r   u3   Нет вложений для скачиванияu'   Скачивание вложений: _download_file_worker_r   )ra  rb  r  u   Запущен поток r1  r   rC  u   Импорт прерванrH  uj   Скачивание завершено. Скачано файлов (успешно/неуспешно): rM  rN  rO  rP  rJ  rQ  rR  )r   r   rr   rs   rL   rf   re  rR   r  rp  r   rW  r  r   r
  r  r  r  rw  r  slistr`  r   r   r  r   rX  emptyrT   )r[   main_filterprojects_pathattachment_countfiltersrD  r>  project_pathpath_filterdownload_filterdownload_countra  rb  
main_counttotal_downloadedtotal_errorstotal_downloaded_bytesri  r  r  r  filter_r  rg  rf  re  rh  download_timetotal_downloaded_mbrv  s                                 r(   download_fileszCmfPluginKaiten.download_files  s   D$"2"23'
 99;DDZP 22 
	0L\$/0J(11*=L|$--c2"<036"F|nA,>?@K)K7O#55;;?;SN N2 /
	0  OO""''(]^OO""''*QRbQc(dew
!"t889 	OA%%11-a!eW5&4$0F NN6"LLNOO""''*DVH(MN	O  	4G & 8 8 > >gW[]aVb > c 4""<??34	4 	 	'Fv&	'  	FKKM	 ??$$&OO""**+HI$$&   "  +%J 00K'L"&66"=0 $$& 5w>BUYZBZ(+>>`a
##P ,vj\ BEEOPSDT U..A#-FhOeNffo	q	
 r,   c                     | j                   d   d   d   }|d   st        d      |d   D cg c]  }|d   r
|d   r|d    c}| _        y c c}w )Nr%  rj   r   	isCheckedu8   Не выбраны проекты для импортаchildrenr!   )r  r   rL   )r[   root_selectedss      r(   _set_selected_projectsz&CmfPluginKaiten._set_selected_projects  sg    &78A!D[)VWW ,J7"
xAkN eH"
 "
s   Ac           	      p	   | j                  || j                  t        j                  j                     d         }d| j
                   d|d    d}|d   j                  dd      }d}|D ]  }t        |      |kD  st        |      } t        t        j                  j                  j                  t        j                  j                  j                  t        j                  j                  j                        }	||	k  rkt        |      dk(  r|d   |d	<   d
|d<   d
|d<   nJt        |      dk(  r|d   |d	<   |d   |d<   d
|d<   n&t        |      dk\  r|d   |d	<   |d   |d<   |d   |d<   ddg}
t        j                  j                  ddd| dg|
      }|sodddd| j
                   dgg dg}t        j                  j                  dd|d   g|g|
      }|s+t        j                  j                  dd|d   g|g|
      }t        |      dkD  rg }|sdd|d   g|g}t        j                  j                  ||
      }|sdg}t        |t        |            D ]|  }t        |      dk(  r	d	d|d   g}t        |      dk(  r |j!                  dd|d   gd	d|d   gg       Ht        |      dk(  sW|j!                  d	d|d   gdd|d   gdd|d   gg       ~ ||g}t        j                  j                  ||
      }|r|d   }d}|s|rd}d}|d   }t        j                  j                  dd|j#                         g|
      rY|d   j                  d      \  }}| d| d| }|dz  }t        j                  j                  dd|j#                         g|
      rYt        j                  ||d       }nd |fS |rt%        j                  d!t'        |j(                              }|D cg c]#  }|j+                         s|j+                         % }}t        |      dkD  r|d   |d<   |j,                  r|D ]  }t/        ||||           |j0                  r$||j0                  vr|j0                   | |_        n||_        d|_        |j4                  r|j7                  d"       ||fS c c}w )#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   ry  NloginILIKEr   FT@+)r   r  import_originalz[,;\s]+save_import)r  r  rR   r   r  r   rX  r&  minr  
max_lengthr  r  rT   listr   r   r   r   rf   r  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   r5  s                           r(   r   zCmfPluginKaiten._process_person)  s_   ''MM&**778B
	 d&&'r$t*R8f%++C3	   	0D4y..&)$i#	0 ''22&&11((33

 /19~")21	+&*,	,'+-	-(Y1$)21	+&*3A,	,'+-	-(Y1$)21	+&*3A,	,'+4Q<	-(~&!!%%f&m4 & 

  :T-=-=,>c'BC&&"
 %%))gy'9:*  * F  **// '9W+=>. " 0  w<!# G)F*;<.G %..33763RG"#'&*6y#i.*Q #J"9~2+6A*O!$Y1!4 '%17JqM$J%0':a=$I0" !# "%Y1!4 '%0':a=$I%17JqM$J%2GZ]$K0" !## $2# #)"2"2"7"7wv"7"V$QZF
!
!'*&&**7GU[[]2S\b*c+4W+=+C+CC+H(L&+nAaS&:EFA &&**7GU[[]2S\b*c  ))!$(	 *  Z'' XXj#fll*;<F17I5;;=ekkmIFI6{Q%.w%7	'" %%$ 9CFC389 }}.'-}}ofX$>FM & $F  -z!!% Js   0R3R3u-   Обработка пользователейc                    | j                   j                  j                  j                  dd      s&| j                   j                  j                  d       y t               }| j                  d      D ]  }	 | j                   j                         r y | j                  |      \  }}| j                   xj                  dz  c_
        |j                  rN|j                  sB|j                  j                  d      s'|r%|j                  |j                  j                          |ra| j                   j                  j                  j                  dd      r0t#        t$        j&                  j(                  t+        |      g       y y y #  | xj                  dz  c_        | j                   j!                  d| dd	
       Y NxY w)N
load_usersTu8   Отключен импорт пользователейr  r   z.evateam.ruu@   Не удалось загрузить пользователя zERR-0008r   r   send_invitesF)r"   )r   r~  rj   rT   rW  rX  r  r(  r   r   imported_object_countr   r   re  r  r   r    schedule_deferred_jobrR   r   register_personsr  )r[   new_user_emailsr   r  r  s        r(   _process_userszCmfPluginKaiten._process_users  sk   ,,2266|TJOO""**+ef%$$W- 	D??,,.%)%9%9$%?"
55:5 LL"00"LL11-@"#''(:(:;	. t<<BBFF~W\]!&"2"2"C"C4P_K`Jab  ^?1$))VW[V\]( * s   6FBF8G r   c           
      2   |d   }|dk(  r|d   }n|d   }|dk(  r
|rd}|S d}|S |dk(  rd}|S |dk(  rd}|S |d	k(  rd	}|S |d
k(  r
|rd}|S d}|S |dk(  rd}|S |dk(  rd}|S |dk(  r
|rd}|S d}|S |dk(  rd}|S t        d|d    d|d    d|d    d|       )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  s   "6*X% -H 0HX%*2T ! U 9>T ! S u$ %N ! M w& 'H ! G w& 'B ! A x'2:< ! = AM< ! ; x' '6 ! 5 v% *0 ! / v%+3* ! + :@* ! ) z) *$ !  NyY_O`Naadenosetdu v$V,--RS\R]_ r,   c           	      ^   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                  j                  |      }|s}| j                  j
                  j                  d| d| d       t        j                  di |d   }d|_        | j                  |_        d|_        |j                  d       d| _
        n,| j                  j
                  j                  d| d| d       ||d<    | j                  rt                yy)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   rW  r  dirtyr  r  _gen_field_metar<  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 .. 	0J&x0;M#H-f5J"//333DM &&++.I-X[\f[ggh,ij & 3 3 Kj6J K&*#+/??(04-""t"4'+$&&,,/HWZ[eZffg-hi"/Jw	0" L  r,   c                    d| _         | j                          d | _        | j                  D ]T  }| j                  t
        j                  j                     d   D ]%  }d|vr|d   d   |k(  s| j                  |   |d<   ' V | j                  j                  j                  d       t
        j                  j                         D ci c]  }|d   |
 }}g }g }| j                  t
        j                  j                     d   D ]  }|d   }|j                  d      }|s*| j                  j                  j                  d| d	       F|d
   r*| j                  j                  j                  d| d       u	 | j                  |      }	|d   }d| d| j$                   j'                         }||d<   | j$                   d| }t
        j(                  j                  |g dd      }|s)t
        j)                  ||d   |	d|| j                  d      }|j*                  }|j,                  rB| j                  j                  j/                  d|j0                   d|j2                   d       k||v r||   d   |j4                  j6                  k7  rZ| xj                   dz  c_        | j                  j#                  d|d    d|d    d|j4                   d||   d    d| 
dd       ||   |d
<   | j                  j                  j                  d | d| d!       n,| j                  j                  j                  d"| d| d!       |j8                  r`||_        ||_        |	d#k(  r|j<                  j6                  xs i }i }t?               }|d$   jA                         D ]>  }|d%   }tB        jE                  |d&d'(      }|||<   |d)   d*k7  s.|jG                  |       @ |D ch c]  }||vr|
 }}|jI                  |       |jI                  |       ||_        tK        tM        |            |_'        n|	d+k(  r|jQ                  |       |jR                  rd|_*        |jQ                  |       |jW                  d,       |	d-k(  r,|r*d.|_,        |jX                  |_        |jW                  d/       t[                 |rd| _         | j                   r| j                  j                  j                  d0       t
        j                  j]                  t^        j`                  jc                         je                  d1      d2dd3       t
        j                  jg                  d4d2i       t
        j                  j                         D ci c]  }|d   |
 }}|D ]  }||d      |d
<    |D ]  }t
        j                  jh                  |d
   d      }tk        t
              |jl                     }|d   d$   jA                         D ]c  }|d%   }|j                  |5      }|s	 ||5      }to        |j                  d)      d*k7        |_8        |jR                  sT|jW                          e  | j                  jr                  j6                  }|d6   D ]P  }|d   t
        j                  j                  k(  s$| j                  t
        j                  j                     d   |d<   R || j                  _9        tu               5  d| j                  jr                  _)        | j                  j6                  jW                  d/       t[                d d d        y c c}w # t        $ r>}
| xj                   dz  c_        | j                  j#                  |
dd       Y d }
~
d }
~
ww xY wc c}w c c}w # 1 sw Y   y xY w)7NFr   r   r   u>   Обработка пользовательских полейr   r   u
   Поле 'u'   ' не пользовательскоеr   u!   ' уже сопоставленоr   zERR-0009	CmfUiFormr   r   r  r'   r   )widgetr  r  r  cmf_deletedr  Tr   r   r4  )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  r  r  r   	CmfMarkupr  u&   Генерация меты полей%Y%m%d%H%M%Sr   meta_version
model_nameforcecmf_model_namer  import_settings);r  r  rN   r7   r  rR   r   r  r   rW  r  r   rT   r<  r  r   r   r    r   r   r  is_newr  rX  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  r{   shop_fields
new_fields
m2m_fieldsfield_titler   r  r%   r   cust_field_ext_id
cust_fieldis_new_cust_fieldcurrent_choicesdefault_choicesdefault_disabled_choicesrj   r  r  r5  r  field_classchoice_modelr  r  r  s                               r(   _process_custom_fieldsz&CmfPluginKaiten._process_custom_fieldsB  s   $ 	$$&  $ .. 	JLv~~'B'BCHM Je+%d+|;)-););L)IE+&	J	J 	##$de39>>3T3T3VWaq)WW

]]6>>#>#>?I w	E.K		+.I&&,,z+Fm-no]#&&,,z+Fg-hi	$($8$8$C! %T?L|nAd.>.>-?@FFHJ&E&M#'#3#3"4B|n E,,00( !% 1 J #00'v&7,#$( 1 
 !+ 1 1%%&&..  1Z5G5G4HHXY [(z*84
8I8I8O8OOOOq(OOO--%f-.c)D/1B C,,6,=,=+> ?88CJ8OPX8Y7ZZ]^g]hj #!, .  '2:'>m$&&,,/}C
|1M &&++1+c*QO ))%0
"-6
*$4&0&8&8&>&>&D"O&(O/2u,!*>!:!A!A!C 	D%*7^
$+$:$:& ##% %; %	
 6@	2 -9488C	D (7( #o5 ($ ( %++,DE#**?;)8J&28>N9O2PJ/&.8%%e,(('+J$%%e,D1$.3D,7J)(2(=(=J%OOdO3Low	r #'D OO""''(PQNN11$&KKOO$5$>$>~$N"+" NN::<Li;XY7=~~7X7X7Z[!1\?A-[K[# B'25='Am$B   
	"E ..//m0D\0RSK<(9(9:L{+N;BBD ""7^
%))z):)z:F$(;)?8)K$L!$$KKM"
	" ??0066+, 	SAyFNN777"mmFNN,G,GHR(	S )1%^ 	7;DOO))4OO!!&&&6L		 	E X   1$))( * 
 h(N \.	 	s7   ]:] +^*^/A^4 	^')3^""^'4^=c                 |   dddddddddd	d
dg}|D ]  }|d   }|d   }| j                   j                  j                  d| d| d       dd|gdd|gg}t        j                  j                  |      }|s5t        j	                  ||| j                   d      }|j                  d       |c S  t                y )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   rW  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nh?
 ) 	!K%f-K%f-KOO""''*Mk]Z]^i]jjk(lm k*[1M #0044M4JM  & 4 4$ +#$(	 !5 ! ""t"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}| j                  d      D ]  }| j                  j                  j                  d|d    d       | j                   d|d    }t
        j                  j                  ddd| dg      }|rn|j                  |d         }|rit
        j                  j                  dd|d   gdg      }|j                  rd| |j                   |_        nd| d|_        |j                  d       dd|d   j                         g}t
        j                  j                  |dg      }|rB|j                  rd| |j                   |_        nd| d|_        |j                  d       i| j                  j                  j                  d|d    d       d}t
        j                  j                  dd|gd g      }t
        j                  |d   |d!t        |j                        d| d| j                  "      }|j                  d#        t                y$)%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  r2  u*   Обработка типа задачи 'r'   rF  r   r   r   r   r  r  r   rF   ry  r   Tr  r  u   Тип 'u.   ' не найден и будет созданui_colorr   )r'   templater  r  r   r   r  N)r(  r   rW  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!5?QR'2<TU)3KL%1;OP'3=QR)3GH%*4FG$.@A!+=>!'1DE!'1DE#-@A
	" )),7 9	.IOO""''*TU^_eUfTggh(ij $(#3#3"4By6G H,,00 &C0A/B#*FG 1 J  (mmIf,=>O#0044"D/&*AB$: 5 
 $$*,->,?
@Q@Q?R(SJ%*,->,?r(BJ%$/ w	&(9(?(?(ABG,,00 z 1 J $$*,->,?
@Q@Q?R(SJ%*,->,?r(BJ%$/OO""''9V,--[\ 1M"("5"5"9"9m4"| #: #
  ,,v&,(099:-.b1?? - J OOO-s9	.t 	r,   u   Обработка теговc           
         ddl m} | j                  d      D ]  }|d   }|d   }	 |j                  dd      j                  dd	      } ||d
d      }ddd|gddd| dgddd| dgg}t        j
                  j                  |      }|s2t        j                  |      }|j                  d       t                 y # t        $ r;}	t                | j                  j                  d| d| d|	 dd       Y d }	~	d }	~	ww xY w)Nr   translitr3  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   r&  rT   r  r   r   r   r   r    )
r[   r  tag_datatag_idtag_namer'   r#  
tag_filtertag_objr%   s
             r(   _process_tagszCmfPluginKaiten._process_tagsj  s.   *((0 	Hd^F'H''S199#rB MWd+g4&|4g5'}5	
 !--++:+>$mmm6GLLTL2L!	"  ))A(3vhVYZ]Y^_)% *  s   BC	D
1D  Dc           	      P   | j                   d   }| j                  d      D ci c]  }|d   |d    }}i }| j                   d   xs g }|D ]I  }|j                  |      }|s*| j                  j                  j                  d| d       @||i dd||<   K | j                  |      D ]u  }|d	   }|j                  |d   |d   |d   |d
   xs i dd      }	|j                  d
      xs i }
|
j                         D ]  }||	d
   vsd|	d
   |<    |	dxx   dz  cc<   w |S c c}w )uh   
        Получает все используемые в проекте типы задач
        r   r2  r'   allowed_card_type_idsu=   Не удалось найти разрешенный тип u5   . Возможно он был удален в Kaitenr   )r   r'   r   r  r<   r   Fr  r   )	_project_datar(  rT   r   rW  rX  r'  r  keys)r[   r>  r  all_task_typesr2  r0  type_id	type_namer  task_type_datatask_propertiesr   s               r(   _get_project_task_typesz'CmfPluginKaiten._get_project_task_types  s    ''-
 "--l;
 dOYv..
 
 
 !% 2 23J K Qr, 	G&**73I&&..ST[S\ ]J K ! 	#Jw	" 00< 	.I "&)I'22$#D/%f-"+L"9"?R"#	N (mmL9?RO.335 Fn\&BB@EN<0=F <(A-(1	.4 i
s   D#c                    t         j                  j                         D ci c]  }|d   |
 }}| j                  d   }| j                  d   }|d   }|d   }|dk7  rd| }| j                   d| d| }t         j
                  j                  |dd	g
      }	| d| }
|	s| j                  j                  j                  d|
 d       t         j                  |
d|| j                  d      }	|	j                          g d}t         j                  j                  |	      }|D ]*  }|j                  |vrd|_        |j                  d       , |	j                  r||	_        |	j                          n)| j                  j                  j#                  d|	 d       dddddddddddddddd}|j%                         D ]D  \  }}dd|gdd|d   gdd|	gg}t         j                  j                  ||d   dg      }|||   d <   F | j&                  D ]R  }|j                  d!      }|s|d"   }|d#   }t         j(                  j                  d$d|gdd|	ggd%      }|rNt         j)                  ||j                  |	|d&   d    | j                  d'      }d }|j                  d(      r|d(   }nY|j                  d)      rHt         j(                  j                  dd|d)   gdd|	gd*d|d&   d    ggd(g+      }|r|j*                  d,z   }|||_        |j                  d       | j                  j                  j                  d-|	 d.|j,                   d/|j                   d0       U |d1   j%                         D ]  \  }j/                  d2d3      d4 d5| j                   j1                         }||vr>t3        fd6| j4                  t         j                  j6                     d7   D        d       }|s~| j                   d|d8   d    }t         j8                  j                  |d9d:g
      }t         j(                  j                  d$d|gdd|	ggd;g+      }|r[|j                  sO| j                  j                  j#                  d<|	 d=|j,                   d>|j:                  j                   d?       ?|st         j(                  j                  d$d|gdd|	gg d@g dAgd%      }|r8| j                  j                  j#                  d<|	 d=|j,                   dB       t         j)                  |||	| j                  dC      }|j<                  dDv r|dE   d    |_        n|j<                  dFv r|dG   d    |_        n||j<                  dHk(  r`|dI   j                  d       s>t         j                  dId|	| j                  dJ      }|j                  d       ||dI   d <   |dI   d    |_        n|dK   d    |_        ||_        |j@                  s|j:                  jB                  }|j:                  j                  }| j                  j                  j                  d-|	 dL|dk(  rdMndN dO| dP|j,                   d/| d0       |j                  d        |	jE                          tG                |	S c c}w )QNr   r   r5  r'   default   для типа r   r   r   r   r   u   : Экран задач u   Создание экрана 'rF  r   T)r'   r  r   r   r  )	_main   Участники   Датыu   Планu   Разработкаu
   Связи_addon_custom_descrparentr  u   Экран u|    был изменен пользователем. Изменения из импорта не будут примененыgroup)r<   systemtabF)r=  r>  r?  rA     Дополнительноеr   r<   rD  rF  )r   rF  r   r!   r  r  r  r  r   r4  r=  )r  r'   rD  ui_form_groupr   r  r  r  rJ  r   i  u   На экран uA    в группу 'Основные' добавлено поле 'r   z) r   r   r   r   r  c              3   l   K   | ]+  }|j                  d       r|d    d   t              k(  r| - yw)r   r   N)rT   r'  ).0r  r   s     r(   	<genexpr>z2CmfPluginKaiten._process_screen.<locals>.<genexpr>H  s<      #yy-%2DT2JcR]N^2^ s   14r   r   r  r  zui_form_group.typeu   На экране u    поле 'um   ' было изменено или уже добавлено пользователем во вкладку 'uL   '. Изменения из импорта не будут примененыr  r   Tr   !=Nu   ' было удалено пользователем. Изменения из импорта не будут применены)r  r'   rD  r   r  )r   r  r>  )r   r   r?  r   rH  )r'   r<   rD  r   r  rA  r   u   во вкладкуu   в группуz 'u   ' добавлено поле ')$rR   r   r   r1  r   r  rT   r   rW  r  r  CmfUiFormGroupr  r'   rF  r  r  rX  r   rP   CmfUiFormFieldr  r  r   r   nextr  r  r  rJ  r  required_changer  r<   invalidate_cacher   )r[   r6  r{   r  r>  rB  task_type_idtask_type_namescreen_ext_idui_formscreen_namedefault_groupsui_form_groupsrJ  
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  s   39>>3T3T3VWaq)WW''-
((/%d+'/9$//?@N++,Bzl"\NK""&& & ' 
 %%=n=MNOO""''*I+VW(XY&& ($?? $ ' G LLN
N $2277w7GN!/ 5 %%^;'+$""t"4	5 ""&4G#LLNOO""**gY '\ ] &6+2d"C!(D9 '48 6;e,L
 '5&:&:&< 	>"J
j)j013(G
 #1155!(+x 6 M
 1>N:&u-	>  #'"6"6 *	.227;M '1F$Z0O"1155!36sG, !% 6 M ! & 5 5,&++""0"9%"@#$( !6 ! "&&y1-i8G$((7"("7"7";";#S/-*HI%sG4,c>'3J53QR 
 !*{ #< #K #"-"5"5";&,3M)""t"4&&++&wi 044A4I4I3J#mN`N`MaaceO*	Z &4L%A%G%G%I g	5!K%--eR8K{m1T-=-=,>?EEGJ,'+}}V^^5P5P'QRZ'[ E #'#3#3"4Bu[7I$7O6P Q,,00(' 1 J #1155!3
3sG,
 ) 6 M ]%B%B&&..(	 2!!+!3!3 4 5,,9,G,G,L,L+M N`a   & 5 5 9 9%sJ7!3022	 %) !: ! !OO**22,WI 6%%/%7%7$8 9de
  & 5 5)#"#$( !6 ! ++/@@.<=Q.RSX.Y+--1EE.<Z.H.O+--7%&DEII%P$*$9$9;"&#'??(, %: %M "&&4&8LYN#AB5I.<=[.\]b.c+ /=Y.G.N+,4M)''*88==
*88==
&&++&wiq0:e0C,IZ[[]^h]i j44>4F4F3Gs:,VXZ
 ""t"4Og	5R 	  "U Xs   Z=u,   Обработка схемы экрановc                    | j                   d   }| j                   d   }| j                   d   }| j                   d| }t        j                  j	                  |dg      }|s:t        j                  | d| || j
                  d	      }|j                  d
       |j                  r|j                  s7t        j                  j                  |      D ]  }|j                  d        d}d }	t        |      }ddi d|d<   |j                         D ]4  \  }
}|d   }|
dk7  ry|j	                  d      s#d| j                   d|
 d}t        j                  j	                  ddd| dg      }|s&| j
                  j                  d| d|
 ddd       d| }	 | j!                  |      }||d!d| j
                  d"}t        j                  j                  d(i |d#d$d%gi}|st        j                  d(i |}|
dk7  r|j$                  j'                         n|}	|j                  d
       t)        |j*                  |      }7 |	r+|	j*                  |k  r|d&z   |	_        |	j                  d
       |S | j
                  j,                  j/                  | d'       |S # t"        $ r/}| j
                  j                  d| d| d d       Y d }~d }~ww xY w))Nr   r5  r   r   r   r<  u+   : Схема экранов проекта Tr'   r   r   r  r  )ui_form_schemeTEXKOM_db_deleter   r:  u   по умолчанию)r   r'   r   r'   r   r   r   r   r   <   Не удалось найти логический тип 'r   r  ERR-0012CmfUiFormSchemer   r;  u:   Не удалось импортировать экран r   zERR-0013r   )rg  r  r  crud_choicer   r   logic_typesr  r  e    была изменена. Изменения из импорта не будут примененыr*   )r1  r   rR   rl  rT   r   r  r  r  CmfUiFormSchemeRuler  deleter   r   rV   r    rd  r   rn  r   maxr  rW  rX  )r[   r2  r>  rB  r?  ui_form_scheme_ext_idrg  rulemax_ordernodefault_rulerV  r6  rW  r  r   rY  r%   	rule_dicts                     r(   _process_screen_schemez&CmfPluginKaiten._process_screen_scheme  sp   ''-
((/**73#'#3#3"4Bzl C//33(5 4 
 #33#}$OP]_,?? $	 4 N D1))!(("66;;>;Z 7DKKK67 KL!*-J  1 %Jy!
 1;0@0@0B 0=,n!/!79, *--l; *,T-=-=,>bb(Q%!'!4!4!8!8 (&A6G5H2JK "9 "J &11Z[iZjjmnzm{{|}&%6 2 
 !'77G%HN"22>BG '5%&/#,"&//	 1155 )95 !55B	BD9,$$++J7#'L		d	+!$,,<a0=d  4 4{ B'2T'9$!!d!3  OO""**!" #\ ]
 K ! OO--TUcTddfgjfkl"!2 . 
 s    J&&	K/$KKuA   Обработка схемы конфигурации полейc                 2   | j                   d   }| j                   d   }| j                   d   }| j                   d| }t        j                  j	                  |dg      }|s#t        j                  | d| || j
                  d	      }|j                  d
       t        j                  j	                  |dg      }|slt        j                  | d|d| j
                        }|j                  d
       t        j                  dd|d| j
                        }|j                          t        j                  ||g | j
                  dd      }|j                  d
       |j                          |j                  d
       |j                          |S )Nr   r5  r   r   r   r<  u@   : Схема конфигурации полей проекта Trf  r  u=   : Конфигурация полей по умолчанию)r'   r   r  r      Спискиr  )r  r'   rD  rb  r   r   )cust_field_confrD  rn  r   r  r  )r1  r   rR   CmfCustFieldConfSchemerT   r   r  CmfCustFieldConfCmfCustFieldConfFieldCmfCustFieldConfSchemeRule
calc_cacherU  )	r[   r>  rB  r?  r   field_config_schemafield_configfield_config_fieldrt  s	            r(   _process_field_config_schemaz,CmfPluginKaiten._process_field_config_schema	  s   ''-
((/**73$$%R
|4$;;??vWZV[?\""("?"?#}$derdst?? $	 #@ #  $$$6!2266fcU6SL%66'=(ef!$(#	  7   !!d!3%+%A%A* '!# &B &" #'')44 ,*?? $ 5 D II$I'##%$/,,.""r,   c                    | j                   d   }| j                   d   }| j                   d| d}t        j                  j	                  |      }|s1t        j                  | d| j
                  || j                  d      }|j                  rG|j                  d	       | j                  j                  j                  d
|        | ddddd| ddddd| dddddg}g }|D ]P  }| j                  j	                  |d         |d<   | j                  ||      }	|j                  |	j                         R t        j                  j!                  dd|gdd|gg dgdgd      }
|
D ]U  }t        j                  j	                  dd|j                  gdd|j"                  gdd|gg      sD|j%                  d       W |j'                          n)| j                  j                  j)                  d| d        | j                   d| }t        j*                  j	                  |      }|sGt        j*                  j	                  d!"      }t        j+                  | d#||| j                  d      }|j                  r||_        ||_        ||_        d$}g }|j3                         D ]  \  }}|d%   }|d&   }d| j                   d| d}t        j4                  j	                  d'd(d)| d)g      }|s&| j                  j7                  d*| d+| d,d-d./       r|j                  |       ||kD  s|}||_         ||_        |j                  d	       t        j<                  j!                  |0      D ]  }|j%                  d1        |S | j                  j                  j)                  d2| d3       |S )4Nr   r5  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   r4  rP  r   r     Бизнес-процесс a    был изменен. Изменения из импорта не будут примененыzsoftdev:defaultrE   u@   : Simple-схема бизнес-процесса проектаr   r'   r  r   r   r   rj  r   r  rk  CmfSchemeWfr   )	scheme_wfrh  u)   Схема бизнес-процесса ro  )r1  r   rR   rX   rT   rY   r   r  r  rW  r  rQ   _process_workflow_statusr   r   r   r  r   rq  create_create_transrX  r  default_epic_workflowdefault_task_workflowdefault_subtask_workflowr   rV   r    default_task_logic_typestrict_task_logic_typeCmfSchemeWfRule)r[   r2  r>  rB  workflow_ext_idr  r  current_statusesr  workflow_statusworkflow_statusesr   scheme_ext_idschemescheme_templatemax_tasks_countr  rV  r6  rW  r  r  r   rt  s                           r(   _process_workflow_schemaz(CmfPluginKaiten._process_workflow_schemaC	  sn   ''-
((/!--.bIF%%)))A))#}$de00&?? $ * H ##MMdM+OO""''*lmulv(wx %S)4Da_`a$S)4Eq`ab$S)NA]^_M
  ", <&*&;&;&?&?F@S&TF#"&"?"?X"V ''(:(:;< !' 0 0 5 58%56h/)
 & $ !6 ! , * ''++tVYY/&V-?-?@#S(3 ,  D)* ((*OO""**.xj 9\ ]  ++,Bzl;##''}'=$0044:K4LO''#}$de($?? $ ( F !!+3F(+3F(.6F+O%'"0:0@0@0B @,n!/!7+L9
&()9)9(:"\N"$M!#0044$f2C1DA.FG 5 
 "OO--VWeVffijviwwxy"!. . 
 &--j9 /&0O5?F2'@( -CF)KKDK) ..33f3E 3T23  OO""**;F8 D\ ]
 r,   c                    |j                  d      }|sy | j                  j                  t        j                   dd       t        |d         j                  d      }|D ]  }|d   r
	 t        |d         }|d	   }| j                   d
| }|j                  |      }	|	j                         st        d      t        j                  j                  |      }
|
s#t        j                  ||| j                  d      }
|
j                  r||
_        |j                  d      |
_        |j                  d      r| j!                  |d         |
_        nt$        j&                  |
_        |
j"                  |
_        ||
_        |
j-                  d       t/        |	d      5 }|
j1                  |j3                         d       d|
_        |
j-                  d       d d d        t5                | j                  j7                  dd        y # 1 sw Y   3xY w# t        $ re}t9                | j                  j;                  t        j                   d d d| d|       t        xj<                  dz  c_        Y d }~!d }~ww xY w)Nr  u$    Обработка вложенийTr   rq  r  
comment_idr   r'   r   w   Не найден файл вложения. Возможно при скачивании возникли ошибкиr  rD  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	  sv   ]]7+
z2233WXdhiy45>>}M) ,	'O|,)' #OD$9 :"1&"9'+'7'7&8=/$J!"1":":="I&--/# R  $1155=N5O
!!'!5!5'0#'??(,	 "6 "J --&5JO0?0C0CI0NJ-&**;7040@0@Q\A]0^
-010@0@
-+5+@+@J(1@J.OOO5ot4 :"..qvvxd.K59
2"D9: (({CG,	'<: :  '))!**+ ,'(M?#cUD 	 *  !!Q&!!'s2   -D4H!;H.HH	H	J#AJJc                 H   |j                  dg       }|r.| j                  j                  t        j                   dd       g }|D ]X  }| j                  |d         }|s||j                  k(  s||j                  k(  s||j                  k(  rH|j                  |       Z |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OO&&''ST   
 
" 	&F%%fTl3F (...X000X///f%	& r,   c           	      |   ddl m} |j                  dg       }|r.| j                  j	                  t
        j                   dd       g }|D ]  }|d   j                  dd	      j                  d
d      } ||dd      }	 dddd| dgdd|gddd| dgg}t        j                  j                  |      }	|	st        d| d      |j                  |	        |S # t        $ rT}
| j                  j                  t
        j                   d|
 d|       t
        xj                  dz  c_        Y d }
~
d }
~
ww xY w)Nr   r  r3  u    Обработка теговTr   r'   r   r  r  r   r  r   r  r#  r  r$  r%  r   u   Тег 'u   ' не найденzERR-0015r  r!   r   )r(  r  rT   r   r   rd   r  r   rR   r&  r   r   r    r  )r[   r  r  r  	task_tagsr3  labelr#  r  tagr%   s              r(   _get_task_tagszCmfPluginKaiten._get_task_tags
  sf   *MM&"-	OO&&''EF   
  	'E&M))#s3;;CDEU$FE'g5'}5We,g5'}5	 mm''w'7#hug5H$IJJC 	'*   '))!**+1SE2)  * 
 !!Q&!!'s   AC	D;'A
D66D;c                 x   t        |d         j                  d      }|j                         sL| j                  j	                  t
        j                   d| dd|       t
        xj                  dz  c_        y |j                         j                  dkD  r| j                  j                  t
        j                   d	d
       t        |d      5 }	 |D ]X  }t        j                  |      }| j                   d|d    ||j                  dd      d|d   |d   d|| j                  d	}|j                  d      r+| j!                  |j                  d            |d<   |d   |d<   |j                  d      r#| j!                  |j                  d            |d<   t"        j$                  j                  |d         }|s[t#        j$                  d i |}|j&                  j(                  t+        j,                  |j.                  j(                        z   |_        |j3                  d
       [ t5                d d d        y y # t6        $ r^}	t9                | j                  j	                  t
        j                   d|	 d|       t
        xj                  dz  c_        Y d }	~	ld }	~	ww xY w# 1 sw Y   y xY w)!Nrq  r  u7    Файл журнала работ не найден 'u]   '. Возможно при дампе журнала работ возникли ошибкиzERR-0016r  r   r   u-    Обработка журнала работTr   rn   r   r   r  r   closedfor_date
time_spent)	r   rD  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  r^  r_  r   ru   rv   rM  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==oN%%'OO%%&&''^_m^n om m	 &  " ((1,OO&&''TU   
 nd+ #+q"+  7#'::c?)-)9)9(:"Xd^<L&M&.$,LLB$?&.*2:*>*2<*@23/7*.//
/+ $<<4@D@P@PQYQ]Q]^iQj@k/=?RS_?`/<#<<5EIEUEUV^VbVbcoVpEq/0AB"(">">"B"BJ]^fJg"B"h&&,&B&B&YEX&YG/6/A/A/G/G",,_f_q_q_w_wJx/xG,6172 L7#+ #+ -D ! + NOO--%..//rsvrwx"$ . 
 %%*%%+9#+ #+s2   J0E(I	J-AJ(#J0(J--J00J9c                 n   |j                  d      }|sy |d   }t        j                   d| }| j                  j	                  | dd       t        |d         j                  d      }g }|D ]  }	|	d	   |k7  r	 t        |	d         }
|	d
   }| j                   d|
 }|j                  |
      }|j                         st        d      t        j                  j                  |      }|s#t        j                  ||| j                  d      }|j                  r||_        |	j                  d      |_        |	j                  d      r| j!                  |	d         |_        nt$        j&                  |_        |j"                  |_        |	|_        |j-                  d       t/        |d      5 }|j1                  |j3                         d       d|_        |j-                  d       d d d        t5                |j7                  t        |j9                                      | j                  j;                  dd        |S # 1 sw Y   \xY w# t        $ rW}t=                | j                  j?                  | d d
 d| d|       t        xj@                  dz  c_         Y d }~?d }~ww xY w)Nr  r   u    Комментарий u%   . Обработка вложенийTr   rq  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_attachments^
  s   ]]7+
!$'
 ))**B:,Oj=> 	 	

 y45>>}M) -	'O|,
:*' #OD$9 :"1&"9'+'7'7&8=/$J!"1":":="I&--/# R  $1155=N5O
!!'!5!5*0#'??(,	 "6 "J --&5JO0?0C0CI0NJ-&**;7040@0@Q\A]0^
-010@0@
-+5+@+@J(1@J.OOO5ot4 :"..qvvxd.K59
2"D9: ""3z'D'D'F#GH(({CI-	'\ !: :  '))j !'(M?#cUD#	 *  !!Q&!!'s3   >D4I2;I-AII	I	J4AJ//J4c           
      h   t        |d         j                  d      }|j                         sL| j                  j	                  t
        j                   d| dd|       t
        xj                  dz  c_        y |j                         j                  dkD  r!| j                  j                  t
        j                   d	d
       t        |d      5 }|D ]  }	 t        j                  |      }| j                   d|d    }t        j                   j#                  |      }|s$t        j!                  ||| j                  d
      }n|j%                  dg       |j&                  s|j#                  d      xs d|_        |j#                  d      r*| j+                  |d         |_        |j,                  |_        |d   |_        |d   |_        ||_        ||_        |j9                  d
       t;                | j=                  |||      }	|d   dk(  rdnd}
| j?                  |j(                  j@                  |||
      }|	r|dz   djC                  |	      z   |_        n||_        |jD                  r|j9                  d
       t;                | j                  jG                  dd        	 d d d        y y # tH        $ rb}tK                | j                  j	                  t
        j                   d| d| d |       t
        xj                  dz  c_        Y d }~Kd }~ww xY w# 1 sw Y   y xY w)!Nrq  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  r^  r_  r   ru   rv   rM  r   rR   
CmfCommentrT   re   r  r   r   r  r   r   r   rD  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<<_M$$&OO%%&&'']^k]l ml l	 &  "''!+OO&&''ST   
 mT* 2/a 1/C0/'+zz#,0,<,<+=RT@R?S)T"("3"3"7"7~"7"N&&,&7&7'/'5+/??04	 '8 'G $//7&66$'3'7'7'?'E2'++K8151A1A,{B[1\G.070B0BG-2>y2I/1=i1H.)12>/6"&*&G&G#(%'
 3?v2F!2KJQW	#11',,2D2DgyZcd&+/)+;bggk>R+RGL+/GL"--#LLTL:&L00KHS1/2/ 2/ ,b % /$11)2233uvyuzz|  ~A  }B  C& ( 2 
 #))Q.))/W2/ 2/sE   L(BJ:'L((EJ:,L(:	L%AL L( L%%L((L1c           
         t        |d         j                  d      }|j                         sL| j                  j	                  t
        j                   d| dd|       t
        xj                  dz  c_        y t        j                  j                  j                  }|j                         j                  dkD  r1| j                  j                  t
        j                   d	d
       t        |d      5 }|D ]  }	 t         j#                  |      }| j$                   d|d    }t        j&                  j)                  dd|gg ddd|ggd
dg      }	|	r|	j*                  r|	j,                  rw|	s5t        j'                  ||| j                  d
      }	|	j/                  d
       t        j                  j1                  dd|	gdg dg dggd
      }
|
rt        j                  j3                  |	      D ]  }|j5                  d
        d}d}t7        |j)                  dg       d       }|D ]p  }|dz  }|d    r|dz  }t        j                  ||	|d    sd!nd"d
|#      }|d$   }t9        |      |kD  r|d | |_
        ||_        n||_
        |j/                  d
       r |d%   |	_
        ||	_        ||	_        ||	_         |	j/                  d
       tC                 	 d d d        y y # tD        $ rb}tG                | j                  j	                  t
        j                   d&| d'| d(|       t
        xj                  dz  c_        Y d }~[d }~ww xY w# 1 sw Y   y xY w))Nrq  r  u1    Файл чек-листов не найден 'uW   '. Возможно при дампе чек-листов возникли ошибкиzERR-0021r  r   r   u'    Обработка чек-листовTr   rn   r   r   rD  r   rO  r   r  r3  r  r  r  )r  r   FrN  rI  rC  rh  r   c                     | d   S Nr  r*   )xs    r(   r  z:CmfPluginKaiten._process_task_checklists.<locals>.<lambda>&  s
    !L/ r,   r5  checkedr;   rC  )
cache_taskrD  r   r  r  r   r'   u;    Не удалось обработать чек-лист: r   zERR-0022)$r   rs   r  r   r    rd   r  r  rR   CmfChecklistItemr'   r  r^  r_  r   ru   rv   rM  r   CmfChecklistrT   r  r  r  r9  r  rq  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>>?PQ&&(OO%%&&''XYhXi jg g	 &  "%66;;FF!))A-OO&&''NO   
 ot, R/ Q/CP/)-C$($4$4#5Rt8L7M!N$*$7$7$;$;!)3 9 :!)3 7$
 -1$1? %< %	 %i.G.G9K`K`$!*(.(;(;'/'-+/??04	 )< )I &NNtN<(.(?(?(D(D!)3	 :$($C$>!"$ -1 )E 
) )$$*$;$;$@$@	$@$R ?D KKK>? '(+,(%+*..w; 9&
 *4 8I'1,K(3 0A 5 0#)#:#:+3'05>y5Ivv0409 $; $D )2&(9I"9~0DD,56K7K,L	,5	,5	 II$I7%8( *8)?	:E	7?O	<4B	1!48"SQ/R/ R/ .b % /$11)2233nornssuvyuz{& ( 2 
 #))Q.))/WR/ R/sR   6M>A1K./M0A&K.MD	K. M.	M7AMMMMM%c           	         |j                  d      }|sy | j                  j                  t        j                   dd       t
        j                  j                  j                  }| j                  j                  j                  d      }t        j                  d| d      }|D ]  }|d   }|j                  |      }	|	r	 | j                   d	|d
    }
t
        j                  j                  |
      }|s#t
        j                  ||
| j                  d      }|j                   rO|d   }t#        |      |kD  r|d | |_        n||_        ||_
        ||_        |j'                  d       t)                 y # t*        $ rb}t-                | j                  j/                  t        j                   d| d| d|       t        xj0                  dz  c_        Y d }~:d }~ww xY w)Nexternal_linksu=    Обработка ссылок на веб-страницыTr   rb  ^/(\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_remotelinksK  s   "'78""##`a 	 	

  &~~22==++//((-**''23+ "	'M&CMM#&E'*.*:*:);2mD>Q=R'S$~~))1E)F!>>'3#'??(,	 * D '',U3H8}';;$,-B.B$C	$,	'DH+8D(II$I/L3"	'4  '))!**+ ,558ESEC 	 *  !!Q&!!'s   B4E;;	G&AG!!G&c                 v   |j                   dv rd}nd}|j                  dddi      D ]  }	 |j                  d      r| j                  |d         }nt	        d	      t        |j                  t        |j                        t        |j                        t        |j                        t        |j                        
      d      }|j                  |j                          y# t        $ rH}t        xj                  dz  c_        | j                   j#                  d| d| d|       Y d}~
d}~ww xY w)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+D D: %%fWn4M%N 	C77+,!--c2B.CDF#$  A  A'KK"%fii.%(%6$'$4$'$4	    "   !3!34!	"  !!Q&!))hilhmmopqors *  s   B7C''	D80=D33D8c           
      4	   t         j                  j                  | j                  j                        }|j                  d       D ]N  }|j                  j                  d      r |j                  d      r|j                  d   j                  d      rP| j                  j                  j                  t        j                   d|        |j                  d      r|j                  d   }n|j                  d   }t         j                  j                  |      }|j                  }|r|dk(  rt         j                  j#                  |      rdv r|j                  d	g       }t%        fd
|D        d       }	|	r t'        |	d         }
| j(                   d|
 }nd }dg}|r"t*        j,                  j/                  ||      }n(t*        j,                  j/                  ddd dg|      }|r|j                  d      r|j                  d   |j                  d<   |j                  |j                  d<   d|j                  d<   t1        j2                  |j                  d         }|rM|d   rH|d   j                  d      r4d|_        d|j                  d<   d|j                  d<   d|j                  d<   |j                  d      rD|j                  d   |j                  d<   |j                  |j                  d<   d|j                  d<   | j                  j                  j                  t        j                   d| dt         j                  j7                  |j                         d       /|j8                  r|j8                  |j8                  k7  rVt;        j<                  d |j                        }|sz|j?                  d!      }| j(                   d| }t*        j@                  j                  |"      }|r|j                  d   |j                  d<   |jB                  |j                  d<   d|j                  d<   | j                  j                  j                  t        j                   d| d|jB                   d       J||d#<   Q y )$Nc                 J    | j                  d      xs | j                  d      S )Nr  src)has_attr)r  s    r(   r  z0CmfPluginKaiten._convert_links.<locals>.<lambda>  s    #,,v2F2]#,,W\J] r,   cmf_convertedr  r  u2    Конвертация ссылки в теге: r  rb  ).z..r  c              3   2   K   | ]  }|d    v s|  yw)r_   Nr*   )rL  attr  s     r(   rM  z1CmfPluginKaiten._convert_links.<locals>.<genexpr>  s     #ZC)sSXzBYC#Zs   r   r   r_   r<  r  r   z%"url":"http%/r%  r   src_origTr   videocontrolsz100%widthheight	href_origu    URL заменен: 'u   ' на 'rF  z	/(\d+)/?$r   r  zdata-issue-id)"urllibparseurlparser6   r_   r  r  rT   r  r   r   rW  r  rd   r  r  r1   basenamerS  rf   r   rR   r  r9  	mimetypes
guess_typer'   unquote_plushostnamer   searchrE  r   r  )r[   r  r  
kaiten_urlr  r_   
parsed_urlurl_pathr  r  r  r  attachment_fields
attach_obj	mime_type
path_matchrr  task_ext_idr+  r  s                      @r(   _convert_linkszCmfPluginKaiten._convert_links  s   \\**4;;??;
%%&]^ P	3Cyy}}_-||F#		&(9(D(DS(IOO""'':+>+>*??qruqv(wx||F#ii'ii&..s3J!Hx3((2I	[ 8#--4K"#Z;#Z\`aO #OD$9 :'+'7'7&8=/$J!$(!!& #1166,, 7 

 $1166-v	{RT7UV, 7 

 <<&,/IIe,<CIIj)'1~~CIIe$15CIIo. ) 4 4SYYu5E FI Yq\il6M6Mg6V#*0:		*--3		'*.4		(+<<'-0YYv->CIIk*(2CIIf%15CIIo.&&++!**+ ,uHV\\%>%>z~~%N$OqR ""z':':j>Q>Q'Q <AJ$**1-!%!1!1 2"WI>~~)))=-0YYv->CIIk*(,		CIIf%15CIIo.OO**//%..//EcU(SWS\S\R]]^_ ,3C(aP	3r,   c                     |j                  d      D ]3  }|j                  d      }|s|j                  d      s)|d   |d<   |d= 5 y)uF   
        Конвертирует "Фрагмент кода"
        prerF   r  N)r  findr  )r[   r  r2  rF   s       r(   _convert_code_blockz#CmfPluginKaiten._convert_code_block  sN     %%e, 	"C88F#Dg.#G}GM		"r,   c           	      *   d}|j                  dddi      D ]  }	 |j                  dddi      }|j                  d      }t        j                  j                  |t        |j                              }t        |j                  d	||
      d      }|j                  |j                          y # t        $ rW}	| j                  j                  t        j                    d d|	 d|       t        xj"                  dz  c_        Y d }	~	d }	~	ww xY w)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-codeT)r   z{})r  umlsvgr  u/    Не удалось получить svg из r   zERR-0025r  r   )r  r3  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_coder8  r  r%   s
             r(   _convert_plantumlz!CmfPluginKaiten._convert_plantuml&  s   &P %%eG=O3P%Q 	'C'"xxg5OxP'00t0<((883svv;O'KKtsKC!   !3!34	'  '))!**++Z[cZddfgjfkl) * 
 !!Q&!!'s   BB22	D;ADDc                    |s|S 	 |dk(  r"t        j                   || j                        }n|}t        |d      }| j                  ||       | j	                  ||       | j                  ||       | j                  |       |j                  r>dj                  |j                  j                  D cg c]  }t        |       c}      }|S |}|S c c}w # t        $ rt}t        |j                  dk(        }	| j                  j                  t         j"                   d|	rdnd d| d	|
       t         xj$                  dz  c_        Y d }~|S d }~ww xY w)Nr  
extensionslxmlr   r  u4    Не удалось обработать текстu    комментарияr   zERR-0026r  r   )r  _markdown_extensionsr   r  r>  r0  r4  bodyr  r  rf   r   r  r  r   r    rd   r  r  )
r[   r   r!   r   r  	html_textr  cr%   
is_comments
             r(   r  zCmfPluginKaiten._convert_texta  sT   K	#J&$--#88	
 !	%i8I""9c2""9c2	40$$Y/IR277INN,C,CDqCFDED  ^bD  E 	#cnn<=JOO%%&&' (?I;rRRTUXTY[	 &  "	#s1   B+C 1CC C C 	EA)EEc                 4   t        |d         }| j                   d| }| j                  || j                  t        j
                  j                     d         }|j                  | j                  d||j                  j                  |||j                  dd      d       |d   |d	<   t        j
                  j                  j                  }t        |d
         |kD  r|d
   d| |d
<   |d   d   }|d   d   }| j                   d| d}	t        j                  j                  |	      }
|
r|
|d<   |d   d   }|d   d   }| j                   d| }t        j                   j                  |dg      }|r||d<   |j"                  |d<   nm| j$                  j'                  t(        j*                   d| d| d|
 dd       n5| j$                  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   Tr0  F)activityapprovedrD  r  r   r  cmf_archivedr   r  r'   Nboardr   ::boardr  r  columnr   r<  r   cache_status_typeu!    Не найден статус 'r   u#   ) в бизнес-процессе zERR-0028r   r'  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_objrr  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&))*"WI6--MM&..556x@

 	--!$..44!!(%MM*e< 
 	 )8(D%
  &~~22==v&'*>>&5f&=>S?S&TOF# W%d+(1!--.b
'B%%)))A*2OJ'!(+D1I$X.w7L#//09+>M%%)))WF,2)7=7I7I 34))!**++L\NZ]^g]h i88@zC)(	 *  OO%%&&' (!!,S
!=%&	 &  f%	1:71CYt_-2@./r,   c                    dt         _        t        |d         }d| dt         _        | j                  j                  t         j                   dd       | j                   d| }t        j                  j                  |d	      }|s#t        j                  || j                  d|
      }|j                  r| j                  ||      }|j                  dg       }| j                  j                  t         j                   d|j                  rdnd d|        |j                  |D cg c]  }| c}       |j                         D ]  \  }}	t!        |||	        | j#                  ||      |_        | j'                  ||      |_        ||_        |j-                  d       t/                | j1                  ||       | j3                  ||       | j5                  ||       | j7                  ||       | j9                  |j:                  j<                  xs d||      }
t?        |d         t        j                  j@                  jB                  kD  rd|d    d|
 }
|
|_        |D ]8  }tE        ||      j<                  }| j9                  |||      }t!        |||       : |jF                  r|j-                  d       | jI                  ||       n6| j                  jJ                  jM                  t         j                   d       | j                  j                  t         j                   dt         j                   d       | j                  jO                  dd       t         j                  sStQ        |d         jS                  d      }tU        |d      5 }|jW                  d       d d d        t         j                  S t         j                  S c c}w # 1 sw Y   t         j                  S xY w)Nr   r   u   [Задача ]u     Начало обработкиTr   r   r   include_archived)rD  r   r  r   r  r   u   Созданиеu   Обновлениеr  r  r   r   z<p><strong>z</strong></p><p></p>u    была изменена пользователем. Изменения из импорта не будут примененыu8    Завершение обработки. Ошибок: r+  r  rq  .successr  ),rd   r  rf   r  r   r   r   rR   r   rT   r  rZ  popr  re   r   r  r  r  r  r3  r  r  r   r  r  r  r  r  r   rj   r&  r'   r  getattrr  r  rW  rX  r  r   rs   ru   rU  )r[   r  rR  rr  r/  r  rS  r  r   rj   r   
text_fieldfield_valueconverted_textr  r{   s                   r(   _process_taskzCmfPluginKaiten._process_task  s   
io& .wiq9
z2233ST`de))*"WI6>>%%! & 
 ~~"?? $"	 & H ##"77	;OO#2#6#67Mr#R OO&&'q)1%>TUUWXgWhj
   !O*!OP%4%:%:%< 5!
E*e45"&";";Hi"PH //)DHM'0H$MMdM+L))(I>&&x;**8Y?**8Y? %%hmm&9&9&?R9UD9W%&)<)<)G)GG ")G"4!5 6f 
 !HM2 >
%h
;AA!%!3!3K9!U*n=>
 ""$/'')<OO""**&&' (\ ]
 	""##[\f\m\m[no 	 	
 	  5   Yz23<<ZHIi%     z   k "Pd    s   -	O"O!!O9c                    d}t        d      5  	 | j                  j                         rnp|j                         }|dk(  rnZt	        |      j                  d      }t        |d      5 }t        j                  |      }d d d        || j                  |      z  }d d d        |j                  |       y # 1 sw Y   9xY w# 1 sw Y   'xY w)Nr   Fr  rC  rj  rn   )r   r   r   rT   r   rs   ru   rv   rw   re  r`  )	r[   
task_queuetask_queue_errorsr   r  r+  r  r{   r  s	            r(   _process_task_threadz$CmfPluginKaiten._process_task_thread   s    51 	A??,,.!~~'6> J//<	)T* -a $		!I- $,,Y@@ 	A 	f%- -	A 	As$   AC(B6>C6B?	;CCc                 	   ddl m} ddlm} d}t        j                         5  t        j                         5  ddd|j                         |j                         |j                         g| _
        t        j                  j                  |ddg	      | _        | j                  j                  j                  j                   | _        | j#                  | j                  j$                  d
         | _        | j                  j$                  j(                  j                  dt*        j,                        | _        | j                  j$                  j(                  j                  dt*        j0                        | _        t5        j6                         }d| d}	| j                  j8                  j;                  |	 d| d| d       | j                    d| }
t        j<                  j                  ddd|
 dgddg      }|st?        d|
       tA        | jB                  |      }| j                  j8                  j;                  |	 d|        tE               }tE               }g }tG        jH                         }tK        |      D ]y  }tM        jN                  | jP                  d| d| |||d      }|jS                  |       |jU                          | j                  j8                  j;                  |	 d |        { d}| jW                  |||| j.                  !      }|D ]7  }| j                  jY                         r n|j[                  |d"          |d#z  }9 |D ]  }|j[                  d$        | j                  j8                  j;                  |	 d%|        |D ]  }|j]                           tG        jH                         |z
  }| j                  j8                  j;                  |	 d&||z  d'd(       d}|j_                         s$||j                         z  }|j_                         s$| j                  j8                  j;                  |	 d)|        ||z  }d d d        d d d        |S # 1 sw Y   xY w# 1 sw Y   |S xY w)*Nr   r
   r@  extra
sane_liststocr   r  rE  r  process_new_or_updatedarchived_tasks[PID r\  u'    Процесс запущен (offset=, limit=r  r   r   r   r  r  r  r  r   u)   Не найден проект с ext_id uE    Обработка задач в несколько потоков: _process_task_thread_r  )rg  rh  r   r  u>    Запущен параллельный обработчик )rm  r$  rn  rq  r   rC  u1    Ожидание обработки задач: u%    Скорость обработки rJ  u    задач в секундуuA    Обработка задач завершена. Ошибок: )0cmf.appr   modules.kaiten.markdownrA  rk   disable_acldisable_notifyPlantUMLExtensionMentionExtensionStrikethroughExtensionrC  rR   	CmfImportrT   r   r^   r   _normalize_settingsr~  r  rj   r\  IMPORT_ONLY_NEW_OR_UPDATED_process_new_or_updatedIMPORT_ARCHIVED_TASKSrO   r1   getpidrW  r  r8  CmfErrorr  threading_max_forksr   r   rZ  r
  r  r  ri  r   r  r'  r   r`  r  r|  )r[   cmf_import_idr>  rm  r$  r   rA  r  process_pidprocess_msgrA  r   thread_countrg  rh  task_threadst1r  r  r  r-  r+  t2r   s                           r(   process_task_forkz!CmfPluginKaiten.process_task_fork4  s   '6  " g	!G$:$:$< g	!,,.++-113)D% %..22 ./ 3 DO  $55<<HHD 44T__5R5RSd5efDM+/??+H+H+N+N+R+R(11,D( $(??#@#@#F#F#J#J ,,$D 
 ))+K!+a0KOO""''-FvhhW\V]]^_ !% 0 01J<@N''++ &C/?s*CD% , G !J>JZ[\\ t77?LOO""''-deqdrs J %L""$B<( "))440QqcB&0->#* ##F+&&++"m#abhaij  J++U $ < < , E
   ??,,.tJ/0a
	  ' 'v&' OO""'';-7hisht(uv&  ""$r)BOO""''-DZRT_UXDYYvw J'--//3355
 (--/ OO""''-`ak`lm j FOg	! g	!R Sg	! g	! g	!R s)   Q=O7Q10/Q1Q=1Q:	6Q==Rc                 L   dd l }|j                  dddd| j                  j                  j                   d| j                  j                   d| d| d	| d
gdd|j
                  |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stderrrp  u(   ] Запуск процесса (offset=rq  r  )
subprocessPopenr   r^   r   DEVNULLr   pid)r[   r>  rm  r$  r  procs         r(   _execute_taskzCmfPluginKaiten._execute_task  s    "K:4??;Q;Q;T;T:U V**+4
|3vhb "%%%%   
 	DHH:EfXXV[U\\]^	
 r,   c                 n   ||k  rd|fgS t        j                  ||z        }t        dt        j                  ||z              }t	        |t        ||            }t        ||      }||z  }	||z  }
g }d}t        |      D ]2  }|	}||
k  r|dz  }t	        ||      }|j                  ||f       ||z  }4 |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ceilrr  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distributionrm  r  r$  s                  r(   _calc_task_distributionz'CmfPluginKaiten._calc_task_distribution  s    * --$%% "&;9N+N!O  #1djj?R1R&ST  #=#6LNb2cd35KL !$44
"22	'( 	AE9}
45E0eOF	 r,   c                    d}d}| j                   j                         j                  dt        |      d      }|j	                         rt        |      j                         D ]  }|j                         s|j                  j                  d      r0|j                  d      j	                         }| j                  du r|s`| j                  du r|rq|j                  d      j	                         r/d	D ]%  }|j                  |      }|j                  d
       ' |dz  }|j                  d      j	                         s|dz  } ||fS )u  
        Получает количество успешно и неуспешно обработанных задач.
        Неуспешно - были ошибки при обрабоке саймой задачи или
        связанных объектов(комментарии, чек-листы, журнал работ и т.д.).

        Для успешно обработанных задач удаляет файл-флаги.
        r   r"  r-  r`  ri  TFr_  )rh  r_  r  r   rh  )r   rr   rs   rf   rt   r   rk  rl  r'   re  rO   r  )	r[   r>  success_countfailed_countro  rq  rs  file_flag_namer  s	            r(   _get_processed_countz$CmfPluginKaiten._get_processed_count  sE    OO557@@J
	  O335 &(==))*=>&//<CCE''4/))U2{$$Z0779*E :$,$5$5n$E	!((D(9: "Q&M $$]3::< A%L+&, l**r,   c                    | j                   d   }| j                   d   }d| d| d}| j                         }| j                  |      \  }}}}}	}
| j                  j	                  | d| d| d|	 d	| d| d|
 dd
       | j                  j
                  j                  d       | j                  d
u r| j                  r|
n|	}n/| j                  du r| j                  r|n|}n| j                  r|n|}|s0| j                  j	                  | dt        j                  d
       y 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                  j	                  | d| t        j                  d
       | j                  j	                  | d| t        j                  d
       | j                  ||| j                  t        j                        }t        j                  }|D ci c]  }|d }}|j!                         }i }t#        j$                         }|s|rt'        |      |k  r|r|j)                  d      }||   dz   }| j                  j
                  j                  d| d| d|        |\  }}	 | j+                  |||      }||f||<   |||<   t#        j6                  d&       t'        |      |k  r|rg }|j9                         D ]  \  }\  }}|j;                         }||j1                  |       |dk(  r/| j                  j	                  d |j4                   d'| d|        a||k  rC| j                  j
                  j/                  d|dz    d| d(|        |j1                  |       | j                  j3                  d |j4                   d!| d"| d)| d$%        |D ]  }||=  |s|rt#        j6                  d*       |r|rt#        j$                         }||z
  }t=        |d+      \  }}t=        |d,      \  }} | j?                  |      \  }!}"| j                  j
                  j                  | d-tA        |      d.d/tA        |      d.d/| d0       | j                  j
                  j                  d1|! d|" d|        | j                  j
                  j                  d2||z  d3d4       | j                  j
                  j                  d5|        y c c}w # t,        $ r}||k  rC| j                  j
                  j/                  d|dz    d| d|        |j1                  |       n3| j                  j3                  d j4                   d!| d"| d#| d$%       Y d }~d }~ww xY w)6Nr   r      Проект 'r   r  uT   . Всего выгруженных задач (активных/архивных): rI  rb  uA   ). Необработано (активных/архивных): Tr   u   Для настройки обработки задач измените параметры 'IMPORT_ONLY_NEW_OR_UPDATED' и 'IMPORT_ARCHIVED_TASKS'Fu-   . Нет задач для обработки)r|  r   u0   Будет выполнена обработкаu    толькоu"    новых/обновленныхu    архивныхu    активныхu    задач: rM  r   u[   . Ограничение одновременных процессов обработки: r   r   u   Попытка r  u0   Повторный запуск (попытка z): u4   . Ошибка предыдущей попытки: rp  uC   ] Процесс завершился с ошибкой после u    попыток: u   . Ошибка: zERR-0034r  rD  uE   ] Процесс завершился успешно (попытка u?   . Код возврата предыдущей попытки: u   . Код возврата:    i  <   u8   . Обработка задач завершена за 02d:z06.3fuE   Обработано задач (успешно/неуспешно): u%   Скорость обработки: rJ  u    задач/секu)   Всего задач в проекте: )!r1  r  r  r   r   rW  r  rO   r}  r  r  r  r  r\  IMPORT_OBJ_CNTIMPORT_PROCESS_RETRYcopyr   rZ  r&  r`  r  r   rX  r   r    r  rU  r   polldivmodr  r'  )#r[   r>  r?  project_msgr  r=  unprocessedr  r  r0  r  r  process_tasks_msgr  max_retries
task_chunktask_chunk_attemptspending_task_chunksactive_processesr  attemptrm  r$  processr%   processes_to_removereturn_coders  diffhoursr  r   secondssuccess_tasksfailed_taskss#                                      r(   _process_taskszCmfPluginKaiten._process_tasks  s   ''-
**73&}oSAF**, ))*5	
 mogRxq
 +Mm2013G2HK  	 	
 	##F	

 4'151M1M-S[J!!U*/3/K/K+QWJ(,(D(D%JOO-LMoo   
 N''4+?+?+K0++!%II!##t+!%88!%%.!%88!}ZLugFFm2/01// 	 	
 	mv  xE  wF  G// 	 	
 33$$!!	
 11 @LLz1}LL +//1!!#!%5&'-7<O044Q7
-j9A=&&++ogYa}TVWaVb,cd !+"00VUKG1;W0E$W-6='
3 

35 &'-7<O: #%2B2H2H2J ..*g%lln*'..w7"a'++#GKK= 1//6is:,H
 #[0 OO22::"RSZ]^S^R__bcmbn o``k_l!n 066zB OO55"'} 5..5Y6G
| T<<G=!J ,6	 6 #2 / .$W-.  #6

1 "%5B !U{!$-y!)R0&*&?&?
&K#|##mS5z#aGS175/C	
 	##STaSbbcdpcqqw  yC  xD  E	
 	##&KZZ^M^`cKddv$wx##&OPUw$WXq M. ! ,..66NwYZ{m[^_i^j kQQTPUW ,22:>11#GKK= 1**12CJ< P--0E3 (2	 2 s   +
T3?T8 8	WA;WWc                     dd|gdd|gg}t         j                  j                  |      }|s5t         j                  ||| j                  d      }|j	                  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"00 '?? $	 1 M 40r,   c                    |d   }|d   }|d   }| j                   j                  j                  d| d| d|        | j                   d| }t        j
                  j                  |      }|s-d	d
|gdd
|gg dg}t        j
                  j                  |      }|s"t        j                  || j                   d      }|j                  s|j                  sr||_	        | j                  ||d         |_        d|_        |d   |_        ||_        t        |d   dz  d      |_        ||_        d|_        |j#                  d       |S | j                   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   rW  r  r   rR   r   rT   r  r   r'   r  status_codeallow_empty_transitionr=   r  roundr  r  rX  )	r[   r  r  rV  r  r   r  r  r  s	            r(   r  z(CmfPluginKaiten._process_workflow_status  s   $  %	!'*!&)##1+c)Llmulvw	
  ++,Byk: **..m.Dk*S(+%M
 %..22-2HO$..!?? $ / O
 **/2H2H#.O *.*A*A+{[aOb*cO'59O2$/$8O!'/O$&+K,E,La&PO#%2O".2O+  T 2  OO""**00OPXz Z\ ]
 r,   c                 2   |d   }|d   }|d   }| j                   j                  j                  d| d| d       | j                   d| d}t        j
                  j                  |	      }|s-t        j                  | j                  || j                   d
      }|j                  rD| j                  d   }| j                  d   }| d| |_
        d| d| d| |_        |j                  d
       | j                   j                  j                  d|        g }	|D ]/  }
| j                  |
|      }|	j                  |j                         1 t        j                   j#                  dd|	gdd|gg dgdgd
      }|D ]U  }t        j                   j                  dd|j                  gdd|j$                  gdd|gg      sD|j'                  d
       W |j)                          |S | j                   j                  j+                  d| d       |S )u  
        Обрабатывает бизнес-процесс для задач списка

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

        Returns:
            CmfWorkflow: бизнес-процесс для задач
        r   r   columnsuQ   Обработка бизнес-процесса задач для списка 'r   r  r   rM  r  T)r  r   r   r  r5  u%   : Бизнес-процесс для u0   Бизнес-процесс для списка u    проекта r  r  r  r  r  r   r  r   r  rP  r   r  r  r  )r   rW  r  r   rR   rX   rT   rY   r  r1  r'   r   r  r  r   r   r   r  r   rq  r  rX  )r[   r  r  rU  r  r  r  rB  r?  r  r  r  r  r   s                 r(   _process_list_task_workflowz+CmfPluginKaiten._process_list_task_workflow  s    d# )"9-##_`k_llopxoyyz{	
 "--.b
'B%%)))A))00&?? $	 * H ##,,U3K ..w7M*m+PQ\P]^HMN{m[klwkxxz  |I  {J  KHMMMdM+OO""''*lmulv(wx!, <"&"?"?X"V ''(:(:;<
 !' 0 0 5 58%56h/)
 & $ !6 ! , * ''++tVYY/&V-?-?@#S(3 ,  D)* ((*  OO""**.xj 9\ ]
 r,   c                    | j                  |      }|d   }|d   }| j                  j                  j                  d| d| d       | j                   d| }t
        j                  j                  |      }|s"t
        j                  || j                  d	      }|j                  r||_	        | j                  |_        ||_        ||_        |d
   }|dk7  rAd| j                   d| d}	t
        j                  j                  ddd|	 dg      }
|
|_        |j!                  d       |S | j                  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   rW  r  r   rR   CmfListrT   r  r'   rZ   r   r  tree_parentrV   r  r  rX  )r[   r  list_foldertask_workflowr  rU  list_ext_id
board_listr  r  r   s              r(   _process_board_listz#CmfPluginKaiten._process_board_listb  s    88Dd# )##&YZeYffijrisst$uv))*"XJ7^^''{';
"?? $ ( J
 %%)JO$($8$8J!/<J,%0J"#-.D#E #q(&()9)9(:"=Q<RRT$U!#0044$f2C1DA.FG 5 
 6@
2OOO-  OO""**
| ,\ ]
 r,   c           	          t         j                  j                  d| j                  dg      }|sJt         j                  d| j                  | j                  dd| j                  d      }|j                          |S )u   
        Получает/Создает каталог для досок в структуре проекта

        Returns:
            CmfFolder: объекта каталога для досок
        u
   Доскиtree_node_is_branch)r'   r  r   Ni_ T)r'   rD  r  sys_typer  r   r  )rR   	CmfFolderrT   _projectr   r  )r[   board_folders     r(   _get_board_folderz!CmfPluginKaiten._get_board_folder  s~     ''++)* , 

 !++!}} MM?? $ , L r,   c                    | j                   j                  j                  d| d| d       | j                   d| }t        j
                  j                  |ddg      }|s"t        j                  || 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         j#                  |d      |_        |j'                  d       |S | j                   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  r<  Tr  u   Фильтр для fullcommonproject in (z) and lists = ANDproject.codeIN
lists.codeFrp   r  u   Фильтр r  )r   rW  r  r   rR   CmfBqlFilterrT   r  r'   r  rD  perm_policy
view_scoperF   ubqlrf   rv   rV  bqlr  rX  )r[   r  rU  r  board_filter_ext_idboard_filterr  s          r(   _process_board_filterz%CmfPluginKaiten._process_board_filter  s    	##&[\g[hhkltkuuv$wx!%!1!1 2"XJ?**..&! / 
 !..*?? $ / L
 ''"6{m DL"&--L'-L$&.L#".t}}/A/A.B.Q[Q`Q`Pa bLDMM,>,>(?'@Atc*//&:%;<C
  $zz#EzBL$/  OO""**~ .\ ]
 r,   c                    |d   }|d   }t        |d   d d      }| j                  j                  j                  d| d| d	       g }t	        |d
      D ]  \  }}|d   }	|d   }
|
s| j                  j                  j                  d|
 d|	 d| d| d		       | d|
 }t        |	      }|| j                  |<   | j                   d| d|	 }t        j                  j                  |ddg      }|s"t        j                  || j                  d      }|j                  r|
|_        d|_        d|j                   d| d|_        dddt        |j                        ggdd|gg}t         j#                  |d      |_        |dz  |_        ||_        |j+                  d       n,| j                  j                  j-                  d | d!| d"       |j/                  |        |S )#u  
        Обрабатывает дорожки доски
        Фильтр по списку (поле lists) и полю Дорожка (поле cf_kaiten_board_lane)

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

        Returns:
            list: список дорожек
        r   r   lanesc                     | d   S r  r*   )rP  s    r(   r  z:CmfPluginKaiten._process_board_swimlanes.<locals>.<lambda>  s    T,/ r,   T)r5  reverseu.   Обработка дорожек доски 'r   r  r   u#   Обработка дорожки 'u   ) доски 'z / r   r'   r  r<  r  embeddedzlists = z and cf_kaiten_board_lane = "r$  r  r  r  r  r   Frp   r  r  u   Дорожка u    доски 'uf   ' была изменена. Изменения из импорта не будут применены)r  r   rW  r  r  rf   
_swimlanesr   rR   r  rT   r  r'   r  rF   r  rv   rV  r  r  r  r  rX  r   )r[   r  r  r  rU  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/
 	##&TU`Taademdnno$pq	"+K"; 3	'GYoG"7+JOO""''5j\WI N*m3xj; !,}C
|<Nw<L,:DOOL)!%!1!1 2"XJb	JO**..&% / H !..*#$( / 
 '' *&0#z/ 033A2B!E 
 !4#joo*>)?@+S,?
  $zz#EzB#*T> +4($/&&..%hZ}[M J` a X&g3	'j r,   c                    |d   }|d   }| j                   j                  j                  d| d| d|        | j                   d| }t        j
                  j                  |ddgd	
      }|s#t        j                  ||| j                   d	      }|j                  r||_        t        j                  j                  |dg      }|r0|j                  j                  |j                  j                         nR| j                   j                  d| d| ddd       n,| j                   j                  j                  d| d| d       t!        |d   dz  d      |_        |j%                  d	       y)u   
        Обработка колонки доски

        Args:
            column_data (dict): сырые данные колонки
            board (CmfKanbanBoard): доска
        r   r   u#   Обработка колонки 'r   u   ) доски r   mapped_status_codesr  Tr  r  r  r<  u>   Не найден статус бизнес-процесса 'r  zERR-0029r   r'  u   Колонка u    доски ro  r  r  r  r  N)r   rW  r  r   rR   CmfKanbanBoardColumnrT   r  r'   r   r  r   r  rj   r    rX  r  r  r  )r[   column_datarL  	column_idcolumn_namecolumn_ext_idboard_columnr   s           r(   _process_board_columnz%CmfPluginKaiten._process_board_column/  s     %	!'*##1+c)MZ_Y`a	
  ++,Byk:2266 % ! 7 
 !66$?? $	 7 L '' +L%%)))WF00778J8J8P8PQ))TU`Taadendoopq)( *  OO""**!,|E7 C\ ]
  %[%>%EqId+r,   c                    |d   }|d   }| j                  |||      }| j                  ||      }| j                  j                  j	                  d| d| d       | j
                   d| }t        j                  j                  |g d      }	|	s#t        j                  d	|| j                  d
      }	|	j                  rK||	_
        | j                  |	_        ||	_        ||	_        ||	_        |rdnd|	_        |	j#                  d
       n)| j                  j                  j%                  d|	 d       | j                  j                  j	                  d| d| d       |d   D ]  }
| j'                  |
|	        y)u>  
        Обрабатывает доску

        Args:
            board_data (dict): сырые данные доски
            board_list (CmfList): список задач для доски
            board_folder (CmfFolder): каталог для досок в структуре проекта
        r   r   u   Обработка доски 'r   r  r   )rD  r  kanban_bql_filterkanban_board_columnsr<  zboard.kanban:defaultT)r   r   r   r  z	1 queriesz7 noner  u   Доска ro  u.   Обработка колонок доски 'r  N)r  r  r   rW  r  r   rR   CmfKanbanBoardrT   r  r'   r  rD  r  r  swimlane_bql_filtersswimlane_typer  rX  r  )r[   r  r  r  r  rU  r  r  board_ext_idrL  r  s              r(   _process_boardzCmfPluginKaiten._process_boardd  s    d# ) 11(KT 11*jI	##&Ek]RUV^U__`$ab**+2hZ8%%)) * 
 ))1#?? $	 * E   $EJ==EL ,E&2E#)2E&1:+EJJ4J(OO""**eW %\ ]
 	##&TU`Taademdnno$pq%i0 	;K&&{E:	;r,   u   Обработка досокc           
      N   | j                         }t        j                  j                  dd| j                  gg dg dg dgdg      }| j                  | j                  d         D ]  }|d   }|d	   }|d
   }|D ]4  }| j                  j                  |d         |d<   |d	   r*|d   d   |d	<   6 ||d
<   	 | j                  ||      }| j                  |||       t                 |t        j                  f|t        j                   fg}
|
D ]K  \  }}dd|g}t#        |j%                  |dg            |_        |j(                  s:|j+                  d       M y # t        $ r<}	t                | j                  j                  d| d| d|	 dd       Y d }	~	7d }	~	ww xY w)Nr  r   )r'   r   rz  )r<   r   r  )rF  r   Tr  r   r   r   r  r<   r'   u/   Не удалось создать доску 'r   r  zERR-0033r  r'  r1  Tr  )r  rR   CmfRegistryrT   r  ry  r1  rQ   r  r  r   r   r   r   r    r  r  r  r9  r  r  r  )r[   r  r  r  r  rU  board_columnsr  r  r%   foldersfolderr   model_filters                 r(   _process_boardszCmfPluginKaiten._process_boards  s    --/ ((,,T]]3-(%	 ** - 
 2243E3Ed3KL 	J!$'H$W-K&y1M, G&*&;&;&?&?F@S&TF# #7++6v+>v+FK(G %2Jy!!55j+N
##J
LI!	6 6001&..)
 % 	.MFE)37L)-ejjVZU[j.\)]F&  -		.  ))Ek]RUV^U__bcfbgh)& *  s   9/E	F$(1FF$c                    | j                   d   }| j                   d| }t        j                  j	                  |dg      }t        j
                  j	                  dg d      }t        j                  j	                  ||      }|s#t        j                  ||| j                  d	
      }|j                  r|j                  j                  xs i }t        |j                  j                        xs
 t               }|j                         D 	ci c]  \  }}	|	|
 }
}}	| j                  j                         D ]?  \  }}||v r||   }||
v r|
|   |k(  r|
|= |||<   n||
v r|
|   }||= |||<   n|||<   ||
|<   A | j                  j                         D ]  }|j!                  |        t#        t%        |j                         d             |_	        t'        |      |_        |j(                  rd	|_        |j-                  d	       | j                  |_	        g |_        |j-                          |j*                  rpt        j.                  j1                  t2        j4                  j7                         j9                  d      ddd       t        j.                  j;                  ddi       yy| j                  j<                  j?                  d| d       yc c}	}w )u   
        Обрабатывает конфигурацию для поля 'Дорожка'
        Собранные значения дорожек добавляются в конфигурацию поля
        r   r   r   r<  r  )r  r  r  r  r  )r  rD  T)r  rD  r   r  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"   Конфигурация поля ro  N) r1  r   rR   r}  rT   r  r~  r   r  r  rj   r  r  r   r  r2  r  r   r  r  r  r  r  r   r  r   r   r  r  r  rW  rX  )r[   r>  field_config_ext_idr  r  config_cust_fieldr  r  kvvalue_to_keynew_key	new_value	old_valueold_keyr5  s                   r(   _process_swimlane_field_configz.CmfPluginKaiten._process_swimlane_field_config  s   
 ''-
!%!1!1 2"ZLA..22:MWZV[2\((,,' - 

 #88<<! = 
 ! & < <%#?? $	 != ! ,,(0066<"O'*:+F+F+L+L'M'VQTQV$ .=-B-B-DETQAqDELE&*oo&;&;&= 2"o- / 8I L0\)5LPW5W(3/8OG,,.*95G'0/8OG,/8OG,*1Y'2 ++- 2(,,S12 "&f_-B-B-DJ^&_!`J*./G*HJ'$$#'
 D1(,%13.""$55(*(9(B(B>(R&/!& >>@PR[?\]   OO""**45F4G H\ ]M Fs   Kc           
      f   t               }| j                  | j                  d         D ]\  }|d   }|d   }| j                   d| }t        j
                  j                  |      }|s&| j                  j                  d| d| ddd	
       g| j                  j                  j                  d| dt        |d                 |d   D ]w  }| j                   d| }t        j                  j                  |d      }	|	r|j                  j                  |	       S| j                  j                  d| d| dd|       y |j                  d       |j!                  t#        |j$                               t'                _ t        j
                  j)                  t+        |             y)uC   
        Добавляет задачи в списоки
        r   r   r   r  u   Список 'r   u   ) не найденzERR-0030r  r'  u0   Добавление задач в список r  r  Tr]  u   В список u3    не удалось добавить задачу u"   . Задача не найденаzERR-0031r  r  )list_idsN)r  ry  r1  r   rR   r  rT   r   r    rW  r  r&  r   r   r   r  r  rf   r   r   recalculate_count_cacher  )
r[   r)  r  list_id
list_titler  r  card_idr/  r+  s
             r(   _add_tasks_to_listz"CmfPluginKaiten._add_tasks_to_list  s    52243E3Ed3KL  	J &G#G,J!--.b	:K++;+?J))$ZLG9<OP)& * 
 OO""''B:,bQTU_`gUhQiPjk &g. !%!1!1 2"WI>~~))t)T&&--d3OO--*:,6ijqir s; <#-&	 .  OOO-LLZ]]+,LA 	F 	..X.Gr,   c                    t         j                  j                  dd| j                  gg dgd      }|r@| j                  j
                  j                  d|        t        | j                  j                        }t         j                  j                  |      }|sdd	d
t        | j                  j                        ggg dg}t         j                  d| j                  ddd| j                  j                   dt        j                  |d      d|| j                  d
      }|j                          d| j                  _        d| j                  _        | j                  j                  d       yy)u  
        Проверяет наличие архивных задач и настраивает их отображение
        Для отображения архивных задач создается фильтр в разделе "Архив"
        r   r   )rK  r   TT)r   r^  u8   Импортировано архивных задач: r  r  r  r  )rK  rP  Fu   Задачиreadonlyr  z) and cmf_archived is not emptyFrp   )
r'   r  r  r  r  r  rK  r   r   r  r  N)rR   r   rp  r  r   rW  rX  rf   r   r  rT   rF   rv   rV  r  show_archivehas_children_archived)r[   archived_tasks_countfilter_ext_idarchived_tasks_filterr  s        r(   _configure_archived_tasksz)CmfPluginKaiten._configure_archived_tasksH  s\   
  &~~33C/+ "  4  
  OO""**-efze{+|}   4 45M$*$7$7$;$;=$;$Q!(#TC0B0B,C+DE1
 )/(;(;' $ *('(:(:';;Z[

3U
;!%(#$( )< )% &**,)-DMM&26DMM/MM409  r,   c                    | j                   j                  j                  d| j                  d           t        j
                  j                  dd|d   gddg      }|r|j                  |d   k7  s|j                  r[|d   |j                  vrJ|d    d|d    d	|d<   | j                   j                  j                  d
|j                   d|d           n&|j                  s|d   |_        |j                          d|d<   d|d<   d|d<   d|d<   | j                         }| j                  |      |d<   | j                  |      |d<   | j                         |d<   t        j
                  j                  ddd|d    dg|j!                               }|s)t        j                  |d   |d   | j                   d      }|j"                  }|j$                  r|D ]  }|dk(  r	t'        ||||           | j                  j                  dd      sd|_        |j                          |j*                  g|_        d|_        d|_        d|_        d|_        d|_        |j                  d       n)| j                   j                  j                  d| d       |r7t        j8                  j;                  |      D ]  }|j=                  d        t?                || _         i | _!        | jE                          | jG                          | jI                          | jK                          | jM                          t?                |S )Nu"   Обработка проекта r   r'   ry  r   r   r   rI  r  u   Проект с именем u8    уже существует! Переименуем в Ttask_allow_multiple_sprintsFsl_only_owner_approvesl_deny_no_approvesl_task_only_owner_closer  rg  cust_field_conf_schemer   r   rf  	is_publicprivater  u"   Настройки проекта u    были изменены пользователем. Изменения из импорта не будут примененыrC  rh  )'r   rW  r  r1  rR   r8  rT   r   r   rX  r'   r  r8  r  rx  r  r2  r  r  r  r  r   cmf_project_admins
show_lists	show_blog
show_pfeed	show_disk	show_chatr   r  rq  r   r  r  r  r'  r  r.  r6  )r[   project_structrR  r2  r  r5  r+  s          r(   _process_projectz CmfPluginKaiten._process_projectr  s   ##&HI[I[\cIdHe$fg ''++D."89 (+ , 
 &&.*FF&&&x0&--. -;6,B+C2nU]F^E__`)av&&&..3K4D4D3E F11?1G0HJ !''%3H%="  " 9=45 38.//4+,5:12 113
 '+&C&CJ&O{#+/+F+Fz+R'(373T3T3V/0 ''++f.*B)C1&EF!&&( , 
  ++#F+%h/?? $	 , K ##&&% ?(?S.*=>? %%))+t<*3' /:.C.C-DK*%)K"$)K!%*K"$)K!$)K!.OO""**4[M B\ ]
 ++;+? 3T23# ++- 	 	! 	&&(r,   u#   Обработка проектовc           
      :   | j                   D cg c]  }t        |d          }}| j                         D ]  }t        |d         }|d   }	 | j                  j	                         r	 d | _        d | _         y ||vr	 d | _        d | _        V|j                  d      r| j                  |d   d         }nt        j                  }d| j                   d| d}||d<   d|| j                  | j                  |d   |||d}|| _        | j                  |       t                d | _        d | _         y c c}w # t         $ rG t#                | xj$                  d	z  c_        | j                  j'                  d
| d| ddd       Y ew xY w# d | _        d | _        w xY w)Nr   r   r%  r   r   r   r5  )project_typer'   r   rI  r2  r   r   r  r   u=   Не удалось импортировать проект 'r   r  zERR-0032r8  r   )rL   rf   r&  r   r   r  r1  rT   r   r;  r}  r   rW   rU   rF  r   r   r   r   r    )	r[   pselected_projects_idsrD  r>  r@  r   rA  rE  s	            r(   _process_projectsz!CmfPluginKaiten._process_projects  s   7;7M7M N!QtW N N ..0 ,	*L\$/0J'0L(*??,,.J !%%)"I %::D !%%)"C  ##H- $ 0 0h1G1M NI !I#%d&6&6%7r*R!H)7X&$-("&":": $ > >(4U(;!*,'3	" &2"%%n5 !%%)"Y,	* !OD  1$))ST`Saadeodppqr) * 	 !%%)"s7   D2D78D7BD77AFF
FF

Fu3   Обработка связей всех задач
is_processc                    |s&| j                   j                  j                  d       y | j                  j                  j                  d      }t        j                  d| d      }t        j                  j                  d      }t        j                  j                  d      }| j                         D ]F  }|d   }| j                  |      D ])  }| j                   j                         r  y |d   }	t        |j                  d	g             D ]f  \  }
}|d   }|
d
k(  r=| j                  j                  |g       }|j!                  |	       || j                  |<   M| d|	 }||	|d| j"                  |<   h |j                  dg       D ]k  }|d   }|j%                  |      }|s|j'                  d      }|	 d| }|| j"                  v rC| d|	 }|| j"                  v rY||	|d| j"                  |<   m , I t)        | j                        }t+        d | j                  j-                         D              }| j                   j/                  d| d|        t        | j                  j1                         d      D ]  \  }
\  }}|
dz  d
k(  r+| j                   j                  j3                  d|
 d|        | j4                   d| }t        j6                  j                  |dg      }|s*| j                   j                  j                  d| d       |D ]V  }| j4                   d| }t        j6                  j                  |ddg      }|s*| j                   j                  j                  d| d       d	 |j8                  |j8                  k(  r&||_        |j<                  r|j?                  d       n| j                   j                  j                  d | d!| d"       t        j@                  j                  |||#      }|sct        jA                  |||| j                   $      }|j?                  d       | j                   j                  jC                  d%| d&| d'|        Y tI                 t)        | j"                  jK                               }| j                   j/                  d-|        t        | j"                  j1                         d      D ]  \  }
\  }}|
dz  d
k(  r5| j                   j                  j3                  d.|
 d|        tI                	 |d/   }|d0   }|d1   } t        j6                  j                  | j4                   d| 2      }!|!s*| j                   j                  j                  d3| d       t        j6                  j                  | j4                   d|  2      }"|"s+| j                   j                  j                  d4|  d       t        j@                  j                  |!|"|#      }|sct        jA                  |!|"|| j                   $      }|j?                  d       | j                   j                  jC                  d%| d&|! d'|"         tI                y # tD        $ r1}| j                   jG                  d(| d)| d*| d+,       Y d }~d }~ww xY w# tD        $ r2 | j                   j                  j                  d5 d6 d7         Y w xY w)8NuF   Отключена обработка связей всех задачrb  r  r  zsystem.additional_parentrE   zsystem.linkr   parentsr   z:additional_parent:)r<   
outward_id	inward_idr  r_   r   z:link:c              3   2   K   | ]  }t        |        y wr   )r&  )rL  rK   s     r(   rM  z5CmfPluginKaiten._process_relations.<locals>.<genexpr>N  s     RxS]Rs   u%   Родительских задач: u   . Подзадач: 2   u9   Обработано родительских задач rM  r   r   r<  uE   Не удалось найти родительскую задачу u   . Возможно задача не попала в импорт или находится в проекте, который еще не импортирован.parent_tasku=   Не удалось найти дочернюю задачу Tr  u!   У дочерней задачи u'    родительская задача uy    из другого проекта. Будет создана связь 'Дополнительный родитель')in_linkout_linkrelation_type)rT  rU  rV  r   u   Создана связь. r  z - u   Не удалось создать связь между родительской и дочерней задачами. Родительская: u   , Дочерняя: u   Ошибка: zERR-0035r  u   Связи задач: u"   Обработано связей r<   rO  rP  r  u=   Не удалось найти входящую задачу u?   Не удалось найти исходящую задачу u.   Не удалось создать связь z. in_link: z, out_link: )&r   rW  rX  r6   r_   r  r   r  rR   CmfRelationTyperT   r&  r'  r   r  rK   r   rI   r  rE  r&  sumr  r   r   r  r   r   r   rS  r  r  CmfRelationOptionr<  r   r    r   r2  )#r[   rL  r  r  additional_parent_type	link_typer   r>  r  rr  r  rD  	parent_id	child_idsrelation_idr  r_   r  linked_task_idtotal_parent_taskstotal_subtasksparent_ext_idrS  child_idchild_ext_id
child_taskrelation_optionr%   total_relationstask_relationrV  rO  rP  rT  rU  s#                                      r(   _process_relationsz"CmfPluginKaiten._process_relations  s   OO""**+st++//((-**''23 "(!7!7!;!;A[!;!\**..M.B	))+ ,	G J!44Z@ *	??,,.#D/!*9==B+G!H IAv &tI
 Av$(MM$5$5i$D	!((13<i0 %.K/B7)"LK 6&-%.8D''4& &/]]3CR%H M'.C#MM#.E  %*[[^N%,IVN3C"DK"d&9&99 %3$4F7)"DK"d&9&99  )&-%38D''43*,	\ !/R4==;O;O;QRR34F3G H!!/ 02	
 *34==3F3F3H!)L C	%A%	92v{&&++OPQsRXYkXlm  $//09+>M ..,,M9+,VK&&..[\e[f gq r
 % 4"&"2"2!32hZ@#^^//')95 0 
 "OO**22WX`Wa bu v
 &
 #**j.@.@@1<
.%00&OOO=..66?
| LEEPM Rst
 +1*B*B*F*F$.%0*@ +G +
  /.4.F.F(2)4.D+/??	 /G /O ,00T0B OO2288"=>T=UUWXbWccfgrfs tU4j LGC	J d1166895o5FGH/89L9L9R9R9TVW/X 0	+A+]2v{&&++.PQRPSSYZiYj,kl, -f 5*<8
)+6	 ..,,t7G7G6H:,4W,XOO**22WXbWc du v
 !>>--8H8H7II;5W-XOO**22YZcYd eu u
 "(":":">">#%"/ #? #
 '&,&>&> '!)&3#'??	 '? 'O $((T(:OO**005m_BwisS[R\]Q0	b 	{ ! OO--55@M B--7L(/ $. .  n  &&..D]O T  *| ,!!*-s:   C2Z7A)[!A[=B[	[&[[7\
	\
c                 
   d| _         || _        t               5  d| j                  _        | j                  j                  j                          t                d d d        | j                  j                  | _        | j                  j                  j                  j                  | _
        | j                  | j                  j                  d         | _        | j                  j                  j                  j                  dt        j                         | _        | j                  j                  j                  j                  dt        j$                        | _        | j)                          | j                  j                  j                  j                  dt        j*                        xs g }t-        d|v       }t-        d|v       }t-        d	|v       }|s| j/                          n%| j                  j0                  j3                  d
       |s| j5                          n%| j                  j0                  j3                  d       |s4| j7                          | j9                          | j;                          | j=                          | j?                          | jA                          | jC                          | jE                  | j                  j                  j                  j                  dd             | j                  j                  j                  j                  dd      r.| xj                   | j                  jG                         z  c_         nK| j                  j0                  j3                  d       n%| j                  j0                  j3                  d       t               5  d| j                  _$        | j                  j                  j                          t                d d d        |s$| j                  jK                  d       | jL                  D cg c]  }|d   	 }}| jO                         D ]  }|d   }	|	|vrd| j                   d|	 d}
tP        jR                  jU                  ddd|
 dgd      }|r0| j                  j0                  jW                  d|d    d|	 d       z| j                  j0                  j3                  d|d    d|	 d        | j                  jK                  d| j                  jX                          | j                    S # 1 sw Y   xY w# 1 sw Y   KxY wc c}w ) Nr   u   Импорт из Kaitenr  rn  ro  
skip_stager   rB   rC   u&   Пропуск дампа данныхuA   Пропуск скачивания файлов вложенийprocess_task_linksT)rL  process_linksu2   Отключена обработка ссылокu.   Пропуск обработки данныхr1  z2--------------------------------------------------r   r   r   r   r   rI  r  r   r   u   ) импортированu6   ) сдамплен, но не импортированu-   Импортировано объектов: )-r   r   r3   r'   rj   r  r   get_max_processesr  r^   r   r{  r~  r  rT   r\  r|  r}  r~  rO   r  IMPORT_SKIP_STAGEr  rA  rW  rX  r  r  r  r   r
  r  r.  rK  ri  process_cross_linksr)  r   rL   r&  rR   r8  r9  r  r  )r[   r   rk  	skip_dumpskip_downloadskip_processrI  selected_project_idsr   r>  rA  rR  s               r(   process_importzCmfPluginKaiten.process_import  sR   $^ 	#=DOO OO!!&&(L	
 "__>>??1188DD001N1NO`1ab'+'D'D'J'J'N'N$--(
$  $<<BBFF(( 
 	##% __2288<<\6KcKcdjhj
j)	Q*_-AO, OO""**+ST!OO""**+no!!#!'')))+$$& ""$##??88>>BBCWY]^ $  ,,2266M4??#F#F#HH&&../cdOO""**+[\^ 	'*DOO$OO!!&&(L	
 OO)595K5K#LAdG#L #L--/ $T]
%99#%d&6&6%7r*R!H$//44$f.1A.CD$( 5  OO**//()9(:#j\Icd OO**22()9(:#j\I  A$ OO"OPTP_P_PuPuOv wx??""g	 	n	 	 $Ms   A T)-A T6!U)T36U r   )r   NF)r1  )TT)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  r.  r8   r   r\  r(  r&  r'  ry  r   r  r  r  r-   r  r  r  r  r  r  r  r  r  r  r  r!  r/  rA  rw  r  r  r   r  r  r  r   r
  r  r.  r8  rd  rx  r  r  r  r  r  r  r  r  r  r  r  r0  r4  r>  r  rZ  re  ri  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r'  r.  r6  rF  rK  r  ri  ru  __classcell__)r\   s   @r(   r5   r5   @   s+   H$44AA E L $33??C KQ. ! !" $ $    "$ "3 " "      '3 ' '@&, m^:4l'Rn( D ' (T# D4l8EtV Z 33 3 !34P EF4 G4 FG
Y H
Y @A_ B_,\>@<= JBJH"BkZWr
K"Z DEc FcB4! 4!l2hwr>N` 45 689vkZ CD] E]~ XY1# Z1#frh5'n. D5+n=~D/Lf/P/'bIVS3j"9'vBHT Q! Q!f&(ob2 "4l%+NfYP6:xJX0d40dM^3,j5;n 451. 61.fL\)HV(1Tl\ :;.* <.*` JKyT y LyvW#r,   r5   r   )(r   r   r  rL  r  r1   r   r  r   r  r  r#  rV  r  
contextlibr   r  r   	itertoolsr   bs4r   pathlibr   queuer   text_unidecoder	   rs  r   cmf.includemodules.kaiten.fieldsr   modules.kaiten.kaiten_clientr   localrd   r-   r3   r5   r*   r,   r(   <module>r     s        	 	        %  "    $   3 5Y__
, % %dK#'77 dK#r,   