
    7h                        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mZm	Z	m
Z
mZmZ d dlmZ d dlmZ d dl d dlmZ d Z G d	 d
ej*                        Zy)    N)Path)DictOptionalListCallableUnionType)BeautifulSoup)cmf_context)*)cmf_plugin_tracker_apic                       fd}|S )Nc                       fd}|S )Nc                    	 | j                   j                  j                  d d dd         | g|i || j                   j                  j	                          S # t
        $ r6 | xj                  dz  c_        | j                   j                  d        Y nw xY w	 | j                   j                  j	                          y # | j                   j                  j	                          w xY w)Nz====================    u   Ошибка )
cmf_importloggerinfodpcommit	Exception
has_errors	log_error)objargskwargsfuncnames      2./modules/tracker/models/cmf_plugin_tracker_api.pywrapperz3catch_exception.<locals>.decorator.<locals>.wrapper   s    +%%**hZqaz+JKC1$1&1
 !!((*	  A!#((=)?@A@!!((*!!((*s#   8A   <BC BC &C. )r   r!   r   s   ` r    	decoratorz"catch_exception.<locals>.decorator   s    	+     r"   )r   r#   s   ` r    catch_exceptionr%      s     r$   c                       e Zd ZU ej                  j
                  dz   Zeed<   ee	e
f   ed<    fdZed        Zedee	e
f   fd       Zdee
   fdZed	        Zedjd
       Zede	deee
      fd       Zed        Zedee
   de
fd       Zd Zdee
   de
fdZd Zdeee	e	f      fdZed        Zed        Zd Zd Zd Z d Z!de	fdZ"de	fdZ#de	fdZ$d Z%de	fd Z&de	fd!Z'd"e	d#e(fd$Z)d% Z*d&e
d'efd(Z+d) Z,d* Z-d+ Z.d, Z/d- Z0d.e
fd/Z1 e2d0      d1        Z3 e2d2      d3        Z4 e2d4      d5        Z5d6 Z6 e2d7      d8        Z7d9 Z8d: Z9 e2d;      d<        Z:d= Z; e2d>      d?        Z< e2d@      dA        Z=edB        Z> e2dC      dD        Z? e2dE      dF        Z@edGe
fdH       ZAdGe
fdIZBedGe
fdJ       ZC e2dK      dL        ZD e2dM      d"e	de	fdN       ZEdO ZF e2dP      d"e	fdQ       ZGedR        ZHdGe
fdSZI e2dT      dU        ZJdV ZKdW ZL e2dX      dY        ZMdkdZZN e2d[      d\        ZOd]e
d^e
fd_ZP e2d`      da        ZQ e2db      dc        ZR e2dd      de        ZSdf ZT e2dg      dh        ZUdi ZV xZWS )lCmfPluginTrackerApi)trackertracker_fieldsr   $_CmfPluginTrackerApi__tracker_fieldsc                     t        |   |i | d | _        d | _        g | _        d| _        i | _        i | _        i | _        i | _	        d | _
        y )Nr   )super__init__source_hashsettingsselected_queuescount_issuesissue_relationssubtaskssprint_issuesproject_list_issuesr*   )selfr   r   	__class__s      r    r-   zCmfPluginTrackerApi.__init__&   s[    $)&)!!#%  $r$   c                    ddl m} | j                  g d        || j                  j                  j                         | j                  j                  j                  | j                  j                  j                        S )u8    Клиент для работы с API Yandex Tracker r   
TrackerApi)pluginzplugin.ext_tokenzplugin.ext_token_addonzplugin.cloudtokenorg_idcloud)	modules.tracker.tracker_apir:   load_fieldsr;   	ext_tokendecryptext_token_addonvaluer?   )r6   r:   s     r    r(   zCmfPluginTrackerApi.tracker3   s_     	;ab++''//1;;..44++##))
 	
r$   returnc                 6   | j                   r| j                   S | j                  j                         j                  d      }|j	                         r;t        |d      5 }t        j                  |      | _         d d d        | j                   S | j                  j                         | _         t        |d      5 }t        j                  | j                   |       d d d        | j                   S # 1 sw Y   | j                   S xY w# 1 sw Y   | j                   S xY w)Nzfields.jsonr+w+)r*   r   get_download_pathjoinpathexistsopenjsonloadr(   
get_fieldsdump)r6   	file_pathfs      r    r)   z"CmfPluginTrackerApi.tracker_fields?   s      (((OO557@@O	i& 5!(,		!%5 $$$	 %)LL$;$;$=D!i& 4!		$//34 $$$5 $$$4 $$$s   C-8!D-DDc                    || _         | j                  | j                   j                  d         }ddg g gdg}| j                  j	                  d      D ]  }|j                         }t        |t        j                  j                     d         D ]o  \  }}|d   s| j                  ||d	         }| j                  |d   d
   |      }|d   d   j                  |d   d          |d   d   d   j                  |       q  |S )Nimport_settingsu   Задачиzcalendar-today)titleicontitlesrows   max_resultsfieldsmodel_fieldattr
field_namer   rX   captionrY   )r   _normalize_settingsjson_settingsr(   
get_issuesas_dict	enumeratemodelsCmfTaskverbose_name
_get_value_normalize_valueappend)r6   r   r/   resultissuenumsettingrE   s           r    previewzCmfPluginTrackerApi.previewO   s   $++DOO,I,IJ[,\]*4DPR]_\`ab\\,,,; 		3EMMOE )(6>>3N3N*OPX*Y Z 3W}-wv?--gm.D\.RTYZq	(#**7=+A)+LMq	&!!$++E23		3 r$   c            
      (   dt         j                  j                         t         j                  j                  ddt         j                  j                         t         j                  j                  ddt         j
                  j                         t         j
                  j                  ddt         j                  j                         t         j                  j                  ddt         j                  j                         t         j                  j                  ddt         j                  j                         t         j                  j                  ddt         j                  j                         t         j                  j                  dg} | S )	uW    Собственный магазин при выборе импорта из Tracker u   Поля контактов)ra   r]   rW   u   Поля организацийu   Поля задачu   Поля заметокu   Поля проектовu"   Поля списков задачu   Поля групп)
rg   	CmfPersonimport_shop_fieldsrW   
CmfCompanyrh   
CmfComment
CmfProduct
CmfProjectCmfPersonGroup)ress    r    calc_models_settingsz(CmfPluginTrackerApi.calc_models_settings`   s&    6AQAQAdAdAf%%**,9VEVEVEiEiEk&&++--9Z9Z9\flftftfyfyz1V=N=N=a=a=c&&++-3v?P?P?c?c?e&&++-<HYHYHlHlHn&&++--9N9N9a9a9c**//1
 
r$   c                    |sy| j                  |      }t        |t              r|S |syt        |t              rg d}|D ]  }||v s||   c S  yt        |t              rg }|D ]p  }d|v r|j                  |d   d          d|v r|j                  |d   d          ;d|v r|j                  |d          T|sW|j                  t        |             r dj                  |      S |S )u`   
        Метод получает значение параметра объекта
        N)r   displaykey inwardIssuer~   outwardIssue,)get
isinstancebooldictlistrl   strjoin)r   r_   to_strrE   
str_fields	str_fieldrm   related_objs           r    rj   zCmfPluginTrackerApi._get_valuet   s    
 eT"LeT"3J' ,	% ++, eT"F$ 4 K/MM+m"<U"CD#{2MM+n"=e"DEk)MM+e"45 MM#k"234 88F##r$   r`   c                 @    |sy | j                  |g      }|r|d   S d S )N)fields_namer   )rt   )modelr`   rz   s      r    _get_field_namez#CmfPluginTrackerApi._get_field_name   s.    &&J<&@s1v&$&r$   c                 6    dddddd}|j                  | d      S )Nr   r      )u   Незначительныйu   Низкийu   Среднийu   Критичныйu   Блокер)r   )prioritymappings     r    _get_priorityz!CmfPluginTrackerApi._get_priority   s-     -/"#
 {{8Q''r$   r/   c                 4    | D ci c]  }|d   |
 c}S c c}w )Nr   r"   )r/   ss     r    rb   z'CmfPluginTrackerApi._normalize_settings   s    &./&	1///s   c                 2    |dk(  r| j                  |      S |S )Nr   )r   )r6   local_field_namerE   s      r    rk   z$CmfPluginTrackerApi._normalize_value   s     z)%%e,,r$   c                     i }|D ]B  }|d   s	| j                  ||d   d      }| j                  |d   d   |      }|||d   d   <   D |S )uC    Преобразование настроек для модели r^   r_   F)r   r`   )rj   rk   )r6   r   r/   normalized_objrp   rE   s         r    _normalize_objz"CmfPluginTrackerApi._normalize_obj   st     	IG=)OOCOGE))'-*@*NPUVECHN7=1,?@	I r$   c           	          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(   Не работает/Уволенный)r}   emailactivecreatedauthorbodyr~   	dismissedr   r   )r)   r   )r6   r_   r   s      r    _get_setting_title_from_attrz0CmfPluginTrackerApi._get_setting_title_from_attr   sZ    ('" C	
 7?4= ""&&tR044VR@@r$   c                     g }ddddddddd	d
ddddd}i }| j                   j                         D ]?  \  }}| |j                  |d       }|j                  |j                  |d      |d       A |S )uO    Сопоставление настроек для модели models.CmfTaskresponsiblecmf_created_at
cmf_authordeadlinetextcoder   parentstatusagile_story_pointsr   
logic_typecmf_modified_atcmf_modified_by)assignee	createdAt	createdByr   descriptionr~   r   queuer   storyPointssummarytype	updatedAt	updatedByr   Nr^   r_   )r)   itemsr   rl   )r6   issue_settingsdefault_local_attrs_mappingadditional_attrcustom_field_keycustom_fieldr_   s          r    _get_issue_import_settingsz.CmfPluginTrackerApi._get_issue_import_settings   s    %)%"!"/ **'
#  .2.A.A.G.G.I 	*l&'(;(;<Lb(Q'RSD!!:>>?OQUV# 	 r$   c                  2    ddddddddddddd	d
dg} | S )N
first_name	firstNamer   	last_namelastNamer   r}   r   does_not_workr   r"   )user_settingss    r    _get_user_import_settingsz-CmfPluginTrackerApi._get_user_import_settings   s;     )+>'<"I6#W5+[A
 r$   c                  "    dddddddddg} | S )Nr   r   r   r   r   r   r"   )comment_settingss    r    _get_comment_import_settingsz0CmfPluginTrackerApi._get_comment_import_settings   s,     -kB(+>"F3

  r$   c                    	 t         t        t        j                     t        t        j                     f   }g 	| _        dt        dt        g t        t           f   d|dt        f	 fd} j
                  j                  dg        j
                  j                         j                  d      }|j                         rH j                         D ]  } j                  |d         D ]  } n  n  j                  d	      D ]  } nx nv j                   j#                  d
      D cg c]  }|j%                          c}d   } j                   j'                  d
      D cg c]  }|j%                          c}d   } | j(                  t        j                          | j*                  t        j                         	j-                  dg d       	S c c}w c c}w )Nr   settings_funcr   rF   c                 
    |       }|D ]X  }j                  | |d         |d<   j                  ||d         |d<   j                  |d         |d<   |j                  |d<   Z j	                  |j
                  |d       y )Nr_   rE   r^   rV   rW   )r   r]   )rj   r   r   rW   rl   ri   )r   r   r   obj_settingsrp   rm   r6   s        r    _get_settingsz@CmfPluginTrackerApi.tmplt_import_settings.<locals>._get_settings  s    (?L' -#'??3#H )-)=)=eW]E[)\&#'#D#DWV_#U "'**	-
 MM5#5#5NOr$   plugin.plugin.*queuesidusersr   r[   r   selectedObjects)r   rE   )r   r	   rg   rh   rs   r   r   r   r   rA   rJ   rK   rL   _get_projects_get_project_tasks_simple_getr(   rd   re   	get_usersr   r   rl   )
r6   r   	TypeModelr   dump_dirprojecttaskuserr   rm   s
   `        @r    tmplt_import_settingsz)CmfPluginTrackerApi.tmplt_import_settings   s   $v~~.V5E5E0FFG	:<$	Pt 	PHRd^4L 	PU^ 	Pcg 	P 	##%6$78??446??I??--/  33GDMB D ((1  .2\\-D-DQR-D-STcCKKMTUVWD-1\\-C-CPQ-C-RScCKKMSTUVD 	dD;;V^^LdD::F<L<LM 	02>? USs   'G"Gc                     |dk(  ry | j                    d| }t        j                  j                  ddd| dg      }|s7| j                  j                  d| dd	d
       | xj                  dz  c_        |S )Nunknown::ext_idLIKE%filteru3   Не найден пользователь ext_id ""zERR-0088rs   obj_typer   )r.   rg   rs   r   r   r   r   )r6   uidperson_ext_idpersons       r    _get_personzCmfPluginTrackerApi._get_person&  s    )++,Bse4!!%%h!M?RS@T-U%VOO%%Em_TUV$ & 
 OOq Or$   c              #   h  K   | j                   j                         j                  d      }|j                         rit        j                  |      D ]P  }|j                  d      rt        |j                  |d      d      5 }t        j                  |       d d d        R y y # 1 sw Y   ^xY ww)Nr   .dirty	data.jsonrH   )
r   rJ   rK   rL   oslistdirendswithrM   rN   rO   )r6   	queue_dirqueue_idrS   s       r    r   z!CmfPluginTrackerApi._get_projects7  s     OO557@@J	JJy1 '$$X.),,X{CTJ 'a))A,&' '' ' 's   B B2B&B2&B/	+B2c                 0   	 |dk(  rS| j                   j                  |      D cg c]-  }|j                  j                  d      s|j	                         / }}|S | j                   j                  |      D cg c]  }|j	                          }}	 |S c c}w c c}w # t
        $ ro}t        j                  |       t        j                  j                  |ddg      | _        | j                  |      D cg c]  }| nc c}w }}|s Y d }~|S d }~ww xY w)Nboards   Доска проектаr   r   r   r]   )r(   get_collectionr   
startswithre   r   gdebugrg   	CmfImportr   r   r   )r6   collection_namecmf_import_idr   dataes         r    get_from_online_or_dumpz+CmfPluginTrackerApi.get_from_online_or_dump@  s   	(*151L1L_1] Q#"xx223NO  Q Q  261L1L_1]^#^^ Q _ 	GGAJ$..22mSRcLd2eDO#'#3#3O#DECCEEDE  	sG   "B 2BB B 7BB 
B 	D&AD6	D ?DDr  c                &    | j                  d|      S )u   
        В Yandex Tracker 'Очереди', это 'Проекты' в EVA.
        Метод получения всех проектов в Tracker для настройки выбора импортируемых очередей.
        r   )r
  )r6   r  r   r   s       r    get_all_queuesz"CmfPluginTrackerApi.get_all_queuesQ  s    
 ++HmDDr$   c                   |j                  dg       }g }|D ]3  }|j                  d      |d<   |j                  t        |d                5 | j	                  d|      }g }|D ]  }	|	j                  dg       }
t        |
      dk(  r||	d<   n4|
D cg c]  }t        |d         |v s| }}t        |      dk(  rX||	d<   t        |	d         dkD  rd	nd
|	d<   |j                  |	        |S c c}w )u  
        В Yandex Tracker 'Проекты', это обычные(классические) списки в EVA !!!
        Метод получения проектов(списков), которые не удалось автоматически сопоставить с очередями,
        для дальнейшей настройки маппинга 'проект -> очередь(проект в EVA)'

        С front в kwargs ожидает:
        selected_queues = [
            {'self': 'https://api.tracker.yandex.net/v2/queues/QWE', 'id': '1', 'key': 'QWE', 'name': 'Тестовый QWE'},
            {'self': 'https://api.tracker.yandex.net/v2/queues/ASD', 'id': '2', 'key': 'ASD', 'name': 'Тестовый ASD'}
        ]

        Возвращает:
        "result": [
        {
            "self": "https://api.tracker.yandex.net/v2/projects/8",
            "id": "8",
            "key": "Проект 1",
            "name": "Проект 1",
            "queues": [
                {
                    "self": "https://api.tracker.yandex.net/v2/queues/SRM",
                    "id": "6",
                    "key": "SRM",
                    "display": "Тестовый 123"
                },
                ...
            ],
            "is_show": false  # если в queues только одно значение, нет смысла предлагать пользователю маппить
        }, ... ]

        Маппинг сохраняется при CmfImport.update в obj выбранной очереди в параметр projects
        'json_settings': {
            ...
            'import_settings': {
                ...
                {'name': 'selectedObjects', 'value': [
                    ...
                    'obj': {
                        'self': 'https://api.tracker.yandex.net/v2/queues/QWE',
                        'id': 1,
                        'key': 'QWE',
                        'name': 'Тестовый QWE',
                        'projects': [{'id': '8', 'name': 'Проект 1'}, {...}, ... ],
                        'boards': [{'id': '14', 'name': 'Доска 1'}, {...}, ... ]
                    }
                    ...
                ]}
            ...
        }
        r0   r   r}   r   projectsr   r   r   TFis_show)r   poprl   r   r
  len)r6   r  r   r   r0   selected_queues_idsr   r  rm   r   r   
new_queuess               r    get_all_projectsz$CmfPluginTrackerApi.get_all_projectsX  s   f !**%6; $ 	9E$yy0E)&&s5;'78	9 //
MJ 	#G[[2.F6{a$3!17c3uT{;KOb;bec
cz?a'$.!),WX->)?!)CGIMM'"	#  ds   C-&C-c                   |j                  dg       }g }i }|D ]2  }|j                  d      |d<   |j                  |d          |||d   <   4 | j                  d|      }g }	|D ]  }
t	        |
d   |
d         }|
j                  d      x}r(|d   |v s1|
d   g|d	<   d
|d<   |	j                  |       Q|
j                  di       j                  d      x}rR|D cg c]  }||v s||    }}t        |      dk(  r||d	<   t        |      dkD  rdnd
|d<   |	j                  |       ||d	<   t        |d	         dkD  rdnd
|d<   |	j                  |        |	S c c}w )u  
        Метод получения досок, которые не удалось автоматически сопоставить с очередями,
        для дальнейшей настройки маппинга 'доска -> очередь(проект в EVA)'

        С front в kwargs ожидает:
        selected_queues = [
            {'self': 'https://api.tracker.yandex.net/v2/queues/QWE', 'id': '1', 'key': 'QWE', 'name': 'Тестовый QWE'},
            {'self': 'https://api.tracker.yandex.net/v2/queues/ASD', 'id': '2', 'key': 'ASD', 'name': 'Тестовый ASD'}
        ]

        Возвращает:
        "result": [
        {
            "id": 14,
            "name": "Доска 1",
            "queues": [
                {
                    "self": "https://api.tracker.yandex.net/v2/queues/QWE",
                    "id": "6",
                    "key": "SRM",
                    "display": "Тестовый QWE"
                },
                ...
            ],
            "is_show": true  # если в queues только одно значение, нет смысла предлагать пользователю маппить
        }, ... ]

        Маппинг сохраняется при CmfImport.update в obj выбранной очереди в параметр boards
        'json_settings': {
            ...
            'import_settings': {
                ...
                {'name': 'selectedObjects', 'value': [
                    ...
                    'obj': {
                        'self': 'https://api.tracker.yandex.net/v2/queues/QWE',
                        'id': 1,
                        'key': 'QWE',
                        'name': 'Тестовый QWE',
                        'projects': [{'id': '8', 'name': 'Проект 1'}, {...}, ... ],
                        'boards': [{'id': '14', 'name': 'Доска 1'}, {...}, ... ]
                    }
                    ...
                ]}
            ...
        }
        r0   r   r}   r~   r   r   )r   r   defaultQueuer   Fr  r   r   r   r   T)r   r  rl   r
  r   r  )r6   r  r   r   r0   selected_queues_keysselected_queues_dictr   r   rm   
board_databoardr  r   r  s                  r    get_all_boardsz"CmfPluginTrackerApi.get_all_boards  s   ` !**%6;!!$ 	7E$yy0E) ''e516 u.	7
 --hF  	%JJt,:f3EFE)~~n==|=&*>>'1.'A&BE(O',E)$MM%(%>>(B7;;GDDDGMoeQVZnQn259o
oz?a'",h+.z?Q+>4Ei e$"1h+.uX+?!+C4i e$%	%(  ps   	E&Ec                    t         j                  j                  | j                  j                  g d      }|j
                  rGt        |j                  |j
                  z        dz  |_        |j                  d       t                y y )N)imported_object_countjson_object_countprogressr   d   T	only_data)rg   r  r   r   r   r  intr  r  savecommit_with_event)r6   r   s     r    _calc_progressz"CmfPluginTrackerApi._calc_progress  ss    %%))T__-?-?1k * m
''"%j&F&FIeIe&e"fil"lJOOdO+ (r$   r   c              #      K   | j                   j                         j                  | d      }t        |d      5 }|D ]  }t        j                  |        	 d d d        y # 1 sw Y   y xY ww)N.jsonrH   r   rJ   rK   rM   rN   loads)r6   r   rR   rS   rows        r    r   zCmfPluginTrackerApi._simple_get   sf     OO557@@D6P	)T" 	&a &jjo%&	& 	& 	&s   9A0A$	A0$A-)A0c                 L   | j                   j                         j                  | d      }| j                   j                         j                  | d      }|j                         r|dv rt        j                  |       ny t        |d      5 } |       D ]  }|j                         }|dk(  rW|j                  j                  d      r4|j                  j                  d      D cg c]  }|j                          c}|d	<   | j                   xj                  d
z  c_        |j                  t        j                  |      dz           	 d d d        t!        j"                  ||       | j                   j%                  d       t'                y c c}w # 1 sw Y   KxY w)Nr(  z.json.dirty)r  r   sprintsa+r   r   all)expandcolumnsr   
Tr!  )r   rJ   rK   rL   r   removerM   re   r   r  r1  get_allr  writerN   dumpsshutilmover$  r%  )	r6   api_funcr   rR   file_path_tmprS   r+  row_dictcolumns	            r    _simple_dumpz CmfPluginTrackerApi._simple_dump  sW   OO557@@D6P	99;DDv[EYZ88		)$-& 	5!z 5;;=8#xx**+FG JM++J]J]ejJ]Jk*l6>>+;*lHY'11Q61

8,t345	5 	M9-t, +m	5 	5s    AF*FAFFF#r   attachments_dirc           	      *   |sy | j                   j                  j                  d       | j                   d|d    }t	        |d      j                  d       D ]  }d}|j                  d      rd}|j                  |   }	 |j                  d      r)| j                   j                  j                  d	|        c|j                  d
      s| j                  j                   | }|j                  | j                  j                        sF| j                   j                  j                  dt        j                  j                  |              |j                  | j                  j                   d      sG| j                   j                  j                  dt        j                  j                  |              ht        j                  j                  |j                  d      d   j                  d      d         }| j                  j!                  |      }	|	j"                  }
|j%                  |
      }t&        j(                  j+                  |	j,                  || j                        }|sFt&        j)                  | j                   |	j,                  || j                  |	j/                               }||_        |
|_        |	j/                         |_        d|_        |j7                          |j8                  j;                           y # t<        $ rw}| j                   j8                  j?                          | j                   j                  j                  dt        j                  j                  |       d|        Y d }~4d }~ww xY w)Nu/   Обработка ссылок в текстеr   r   lxmlc                 J    | j                  d      xs | j                  d      S Nhrefsrchas_attrtags    r    <lambda>z1CmfPluginTrackerApi._dump_links.<locals>.<lambda>%  s"    CLLQWDXDo\_\h\hin\o r$   rD  rC  zmailto:u   Почта: httpuA   Внешняя ссылка, оставляем как есть: z/ajax/v2/attachments/u   Не файл: /r   ?r   rC  
obj_ext_idr.   )r   rC  rN  r.   import_raw_jsonFu>   Не удалось скачать файл по ссылке : ) r   r   r   r.   r
   find_allrF  attrsr  warningr(   urlurllibparseunquotesplitget_attachmentr   rK   rg   CmfImportDownloadr   contentre   pathrO  
downloadedr$  r   r   r   rollback)r6   r   r>  
issue_dictissue_ext_idrH  r~   rT  attachment_id
attachment	file_namerR   download_jobr	  s                 r    _dump_linkszCmfPluginTrackerApi._dump_links  sL   ##$UV**+2j.>-?@ v.778op +	RCC||F#))C.C%R>>),OO**22\#3GH~~f-!\\--.se4C~~dll&6&67OO**225vw}  xD  xD  xL  xL  MP  xQ  wR  4S  T~~)9)9(::O&PQOO**22_V\\EYEYZ]E^D_3`a & 4 4SYYs^B5G5M5Mc5RST5U V!\\88G
&OO	+44Y?	%77;;ASASGSHLHXHX  <  Z $#)#;#;tAKASASGSHLHXHXLVL^L^L`	 $< $bL
 %.!$-!/9/A/A/C,*/'!!#&&(Q+	RR  R""++-&&..1opvp|p|  qE  qE  FI  qJ  pK  KM  NO  MP  0Q  R  RRs.   9L<BLA-LEL	NA,NNc                    t        d      5  |}d}	| j                  j                  j                  d| d| d| d       |j	                  |d   |	      }
t        ||      D ]h  }|j                  |
|
      }
|
D ];  }|j                         }| j                   d|d    }	 | j                  j                         r0	 | j                  j                  j                            d d d        y| j                  j                  j                  d|d    d|d           |j                  t        |d               }|j                         r&	 | j                  j                  j                          |j                  t        |d         dz         }|j                  d       |j                  d      }|j!                  d      r~| j                  j                  j                  dt#        |j!                  d                    |j%                  |      D ])  }|d   }|j                  |      }|d   j'                  d      rt(        j*                  j!                  |d   || j                        }|s0t(        j+                  | j                  |d   || j                        }||_        ||_        ||_        d|_        |j5                          |j                  j                          | j                  j                  j7                  d|d           t9        |d      5 }|j;                  |d          d d d        , | j=                  |j!                  dd      ||       |j                  d      }|j                         rt>        jA                  |       | j                  j                  j                  d       t9        |d       5 }|jC                  |      D ]k  }|j;                  tD        jG                  |      d!z          | j                  xjH                  dz  c_$        | j=                  |j!                  d"d      ||       m 	 d d d        |jK                  |      |d#<   tM        jN                  ||       |j                  d       |d$   }|jQ                         D ]!  \  }}|D ]  }|d   |d%   d   k(  s||d&<    ! # t        |      jS                  dd      |d'<   |j                  d(      }t9        |d)      5 }tD        jU                  ||       | j                  xjH                  dz  c_$        | xjV                  dz  c_+        | j                  j                  j                  d*| jV                   d+|d,           d d d        | j                  j                  j                          > |j[                  |	       k |j\                  j_                          d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w#  |	dz  }	| j                  jY                  d-|d    d.d/d01       Y xY w# | j                  j                  j                          w xY w# 1 sw Y   y xY w)2NFinit_views_and_dsr   u   Страницы задач с u    до u    по u    на страницеr~   )per_page)pager   r   r   u   Задача "" ID r   Texist_okattachmentsu%   Обработка вложений: r   r[  rJ  rM  )r   rC  rN  r.   u   Не ссылка zwb+descriptionHtmlr   comments.jsonu'   Дампинг комментариевr.  r2  textHtml	changelog	workflowsr   workflow
issue_pathr   rI   u   Скачано задач     из r1   u0   Не удалось скачать задачу zERR-0089rh   rQ   r   
error_type)0r   r   r   r   get_issues_for_queuerangeget_issues_for_queue_by_pagere   r.   	is_cancelr   r   rK   r   rL   mkdirr   r  get_issue_attachmentsr  rg   rZ  r\  r   rO  r]  r$  rS  rM   r5  re  r   r3  get_issue_commentsrN   r6  r  get_issue_changelogr7  r8  r   replacerQ   r1   r   putclientclose)r6   
start_pageend_pageri  	tasks_dir
queue_datar(   tasks_that_are_doner  errorsissuesrj  rn   r_  r`  task_dirtask_dir_tmpr>  rb  rc  attach_file_pathrd  rS   comments_filecommentrs  rt  
issuetypes	issuetype	info_paths                                 r    _dump_task_partz#CmfPluginTrackerApi._dump_task_partR  sl   51 e	"FFOO""''*I*U[\d[eekltku  vL  )M  N00E1BX0VFj(3 _0<<V$<O# \4E!&J&*&6&6%7r*T:J9K#LLY4??446#$n **113Ge	" e	" ..33ojQVFWEXX^_ijn_o^p4qr#,#5#5c*T:J6K#L#??,$d **113a (1'9'9#j>N:ORZ:Z'[$**D*9 +3*;*;M*J%>>-8 OO2277:_`cdndrdr  tA  eB  aC  `D  9E  F.4.J.J5.Q G
,6v,>	3B3K3KI3V 0#-i#8#C#CF#K393K3K3O3O-7	-B3?484D4D 4P 4&L
 ,87=7O7O7;1;I1F7C8<8H8H	 8P 8* 9IL$58AL$5CML$@>CL$;$0$5$5$7$0OO$:$:$<$(OO$:$:$B$BEWXbclXmWnCo$p)-.>)F %G!()
90E(F%G %G1G8 ((8I2)NP_akl )5(=(=o(N(//1IIm4..334]^!-6 k!+1+D+DU+K k !

7(;d(B C $ A AQ F A $ 0 0Z1Lo_i jkk 392L2LU2S
;/L(;'--t-<$.{$;	4=OO4E *0Hj-7 *	#,T?j6H6N#N=EJz$:$)** 47x=3H3HSU3V
<0$,$5$5k$B	!)T2 a IIj!4 OO==B= --2- OO2277"<T=N=N<OvV`aoVpUq r	  **113y\4z $''/_0@ MM!Ke	" e	"d%G %Gk k, !11NzZ_O`Nab&%.'-	 2  **113Ge	" e	"s   BY2%X &Y2/AX%Y23F3X&W2;BXB W?	A2XAX	BX	XAY22W<7X?X	XXX,Y	Y		&Y/	/Y22Y;r  cntc                    ddl m} ddlm} ddlm} d}t        j                  ||z        }|| j                  z  }||k  r:t        j                  || j                  z        }t        j                  ||z        }t        |d         j                  d      }	|	j                  d	        |       }
d}t        j                  || j                  z        }d
}|}g }|dkD  r||z   }||kD  r|d
z   } || j                  d| ||||	| || j                  j                  j                         | j                  j                   j"                  | j                  j$                  j"                        |
d      }|j'                  |       |j)                          | j*                  j,                  j/                  d|        ||z  }||z  }|dkD  r|D ]  }|j1                           | j*                  j,                  j/                  d       |
j3                         s$||
j5                         z  }|
j3                         s$| j*                  j,                  j/                  d|        |S )Nr   QueueThreadr9   r   r   tasksTrl  r   
dump_tasksr<   )r  r  ri  r  r  r(   r  targetr   r   u   Форк _dump_task_part proc=uE   Конец параллельного скачивания задачu   Ошибок: )r   r  	threadingr  r@   r:   mathceildownload_threading_max_forksr   rK   r}  r  r;   rB   rC   rD   rE   r?   rl   startr   r   r   r   emptyr   )r6   r  r  r  r  r:   ri  total_pagesper_threadsr  r  r  	step_pager  	last_pageprocessr  procs                     r    _dump_taskszCmfPluginTrackerApi._dump_tasks  s>   $:iih/!B!BByyt'H'H!HIH))C(N3KK01::7C	&#gIIkD,M,MMN	
	Ao!I-H)#$q=++!*.&0$,$,%.&0#-DKK4I4I4Q4Q4S59[[5P5P5V5V48KK4E4E4K4K$M 0CDED NN4 JJLOO""''*H(OP)#J9$K) Ao,  	DIIK	 	##$kl%++-)--//F &++- 	##nVH$=>r$   c                 :   |j                  | d      }|j                         rt        j                  |       t	        |d      5 }t        ||      }t        |      t        u r\|D ]V  }|j                  t        j                  |j                               dz          | j                  xj                  dz  c_        X nt        |      t        u ro|j                         D ]&  \  }}|D 	cg c]  }	|	j                          c}	||<   ( t        j!                  ||       | j                  xj                  dz  c_        nCt        j!                  |j                         |       | j                  xj                  dz  c_        ddd       yc c}	w # 1 sw Y   yxY w)u(  
        Метод создает дамп элемента очереди.
        :param attr: элемент очереди
        :param queue_obj: объект очереди
        :param queue_dir_tmp: директория для сохранения JSON файла дампа
        r(  r.  r2  r   N)rK   rL   r   r3  rM   getattrr   r   r5  rN   r6  re   r   r  r   r   rQ   )
r6   r_   	queue_objqueue_dir_tmp
items_filerS   itemkv_s
             r    _dump_queue_itemsz%CmfPluginTrackerApi._dump_queue_items  sF    #++tfEN;
IIj!*d# 	7q9d+DDzT!  ;DGGDJJt||~6=>OO55:5; dt# JJL 7DAq456qqyy{6DG7		$"11Q61		$,,.!,11Q61	7 	7 7	7 	7s    B%F+FBFFFc                 
   | j                   d   d   d   }|d   st        d      |d   D cg c]  }|d   s	|d   s|d    c}| _        | j                  j	                         j                  d      }|j                  d	
       t        | j                        }t        d|z        }| j                  j                  j                  d       | j                  D ]  }	 | j                  j                         r y | j                  xj                  dz  c_        | j                  j                  j                  d|d    d|d    d       |j                  t        |d               }|j                  d      }| j                  j                  |d         }	|j!                         sP|j                  |d    d      }
| j                  j#                  |d         }|j%                         }|d   |d<   |d   |d<   t        |
      |d<   |	|d<   t&        j)                  |d   d	
       | j                  j                  j                  d       | j+                  d||
       | j                  j                  j                  d       | j+                  d||
       | j                  j                  j                  d       | j+                  d ||
       | j                  j                  j                  d!       | j+                  d"||
       | j                  j                  j                  d#       | j+                  d$||
       | j                  xj,                  |z  c_        | j                  j/                  d	%       t1                t3        j4                  |d   |       t        |      |d<   t7        |d         j                  d      }t9        |d&      5 }t:        j=                  ||       d d d        n*t9        |d'      5 }t:        j?                  |      }d d d        | j                  j                  j                  d(|	        |	dkD  r-d| _         | xjB                  | jE                  |	)      z  c_!         | j                  j                  j                  d/       y c c}w # 1 sw Y   xY w# 1 sw Y   xY w#  | xjB                  dz  c_!        | j                  jG                  d*|d    d+d,d-.       Y (xY w)0Nr   rE   r   	isCheckedu7   Не выбрано ни одной очереди ... childrenr   r   Trl  P   u<   Старт создания дампа очередей ... r   u,   Создание дампа очереди "r   rk  r    ... r   r~   r   )r~   r   r  r   r1   u1   Создание дампа типов задачr  u0   Создание дампа разрешенийpermissionsu=   Создание дампа рабочих процессовrs  u(   Создание дампа версийversionsu2   Создание дампа компонентов
componentsr!  rI   ru7   Создание дампа задач очереди: )r  r  u<   Не удалось создать дамп очереди "z	"ERR-0090rx   rQ   rw  u7   Конец создания дампа очередей)$r/   r   r0   r   rJ   rK   r}  r  r#  r   r   r|  r  r   r(   get_queue_issues_countrL   
get_queuesre   r   makedirsr  r  r$  r%  r7  r8  r   rM   rN   rQ   rO   r1   r   r  r   )r6   rootval
queues_dirr  stepr   r   	data_filer1   r  r  r  rS   s                 r    _dump_queuesz CmfPluginTrackerApi._dump_queues  s   }}./8;K UVV6::6Fjs#e*Y\]hYiE
j__668AA(K
$'$&&'28}##$bc)) @	E???,,.11Q61&&++.[\abh\i[jjpqvw{q|p}  ~C  -D  E&//E$K0@A	%..{;	#||BB5<P '')$.$7$75;-v8N$OM $ 7 7E%L 7 II!*!2!2!4J+0?Jx(-2:->Jz*.1-.@J{+1=J~.KK
; 7$KGOO**//0cd**<MROO**//0bc**=)]SOO**//0op**;	=QOO**//0Z[**:y-POO**//0de**<MROO,,4,OO((4(8%'KK
; 7C.1)nJ{+ $Z%< = F F{ SI i. 1!		*a01 1 i- 2%)YYq\
2 &&++.efres,tu!#()D%OOt'7'7:S_'7'``Oq@	D 	##$]^U  kl1 12 21$))STYZ_T`Sa b )%	 * sS   
R(R(R(!S=KSR-2SR9A"S-R6	2S9S	>S<Tc                 	   | j                   j                         }t        j                  |      \  }}}||z  dz  }| j                   j                  j                  d| d       | j                   j                  j                  d       | j                   j                  j                  d       | j                  | j                  j                  d       | j                   j                  j                  d       | j                  | j                  j                  d       | j                   j                  j                  d	       | j                  | j                  j                  d
       | j                   j                  j                  d       | j                  | j                  j                  d       | j                   j                  j                  d       | j                  | j                  j                  d       | j                   j                  j                  d       | j                  | j                  j                  d       | j                   j                  j                  d       | j                  | j                  j                  d       | j                   j                  j                  d       | j                  | j                  j                  d       | j                   j                  j                  d       | j                  | j                  j                   d       | j                   j                  j                  d       | j                  | j                  j"                  d       | j                   j                  j                  d       | j                  | j                  j$                  d       | j                   j                  j                  d       | j                  | j                  j&                  d       | j                   j                  j                  d       | j                  | j                  j(                  d       d| j                   _        | j                   j-                          t/                | j                   j                  j                  d        | j1                          y!)"u^   
        Загружает все данные из API, кроме вложений
        r   u   Свободно места: r   u5   Скачивание данных через API ... u?   Создание дампа всех пользователейr   u/   Создание дампа всех ролейrolesu/   Создание дампа всех группgroupsu:   Создание дампа всех типов задачissue_typesu;   Создание дампа всех приоритетов
prioritiesu5   Создание дампа всех статусовstatusesu<   Создание дампа всех типов ссылок	linktypesu3   Создание дампа всех экрановscreensuF   Создание дампа всех рабочих процессовrs  u5   Создание дампа всех очередейr   u/   Создание дампа всех досокr   u5   Создание дампа всех спринтовr-  uE   Создание дампа всех проектов(списков)r     u?   Создание дампа выбранных очередейN)r   rJ   r7  
disk_usager   r   r=  r(   r   	get_roles
get_groupsget_issue_typesget_prioritiesget_statusesget_linktypesget_screensget_workflowsr  
get_boardsget_sprintsget_projectsr  r$  r%  r  )r6   download_pathtotalusedfreefree_percents         r    download_dataz!CmfPluginTrackerApi.download_data\  sU    99;"--m<tTe|c)##&CL>QR$ST##$[\##$ef$,,00':##$UV$,,00':##$UV$,,118<##$`a$,,66F##$ab$,,55|D##$[\$,,33Z@##$bc$,,44kB##$YZ$,,22I>##$lm$,,44kB##$[\$,,118<##$UV$,,118<##$[\$,,22I>##$kl$,,33Z@#% ##$efr$   c           
         t        d      5  	 |j                         }|dk(  rnW| j                  j                         rn;t        j
                  j                  |d         }| j                  j                  j                  d| d       	 | j                  j                  |d   |d          t        |d         j                         j                  }||d	   d
   k7  r5| j                  j                  j                  d| d| d|d	   d
    d       t        j                   j                  |d         }d|_        |j%                          | j                  j                  j                  d|d           nd d d        y # t&        $ r$ | j                  j)                  d| dd       Y 7w xY w# 1 sw Y   y xY w)NFrg  TDONErC  u   Попытка скачать r  r\  rO  sizeu   Возможно файл u.    не был скачан корректно: rv  u	    байтr   )r   u   Сохранен в u,   Не удалось скачать файл zERR-0091rZ  r   )r   r   r   r|  rU  rV  rW  r   r   r(   downloadr   statst_sizerS  rg   rZ  r]  r$  r   r   )r6   download_queuerd  rC  	file_sizedownload_files         r    _download_file_workerz)CmfPluginTrackerApi._download_file_worker  s   51 	-1136)??,,.||++L,@A&&++.LTFRW,XYLL)),v*>V@TU $\&%9 : ? ? A I II L1B$CF$KK..668>l(k=N0OPV0W/XXac %+$<$<$@$@LQUDV$@$WM/3M,!&&(OO**//2F|TZG[F\0]^- 	 	0 ! OO--FtfM"!4 . 1	 	s1   B F6C-F;F6*F30F62F33F66F?c                    ddl m} ddlm} | j                  j
                  j                  d        |       }| j                  j                  dg       dd| j                  gg dg}t        j                  j                  |	      }|s&| j                  j
                  j                  d
       y | j                  j
                  j                  d|        g }t        | j                        D ]f  } || j                  d| d|i      }|j                  |       |j!                          | j                  j
                  j                  d| d       h t        j                  j#                  |g d      D ]\  }	| j                  j%                         r n@|j'                  |	j(                  |	j*                  |	j,                  |	j.                  d       ^ |D ]  }
|j'                  d        |j1                         s|D ]  }|j3                           | j                  j%                         ry | j                  j
                  j                  d       y )Nr   r  r  u5   Старт скачивания вложений ... zplugin.plugin.source_hashr.   ==)r]  r  Fr   u   Вложений нетu   Файлов: _download_file_worker_r  r  u/   Запуск задачи скачивания r  )rC  r\  rO  r   r]   )r   rC  r\  rO  r  u   Конец скачивания)r   r  r  r  r   r   r   rA   r.   rg   rZ  countrz  r  r  rl   r  slistr|  r  r   rC  r\  rO  r  r   )r6   r  r  r  _filtercount_download_filesprocsir  rd  r  s              r    download_filesz"CmfPluginTrackerApi.download_files  s   $##$[\##%@$AB!4)9)9:<WX%77==W=M#OO""''(AB##n5I4J$KLt889 	gA11-aS1(.9D
 LLJJLOO""''*YZ^Y__d(ef	g #44::'Ru:v 	L((*"oo$))$))#/#?#?	  	  	'Av&	' ##% 		 ??$$&##$EFr$   
group_infoc                    | j                   j                  j                  d|d           | j                   d|d    }t        j
                  j                  ddd| dgdg	      }|s(t        j
                  j                  d
d|d   gdg	      }|s't        j                  |d   |d|| j                         }|j                  r
|d   |_        ||j                  vr|j                   d| |_	        |j                  d       |S )Nu   Импорт группы r}   r   r   r   r   r   r   r  r   r  T)r   r   import_originalrO  r   save_import)r   r   r   r.   rg   ry   r   r  r   r   r$  )r6   r  group_ext_idgroups       r    _process_groupz"CmfPluginTrackerApi._process_group  s   ##&@IAV@W$XY**+2j.>-?@%%))(Fa~UVDW1Xbeaf)g))--fdJyDY5Zdgch-iE))z)/D\ko:DQUQ`Q` * bE  #I.EJu||+#ll^2l^<EL

t
$r$   u;   Обработка пользователей и группc           	      \   t               }| j                  d      D ]  }| j                  j                         r y	 | j                  j                  j                  d|d           d| j                   d|d    d}| j                  || j                  t        j                  j                     d         }d}t        j                  j                  d	d
|d   gdg      }|st        j                  j                  ddd| dgdg      }|st        j                  j                  dd
|d   g      }t        |      dkD  rE| xj                  dz  c_        | j                  j!                  d|d    dt        |       dd       |r|d   }|s6d}t        j                  ||d   j#                         | j                  d      }|j$                  r|D ]  }t'        ||||           |j(                  r|j$                  r|j+                  d       |j-                  ddg       |j.                  r$||j.                  vr|j.                   | |_        n||_        t        j0                  j3                         }	t        j0                  j5                         }
|j6                  j9                  |	       |j6                  j9                  |
       d|_        |j                  dg       D ].  }| j=                  |      }|j6                  j9                  |       0 |j+                  d       | j                  xj>                  dz  c_        |j@                  ri|jB                  s]|j@                  jE                  d       sB|j@                  jE                  d!      s'|r%|jG                  |j@                  jH                          |r'tK        t        j                  jL                  |g$       yy#  | xj                  dz  c_        | j                  j!                  d"|d    d#d       Y xY w)%u7    Импорт пользователей и групп r   Nu&   Импорт пользователя r}   r   r   r]   Floginr  r   r   r  r   r   r   r   r   r   u+   Пользователей с именем z > zERR-0092rs   r   r   T)r   r  r   r  r  rg_member_ofr  r!  z.evateam.ruzrobot@yandex.ruu@   Не удалось загрузить пользователя zERR-0093)r   )'setr   r   r|  r   r   r.   r   r/   rg   rs   ri   r   r   r  r   r   lowerr  setattr
is_changedr$  rA   r   ry   tracker_group
user_groupr  rl   
user_localr  r  r   r   r   addrE   schedule_deferred_jobregister_persons)r6   new_user_emailsr   r   	user_dict
is_createdr   personsr~   r  r  r  r  s                r    _process_usersz"CmfPluginTrackerApi._process_users  s    %$$W- F	D((*B&&++.TUYZcUdTe,fg"$T%5%5$6beR H //dmmFDTDTDaDa6bck6lm	"
))--gtYwEW5Xbeaf-g#--11(FaP]^_L`9aknjo1pF!"("2"2"7"7iX^N_?`"7"aw<!+ OOq0O OO55"MiX^N_M``cdghodpcq r *)4 6 
 #%,QZF!%J#--]4=g4F4L4L4N[_[j[j>B . DF ))( =Ys^<=$$)?)?KKDK1 ""Hn#=>==$FMM9+1==/-(I$1FM & 5 5 C C E#22==?
##**=9##**:6$(!"&((8R"8 6J //
;E''..u56 d+55:5 LL & 4 4!'!6!6}!EI^I^_pIq&#''(:(:;F	R !&"2"2"C"C?J[\ 1$))VW[\eWfVgh( * s   NO--;P+u#   Обработка статусовc                    | j                  d      D ]Q  }| j                  j                         r y| j                   d|d    }t        j
                  j                  |      }|s,dd|d   gg dg}t        j
                  j                  |	      }|s$t        j                  |d   | j                  
      }|d   |_        | j                  |j                  dd            |_	        |d   dk(  r| j                  d      |_	        ||_
        |j                  d       | j                  j                  j                          | j                  xj                  dz  c_        T y)uJ    Импорт и сопоставление статусов из Tracker r  Nr   r   r   r   r  r   r  Nr   r   r   r   rM   u
   РевьюreviewTr  r   )r   r   r|  r.   rg   CmfStatusCoder   r   calc_status_typestatus_typer   r$  r   r   r  )r6   r   status_code_ext_idstatus_coder  s        r    _process_statusesz%CmfPluginTrackerApi._process_statusesM  sI    &&z2 	7F((*$($4$4#5Rt~!F ..22:L2MK"D&.9;QR$2266g6F$22vSWSbSb2c%f~K&*&;&;FJJvv<V&WK#f~-*.*?*?*I'!3K.OO%%'OO11Q61+	7r$   u2   Обработка логических типов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	}| j                  d      D ]  }| j                  j                         r y| j                  j                  j	                  d|d           | j
                   d|d    }t        j                  j                  ddd| dg      }|r|j                  |d         }|rft        j                  j                  dd |d   gdg!      }|j                  r|j                   d| |_	        n||_	        |j                  d"#       | j                  j                  j	                  d$|d    d%       t        j                  j                  dd&|d   j                         gdg!      }|r>|j                  r|j                   d| |_	        n||_	        |j                  d"#       | j                  j                  j	                  d'|d    d(       d}t        j                  j                  dd |g      }t        j                  |d   j                         | j                  )      }|d   j                         |_        |j                  d*d+      |_        ||_        d,|_        ||_	        |j                  |j                    #       t#                | j                  xj$                  d-z  c_         y).u9    Маппинг issuetypes в logic_type и импорт Bugztask.bug:default)r   r   z
Task Agiletask.agile:defaultFeatureztask.feature:defaultImproveztask.improve:defaultEpicztask.epic:default	UserStoryztask.userstory:defaultu$   Запрос на измененияztask.sd_change_request:default   Инцидентztask.sd_incident:default*   Запрос на обслуживаниеztask.sd_service_request:default)	u   Ошибкаu   Задачаu!   Новая возможностьu   Улучшениеr"  StoryzChange requestr$  r%  r  Nu#   Импорт типа задачи r   r   r   r   r   r   r   r   r  r  Tr!  u   Поиск по имени "z" ... ILIKEu   Тип "u7   " не найден. Создание нового ... r  r   r   rh   r   )r   r   r|  r   r   r.   rg   CmfLogicTyper   r   r$  stripr   r   templatecmf_model_nameis_newr%  r  )r6   	name2code
issue_typeissue_type_ext_idr   logic_type_dicttemplate_coder*  s           r    _process_issue_typesz(CmfPluginTrackerApi._process_issue_typesh  s   
 &+4FG%1;OP:CMc1d+4>T"U#-@A)3KL'MWwx);E_ `Co  z[  ;\

	 **=9 3	7J((*OO""''*MjY_N`Ma(bc#'#3#3"4Bz$7G6H I,,006QO`NaabKc8d0eJ (mmJv,>?O#0044VT?[aKb<cmulv4w
$$+5+<+<*=R@Q?R(SJ%(9J%$/ OO""''*FzRXGYFZZ`(ab,,00*U[J\JbJbJd8e9A
 1 DJ$$+5+<+<*=R@Q?R(SJ%(9J%$/OO""''(:f3E2FF}(~0M**..vt]6S.TH,,*V2D2J2J2LY]YhYh,iJ(0668JO(nn]B?JO"*J(1J% 1JOO**;*;&;O<OO11Q61g3	7r$   c                 v   | j                    d|d    }t        j                  j                  |      }|j                   d|d    }t        j
                  j                  dd|g      }|s+t        j
                  j                  g ddd	|gd
d	|gg      }|s.t        j
                  j                  g ddd|d   gdd|gg      }|s"t        j                  ||| j                        }|d   |_        ||_        |j                  |_	        d|_
        ||_        |j                  |j                          y )Nr   r   r  r   r  r   r  rt  =r  r   r}   )rt  r  r   Fr!  )r.   rg   r  r   r   	CmfStatusr   r   r  r  allow_empty_transitionr$  r,  )r6   status_datart  r  r  status_ext_idr   s          r    _create_statusz"CmfPluginTrackerApi._create_status  sU    $ 0 01K4E3FG**..6H.I#??+2k$.?-@A!!%%hm-L%M%%))&S(+[12) F %%))&{956T8,2) F %%x[]a]l]l%mF!),((44(-%%&--/0r$   u4   Обработка рабочих процессовc           	         | j                  d      D ]  }| j                  j                         r y| j                  j                  j	                  d|d           | j
                   d|d    }t        j                  j                  |      }|sBt        j                  j                  d	      }t        j                  ||| j                  
      }|d   |_	        |j                  d       |d   D ]  }| j                  |d   |        t        j                  j                  dd|gg dgdg      }|D ]J  }t        j                  j                  dd|j                  gdd|gg dg      s9|j                  d       L |d   D ]*  }| j                  j                         r  y|j                    d|d   d    }t        j                  j                  |      }	|j                  dg       D ]  }
|j                    d|
d   d    }t        j                  j                  |      }|j                    d|d   d    d|
d   d    }t        j"                  j                  ||      }|st        j#                  ||      }|
d   |_	        |	g|_        ||_        |j                  d        - | j                  xj(                  dz  c_         y)u    Импорт workflow rs  Nu/   Импорт рабочего процесса r   r   r   r  r  r   r   r*  r   Tr  stepsr   rt  r  r  r  r  )r   !=Nr   )forceactionsr  -)r   rt  r   )r   r   r|  r   r   r.   rg   CmfWorkflowr   r   r$  r9  r5  r   r  deleter   CmfTransstatus_from	status_tor  )r6   workflow_infoworkflow_ext_idrt  template_workflowr  workflow_statusesr   status_from_ext_idrE  actionstatus_to_ext_idrF  transition_ext_id
transitions                  r    _process_workflowz%CmfPluginTrackerApi._process_workflow  s    "--k: 1	7M((*OO""''*YZghnZoYp(qr!%!1!1 2"]45H4IJO))--_-EH$*$6$6$:$:@T$:$U!!--_O`9= . J)&1HMMMdM+%g. >##DNH=> !' 0 0 5 5z4QY>Z\r=s>K_ !6 !N+ *''++]D&J\J\4]5?x4PRh4j+ kD)	* &g. 6??,,.(0'84>$;O:P%Q"$..22:L2M"hhy"5 6F*2//):"VH=Md=S<T'U$ & 0 0 4 4<L 4 MI+3??*;2d8nT>R=SSTU[\dUefjUkTl(m%!'!4!4<MX`!4!aJ%%+__<MX`_%a
&,VnJO.9]J*+4J(OOO566, OO11Q61c1	7r$   c                 P   t               }d }d }d }|d   D ]  }| j                   d|d   d    }t        j                  j	                  |      }| j                   d|d   d    }	|d   d   |d   d   k(  r1t        j
                  j	                  dd	d
|	 d
g      }
|
}|s|}|s|}|||	<    | j                   d|d    }t        j                  j	                  |      }|sBt        j                  j	                  d      }t        j                  ||| j                        }d|d    |_        ||_	        ||_
        ||_        |j                  d       t        j                  j                  |      D ]  }|j                           |j!                         D ]  \  }	}| j                  j#                         r |S t        j
                  j	                  dd	d
|	 d
g      }
|
|d|| j                  d}t        j                  di |}|j                  d        |S )NissueTypesConfigr   rt  r   r  	issueTypedefaultTyper   r   r   r   zsoftdev:defaultr;  r<  u!   Simple-схема проекта r   Tr  )	scheme_wfrh   )r   target_workflowr+  rU  r   r"   )r   r.   rg   rB  r   r(  CmfSchemeWfr   r   default_task_logic_typedefault_task_workflowdefault_subtask_workflowr$  CmfSchemeWfRuler   rC  r   r|  )r6   r   	issue_maprX  default_task_wfdefault_subtask_wftype_configrH  rt  logic_type_ext_idr   scheme_ext_idschemer*  rule	rule_dicts                   r    #_create_schemewf_for_simple_projectz7CmfPluginTrackerApi._create_schemewf_for_simple_project  sy   F	"&!"#56 	4K!%!1!1 2"[5LT5R4STO))--_-EH#'#3#3"4B{;7OPT7U6V W}%d+{;/G/MM#0044XvQRSdReefOg<h4i
*4'&&.O))1&+3I'(	4  ++,Bwt}o>##''}'=))--3D-EH''}x\`\k\k'lF9'&/9JK)@&'6$*<'%**//&/A 	DKKM	 ,5??+< 	('x((*   ,,006QO`NaabKc8d0eJ(#+"+#"ooI ))6I6DII$I'	( r$   c              #      K   | j                   j                         j                  d|      }t        |j                  d      d      5 }|D ]  }t        j                  |        	 d d d        y # 1 sw Y   y xY ww)Nr   zversions.jsonrH   r)  r6   
project_idproject_dirrS   r+  s        r    _get_project_versionsz)CmfPluginTrackerApi._get_project_versions:  sm     oo779BB8ZX+&&7> 	&! &jjo%&	& 	& 	&   AA=A1(	A=1A:6A=u   Обработка версийc                    t         j                  j                  ddd|d    dgdg      }t         j                  j                  d|      }t         j                  j                  d|      }| j	                  |d	   
      D ]{  }	 | j
                  j                         r y | j                   d|d	    }t         j                  j                  |      }|s"t         j                  || j
                  d      }t         j                  j                  d      |_
        ||_        |d   |_        |j                  dd      |_        |j                  j                  |_        |d   r|n||_        |j                   r-|d   s|d   r|j%                  d       n|j%                  d       |j&                  r)|j(                  r|j+                  |j,                          | j
                  xj.                  dz  c_        ~ y #  | xj0                  dz  c_        | j
                  j3                  d|d    dd       Y xY w)Nr   r   r   z"scheme_wf.default_release_workflowr  release)sys_typetree_parentarchiver   rh  
::version:r  Tr   r   r  zlist.release:defaultr;  r   r   r   archivedreleasedCLOSEDOPENr!  r   u)   Ошибка импорта версии zERR-0094CmfListr   )rg   rx   r   	CmfFolderrj  r   r|  r.   rx  r(  r   r   r   r   rU  default_release_workflowrt  ro  set_default_statusr  r  r$  r,  r  r   r   )r6   project_dataproject_objrelease_folderarchive_folderversionversion_ext_idversion_lists           r    _process_versionsz%CmfPluginTrackerApi._process_versions@  s$   ''++f,x*@)A&CD89 , 

  ))--yk-Z))--yk-Z11\$=O1P !	G ??,,.$($4$4#5Z!O%~~111H##)>>=A__BF $2 $HL +1*=*=*A*AG]*A*^'&1#$+FO!$+KKr$B!(3(=(=(V(V%=DZ=P>Vd(((z*gj.A$77A$77?//L4K4K %%L4G4G0G%H55:55!	61$))??PQ& * s   	H%EH;Ic              #      K   | j                   j                         j                  d|      }t        |j                  d      d      5 }|D ]  }t        j                  |        	 d d d        y # 1 sw Y   y xY ww)Nr   zcomponents.jsonrH   r)  rg  s        r    _get_project_componentsz+CmfPluginTrackerApi._get_project_componentsm  sn     oo779BB8ZX+&&'894@ 	&A &jjo%&	& 	& 	&rk  u)   Обработка компонентовc                 *   t         j                  j                  ddd|d    dg      }t         j                  j                  |dddg      }| j	                  |d	   
      D ]  }	 |j
                  sd|_        |j                          | j                  j                         r y | j                   d|d	    }t         j                  j                  |g d      }|s"t         j                  || j                  d      }||_        |d   |_        ||_        |j                  d      r| j                  |d   d	         |_        |j                  dd      r|j                  |_        |j"                  r|j$                  r|j                  d       |j                  dd      r|j&                  s!|j)                          d|j&                  _        |j&                  j"                  rG|j                  dd      |j&                  _        |j&                  j,                  j                  d       | j                  xj.                  dz  c_         y #  | xj0                  dz  c_        | j                  j3                  d|d    dd       Y .xY w)Nr   r   r   r   r  Ttree_node_is_branch)ro  rn  include_systemr]   r   rq  ::component:)descr_documentdefault_ownerdefault_responsibler  ro  r   r   r]   rs  r   lead
assignAutoFr  r   r   r   u1   Ошибка импорта компонента zERR-0095CmfComponentr   )rg   rx   r   ry  r  r  r$  r   r|  r.   r  r   r   ro  r   r  r  r  r  r  create_descr_document
text_draftrE   r  r   r   )r6   r|  r}  components_folder	componentcomponent_ext_idcomponent_lists          r    _process_componentsz'CmfPluginTrackerApi._process_componentss  s   ''++f,x*@)A&CD , 
 #,,00[S_@DNcMd 1 f 55dAS5T /	I.(<<<@%9%**,??,,.&*&6&6%7|IdOCT#U !'!4!4!8!8+H "9 " &%+%8%8@PDHOOIM &9 &ON )4%&/&7#->*==(373C3CIfDUVZD[3\N0==u59G9U9UN6!11n6O6O"''D'9==3)88&<<>HL55E%44DDCL==Q^`bCc55@&55;;@@T@R55:5Q/	R1$))G	RXHYGZ[+ * s   )=I(F(I;Ju3   Обработка проектов(списков)c           	      &   t         j                  j                  ddd|d    dg      }| j                   d|d    }t         j                  j                  |      }|s(t         j	                  |d|	      }|j                          |d
   D ]  | j                  j                         r y t        t        fd| j                  d
            d       }|&| j                  j                  dd    ddd       p	 | j                   d|d    }t         j                  j                  |dg      }|s't         j                  |d   ||| j                  d      }|j                  dd      |_        |j                  d      |_        |j                  d      |_        ||_        t         j"                  j                  d      |_        |j&                  r)|j(                  r|j                  |j*                          | j,                  j                  |j.                        x}rd|d<   | j                  xj0                  dz  c_         y #  | xj2                  dz  c_        | j                  j                  d|d    d d       Y xY w)!Nr   r   r   r   z::projects:r   r  u   Проекты)ro  r   r   r  c                 >    t        | d         t        d         k(  S Nr   r   )r  project_lists    r    rI  z<CmfPluginTrackerApi._process_project_lists.<locals>.<lambda>  s    QtW\RVEWAX1X r$      Проект "r   u"   " не найден в дампе!zERR-0096rx   r   ::project_list:r  T)r   r   r   r   r  r   r   	startDateendDatezlist.base:defaultr;  r!  r   r   u+   Ошибка импорта проекта zERR-0097)rg   rx   r   r.   ry  r$  r   r|  nextr   r   r   rx  r   plan_start_dateplan_end_datero  r(  r   r  r  r,  r5   r   r  r   )	r6   r|  r}  project_lists_folder_ext_idproject_lists_folderproject_list_ext_idproject_list_objproject_list_datar  s	           @r    _process_project_listsz*CmfPluginTrackerApi._process_project_lists  s   ''++f,x*@)A&CD , 
 *.)9)9(:+lSWFXEY&Z#%//33;V3W##)#3#3Rb;V $4 $X  %%'(4 *	L((*'XZ^ZjZjkuZv wy}~L#))%l6&:%;;^_) * 
 )-)9)9(:/,W[J\I]&^##)>>#5#5=PZbYc#5#d ''-~~<;O=H=PAEFJ	 (6 (L$ )5(8(8(K %3?3C3CK3P 01=1A1A)1L ./C ,.4.A.A.E.EK^.E._ +#338H8S8S$))8H8O8O4O)P(,(@(@(D(DEUE\E\(]]$]37%i055:5G*	H1$))A,vBVAWX) * s    EI;Jc                    ddl m} | 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        j	                  |       }|j                  d       |S # t        $ r%}t        j                  d|  d|        Y d }~y d }~ww xY w)Nr   )translitr   r  #r   ruT)language_codereversedORaliasr'  r   "%r   r   )r   r  u+   Не удалось создать тег "z": )
transliterater  r  rg   CmfTagr   r$  r   loggingrS  )rH  r  r  r  tag_objr	  s         r    _create_tagzCmfPluginTrackerApi._create_tag  s    *kk#s#++C4D4@	W'Qse2;/#&'QugR=1	G mm''w'7G --S-1.N 	WOOI#cRSQTUVV	Ws   A"B 	C!CCu   Обработка теговc                     t               }| j                  |d         D ]D  }| j                  j                         r y |j	                  d      s1|j                  |d         }F |D ]  }| j                  |        y )Nr   tags)r  r   r   r|  r   unionr  )r6   r|  r  rn   rH  s        r    _process_tagsz!CmfPluginTrackerApi._process_tags  sx    u,,\$-?@ 	1E((*yy zz%-0	1  	"CS!	"r$   u8   Обработка наблюдателей задачиc                    |d   D ]r  }| j                  |d         }|st        d|d          ||j                  k(  s||j                  k(  s||j                  k(  rX|j
                  j                  |       t t                y)u;   Добавляем наблюдателей в задачу	followersr   uI   _process_watchers: Не найден наблюдатель задачи r}   N)r   CmfErrorr   r   	cmf_owner
spectatorsrl   r%  )r6   	issue_objrn   watcherr   s        r    _process_watchersz%CmfPluginTrackerApi._process_watchers  s     [) 	0G%%gdm4F!jkrs|k}j~  A  A...&I<P<P2PTZ^g^q^qTq  ''/	0 	r$   rn   c              #      K   t        | d         j                  d      }t        |d      5 }|D ]  }t        j	                  |        	 d d d        y # 1 sw Y   y xY ww)Nru  rp  rH   )r   rK   rM   rN   r*  )rn   comments_file_pathrS   r+  s       r    _get_issue_commentsz'CmfPluginTrackerApi._get_issue_comments  s_     !%"56??P$d+ 	&q &jjo%&	& 	& 	&s   *A!A	A!AA!c           
         | j                  |      D ]8  }| j                   d|d    }t        j                  j	                  |      }|r|j
                  sG|st        j                  |d|      }| j                  |d   d         |_        |j                  |_        | j                  |d   d         |_	        |d	   |_
        |d
   |_        | j                  |j	                  d|j	                  dd                  |_        | j                  |j                  j                  ||      |_        ||_        |j#                  d       ; y )Nr   longIdr  Tr   r  r   r   r   r   r   r   rq  r   r   r  )r  r.   rg   rv   r   r  r   r   r  r   r   r   _process_mentionsr   _process_linksrE   rO  r$  )r6   r   rn   comment_datar   r  s         r    _process_issue_commentsz+CmfPluginTrackerApi._process_issue_comments  sB    44U; 	+L(()L,B+CDF''++6+:Gw66 ++4V\+]!%!1!1,{2KD2Q!RG ' 2 2G&*&6&6|K7PQU7V&WG#&2;&?G#%1+%>G"11,2B2B:|O_O_`fhjOk2lmGL..w||/A/A4OGL&2G#LLTL*'	+r$   c              #      K   t        | d         j                  d      }t        j                  |      D ]  }||j                  |      d  y w)Nru  rn  )rc  rR   )r   rK   r   r   )rn   attachments_pathrc  s      r    _get_issue_attachmentsz*CmfPluginTrackerApi._get_issue_attachments2  sT     l 34==mL$45 	^I )8H8Q8QR[8\]]	^s   AAu#   Обработка вложенийc                    ddl m} g }| j                  |      D ]%  }t        j                  j                  |d   |      }|s%t        j	                  | j                  ||d         }|j                  r|j                  d       |j                          t        j                  |d   |j                         |j                  }|r]t        j                  j                  j                   j#                         }|j%                  |j&                        }	|	j)                          |j+                  |       t-                ( y )	Nr   )RDiskrc  )r   r   )r   r   r   Tr  rR   )rdisk.rdiskr  r  rg   CmfAttachmentr   r   r  r$  
upload_dirr7  copyfull_path_filer,  CmfRFiler   data_driverget_rd	get_rfile
_file_namemake_previewrl   r%  )
r6   r  
issue_datar  rn  attachment_inforb  r,  rdiskrfiles
             r    _process_attachmentsz(CmfPluginTrackerApi._process_attachments8  s   %#:::F 	 O--11{7S\e1fJ#11T__9B7F{7S 2 U
 $$D1!!#KK4j6O6OP&&F%11==DDF
(=(=>""$z*)	 r$   uB   Обработка упоминаний пользователейc                    ddl m} |sy t        |d      }|j                  t        j                  d            D ]  }	  ||j                  d         }|j                  j                  d      }t        j                  j                  dd	d
| d
g      }|st        d|       |j                  |j                  d<   d|j                  d<   |j                  j                  |j                  d<   |j                   j                  |j                  d<    t)        |      S # t        $ rD}| xj"                  dz  c_        | j$                  j'                  d| d| dd       Y d }~.d }~ww xY w)Nr   )urlparsehtml.parserzstaff.yandex.ru)rC  rC  rK  r  r'  r   r   u+   Не найден пользователь Tcmf_convertedzdata-linked-resource-idzdata-usernamer   uZ   Не удалось преобразовать ссылку на пользователя rP  zERR-0098rs   r   )urllib.parser  r
   rQ  recompilerR  r\  r)  rg   rs   r   r   rC  r   rE   r  r   r   r   r   )	r6   r   r  souprH  user_url	user_namer   r	  s	            r    r  z%CmfPluginTrackerApi._process_mentionsT  s[   )T=1==bjj1B&C=D 	C#CIIf$56$MM//4	))--gw!I;VWHX5Y-Z#&QR[Q\$]^^$*KK		&!-1		/*7=yy		34-3\\-?-?		/*	( 4y  1$))pqtpuuwxywz{( *  s   CD!!	E.*9E))E.c                    d}|j                  d      r|d   j                  d      s |j                  dk(  s|j                  d      r|j                  rt         |j                  dd      j                  di |j                  |j                  dd |j                  |j                  |j                  d	d
      }|j                  |j                         |S t         |j                  dd      j                  di |j                  |j                  dd dd|j                  d	d
      }|j                  |j                         |S )uS   
        Из документов MS создаем наши превью
        au  
        <div contenteditable="false" class="app-tinymce-card-preview app-tinymce-is-preview">
              <a class="app-tinymce-href-preview app-tinymce-is-preview" title="{fileName}"
                rel="{urlPreview}"
                download="{url}" cmf_converted=True>
                <span class="app-tinymce-img-preview-block app-tinymce-is-preview">
                <span class="app-tinymce-img-preview-size app-tinymce-is-preview">
                  <img class="app-tinymce-img-preview app-tinymce-is-preview"
                  src="{urlPreviewImg}" alt="attachment" cmf_converted=True>
                </span>
                </span>
                <span class="app-tinymce-file-preview-block app-tinymce-is-preview">
                      <span class="app-tinymce-file-name-block app-tinymce-is-preview">
                        <span class="app-tinymce-file-name-view app-tinymce-is-preview">{fileName}</span>
                        <span class="app-tinymce-file-name-view app-tinymce-is-preview">{fileName2}</span>
                      </span>
                      <span class="app-tinymce-file-create-view app-tinymce-is-preview display-contents"></span>
                      <svg class="remove-file-icon" style="width:24px;height:24px" viewBox="0 0 24 24">
                          <path style="pointer-events: none;" fill="#e8e8e8" d="M19,3H5A2,2 0 0,0 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5A2,2 0 0,0 19,3M19,19H5V5H19V19M17,8.4L13.4,12L17,15.6L15.6,17L12,13.4L8.4,17L7,15.6L10.6,12L7,8.4L8.4,7L12,10.6L15.6,7L17,8.4Z" />
                      </svg>
                </span>
              </a>
            </div>
            classzyfm-fileimgr2  r   Ni)fileName	fileName2urlPreviewImg
urlPreviewrT  r  z/static/file-outline.pngr"   )rF  r  r   findurl_previewr
   r  formaturl_preview_imgrT  replace_with
currentTag)r6   rH  attachTAG_TMPLr   s        r    _create_previewz#CmfPluginTrackerApi._create_previewr  sX   0 LL!c'l&8&8&DUZIZ^a^f^fgl^m!!!"C("2"24"<"C"C #JSYS^S^TZT_T_`cacTdX^XnXnU[UgUgNTjj	GI #J
 LYZ   . 
 ""C("2"24"<"C"C #JSYS^S^TZT_T_`cacTdXrUWNTjj	GI #J
 LYZ   .
r$   u#   Конвертация ссылокc                 F   |s|S t        |      }|j                  d       D ]  }|j                  j                  d      r)| j                  j
                  j                  d|        H|j                  d      rG|j                  d   j                  d      r)| j                  j
                  j                  d|        | j                  j
                  j                  d|        |j                  d      r|j                  d   }n|j                  d   }t        j                  j                  |      j                  d	      d
   j                  d      d   t        fd|j                  dg       D        d       }|d|d   }t        j                  j!                  ||g d      }	|	s|j                  d      r|j                  d   |j                  d<   |	j"                  |j                  d<   d|j                  d<   t%        j&                  |	j"                        }
|
rN|
d   rI|
d   j                  d      r5d|_        d|j                  d<   d|j                  d<   d|j                  d<   n-|
r|
d   r&|
d   j                  d      s| j+                  ||	       |j                  d      r|j                  d   |j                  d<   |	j"                  |j                  d<   d|j                  d<   t%        j&                  |	j"                        \  }
}|
r|
j                  d      rd|_        d|j                  d<   d|j                  d<   d|j                  d<   |j-                  d      }|j                  d   |j                  d<   |
|j                  d<   |j/                  |       n| j+                  ||	       t        j                  j                  |	j"                        }| j                  j
                  j                  d|         t1        |      S )Nc                 J    | j                  d      xs | j                  d      S rB  rE  rG  s    r    rI  z4CmfPluginTrackerApi._process_links.<locals>.<lambda>  s    #,,v2F2]#,,W\J] r$   r  u   Уже обработали rC  r  u   Это якорь u&   Обрабатываем ссылку rD  rK  r   rL  r   c              3   4   K   | ]  }|d    k(  s|  yw)r   Nr"   ).0r  file_ids     r    	<genexpr>z5CmfPluginTrackerApi._process_links.<locals>.<genexpr>  s      #g!TUVZT[_fTfA#gs   rn  r}   )rT  r  r  )r   r   r]   src_origTvideocontrolsz100%widthheightimage	href_origsourcer   u   Заменили на )r
   rQ  rR  r   r   r   r   rF  r  rU  rV  rW  rX  r  rg   r  sgetrT  	mimetypes
guess_typer   r  new_tagrl   r   )r6   r   r   r  	text_souprH  rT  attachment_datarc  
attach_obj	mime_typeencoder
  rC  r  s                 @r    r  z"CmfPluginTrackerApi._process_links  s   K!$'	%%&]^ 9	MCyy}}_-&&++.J3%,PQ||F#		&(9(D(DS(I&&++.@,FGOO""''*PQTPU(VW||F#ii'ii& ll**3/55c:2>DDSI!LG ##gz~~mR/P#gimnO&'	2I--22	&:c 3 eJ<<&,/IIe,<CIIj)'1~~CIIe$15CIIo. ) 4 4Z^^ DI Yq\il6M6Mg6V#*0:		*--3		'*.4		(+&)A,y|?V?VW^?_,,S*=<<'-0YYv->CIIk*(2CIIf%15CIIo.(1(<(<Z^^(L%Iv Y%9%9'%B#*0:		*--3		'*.4		(+!*!2!28!<.1ii.?U+/8V,

6*,,S*=||++JNN;&&++.DTF,KLs9	Mv 9~r$   c                 <    d } ||      } ||      }|  d| d| S )Nc                 B   | yt        |       t        u r| j                  d      S t        |       t        u rZdj	                  | D cg c]?  }t        |      t
        ur*t        |j                  d|j                  d                  n|A c}      S t        |       S c c}w )Nu   Не указаноr}   z, r   )r   r   r   r   r   r   )r  r  s     r    	get_valuez8CmfPluginTrackerApi._simple_html_diff.<locals>.get_value  s    y,aDuuY''aDyykl!mfgQWZHZ#aeeIquuT{&C"D`a"a!mnn1v "ns   ABrP  u    ➔ r"   )ra   _from_tor  
from_valueto_values         r    _simple_html_diffz%CmfPluginTrackerApi._simple_html_diff  s3    	 u%
S>"ZLhZ88r$   c                 @   |d   D ]  }| j                    d|d    }t        j                  j                  |      }|r|j                  sGd }|j                  d      x}s]|D ]C  }|d   d   dk(  r|d   s|d	   s| j                  |d   d
   |d   |d	         }	||	n| d|	 }E |st        j                  |d|      }||_        | j                  |d   d         |_        |j                  |_	        |d   |_
        d|_        |j                  d        y )Nrr  z	::change:r   r  r]   fieldr   fromtor}   z<br>Tr  r   r   r   r  )r.   rg   rv   r   r  r  r   r   r   r  r   	log_levelr$  )
r6   r   rn   changer   r  comment_textr]   r  diffs
             r    _process_issue_changelogz,CmfPluginTrackerApi._process_issue_changelog  s[   K( 	/F(()6$<.AF''++6+:Gw66LH--v-# aEW~d+x7  =t 11%.2KUSY]\abf\ghD+7+?4~UYZ^Y_E`La $//tTZ`/aG+%)%5%5f[6I$6O%P"$+$6$6!)/)<&$%!.5	/r$   u   Обработка задачиc           	      V   | j                    d|d   d    }t        j                  j                  ddd| dg      }|st	        d	|d   d
    d      | j                    d|d    }| j                  || j                  t        j                  j                     d         }| j                    d|d    d|d   d    }t        j                  j                  ddd| dgdg      }| j                    d|d   d    }t        j                  j                  ddd|gddd| dgg      }	|j                  d      r| j                  |j                  d      j                  d            }
|
|d<   |
|d<   |
sT| xj                  dz  c_        | j                  j                  d|j                  d      j                  d
       dd       |j                  d      r2| j                  |j                  d      j                  d            |d<   |j                  d      r2| j                  |j                  d      j                  d            |d <   ||d<   |j                  |d!<   |	|d"<   | j                   |d#<   d$|d%<   ||d&<   |j                  d'|j                  d(d)            |d*<   ||d<   |j                  d+g       }|D ]  }| j                    d|d    }|j                  d,      d-k(  rFt#        |d   .      |d/<   t#        | j                    d|d0   d    .      |d1<   || j$                  |<   q|j                  d,      d2k(  st#        |d   .      |d1<   t#        | j                    d|d0   d    .      |d/<   || j$                  |<    |j                  d3      x}rb| j                    d|d    }| j&                  j                  |g       }|j)                  | j                    d|d           || j&                  |<   |j                  d&      x}rb| j                    d|d    }| j&                  j                  |g       }|j)                  | j                    d|d           || j&                  |<   | j                  j*                  j-                  d4|        t        j                  j                  |g d56      }|s&t        j                  |d7   | j                  d$|8      }t/        |d9      r|j0                  s|j2                  r%|j5                         D ]  \  }}t7        |||        |j8                  r|j;                  d$:       |d   d;   d3k(  r
|d<   |_        ||_        | jA                  ||       | jC                  |jD                  jF                        |_"        | jI                  |jD                  jF                  ||      |_"        | jK                  ||       | jM                  ||       |j                  d=g       D ]  }| j                    d>|d    }t        jN                  j                  |.      }|s:| j                  j                  d?|d
    d@d       | xj                  dz  c_        s|jP                  j)                  |        |j                  dAg       D ]  }| j                    dB|d    }t        jR                  j                  |.      }|s:| j                  j                  dC|d
    dDd       | xj                  dz  c_        s|jT                  j)                  |        |j                  dE      x}r^| j                    dF|d    }| jV                  j                  |t#        dGg H            }|dI   j)                  |       || jV                  |<   |j                  dJ      x}rf|D ]a  } | j                    dK| d    }!| jX                  j                  |!t#        dGdGg L            }"|"dI   j)                  |       |"| jX                  |!<   c |j                  dM      r| j[                  ||       |j8                  r|j;                  d$:       t]                |j                  dNg       }#|#r~	 |j_                  dNg       |#D ].  }$| ja                  |$      }%|jb                  j)                  |%       0 |j8                  r,|j;                  d$O       |jd                  jg                          | j                    d|d    }&t        jh                  j                  |&.      }'|'s!t        ji                  |&| j                  R      }'||'_5        |dS    }(dT|( dU|( dV|'_"        dW|'_6        |'j;                  d$:       |'jd                  jg                          | xjn                  dz  c_7        | j                  j*                  j-                  dX| jn                   dY| jp                          yZ#  | j                  j                  dP|# dQd       Y  xY w)[u   
        Общая логика обработки которая потом разделяется на задачи и эпики
        r   r   r   r   r   z%::z::%r   u   Нет проекта "r}   r   r]   rt  r   r   r  r  r   r  r4  r   r   r  r   u*   Не найден автор задачи zERR-0099rh   r   r   r   r   r   cache_status_typer   activityTapprovedr   ro  r   r   r   links	directioninwardr  r   objectr   outwardepicu0   Попытка создать задачу из )r   r  r   r   r  r   r   r   r  r   r  r  r~   r   fixVersionsrr  u!   Не найдена версия zERR-0100r  r  u%   Не найден компонент zERR-0101r   r  F)r   r  r  sprint	::sprint:)r   rt  r  r  r  r!  u0   Не удалось привязать теги zERR-0102r   r   r6   u?   Задача импортирована из Tracker: <a href="" target="_blank"></a>r   u&   Импортировано задач rv  N)9r.   rg   rx   r   r  r   r/   rh   ri   r5  r(  r   r   r   r   r  default_activityr   r2   r3   rl   r   r   hasattrr  r,  r   r  r  r$  r   rO  r  r  r   rE   r  r  r$  rx  listsr  r  r5   r4   r  r%  rA   r  r  r   r   rv   r   r   r1   count_project_issues))r6   rn   project_ext_idr   r`  normalized_issuer8  r   r`  r   r   issue_links
issue_linklink_ext_id
issue_epicepic_ext_id	sub_tasksissue_parentparent_ext_idr  r`   rE   r  r  version_objr  r  component_objr  r  r  r-  r1  sprint_ext_idsprint_datar  rH  r  comment_ext_idr  rC  s)                                            r    _process_issuez"CmfPluginTrackerApi._process_issue  s
   
 !,,-Rgt0D/EF##''fN+;3&?@ ( 
 5eGnY6O5PPRSTT**+2eDk];  ..udmmFNND_D_6`ai6jk++,BuZ/@.AE(OTXDYCZ[!!%%h!M?RS@T-U_l^m%n#//05=3F2GH((,,T6>EV5W6>!L]K^^_H`5a5c, d
 99[!%%eii&<&@&@&FGF-3\*,2[)1$))@;AWA[A[\eAf@gh& *  99[!262B2B599[CYC]C]^bCc2d./99Z .2.>.>uyy?T?X?XY]?^._]+%+"060B0B,-)3&'+'<'<$'+$%,"#(99->		-Y[@\#] %1" ii,% 		?J!--.bD1A0BCK~~k*h6-19I(9S-T
>*,04;K;K:LBzZbOcdhOiNj8k,l
=)4>$$[1,	9,08H8R,S
=)-1D<L<L;MRPZ[cPdeiPjOk9l-m
>*4>$$[1		? 6**:*!--.bD1A0BCK))+r:I 0 01E$K=AB)2DMM+& 99X..<.#//0<3E2FGM))-<I 0 01E$K=AB+4DMM-(##&VWgVh$ijNN&&lCu&v	,<V,D26//7;.: ' <I
 9/0Y5N5NR[RbRb%5%;%;%= 6!
E	:u56 NNtN, =6)"9-IN$)	!!!)U3//	0D0DE	,,Y^^-A-A9eT	$$Y6%%i7 yy3 	4G $ 0 01GDM?KN ..,,N,CK))7	8J7KL& * 
 1$&&{3	4 <4 	;I"&"2"2!3<	$?PQ"//33;K3LM ));Ii<P;QR& * 
 1$$$++M:	; !99Y//</%)%5%5$6olSWFXEY"Z $ 8 8 < <=PRV_dmoRp qh'..|<<MD$$%89 ii))7)! @#'#3#3"4IfTl^ L"0044]DQVafoqDrsH%,,\:4?""=1	@ 99[!""9e4NNtN, yy$%%vh/ 3C"..s3GNN))'23 ''NNTN2LL'') !,,-Rd}=##''~'>''~$//'ZG"-XY]X^^pqupvvz{&

Q##&LTM^M^L__efjff  fA  %B  	C+))FtfM& * s   A=h #h(c                     t        d      5  	 | j                  j                         rn(|j                         }|dk(  rn| j	                  |       Cd d d        y # 1 sw Y   y xY w)NFrg  r  )r   r   r|  r   rI  )r6   issue_queuern   s      r    _process_issue_forkz'CmfPluginTrackerApi._process_issue_fork  s^    51 		+??,,.#)F?##E* 		+ 		+ 		+s   AAA$c              #   \  K   | j                   j                         j                  dt        |      d      }t        j                  |      D ]P  }|j                  d      rt        |j                  |d      d      5 }t        j                  |       d d d        R y # 1 sw Y   ]xY ww)Nr   r  r   r   rH   )
r   rJ   rK   r   r   r   r   rM   rN   rO   )r6   rh  r  task_idrS   s        r    r   z&CmfPluginTrackerApi._get_project_tasks  s     OO557@@3z?\cd	zz), 	#G)i((+>E #iil"# #		## #s   A;B,=B B, B)	%B,u   Обработка досокc           	        
 t         j                  j                  ddd|d    dg      }|d   D ]
  
| j                  j	                         r y t        t        
fd| j                  d            d       }|&| j                  j                  d
d    d	d
d       p| j                   d|d    |d<   t         j                  j                  |d   g d      }|s$t         j                  |d   | j                        }|d   |_        ||_        ||_        ||_        |j                  d       |j                   r|j"                  D ]  }|j%                           |d   D ]  }t         j'                  |d   || j                  d      }|j                  d       |d   D ]U  }| j                   d|d    }t         j(                  j                  |      }	|	sJ |j*                  j-                  |	       W |j                  d        | j                  xj.                  dz  c_        t1                 y )Nr   r   r   r   r   c                 >    t        | d         t        d         k(  S r  r  r  r  s    r    rI  z5CmfPluginTrackerApi._process_boards.<locals>.<lambda>      s1T7|s5;?O/O r$   u   Доска "r   u$   " не найдена в дампе!zERR-0103CmfKanbanBoardr   r   r   )kanban_board_columnsrO  r   ro  r  r3  Tr  r1  )r   r   r   r  r  r  r   )rg   rx   r   r   r|  r  r   r   r   r.   rS  r   r   ro  rO  r$  r  rT  rC  CmfKanbanBoardColumnr  mapped_status_codesrl   r  r%  )r6   r|  r   r  	board_objr<  board_columnr   r8  status_globalr  s             @r    _process_boardsz#CmfPluginTrackerApi._process_boards  sk   ""&&f,x*@)A&CD ' 
 "(+ 2	 E((*f%OQUQaQabjQklnrsJ!))#E&M?2WX- * 
 &*&6&6%7r*T:J9K#LJx --11!(+[ 2 I
 "11H9MZ^ZiZi1j	'/IN%I$*I!(2I%NNtN,(('<< $FMMO$ )3 8F#)#>#>#F^(#'??(,	 $? $L !%%$%7"("4 O+/+;+;*<Bvd|n(M(.(<(<(@(@(@(V,,}$88??N	O
 !%%$%78  OO11Q61e2	 r$   c                 T   dd|j                   gg}|j                  d      r|j                  g d       n|j                  dd|g       t        j                  j                  |      }| j
                   d|d    }t        j                  j                  |d	g
      }|s"t        j                  || j                  d      }|d   |_        |j                  d      |_	        |j                  d      |_
        ||_        ||_        ||_        t        j                  j                  d      |_        |j                   r)|j"                  r|j%                  |j&                          |d   |_        |j                   r)|j"                  r|j%                  |j&                          |S )Ntree_parent_idr  rt  )rn  r  rp  rn  r   r2  r   r   r  Trs  r   r  r  zlist.agile_sprint:defaultr;  r!  )r   r   rl   rg   ry  r.   rx  r   r   r  r  ro  r   	list_typer(  r   r  r  r$  r,  )	r6   r   r1  parent_sys_typer]  r  ro  rF  sprint_lists	            r    _process_listz!CmfPluginTrackerApi._process_list  s   $dFII67::j!NN89NNJo>?&&**'*:++,IfTl^Dnn((xj(Q ..$//9= ) ?K "&>&,jj&=#$*JJy$9!"-# )!'!4!4!8!8>Y!8!Z&&;+A+A;+=+='=> "&>&&;+A+A;+=+='=>r$   u#   Обработка спринтовc           	         t         j                  j                  ddd|d    dg      }|d   D ]  t        t	        fd| j                  d                  }|D ]  }| j                  j                         r  y | j                  ||      }| j                  j                  |j                        x}rd|d	<   |j                  d
      |d
<   t                | j                  xj                  dz  c_          y )Nr   r   r   r   r   c                 D    t        | d   d         t        d         k(  S )Nr  r   r  rQ  s    r    rI  z6CmfPluginTrackerApi._process_sprints.<locals>.<lambda>I  s#    C'
40@,AStEU,U r$   r-  Tr   rt  r   )rg   rx   r   r   r   r   r   r|  r`  r4   r   r%  r  )r6   r|  r   r-  r1  
sprint_objrG  r  s          @r    _process_sprintsz$CmfPluginTrackerApi._process_sprintsB  s    ""&&f,x*@)A&CD ' 
 "(+ 	;E6"UW[WgWghqWrstG! ;??,,.!//?
"&"4"4"8"89J9J"KK;K-1K	*.4jj.DK
+!#55:5;	;r$   project_structr|  c                    ddl m} ddlm} d}t        j
                  j                  dd|d   gddg	      }|r|j                  j                  |d   k7  s|j                  r\|d   |j                  vrK|d    d
|d    d|d<   | j                  j                  j                  d|j                   d|d    d       n&|j                  s|d   |_	        |j                          t        j
                  j                  ddd|d    dg|j                         	      }|s[d}t        j                  |d   | j                  d|d         }t         j#                  dd|j$                  j&                        |_        |D ]  }t)        ||||           |j*                  }|j                          |r7t        j,                  j/                  |      D ]  }	|	j1                  d        | j3                          | j5                  |       | j3                          | j7                  |       | j3                          | j9                  |       | j                  j                  j;                  d       g }
 |       }t=        | j>                        D ]e  } || j@                  d| d|i      }|
jC                  |       |jE                          | j                  j                  j;                  d|        g | jG                  |d         D ]/  }| j                  jI                         r n|jK                  |       1 |
D ]  }|jK                  d        | j                  j                  j;                  d       |
D ]  }|jM                           | j                  j                  j;                  d        | j                  jI                         ry tO                | jQ                  |       | j3                          | jS                  |       | j3                          | jU                  |       | j                  xjV                  d!z  c_+        | j3                          |S )"Nr   r  r  Fr   r  r   r   r  z ()r  uo   " уже существует! Импортируемый проект будет переименован в "r   r   r   Tr/  z[^A-Za-z0-9-]r   )r   )TEXKOM_db_delete)r|  u<   Импорт задач в несколько потоковrL  rK  r  u.   Параллельный обработчик r   r  u3   Ожидание обработки задач ... u(   Конец обработки задачr   ),r   r  r  r  rg   rx   r   r   r   r   r   r   rS  r   r$  keysr  subr   rE   r  r,  rh   r   rC  r&  r  r  r  r   rz  threading_max_forksrL  rl   r  r   r|  r  r   r%  r  rZ  rd  r  )r6   re  r|  r  r  project_is_newr}  r~   r,  r   issue_processrK  r  r  rn   s                  r    _process_projectz$CmfPluginTrackerApi._process_projectX  sO   $''++FD.QWBX3Y4@(3K , M&&))^L-II&&&x08J8JJ -;6,B+C2nU]F^E__`)av&&&..@P@P?Q RB CQ  RX  CY  BZ  Z[0\ ] ''%3H%="  " ''++f.*B)C1&EF!&&( , 
 !N ++1G7;<@3A(3K , MK  "vv&6K<L<L<R<RSK! 	;CKnS&9:	; ##++;+? 3T23 	 	|, 	  . 	5 	##&bdgt//0 	aA!9!9!4QC8"/!=?D   &JJLOO""''*XY]X^(_`	a ,,\$-?@ 	#E((*OOE"	#
 " 	$DOOF#	$ 	##&Y[! 	DIIK	 	##&NP??$$& 	##L1 	\* 	l+--2-r$   u#   Обработка проектовc                 *   t         j                  j                  d      j                  j                  }| j                         D ]4  }d }t        |d         |d<   	 | j                  j                         rt                 y d| j                   d|d    d}t         j                  j                  d      }| j                  |      }|j                  di       }|r| j                  |d         }nddd	}||d
<   d|d   |j                  d|j                  dd            |j                  j                  |||d   ||t        j                  |      d
}	d| _        |d   | _        | j%                  |	|      }7 y # t&        $ r |rBt         j)                  |d      }
|
j+                  d       d|
_        |
j+                  d       t                | xj.                  dz  c_        | j                  j1                  d|d    dd       Y w xY w)Nsoftdevr;  r   r   zproject.agile:defaultr  z"default_import_tracker@evateam.comdefault_import_tracker)r   r   r   r   r   ro  r   r   r~   )
project_typer   r   r   rU  r'  task_code_prefixr  r   rO  r   r1   delme)r   r   Tr  r!  r   u<   Не удалось импортировать проект zERR-0104rx   r   )rg   CmfActivityr   r   rE   r   r   r   r|  r%  r.   r(  re  r   rN   r6  r1   r9  rn  r   rh   r$  cmf_deletedr   r   )r6   r'  r|  r   r:  r   rb  project_leadr  re  r   s              r    _process_projectsz%CmfPluginTrackerApi._process_projects  s   %%))y)9<<BB ..0 5	LG!$\$%7!8L1??,,.%'#%d&6&6%7r,t:L9MR!P#0044:Q4R
AA,O+//; $ 0 0d1C DI*N)A!CI *8X&$-(0(,,->@P@PQ^`b@cd",--"5"5!' ((4U(;!*,'+zz,'?" %&!,8,H)//MI5	L  !>>w>GDII$I/'+D$III-!#1$))RS_`fSgRhi) * s   $E>C7E>>BHHuN   Обработка связей задач и проектов(списков)c           
         | j                   j                         D ]M  \  }}| j                  j                         r y|d   s)t        j
                  j                  |      }|j                  j                          | j                  j                  j                  d|j                   dt        |d                 |d   D ]  }t        j                  j                  |g d      }|r|j                  j                  |       D| xj                  d	z  c_        | j                  j!                  d
| d|j                   dd        |j#                  d       t%                P y)ul   
        Постобработка добавления задач в проекты(списки)
        Nr   r  u@   Добавляем задачи в проекты(списки) rP  r  r8  r   r&  r  r   -   Неизвестная задача issue_id=u!    в проекте(списке) zERR-0105rx  r   Tr  )r5   r   r   r|  rg   rx  r   membersrO   r   r   r   r  rh   rl   r   r   r$  r%  )r6   r  r  r  issue_idr   s         r    _process_project_list_tasksz/CmfPluginTrackerApi._process_project_list_tasks  s~   
 7;6N6N6T6T6V 	 2!2((*$Y/%~~119L1M$$))+OO""''RScShShRiiklo  qB  CK  qL  mM  lN  OP-h7 
~~))Bj)k$,,33D9OOq(OOO--GzQr  tD  tI  tI  sJ  K"!* . 
 !!d!33	 r$   u>   Обработка связей задач и спринтовc           
      
   | j                   j                         D ]e  \  }}| j                  j                         r y|d   s)t        j
                  j                  |      }|j                  j                          | j                  j                  j                  d|j                   dt        |d                 |d   D ]  }t        j                  j                  |g d      }|r1|j                  d	      r| j                   d
|j                   }t        j                   j                  |g d      }|s!t        j!                  || j                        }d|_        d|j$                   d|j                   d|_        ||_        |j*                  r|j-                  |j.                          |j0                  dk(  st        |j2                        dk  s!|j                  j5                  |       >|j                  j5                  |       [| xj6                  dz  c_        | j                  j9                  d| d|j                   dd        |j-                  d       t;                h y)u^   
        Постобработка добавления задач в спринты
        Nr   r  u0   Добавляем задачи в спринт rP  r  rz  r  rt  z::comment-sprint:)r   r   r   r3  r   uB   Задача была в архивном спринте <a href="r4  r5  r!  rv  r   r{  u    в спринте zERR-0106rx  r   Tr  )r4   r   r   r|  rg   rx  r   r|  rO   r   r   r   r  rh   r.   r   rv   r   rC  r   r   r  r$  r,  r&  r8  rl   r   r   r%  )r6   rF  rG  rc  r}  r   rH  r  s           r    _process_sprint_tasksz)CmfPluginTrackerApi._process_sprint_tasks	  sS   
 +/*<*<*B*B*D '	 &M;((*y)++=+AJ##%OO""''*Z[e[j[jZkkmnqr}  G  sH  oI  nJ  )K  L'1 ~~))Bj)k"z2,0,<,<+==Nt{{m)\"("3"3"7"7~?^ #8 #`&&,&7&7~Z^ZiZi&7&jG,-)*33=??2CCUV`VeVeUffj(l)-"--#LLw~~3ELF11X=#djj/UVBV&..55d;"**11$7OOq(OOO--GzQdeoetetduv"!* . -8 OOO-O'	 r$   c                     dt         dt         f fd}g dg dg}dD ]  }t        t              |   }|j                  |      } j                  j
                  j                  d|j                   d	|        d
}d}|dkD  sg|j                  |g d||z  ||z  |z   g      }|dz  }||z  }|D ]  }		 t        |	d      rN ||	j                  j                        |	_        |	j                  r`|	j                          |	j                          n? ||	j                  j                        |	_
        |	j                  r|	j                  d       |	j                   D ]R  }
|
j"                  dk(  r ||
j                  j                        |
_
        |
j                  sA|
j                  d       T  |dkD  r4 y#   j                  j%                  d|	 d|        xj&                  dz  c_        Y FxY w)uS   
        Замена ссылок на задачи и документы
        r   rF   c           	      b   | s| S t        | d      }|j                  d      D ]  }|j                  j                  d      r d }|j                  j                  dd      j	                  	j
                  j                        rYt        j                  d|j                  d         x}rt        j                  j                  ddd	|j                  d
       dgdg      }|D ]'  }|j                  d   |j                  d
      k(  s%|} n |s	j                  j                  j!                  d|j                  d
       d       (t        j                  d|j                  d         x}rlt        j"                  j                  |j                  d
            }|sO	j                  j                  j!                  d|j                  d
       d       d|j                  j                  dd      v rt        j                  d|j                  d         }|s7	j                  j                  j!                  d|j                  d           5	j$                   d|j                  d
      dd   }t        j&                  j                  |dg      }|sQ	j                  j                  j!                  d| d       d|j                  j                  dd      v rt        j                  d|j                  d         }|s7	j                  j                  j!                  d|j                  d           #t        j                  j                  ddd	|j                  d
      dd   dgdg      }|D ]*  }|j                  d   |j                  d
      dd  k(  s(|} n |s?	j                  j                  j!                  d|j                  d
      dd   d       ̐||j)                  t        j*                  j-                  |              t/        |      S )Nr  ar  rC  r   z
[A-Z]+-\d+rO  r'  z%"key":"r   r  r  r~   u;   Не удалось найти задачу по коду "r   z[A-Z]+$)rs  u;   Не удалось найти проект по коду "z/wiki/z\/\d+u8   Не удалось найти ID документа в r   r   r  u9   Не удалось найти документ по ID "z/browse/z	\/\w+-\d+u2   Не удалось найти ID задачи в )r
   rQ  rR  r   r  r(   rT  r  searchrg   rh   r   r  rO  r   r   rS  rx   r.   CmfDocumentr  CmfPluginCsvcreate_tag_linkr   )
r   r  rH  r   r   objsr+  r   ext_coder6   s
            r    check_linksz=CmfPluginTrackerApi._process_cross_links.<locals>.check_linksR	  s_    }5D}}S) 6O99==199==,778H8HI!yy		&8IJJtJ%~~22$5w(4::VW=/Y[@\#]$5#6  3  8 $( &C"2259TZZ]J&) %&  # OO22::=xy}  zD  zD  EF  zG  yH  HI  <J  K$!#:syy7H!III$//33TZZPQ]3S" OO22::=xy}  zD  zD  EF  zG  yH  HI  <J  K$ vr!::YYx61BCF!..669qrur{r{  }C  sD  rE  8F  G  $ 0 01FLLOAB4G3HIF ,,00x0PC..669rsyrzz{7|} 399==#<<!yysyy7HIH#..669kloluluv|l}k~7  A !>>.. 17hx~~VWGXYZY[G\F]]_<`a 12 / 4D  $ "..u59J129NN"%C!" ..669tu}  vD  vD  EF  vG  HI  HJ  vK  uL  LM  8N  O ?$$V%8%8%H%H%MNm6On t9r$   )r   r>  N)r  r  T)r  rh   rx   ry  r   u)   Конвертируем ссылки в u=    на локальные задачи и документы: i  r   )r   zcomments.log_levelzcomments.textr  )r   r]   slicer   r  Tr!  r   uZ   Не удалось конвертировать перекрестные ссылки в zERR-0107r   N)r   varsrg   r  r   r   r   ri   r   r7  r   rE   r  r  r$  
do_publishcommentsr   r   r   )r6   r  r  	mode_namer   r  r  r  r  r   r  s   `          r    _process_cross_linksz(CmfPluginTrackerApi._process_cross_linksM	  s   
;	c ;	c ;	z ./NON $	-IL+E++W+-COO""'';E<N<N;O  PM  NQ  MR  STDA'zz9v)*T1t8d?(C " EQt -C-"35-8-HCN"~~ #
 # 0'2388>>'BCH"~~ #4 8'*|| =G&00A5 (+6w||7I7I+JGL&11 't <=- '$	-<-11xy|x}~&%. 2 
 1,s   6C%F=F==8G8u3   Обработка связей всех задачc                 N   | j                   j                  j                  dt        | j                                | j                  D ]  }| j                   j                         r yt        j                  j                  |      }| j                  |   D ]h  }t        j                  j                  |dg      }|s)| j                   j                  j                  d|        P||_
        |j                  d       j  | j                   j                  j                          d	d
dd}| j                   j                  j                  dt        | j                  j                                       | j                  j!                         D ]!  \  }}| j                   j                         r y	 | j"                   d|d   d    }|j                  |d   d         }	|	r!t        j$                  j                  |	      }
n t        j$                  j                  |      }
|
s)t        j$                  j                  dd|d   d   g      }
|
sTt        j%                  || j                   |d   d         }
|d   d   |
_        |d   d   |
_        |
j                  d       t        j                  j                  |d   d         }t        j                  j                  |d   d         }|r|r| j"                   d|d    }t        j*                  j                  |      }|s!t        j+                  || j                         }||_        ||_        |
|_        |j                  d       n=|r	|d   d   }n
|r|d   d   }| j                   j                  j                  d        $ | j                   j                  j                          y#  | xj2                  dz  c_        | j                   j5                  d|d    d|d    d|d    d d!"       Y xY w)#uD   
        Постобработка связей задач
        u   Подзадачи: Nr  parent_taskr  uq   Не удалось связать задачи, возможно задача не попала в импорт Tr  zsystem.finish:finishzsystem.duplicatezsystem.link)depends
duplicatesrelatesu   Связи: r   r   r   r;  r   r  r   )r   r   r   r-  r+  r   r   r   r3  r   u.   Не удалось создать связь z out=z in=zERR-0108CmfRelationOptionr   )r   r   r   r  r3   r|  rg   rh   r   rS  r  r$  r   r   r2   ri  r   r.   CmfRelationTypein_type_nameout_type_namer  in_linkout_linkrelation_typer   r   )r6   rC  r  child_ext_id
child_task	map_namesrelation_ext_idissue_relationr   relation_coder  in_link_taskout_link_task
rel_ext_idrelation_option	link_tasks                   r    _process_relationsz&CmfPluginTrackerApi._process_relations	  s&   
 	##&:3t}};M:N$OP!]] 	2M((* ..,,M,BK $m < 2#^^//|]O/\
!OO**22 L  MY  LZ  [\)4
&D12	2 	!!# .,$
	
 	##l3t7K7K7P7P7R3S2T$UV/3/C/C/I/I/K /	+O^((*+ ,,-Rv0Ft0L/MN )nV.DT.J K $*$:$:$>$>M$>$RM$*$:$:$>$>f$>$MM$$*$:$:$>$>vtUcdjUklpUqFr$>$sM$$*$:$:&UYUdUd@Nv@VW[@\ %; %^M1?1G	1RM.2@2H2RM/!&&4&8%~~119VW_9`1a & 2 2.:XYa:b 2 cM$($4$4#5Rt8L7M!NJ&,&>&>&B&B*&B&UO**0*B*B*aeapap*B*q.:O+/<O,4AO1#((T(:#$2>$B8$L	&$2=$A($K	OO**22 L  MV  LW  XYM/	b 	!!#1$))D^TZE[D\N>:;4}@]?^`0	 * s   4G>OAP$c                    d| _         || _        d| j                  _        d| j                  _        d| j                  _        | j                  j                          | j                  j                  j                  j                  | _        | j                  | j                  j                  d         | _
        t                | j                          | j                          | j                          | j                          | j                          | j!                          | j                          | j#                          | j                          | j%                          | j                          | j'                          | j)                          | j+                          | j-                          | j/                          d| j                  _        | j                  j                          t                | j1                         D ]  d   | j2                  D cg c]  }|d   	 c}vr&| j                  j4                  j7                  dd    d       t9        t;        fd	| j2                        d       }|sx|d
   D ].  }| j                  j4                  j7                  d|d    d       0 |d   D ].  }| j                  j4                  j7                  d|d    d       0  | j                  j4                  j7                  d| j                           | j                  j4                  j7                  d| j                  j                          | j                    S c c}w )Nr   u&   Импорт данных из TrackerrU   r   r   u+   Импортирована очередь 'r   'c                 >    t        | d         t        d         k(  S r  r  )r  r   s    r    rI  z4CmfPluginTrackerApi.process_import.<locals>.<lambda>4
  rR  r$   r  u,    --- импортирован проект 'r   u,    --- импортирована доска 'u#   Ошибок обнаружено: u-   Импортировано объектов: )r   r   r   r  r  r$  r;   r.   rb   rc   r/   r%  r  r  r&  r  r  r2  rP  rx  r  r  r~  r  r   r0   r   r   r  r   )r6   r   r   r  r   r   r   s         @r    process_importz"CmfPluginTrackerApi.process_import
  s   $G01-#$ ??1188DD001N1NO`1ab !!#  !!#!((*""$#& '') 		rET{8L8L"M3t9"MMOO""''*UV[\bVcUdde(fgf%OQUQeQefhlmJ)*5 sGOO**//2^_fgm_n^oop0qrs(2 rFOO**//2^_efl_m^nno0pqr		r 	##&I$//IZ$[\##&STXTcTcTyTySz${|??"" #Ns   M))T)r1  kanban)X__name__
__module____qualname__r   r'   ui_meta_skipr#  __annotations__r   r   r   r-   propertyr(   r)   r   rq   staticmethodr{   rj   r   r   r   rb   rk   r   r   r   r   r   r   r   r   r
  r  r  r  r&  r   r=  r   re  r  r  r  r  r  r  r  r  r%   r  r  r2  r9  rP  re  rj  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r$  rI  rL  r   rZ  r`  rd  rn  rx  r~  r  r  r  r  __classcell__)r7   s   @r    r'   r'       s   )==JJMllLO39o%% 	
 	
 %S$Y % %T$Z "  & # #J '3 '8DJ3G ' ' ( ( 0d4j 0T 0 0

DJ 
4 
ADc3h,@ 8      $L"'"E3 EKS KZP3 Pd & &3 02R 2Rd 2Rhf"P5d 5 5n74O_b8t@/Gb ( RSO] TO]b :;7 <74 IJB7 KB7H1@ KL47 M47l4l& 67* 8*X& @A6 B6p JK6 L6p W W( 45" 6" OP
 Q
 &4 & &+4 +, ^d ^ ^
 :;  < 6 YZc c  [:-^ :;@3 @ <@D 9 9 /D /: 67{C 8{Cz
+# 457  67 r!F :;; <;*it i4 iV :;8 <8t ef  g @ UV+  W+ Zg-R JKM$ LM$^8#r$   r'   )r  r  r7  rU  pathlibr   typingr   r   r   r   r   r	   bs4r
   cmf.appr   cmf.includemodules.tracker.fieldsr   r%   r'   r"   r$   r    <module>r     s@         > >    9"^(#0DD ^(#r$   