U
    ^
g                    @   s   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	m
Z
 d dlmZ d dlmZ d dlmZmZmZmZmZmZ d dlZd dlZd dlmZ d dlmZ d dlT d d	lmZ d d
lm Z  dd Z!G dd dej"Z"dS )    N)Path)Queue)Thread)CallableDictListOptionalTypeUnion)BeautifulSoupcmf_context)*)cmf_plugin_you_track)YouTrackClientc                    s    fdd}|S )Nc                    s    fdd}|S )Nc                    s   } j dkr"|d|d  7 }n0 j dkrR|d|d d  d|d d  d	7 }znz4| jjd
 d| dd
   | f||W W :S  tk
r   |  jd7  _| jd|  Y nX W 5 | jj  X d S )N_simple_dump    _process_issuer   
idReadable (id)z=====u   Ошибка )	__name__
cmf_importdpcommitloggerinfo	Exception
has_errors	log_error)objargskwargs_name)funcname 1./modules/youtrack/models/cmf_plugin_you_track.pywrapper   s    

&z3catch_exception.<locals>.decorator.<locals>.wrapperr(   )r&   r*   r'   )r&   r)   	decorator   s    z"catch_exception.<locals>.decoratorr(   )r'   r,   r(   r+   r)   catch_exception   s    r-   c                       s  e Zd ZU ejjd Zejjddg Zeed< e	e
ef ed<  fddZedd	 Zee	e
ef d
ddZede
e
e
e
dddZeee
dddZedd Zee
eee  dddZeedddZeedddZed d! Zed"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zed,d- Zed.d/ Z d0d1 Z!ee ed2d3d4Z"d5d6 Z#e
d7d8d9Z$d:d; Z%e
d<d=d>Z&e
d?d@dAZ'e
e
dBdCdDZ(dEdF Z)e*dGdHdIZ+ddJdKZ,dLdM Z-ddPdQZ.e/dRe
d<dSdTZ0dUdV Z1de
e
dWdXdYZ2deee
e
dZd[d\Z3d]d^ Z4d_d` Z5dadb Z6dcdd Z7ddfdgZ8e/dhdidj Z9e/dke
e
dldmdnZ:e/dodpdq Z;e/drdsdt Z<e/dudvdw Z=e/dxdydz Z>e/d{d|d} Z?d~d Z@dd ZAdd ZBdd ZCe/ddd ZDe/ddd ZEe/ddd ZFeedddZGe/ddd ZHe/ddd ZIdd ZJdd ZKe/ddd ZLe/ddd ZMdd ZNdd ZOdd ZP  ZQS )CmfPluginYouTrack)youtrackyoutrack_fieldsZtestget_all_projectsr    #_CmfPluginYouTrack__youtrack_fieldsc                    sB   t  j|| i | _i | _i | _g | _g | _d| _d| _d | _	d S )Nr   F)
super__init__Zepicsissue_relationssubtasksZboardsselected_projectsr    update_fieldsr2   )selfr#   r$   	__class__r(   r)   r4   9   s    zCmfPluginYouTrack.__init__c                 C   sJ   |  ddddddg t| jjj| jj | jjj| jj | jj	jdS )u7    Клиент для работы с YouTrack REST API pluginzplugin.ext_urlzplugin.ext_tokenzplugin.ext_loginzplugin.ext_passwordzplugin.verify_sslurltokenZusernameZpassword
verify_ssl)
load_fieldsr   r<   ext_urlvalue	ext_tokendecrypt	ext_loginext_passwordr@   )r9   r(   r(   r)   ytE   s    

zCmfPluginYouTrack.yt)returnc              	   C   s   | j r| j S | j d}| rN| jsNt|d}t|| _ W 5 Q R X n:| j	
 | _ t|d}tj| j |dd W 5 Q R X d| _| j S )Nfields.jsonr+w+FZensure_ascii)r2   r   get_download_pathjoinpathexistsr8   openjsonloadrH   Z
get_fieldsdump)r9   	file_pathfr(   r(   r)   r0   X   s    z!CmfPluginYouTrack.youtrack_fieldsNEtc/UTC%Y-%m-%dT%H:%M)datetimetzformatrI   c                 C   sN   | pt jt jj|} t|}tjt j| |	|}||}|S )N)
dtrY   nowtimezoneutcstrftimepytzZlocalizestrptimeZ
astimezone)rY   rZ   r[   Zdt_tzZdt_strr(   r(   r)   _datetime_in_user_tzi   s
    

z&CmfPluginYouTrack._datetime_in_user_tz)	timestamprI   c                 C   s   t j| d tj}| S )N  )r\   rY   Zfromtimestampra   r_   Z	isoformat)rd   Zdt_objr(   r(   r)   	_ts_to_dtu   s    zCmfPluginYouTrack._ts_to_dtc                 C   s^   |sdS |  |}t|tr |S |s(dS t|trH|dkrDt|S |S |drZ|d S |S )u`   
        Метод получает значение параметра объекта
        N)createdupdatedresolveddatestartZfinishcf_rC   )get
isinstanceboolintr.   rf   
startswith)r"   attrrC   r(   r(   r)   
_get_value{   s    




zCmfPluginYouTrack._get_value)
field_namerI   c                 C   s&   |sd S | j |gd}|r"|d S d S )N)Zfields_namer   )import_shop_fields)modelrt   resr(   r(   r)   _get_field_name   s    z!CmfPluginYouTrack._get_field_name)issuec                 c   s8   t | d d}t|D ]}|||dV  qd S )N
issue_pathattachments)	file_namerU   )r   rO   oslistdir)ry   Zattachments_pathr|   r(   r(   r)   _get_issue_attachments   s    z(CmfPluginYouTrack._get_issue_attachmentsc              	   c   s>   | d  d}t |d}|D ]}t|V  qW 5 Q R X d S )Nrz   z/comments.jsonrK   )rQ   rR   loads)ry   Zcomments_file_pathrV   rowr(   r(   r)   _get_issue_comments   s    z%CmfPluginYouTrack._get_issue_commentsc              
   C   s   ddl m} | dddd} || ddd	}z^d
dd| gddd|  dgddd| dgg}tjj|d}|stj| d}|jdd |W S  tk
r } zt	d|  d|  W 5 d }~X Y nX d S )Nr   )translitr   _# ruT)Zlanguage_codereversedORr'   ILIKEaliasz%"z"%filterr+   Zsave_importu+   Не удалось создать тег 'z': )
Ztransliterater   replacemodelsZCmfTagrm   saver   loggingwarning)tagr   r   _filtertag_objer(   r(   r)   _create_tag   s     zCmfPluginYouTrack._create_tagc               
   C   s   dt j t jjddt j t jjddt j t jjddt j t jjddt j t jjddt j t jjddt j	 t j	jdg} | S )	uW    Собственный магазин при выборе импорта из Tracker u   Поля контактов)Zcaptionfieldsiconu   Поля организацийu   Поля задачu   Поля заметокu   Поля проектовu"   Поля списков задачu   Поля групп)
r   	CmfPersonru   r   Z
CmfCompanyCmfTask
CmfCommentZ
CmfProduct
CmfProjectCmfPersonGroup)rw   r(   r(   r)   calc_models_settings   s<    %z&CmfPluginYouTrack.calc_models_settingsc                 C   s   t  d | _| jjd| jd  ddd tjrBttj| j| _| jjdtj dd t	 j
}| jjdt|d  d	dd tt|d
 | j| _| jstdd S )Nr   z
cpu_count=u3   , необходимо не менее 2х ядерT)	anonymouszconfig.IMPORT_PROCESS=zavailable_memory=i   @u-   Гб, по 2 Гигабайта на ядроl        u   Ресурсов системы недостаточно для импорта, обратитесь в техподдержку для дополнительной информации.)multiprocessing	cpu_countmax_processesr   logconfigZIMPORT_PROCESSminpsutilZvirtual_memoryZ	availablerp   r   )r9   Zavailable_memoryr(   r(   r)   _prepare_multiprocessing   s0    


z*CmfPluginYouTrack._prepare_multiprocessingc                 C   sL   t jj| jjdddgd}|jrHt|j|j d |_|j	dd t
  d S )Nimported_object_countjson_object_countprogressr   r   d   TZ	only_data)r   	CmfImportrm   r   r   r   rp   r   r   r   commit_with_event)r9   r   r(   r(   r)   _calc_progress  s    z CmfPluginYouTrack._calc_progressc                 C   s2   dddd}||kr|| S | j |i ddS )Nu   ИмяZEmailu(   Не работает/Уволенный)fullNameemailbannedr'   r   )Ztracker_fieldsrm   )r9   rr   mappingr(   r(   r)   _get_setting_title_from_attr   s    z.CmfPluginYouTrack._get_setting_title_from_attrc                 C   s   ddddddddddd	dd
dddddg}ddddddd}| j D ]6}|||d |d d fdd|d  d qL|S )uO    Сопоставление настроек для модели models.CmfTaskcoder   model_fieldrr   r'   summarytextwikifiedDescriptioncmf_created_atrg   cmf_modified_atrh   status_closed_atri   
logic_typestatusresponsiblefix_versionsaffected_versions
components))r	   enum)Statestate)ZAssigneeuser)zFix versionsversion)zAffected versionsr   )	SubsystemZ
ownedFieldZ	fieldTypeZ	valueTypeNrl   r   )r0   appendrm   )r9   Zissue_settingsZcustom_fields_mappingcfr(   r(   r)   _get_issue_import_settings*  s.    


z,CmfPluginYouTrack._get_issue_import_settingsc                  C   s    dddddddddg} | S )uQ    Сопоставление настроек для модели models.CmfPersonr'   r   r   r   does_not_workr   r(   )Zuser_settingsr(   r(   r)   _get_user_import_settingsJ  s
    z+CmfPluginYouTrack._get_user_import_settingsc                  C   s    dddddddddg} | S )uR    Сопоставление настроек для модели models.CmfCommentr   rg   r   
cmf_authorauthorr   textPreviewr(   )Zcomment_settingsr(   r(   r)   _get_comment_import_settingsT  s
    z.CmfPluginYouTrack._get_comment_import_settingsc                 C   s  |s|S |dkrHd| j  d|d  d}tjjddd| dgd}|S |dkr| j  d|d	 d  d|d  }tjjddd| dgd
gd}|S |dkr| |d S |dkr&g }|D ]b}	| j  d|	d  }
tjj|
d}|s|  jd7  _| jj	d|	d  ddd q|
| q|S |dkrg }t|trF|g}|D ]d}| j  d|d  }tjj|d}|s|  jd7  _| jj	d|d  ddd n
|
| qJ|S |S )Nr   ::r   ext_idLIKE%r   r   projectstatus_typer   r   r   )r   r   
::version:r   r   u!   Не найдена версия r'   zERR-0050CmfListobj_typer   u%   Не найден компонент CmfComponent)source_hashr   CmfLogicTyperm   	CmfStatus_get_personr   r    r   r!   r   rn   dictr   )r9   r"   rt   rC   logic_type_ext_idr   status_ext_idr   Zversionsr   version_ext_idZversion_objr   	componentcomponent_ext_idZcomponent_objr(   r(   r)   _normalize_value^  s`    "

z"CmfPluginYouTrack._normalize_value)settingsrI   c                 C   sR   i }|D ]D}|d sq|  ||d }| ||d d |}|||d d < q|S )uC    Преобразование настроек для модели r   rr   rt   )rs   r   )r9   r"   r   Znormalized_objsettingrC   r(   r(   r)   _normalize_obj  s    z CmfPluginYouTrack._normalize_objc           
         sd  t ttj ttj f }g  |_jdg ttg t	t f |td fdd}d }d }j
 d}| r D ]$}|d D ]} qq|r~ qq~dD ]} qq|sdd	 jjjd
dD }|r|d }|std|sdd	 jjjd
dD }	|	r|	d }|s*tdd_||jtj ||jtj  dg d  S )Nplugin.plugin.*)r"   settings_funcrv   rI   c                    sX   | }|D ]6} | |d |d< ||d |d< |j|d< q
 |j|d d S )Nrr   rC   r   r   )r'   r   )rs   rx   r   r   verbose_name)r"   r   rv   Zobj_settingsr   resultr9   r(   r)   _get_settings  s    z>CmfPluginYouTrack.tmplt_import_settings.<locals>._get_settingsprojectsr   usersc                 S   s   g | ]}|qS r(   r(   .0r"   r(   r(   r)   
<listcomp>  s     z;CmfPluginYouTrack.tmplt_import_settings.<locals>.<listcomp>r   )max_resultsr   uT   Не найдено ни одной задачи, импорт невозможен!c                 S   s   g | ]}|qS r(   r(   r   r(   r(   r)   r     s     ub   Не найдено ни одного пользователя, импорт невозможен!TselectedObjects)r'   rC   )r
   r	   r   r   r   r   rA   r   r   r   rN   rO   rP   _get_projectsget_project_tasks_simple_getrH   issuesget_allr   r   r8   r   r   r   )
r9   r   Z	TypeModelr   taskr   Zdump_dirr   tasksr   r(   r   r)   tmplt_import_settings  sB    &	z'CmfPluginYouTrack.tmplt_import_settings)cmf_import_idc             
   O   sN   g }zdd | j jD }W n. tk
rH } zt|  W 5 d }~X Y nX |S )Nc                 S   s   g | ]}|qS r(   r(   r   r(   r(   r)   r     s     z6CmfPluginYouTrack.get_all_projects.<locals>.<listcomp>)rH   r   r   gdebug)r9   r  r#   r$   rw   r   r(   r(   r)   r1     s    
z"CmfPluginYouTrack.get_all_projectsc                 C   s<   d}| j  d|d}| r8tdd t|D }|S )Nr   r   r  c                 s   s   | ]}| d  V  qdS ).dirtyz.metaN)endswith)r   entryr(   r(   r)   	<genexpr>  s     z9CmfPluginYouTrack._count_project_tasks.<locals>.<genexpr>)r   rN   rO   rP   sumr}   r~   )r9   
project_idcount	tasks_dirr(   r(   r)   _count_project_tasks  s
    z&CmfPluginYouTrack._count_project_tasksr+   c              	   c   sN   | j  | d}| rJt|d}|D ]}t|V  q.W 5 Q R X d S )N.jsonrK   )r   rN   rO   rP   rQ   rR   r   )r9   r'   rU   rV   r   r(   r(   r)   r     s    zCmfPluginYouTrack._simple_get)r  c              	   C   s<   | j  d|}t|dd}t|}W 5 Q R X |S )Nr   rJ   rK   )r   rN   rO   rQ   rR   rS   )r9   r  project_dirrV   project_fieldsr(   r(   r)   _get_project_fields  s    z%CmfPluginYouTrack._get_project_fields)r'   r  c                    sH   t  tr  | |}tt fdd|d }|sDtd  d|S )Nc                    s   | d d  kS )Nfieldr'   r(   )rV   r+   r(   r)   <lambda>      z6CmfPluginYouTrack._get_project_field.<locals>.<lambda>u0   В проекте не найдено поле '')rn   strr  nextr   
ValueError)r9   r'   r  r  Zproject_fieldr(   r+   r)   _get_project_field  s    

z$CmfPluginYouTrack._get_project_fieldc                 C   s   t jj}|| jj d| }|d k	r2t|S | dD ]^}|d|krV|  S |dd	 |	 krv|  S |d r<|d 	 |	 kr<|  S q<t
d| d S )N:user:r   r   loginr   r   uH   В дампе не найдены данные пользователя )APPREDIS_DBredisrm   r   r   pickler   r   lowerr   )r9   user_idredis_db	user_datar(   r(   r)   _get_user_data_from_dump  s    

z*CmfPluginYouTrack._get_user_data_from_dump)	dump_pathc                 C   s   z|  |W S  tk
r   z|d}| rt|d@}|D ]4}t|}||d kr@|  W  5 Q R  W  Y S q@W 5 Q R X | jj	|}|rt|d}|
tj|ddd  W 5 Q R X |W  Y S W n    | jjd|  Y nX Y nX d S )	N
users.jsonrr   a+FrM   
uR   Неудалось получить данные пользователя по ID )r)  r   rO   rP   rQ   rR   r   rH   r   rm   writedumpsr   r   r   )r9   r&  r*  Z
users_pathrV   r   r"   r(  r(   r(   r)   _get_user_data  s(    

&"z CmfPluginYouTrack._get_user_datac                 C   s   |dkrd S z|  |}W n,   | jjd| dddd tj Y S X | j|dd|d\}}|s| jjjd	rt	j
j| jjd	 d
}| jjd| d|  n.tj}|  jd7  _| jjd| dddd |S )Nunknownu5   Не найден пользователь user_id = u/    в дампе, указан системныйzERR-0045ZCmfUserr   Fr"   Zdefault_user_idr   u@   , указан пользователь по умолчанию r   u!   , указан системный)r)  r   r!   r  Zsystem_user_process_personjson_settingsrC   rm   r   r   r   r   r    )r9   r&  r"   r   personr   r(   r(   r)   r   6  s4    

zCmfPluginYouTrack._get_personc              
   c   sf   | j  d}| rbt|D ]>}|dr2q"t| d| dd}t	|V  W 5 Q R X q"d S )Nr   r	  /
/info.jsonrK   )
r   rN   rO   rP   r}   r~   r  rQ   rR   rS   )r9   r  r  rV   r(   r(   r)   r   V  s    
zCmfPluginYouTrack._get_projectsr   re   c              
   c   s   | j  d|d}| s:| j jd| d|  d S tt|D ]\\}}||k rZqH|	drfqH||| krv qt
| d| dd}t|V  W 5 Q R X qHd S )	Nr   r  u   Каталог u    отсутствует. Возможно он был удален или еще не создан. Необходимо повторно запустить импорт проекта r	  r8  r9  rK   )r   rN   rO   rP   r   r   	enumerater}   r~   r  rQ   rR   rS   )r9   r  rk   limitr  iZtask_idrV   r(   r(   r)   r   `  s    
z#CmfPluginYouTrack.get_project_tasksu   Дампc              	   C   s   | j  | d}| j  | d}| r>t| t|d:}| D ],}| j  jd7  _|t	j
|ddd  qPW 5 Q R X t|| | j jdd	 t  d S )
Nz.json.dirtyr  r-  r   FrM   r.  Tr   )r   rN   rO   rP   r}   removerQ   r   r/  rR   r0  shutilmover   r   )r9   Zapi_funcr'   Zfile_path_tmprU   rV   r   r(   r(   r)   r   s  s    

$zCmfPluginYouTrack._simple_dumpc              	   C   sh   | j d | jj|}t|d  d}| r>t| t	|d}t
j||dd W 5 Q R X d S )Nu"   Дамп полей проектаr  z/fields.jsonrL   FrM   )r   r   rH   r   Zcustom_fieldsr   rP   r}   r=  rQ   rR   rT   )r9   project_datar  Zfields_list_filenamerV   r(   r(   r)   _dump_fields  s    
zCmfPluginYouTrack._dump_fields)last_dump_datenew_dump_datec	           #      C   s  t dd | jjd| d||   |}	d}
z0|	jj|d ||||dD ]}zz| j rW W  W W 5 Q R  dS |d	 }|d
 }| d| d}| j	 d| }| jjd|  |
|}|
|d }| rt|| |jdd ||d< |
d}|
d}|jdd |d r| jjd| dt|d   |	j|D ]}z6|d }tj|}|d ds|d dr,|
|}|d }|drtj| jjj|}tjj||| j	d}|s tj||| j	| jd}||_||_||_d|_ |!  |j  nd| jj"d|d  d|d   |
|}t#|d(}t$%dd |d! }|&t'(| W 5 Q R X | j)d" W nR t*k
r } z2| jj+d#|d  d|d	  d$| d%d&d'd( W 5 d }~X Y nX q`| jjd)|  |
d*}| r(t,-| t#|d+b}|	j.|D ]N}| /|d, d	 | |&t0j1|dd-d.  | j j2d7  _2| j)d/ q@W 5 Q R X d0d1 |	j3|D |d2< d3d1 |	j4|D |d4< d5d1 |	j5|D |d6< |d7 D ]$}d8|d9 d: d	  }|||< q|
d;} |  r4t,-|  t#| d<Z}|	j6|D ]F}!| /|!d, d	 | | /|!d= d	 | |&t0j1|!dd-d.  qLW 5 Q R X t|| |
d>}"t7|8dd |d< t#|"d<}t0j9||dd- W 5 Q R X | j j2d7  _2| j)d? W n.   |
d7 }
| jj+d@| dAd&d'd( Y nX | jjdB|  W 5 | jj  X qRW n.   |
d7 }
| jj:dC|d  dD Y nX |;|
 |	<  W 5 Q R X d S )ENFZinit_views_and_dsu   Дамп задач с u    до r   	shortName)
start_dateend_dateskipr   r   r   r   r   r   r      Задача r
  Texist_okrz   r{   u1   Обработка вложений задачи : r'   r>   Zhttpz/api/files/)href
obj_ext_idr   )rM  rN  r   r   u   URL вложения 'u&   ' не содержит ссылку: zwb+z^data:.+;base64,r   Zbase64Content
attachment:   Не удалось обработать вложение z): zERR-0054r   rT   r   Z
error_typeu/   Дамп комментариев задачи zcomments.jsonr-  r   rM   r.  commentc                 S   s   g | ]}|qS r(   r(   )r   lr(   r(   r)   r     s     z5CmfPluginYouTrack._dump_task_part.<locals>.<listcomp>linksc                 S   s   g | ]}|qS r(   r(   )r   sr(   r(   r)   r   
  s     sprintsc                 S   s   g | ]}|qS r(   r(   )r   tr(   r(   r)   r     s     tagsZcustomFieldsrl   ZprojectCustomFieldr  zworklog.jsonrL   Zcreator	info.jsonr  u9   Не удалось создать дамп задачи zERR-0089u#   Создан дамп задачи uA   Не удалось получить задачи проекта u    с сервера)=r   r   r   r   r  Zfor_projectr   r   	is_cancelr   rO   rP   r>  r?  mkdirlenr{   r   CmfDocument_get_filenamerq   urllibparseurljoinrH   _connectionr>   CmfImportDownloadrm   pathr'   import_raw_json
downloadedr   r   rQ   resubr/  base64Z	b64decodeinc_statr   r!   r}   r=  Zcommentsr1  rR   r0  r   rT  rV  rX  Ztime_trackingr  r   rT   Z	exceptionputclose)#r9   r  r@  r/   tasks_that_are_donerH  r   rB  rC  rH   errorsry   Zissue_id	issue_keyZissue_key_idissue_ext_idZtask_dirZtask_dir_tmpZattachments_dirZattachments_dir_tmprO  r|   Zattach_file_pathZattachment_urldownload_jobrV   Zbase64_contentr   Zcomments_file_namerR  r   Zcf_keyZworklog_file_nameZworklogZ	info_pathr(   r(   r)   _dump_task_part  s
   






 	





&


z!CmfPluginYouTrack._dump_task_partr@  issues_countrB  rC  c                 C   s  t jj}d}t|d d}|jdd t }t|| j	 }	d}
d}g }||kr|
|	 |	 }||krn|}t
| jd|
 |||
|	 ||
|	  |||t| jjj| jj | jjj| jj | jjjddd	}|| |  | jjd
|  |
d7 }
qL|	d }| jjd|	 d |D ]8}|j|d | r$| jjddddd tdq$| jjd | s|| 7 }ql| jjd|  | j |d | !|d dD ]}| j" r|  S t|d d}| j# d}| j# d}|$ rt%&|| t'|d}t'|dj}t'|dT}|D ]H}||kr@|(| t)*|}|+| jj, d|d  t-.| q@W 5 Q R X W 5 Q R X W 5 Q R X |/  t%0|| q|S ) Nr   r  r  TrJ  Zdump_tasks_r=   )r  r@  rH  r   rB  rC  rm  r/   targetr'   r$   u   Форк _dump_task_part proc=r   <   u%   Таймаут дампа задач u    минут)timeoutu/   Возможно завис дамп задачzERR-0055r   rT   rQ  u"   Ошибка дампа задачuI   Параллельное скачивание задач оконченоu.   Ошибок скачивания задач: r   r;  rz   r+  zusers.json.newr,  r-  r  )1r!  r"  r#  r   rO   r[  r   mathZceildownload_threading_max_forksr   rr  r   r<   rB   rC   rD   rE   rF   rG   r@   r   rk   r   r   r   joinis_aliver!   TimeoutErroremptyrm   r   r  rZ  rN   rP   r>  copyrQ   r/  rR   r   setr   r$  r0  unlinkr?  )r9   r@  rt  rB  rC  r'  rn  r  rm  stepr<  r   processprocrx  ry   Zissue_users_pathZall_users_pathZall_users_path_newf1f2Zf3liner(  r(   r(   r)   _dump_tasks>  s    











&zCmfPluginYouTrack._dump_tasksc                 C   sr  | j d d d }|d s"td| j d}|jdd d	d
 |d D | _t| j}td| }| jD ]}|d }|d }|d }z| j	 rW  d S | j j
d7  _
| jjd| d| d| d ||}	|| d}
|	d}| jj }|r|d d d d nd}d }| rlt|d}t|}|d}W 5 Q R X |rl| ||}tjtjjd}| ||}|	 rt|	|
 ntj|
dd t ! }| jj"|d }t#|
|d< | j$|d d tj%d!< | j j&|7  _&| jj'dd" | jj()  d#tj%d!< t|d |	 t#|	|d< |d  d$}t|d%}tj*||d&d' W 5 Q R X t ! | }| jjd(| d| d)|d*d+ t+|d  d,}|r.| s| jj,d-| d.|d  d/| d0| d1	 d }n6| -|d s.| jj,d2| d.| d3| d1 d }t ! }| jj.j/|||d4}d5| }|s`|r|d67 }|r||d7| 7 }|r|d8| 7 }|d9| d7 }| j0| |  j1| j2||||d:7  _1t ! | }| jjd;| d<|d*d+ | j1s(||d< t|d%}tj*||d&d' W 5 Q R X W qn   |  j1d7  _1| jj3d=| d>d?d@dA Y qnX qn| j0dB d S )CNr   rC   r   	isCheckedu9   Не выбраны проекты для импорта!r   TrJ  c                 S   s$   g | ]}|d  r|d r|d  qS )r"   r  r(   )r   valr(   r(   r)   r     s    z4CmfPluginYouTrack._dump_projects.<locals>.<listcomp>childrenP   r   rE  r'   r   u   Дамп проекта rL  z (ID r   r
  rY  ZprofilesZgeneralr^   rW   r,  Z	dump_daterX   r  )r@  r   ZNO_CACHEr   1r9  rL   FrM   u%   Дамп данных проекта u    выполнен за .3fu    сек.z/tasksu$   В каталоге проекта 'z' (u5   ), отсутствует каталог задач (u@   ). Дата последнего успешного дампа (u   ) будет сброшена.u/   В каталоге задач проекта 'ud   ) отсутствуют задачи. Дата последнего успешного дампа ()rF  rG  u*   Дампим задачи проекта: u    (в периодu    с u    по u4    включительно, часовой пояс: rs  u$   Дамп задач проекта 'u   ' выполнен за u2   Не удалось получить проект zERR-0058r   rT   rQ  u0   Закончили дампить проекты)4r   r   r   rN   rO   r[  r7   r\  rp   rZ  r   r   r   rH   r   merP   rQ   rR   rS   rm   rc   r\   rY   r]   r^   r_   r`   r>  r?  r}   makedirstimeprocess_timer   r  rA  environr   r   r   r   rT   r   r   r  r  r  r   r    r  r!   )r9   rootZprojects_dirZcntr  r   r  Zproject_keyZproject_namer  Zproject_tmp_dirZ	data_filer(  Zuser_tzrB  rV   Zcurrent_dumpZlast_dump_date_utcZnew_dump_date_utcrC  t1r@  t2r  rt  info_msgr(   r(   r)   _dump_projects  s    









 


z CmfPluginYouTrack._dump_projectsc                 C   s   | j  }t|\}}}|| d }| j jd| d | j jd | j jjddr~| j jd | 	| j
jjd n| j jd	tjd
 | j jd | 	| j
jjd d| j _| j   t  | j jd |   dS )u^   
        Загружает все данные из API, кроме вложений
        r   u   Свободно места: r   u5   Скачивание данных через API ... 
load_usersTu#   Дамп пользователейr   9   Отключен импорт пользователей!levelu    Дамп типов ссылок	linktypes   u,   Дамп выбранных проектовN)r   rN   r>  
disk_usager   r   r6  rC   rm   r   rH   r   r  r   r   WARNINGr  r   r   r   r  )r9   Zdownload_pathtotalusedfreeZfree_percentr(   r(   r)   download_data<  s&    

zCmfPluginYouTrack.download_datac           	      C   sd  t ddN d}| }|dkr&qL| j r4qLtj|d }| jjd| d z| j	
|d |d  t|d  j}||d	 d
 kr| jjd| d| d|d	 d
  d tjj|d d}d|_|  | jjd|d   | jd W q tk
rH } z$|d7 }| jjd| ddd W 5 d }~X Y qX q|| W 5 Q R X d S )NFrD  r   DONErM  u   Попытка скачать  ... rd  re  sizeu   Возможно файл u.    не был скачан корректно: u    из u	    байтr   r4  Tu   Файл сохранен в rO  r   u,   Не удалось скачать файл zERR-0091rc  r   )r   rm   r   rZ  r_  r`  Zunquoter   r   rH   Zdownloadr   statst_sizer   r   rc  rf  r   rj  r   r!   rk  )	r9   download_queueerror_queuern  rq  rM  	file_sizeZdownload_job_objr   r(   r(   r)   _download_file_workerd  s@    
z'CmfPluginYouTrack._download_file_workerc                 C   s  | j jd t }t }d}| j dg dd| jgdddgg}tjj|d}|sf| j jd	 |S | j jd
|  g }t	| j
D ]H}t| jd| ||dd}|| |  | j jd| d qtjj|dddgdD ]0}	| j  r q||	j|	j|	j|	jd q|D ]}
|d q| sN|D ]}|  q>| j  r^d S | j jd | s| j  r|S || 7 }ql|S )Nu)   Cкачивание вложений ... r   zplugin.plugin.source_hashr   ==rf  Fr   u   Вложений нетu   Файлов: Z_download_file_worker_)r  r  ru  u/   Запуск задачи скачивания r  rM  rd  re  r   )r   rM  rd  re  r  u8   Скачивание вложений завершено)r   r   r   r   rA   r   r   rc  r  ranger{  r   r  r   rk   ZslistrZ  rk  r   rM  rd  re  r  r|  rm   )r9   r  r  rw   r   Zcount_download_filesZprocsr<  r  rq  r   r(   r(   r)   download_files  sd    






z CmfPluginYouTrack.download_filesTc              	   C   s  |rd| dnd}|  || jtjj d }d| j d|d  d}|d}|s| jj	d|d	  d
 t
jjjttj d }	t|d	 d |	  dtj }||d< |d ddd}
t|
dkrtt|
d t|
d n
t|
d }ttjjjtjjj}||krZt|
dkr.|
d nd|d< t|
dkrL|
d n|
d |d< n2|  jd7  _| jjd|d  d| dddd ddg}tjjd	d|d g|d}|stjjddd| dg|d}|stjjdd|d g|d}t|dkr>| jjd |d  d!t| d| d"dd |  jd7  _g }|s| jj	d#|d  d|  dd$|d g}tjj||d}|st|
dkrdd$|
d g}nHt|
dkrd%dd$|
d gdd$|
d ggdd$|
d gdd$|
d ggg}tjj||d}t|dkrN|  jd7  _| jjd&|d  d'|d  d(t| d| d"dd |r^|d }n*| jd)|d  d'|d  d*| tj d+}|s,|r$d,}d}|d }tjjd	d| g|dr| jd-| d.tj  |d d\}}| d/| d| }|d7 }qtj||| jd,d0}nd |fS |r| jj!d1|  |j"rj|D ]}t#||||  qR|j$r||j$kr|j$ | |_$n||_$tj%& }tj%' }|j()| |j()| d,|_*|j+r|j,d,d2 ||fS )3N(r   r   r   r   r   r   u   У пользователя r   u    не указан emailr   @r'   .r   r   
first_name	last_nameu?   Часть полного имени пользователя 'u   ' длиннее uM    символов. Имя и фамилия не были заполнены.zERR-0110r   r   r   rg_member_ofr   r   r   r   r   u+   Пользователей с почтой z > zERR-0037uH   Не удалось найти пользователя с почтой r  r   u+   Пользователей с именем r   z) > uM   Не нашли пользователя среди существующих z) FTuQ   Обнаружена учетная запись с дублирующим email u   , добавляем цифру+)r   r   r   import_originalu0   Импортируем пользователя r   )-r   r   r   r   r   r   rm   r   r   r   Zcmfr   ZCmfEmailZ
max_lengthr\  r   Z
ORG_DOMAINcmfutilZtranslit_stripr   splitmaxr   r  r  r    r!   listr   r   INFOr%  r  r   r  setattrr   r   youtrack_group
user_groupr  r   Z
user_local
is_changedr   )r9   r   Zcreateupdater"   Zobj_msgZ	user_dictZperson_ext_idr   Zmax_lenr'   Zcurrent_length_nameZmax_length_namer   r7  Zpersonsr   
is_creatednr   Zprefix_emaildomainkeyr  r  r(   r(   r)   r5    s    
"2
$&



z!CmfPluginYouTrack._process_personu-   Обработка пользователейc              	   C   s  | j jjdds(| j jdtjd d S t }| dD ]}zj|d rJW q8| j 	 r\W  d S | 
|\}}| j  jd7  _|jr|js|jds|r||jj W q8   |  jd7  _| j jd	| d
dd Y q8X q8|r| j jjddrttjjt|gd d S )Nr  Tr  r  r   Zguestr   z.evateam.ruu@   Не удалось загрузить пользователя zERR-0038r   r   Zsend_invites)r#   )r   r6  rC   rm   r   r   r  r  r   rZ  r5  r   r   r   r  addr    r!   Zschedule_deferred_jobr   r   Zregister_personsr  )r9   Znew_user_emailsr   r7  r  r(   r(   r)   _process_users\  sB    

z CmfPluginYouTrack._process_usersuB   Обработка упоминаний пользователей)r   rI   c                 C   s   |sd S t |d}|dd D ]}zV| |jd }|jd |jd< |j|jd< d|jd< |jj|jd	< |jj|jd
< W q  tk
r } z0|  j	d7  _	| j
jd| d| ddd W 5 d }~X Y q X q ddd |jjD S )NZlxmlc                 S   s
   |  dS )Ndata-user-id)Zhas_attr)r   r(   r(   r)   r    r  z5CmfPluginYouTrack._process_mentions.<locals>.<lambda>r  rM  Z	href_origTZcmf_convertedzdata-linked-resource-idzdata-usernamer   uZ   Не удалось преобразовать ссылку на пользователя rL  zERR-0098r   r   r   c                 S   s   g | ]}t |qS r(   )r  )r   cr(   r(   r)   r     s     z7CmfPluginYouTrack._process_mentions.<locals>.<listcomp>)r   Zfind_allr   ZattrsrM  r   rC   r   r   r    r   r!   r|  Zbodyr  )r9   	issue_objr   Zdoc_soupr   r7  r   r(   r(   r)   _process_mentions  s&    

z#CmfPluginYouTrack._process_mentionsu8   Обработка комментариев задачиc           	      C   sL  d|d  d|d  d|d  d}d}d}|  |D ]}| j d	|d  }tjj|d
}|r|js| jjd| d|d q6|stj|d|d}| |d d |_	|j	|_
|j	|_| |d |_|d r| |d |_n|j|_|d |_| ||jj|_||_|jdd |d7 }| jdd q6| jd| d|  d S )Nu$   Комментарий задачи r   r   r   ): 'r   r  r   r   r   uN   Комментарий уже существует, и был изменен: zERR-0046r3  T)parentr  r   r   rg   rh   r   r   r   rR  	processedu   Обработано u:    комментариев, из них приватных )r   r   r   r   rm   r  r   r!   r   r   	cmf_ownercmf_modified_byrf   r   r   r   r  rC   re  r   rj  r   )	r9   r  
issue_datar"   Zcomment_countZcomment_private_countZcomment_datar   rR  r(   r(   r)   _process_issue_comments  sF    $

z)CmfPluginYouTrack._process_issue_commentsu*   Обработка тегов задачиc                 C   s   zT| dg |d D ]}| |d }|j| q|jrR|jdd |j  W n>   | jj	d|d  d|d  d|d	  d
ddd Y nX d S )NrX  r'   Tr   u1   Не удалось привязать теги 'u   ' к задаче r   r   r   r   zERR-0102r   r   )
rA   r   rX  r   r  r   r   r   r   r!   )r9   r  r  r   r   r(   r(   r)   _process_issue_tags  s    "z%CmfPluginYouTrack._process_issue_tagsu0   Обработка вложений задачиc                 C   s  ddl m} d|d  d|d  d|d  d	}d}| |D ]>}z&z|d D ]}|d |d krR qlqRtj|d }tjj	||d}	|	stj| j|d|d}	|	j
r*|r| j|d d |d|	_| |d |	_|	jdd |	  t|d |	j tjjj }
|
|	j}|  |	j  W n<   |d7 }| jjd|d  d|d | jj  Y nX W 5 | jd
d X q>|S )Nr   )RDisku   Вложения задачи r   r   r   r  r   r  rO  r  r{   r'   r|   )r'   r  T)r   r  r  r'   r   r3  rg   r   rU   r   rP  zERR-0035)Zrdisk.rdiskr  r   r   rj  r   r]  r^  ZCmfAttachmentrm   r  r   r   rf   r   r   Z
upload_dirr>  r  Zfull_path_fileZCmfRFiler   Zdata_driverZget_rdZ	get_rfileZ
_file_nameZmake_previewr   r!   Zrollback)r9   r  r  r  r"   rn  Zattachment_dataZattach_dataZattach_namerO  ZrdiskZrfiler(   r(   r)   _process_attachments  sL    $z&CmfPluginYouTrack._process_attachmentsu8   Обработка наблюдателей задачиc                 C   s   d|d  d|d  d|d  d}|d d	 D ]X}| j |d
 d |d}|s\td| ||jks0||jks0||jkr|q0|j| q0t  d S )Nu$   Наблюдатели задачи r   r   r   r  r   r  watchersissueWatchersr   r3  uI   _process_watchers: Не найден наблюдатель задачи )r   CmfErrorr   r   r  Z
spectatorsr   r   )r9   r  r  r"   Zwatcherr7  r(   r(   r)   _process_watchers  s    $z#CmfPluginYouTrack._process_watchersu   Обработка задачиc                 C   s  d}| j  d|d d  }tjjddd| dgd}|sTtd	|d d
  dd|d  d|d  d}|d }| j  d|d  }| || jtjj d }| j	|d< d|d< ||d< |d |d< ||d< |d r|d j
|d< |drn| j|d d |d}	|	|d< |	|d< |	sn|  jd7  _| jjd|d  dd d! | jjd|d d  tjddd" |d#r| j|d# d |d|d$< |d$ s|  jd7  _| jjd%|d#  dd d! | jjd%|d# d  tjddd" |d&g }
|d'g }|d(g }| jjd)|  tjj|ddd*dgd+}|sZtj|d, | jd|d-}t|d.rn|jsv|jr| D ]\}}t||| q~|jr|jdd/ || ||7 }| ||jj|_|d0 r|  || |d1 d2 r| !|| |
|_"||_#||_$|d3 r$| %|| |d4 |_&||_'|jrH|jdd/ t(  | jj)j)j  d5|d  }tj*j|d6}|stj*|| jd7}||_+t,j-.| j/j0j1d8|d  }d9| d:| d;|_d<|_2|jdd/ |j34  | j5d=d> |S )?u}    Общая логика обработки которая потом разделяется на задачи и эпики r   r   r   r   r   r   r   r   u2   Не найден проекта с ключем 'rE  r  rI  r   : 'r   r   activityTZapprovedr  r   r   r   Zcache_status_typeZreporterr3  r   r  r   u*   Не найден автор задачи zERR-0049r   r   )r   exc_infoZupdaterr  uG   Не найден последний обновивший задачу r   r   r   u0   Попытка создать задачу из r   r   r   r'   )r'   r   r  r   r  r   ZcommentsCountr  r  rX  r   z
::comment:r   r   r   zissue/u@   Задача импортирована из YouTrack: <a href="z" target="_blank">z</a>   r  r  )6r   r   r   rm   r  r   r   r   r   Zdefault_activityr   r   r    r   r!   r   r   ZERRORpopr   r   hasattrr  is_newitemsr  r  r   r  r  r   rC   r  r  r   r   r   r  r   re  r   r<   r   r  r_  r`  ra  rH   rb  r>   Z	log_levelr   r   rj  )r9   ry   rn  project_ext_idr   r"   ro  rp  Znormalized_issueZissue_reporterr   r   r   r  rt   rC   Zcomment_ext_idrR  rM  r(   r(   r)   r   &  s    



	
	


z CmfPluginYouTrack._process_issuec              	   C   sV   d}t dd4 | j rq>| }|dkr.q>|| |7 }qW 5 Q R X || d S )Nr   FrD  r  )r   r   rZ  rm   r   rk  )r9   issue_queueissue_queue_errorsrn  ry   r(   r(   r)   _process_issue_thread  s    
z'CmfPluginYouTrack._process_issue_threadc              
   C   s  ddl m} d}t  t  tjj|ddgd}|| _| jj	j	j
| _
| | jjd | _| jjd| j  t }t }	g }
t }t| jD ]F}t| jd| ||	d	d
}|
| |  | jjd|  qd}| |||D ](}| j r q || |d7 }q|
D ]}|d q$| jjd |
D ]}|  qHt | }| jjd d|| dd d}|	 s||	 7 }q| jjd|  ||7 }W 5 Q R X W 5 Q R X |S )Nr   r   r   r   r   import_settingsuD   Обработка задач в несколько потоков: Z_process_issue_thread_)r  r  ru  u=   Запущен параллельный обработчик r   r  u3   Ожидание обработки задач ... z-----u&    скорость обработки: r  u    задач в секундуu@   Обработка задач завершена, ошибок: )cmf.appr   r  Zdisable_aclZdisable_notifyr   r   rm   r   r<   r   _normalize_settingsr6  r   r   r   Zthreading_max_forksr   r  	monotonicr  r   r  r   rk   r   rZ  rk  r|  r  )r9   r  r  rH  r;  r   rn  r   r  r  Zissue_processr  r<  r  Zissue_country   r  r    r(   r(   r)   process_issue_fork  s^    



z$CmfPluginYouTrack.process_issue_forkc                 C   s   dd l }|jdddd| jjj d| jj d|d  d	| d
tj dgddtddtddd}| jd|j	  | j
  |S )Nr   /usr/bin/python3	manage.pyshellz*plugin = models.CmfPluginYouTrack.get(id='z(');retcode = plugin.process_issue_fork('', 'r   ', , );T"/var/log/eva-import-subprocess.logr-  &/var/log/eva-import-subprocess.err.logZ	close_fdsZstart_new_sessionstdoutstderru   Запущен )
subprocessPopenr   r<   r   r   IMPORT_OBJ_CNTrQ   r   pid
log_detail)r9   r@  rH  r  r  r(   r(   r)   _execute_task  s      2
zCmfPluginYouTrack._execute_taskc           	      C   s  | j jd| j  d}| |d }g }t| jD ]0}| ||}|tj7 }|	| ||kr6 qhq6||k rt
d t|D ]L}| }|d k	r|  j|7  _|| | ||}|tj7 }|	| qqht|D ]"}|  |jr|  j|j7  _q| j jd d S )NuH   Обработка задач в несколько процессов: r   r   r   u0   Обработка задач завершена)r   r   r   r   r  r  r   r   r  r   r  sleepr  pollr    r=  communicate
returncode)	r9   r@  rH  Z
task_countr  r   r  r  new_procr(   r(   r)   _process_tasks1  s6    





z CmfPluginYouTrack._process_tasksu   Обработка версийc           
   
   C   s  t jj|d dgd}t jjd|d}t jjd|d}| |d }|D ]}|d d	kr\qH|d
 D ]}zP| j rW   d S | jjd|d  d | j	 d|d  }t j
j|d}	|	st j
|| jdd}	t jjdd|	_||	_|d |	_|dd|	_|dr| |d |	_|jj|	_|	jrD|	jrD|	jdd |d rV||	_n||	_|	jr|d sx|d r|	d n
|	d |	jr|	jr|	jdd | j jd7  _W qd   |  jd7  _| jjd|d  dddd  Y qdX qdqHd S )!Nr   z"scheme_wf.default_release_workflowr  release)sys_typetree_parentarchiver   z$typeZVersionProjectCustomFieldvaluesu!   Обработка версии 'r'   r  r   r   Tr   r   r  zlist.release:defaultr   descriptionr   ZreleaseDater   ZarchivedZreleasedCLOSEDZOPENr   u,   Ошибка загрузки версии 'ERR-0053r   r   )r   r   rm   	CmfFolderr  r   rZ  r   r   r   r   r   r   r  r'   r   rf   Zrelease_date	scheme_wfZdefault_release_workflowworkflowr  r  r   r	  Zset_default_statusr   r    r!   )
r9   r@  project_objZrelease_folderZarchive_folderr  r  r   r   Zversion_listr(   r(   r)   _process_versionsV  sr    






z#CmfPluginYouTrack._process_versionsu)   Обработка компонентовc              
   C   s$  t jj|d ddgd}t jj|dddgd}z| d	|d
 }W n: tk
r|   | jjd|d  d|d  d Y d S X |d D ]}| j	 r d S | jj
d|d  d z.|jsd|_|  | j d|d
  }t jj|ddddddgd}|st j|| jdd}||_|d |_||_|dr\| j|d d
 d|d  d|_nd |_d |_|jr|jr|jdd |dd r|js|  d|j_|jjr|dd |j_|jjjdd | j jd!7  _W q   |  jd!7  _| jjd"|d  d#d$d% Y qX qd S )&Nr   r   r  r  r   Ttree_node_is_branch)r	  r  Zinclude_systemr   )r   Z
Componentsr      Проект rE  rL  r'   uC    не содержит компонентов (подсистем).r  u)   Обработка компонента 'r  r   descr_documentdefault_ownerdefault_responsibler  r	  r  r  owneru   Компонент r3  r   r  r   r   u5   Ошибка обработки компонента r  r   r   )r   r   rm   r  r  r   r   r   r   rZ  r   r  r   r   r   r  r'   r	  r   r  r  r  r  r  Zcreate_descr_documentZ
text_draftrC   r   r    r!   )r9   r@  r  Zcomponents_folderZcomponents_fieldr   r   Zcomponents_listr(   r(   r)   _process_components  s    




z%CmfPluginYouTrack._process_componentsu   Обработка теговc                 C   sl   t  }| j|d | |d dD ]0}| j r6 d S |d D ]}||d  q>q"|D ]}| | qXd S )Nr   ry  rX  r'   )r  r   r  r   rZ  r  r   )r9   r@  rX  ry   r   r(   r(   r)   _process_tags  s    

zCmfPluginYouTrack._process_tags)project_structr@  c                 C   s  | j jd|d  d|d   tjjdd|d gddgd}|r|jj|d ksh|jr|d |jkr|d  d	|d  d
|d< | j j	d|j
 d|d   n|js|d |_|  d|d< tjjddd|d  dg| d}|stj| j |d |d dd}|jrR|D ]$}|dkr,qt||||  q|drRd|_|j}|  |rtjj|dD ]}|jdd qt| | | | | | | | | j  rd S t  | j  jd7  _|   |S )Nu"   Обработка проекта rE  rL  r'   r  r   r   r   r   r   u   Проект с именем u8    уже существует! Переименуем в TZtask_allow_multiple_sprintsr   r   )r   r   r'   r  Z
restrictedZprivate)r  TEXKOM_db_deleter   )r   r   r   r   r   rm   r   r   r   r   r'   r   keysr  r  Zperm_policyr  r   r  deleter  r  r  r  rZ  r   r   r   )r9   r  r@  r  r  r  r  r(   r(   r)   _process_project  sr    





z"CmfPluginYouTrack._process_projectu#   Обработка статусовc              
   C   s<  z|  d|d }W n: tk
rN   | jjd|d  d|d  d Y d S X |d D ]}| j rl d S | jjd	|d  d
 | j d|d  d|d  }tj	j
|d}|stj	|d p|d || jd}|d rd}n&|d r| |d }n| |d }||_|jdd | jj  | j jd7  _qXd S )Nr   r   r  rE  rL  r'   -    не имеет статусов задач.r  u#   Обработка статуса 'r  r   r   localizedName)r'   r   r   Z
isResolvedr  Tr   r   )r  r   r   r   r   rZ  r   r   r   CmfStatusCoderm   Zcalc_status_typer   r   r   r   r   )r9   r@  state_fieldr   Zstate_ext_idstatus_coder   r(   r(   r)   _process_statuses\  s>    
z#CmfPluginYouTrack._process_statusesu2   Обработка логических типовc                 C   s@  dddddddddddddddddddddddddd	ddd	ddd	dd
ddd
ddd
ddd}z|  d|d }W n: tk
r   | jjd|d  d|d  d Y dS X |d D ]j}| jjd|d  d | j r  dS | j d|d  }tj	j
ddd| dgd}|r8q|
|d }|sf|
drf|
|d }|rtj	j
dd |d gdgd!}|jrd| |j |_nd| d|_|jd"d# qd$|d  d}dd%|d  g}	|
dr|d&|d  d7 }d'|	dd%|d  gg}	| jj| tj	j
|	dgd!}|rx|jr\d| |j |_nd| d|_|jd"d# q| jjd(|d  d) d}
tj	j
dd |
gd}tj	|d p|d |
d*d+|d,d| d| jd-}|d. d/ d0kr |d. d/ |_|
dr|d g|_|jd"d1 t  | j jd27  _qdS )3u#    Маппинг Type в logic_type    Подзадачаztask.sub:default)r'   r   Z	UserStoryztask.userstory:defaultz
Task Agileztask.agile:defaultBugztask.bug:defaultEpicztask.epic:default)r*  ZSubtaskzSub-tasku   ИсторияZStoryu   Задачаu   ЗаданиеZTasku   Ошибкаu   Багr+  u   Эпикu   Вехаr,  r	   r   r  rE  rL  r'   u<    не имеет логических типов задач.Nr  u*   Обработка типа задачи 'r  r   r   r   z%::z::%r   r%  r   r  r   Tr   u   Ищем по имени 'r   u	    или 'r   u   Тип 'u.   ' не найден и будет созданr  r   r   )r'   r   templatecmf_model_namer   r   color
background#fffr   r   )r  r   r   r   r   r   rZ  r   r   r   rm   r   r   stripZui_colorr   r   r   )r9   r@  Z	name2codeZ
type_fieldZ
issue_typer   r   Zlogic_type_dictr  Zfilter_Ztemplate_codeZlogic_type_templater(   r(   r)   _process_issue_types  s    

z&CmfPluginYouTrack._process_issue_typesc           	      C   sP  | j  d|d  d|d  }tjj|d}|j d|d  }tjjdd|gd}|s~tjjdd|gdd|gddd ggd}|sd	d|d	 g}|d
 rdd	d|d
 gd	d|d	 gg}tjj|dd|gddd ggd}|stj||| jd}|d
 p|d	 |_|d p
d|_|d d dkr.|d d |_	||_
d|_||_|jdd |S )Nr   r   r   r   r  r   r(  r  r'   r%  r   )r(  r  r   r  r   r/  r0  r1  Tr   )r   r   r&  rm   r   r   r   r'   r   r/  r(  Zallow_empty_transitionr   )	r9   Zstatus_datar  r@  r   r(  r   r   Zfilter_namer(   r(   r)   _create_status  sJ    z CmfPluginYouTrack._create_statusc              
   C   s  | j  d|d  }tjj|dgd}|sbtjjdd}tj|d  d||| jd	}|jd
d z0| d|d }|d D ]}| ||| q|W n: tk
r   | jj	
d|d  d|d  d Y d S X tjjdd|gddd ggdgd}|D ]>}tjjdd|jgdd|gddd ggds$q|jd
d
d q| j  d|d  }	tjj|	d}
|
stjjdd}tj|d  d||	| jd	}
||
_||
_||
_|
jd
d tjj|
dD ]}|jd
d qd||
| jd }tjf |}|jd
d |
S )!Nr   r   r   r  zdefault.system:defaultr  rE  u3   : Simple бизнес-процесс проекта)r'   r-  r   r   Tr   r   r  r  rL  r'   r$  r  r  r   r   !=r   )r   forcez
::SIMPLE::r   zsoftdev:defaultu@   : Simple-схема бизнес-процесса проекта)r  r  r   )r.  Ztarget_workflowr  r   )r   r   ZCmfWorkflowrm   r   r   r  r4  r   r   r   r   r  r   r"  ZCmfSchemeWfZdefault_epic_workflowZdefault_task_workflowZdefault_subtask_workflowZCmfSchemeWfRule)r9   r@  Zworkflow_ext_idr  Zworkflow_templater'  r   Zworkflow_statusesr   Zscheme_ext_idZschemeZscheme_templateZruleZ	rule_dictr(   r(   r)   _create_scheme_wf_for_project'	  s|    
z/CmfPluginYouTrack._create_scheme_wf_for_projectu#   Обработка проектовc           	      C   sr  t jjddjj}|  D ]P}t|d |d< z| j rJt	  W  d S |d dd | j
D krfW q| j d|d  }t jjdd}| | | | | |}|di }|r| |d }n
d	d
d}||d< d|d |d |jj|||d ||tj|ddd
}| || W q tk
rj   t	  |  jd7  _| jjd|d  d|d  ddd Y qX qd S )NZsoftdevr  r   c                 S   s   g | ]}|d  qS r4  r(   r   r(   r(   r)   r   	  s     z7CmfPluginYouTrack._process_projects.<locals>.<listcomp>r   zproject.agile:defaultZleaderz#default_import_youtrack@evateam.comZdefault_import_youtrack)r   r'   r   r   r'   r  rE  FrM   )
Zproject_typer'   r   r   r  r  Ztask_code_prefixr  r   re  r   u<   Не удалось импортировать проект rL  zERR-0104r   r   )r   ZCmfActivityrm   r   rC   r   r  r   rZ  r   r7   r   r   r)  r3  r7  r   rR   r0  r#  r   r    r!   )	r9   r  r@  r  r   r  Zproject_leaderr  r  r(   r(   r)   _process_projectsu	  sR    



z#CmfPluginYouTrack._process_projectsu*   Обработка связей задачc                 C   s  |   D ]}| j|d | |d dD ]^}| j rB  dS |d }| j d|d  }|d d d }|d d }|r| j d|d	 d  }| j|g }|| || j|< |d
 D ]}	|	d d }
|	d sq|
|krq|	d }|	d }| j d|
 }|dkrt|	d D ]X}| d|d  d|d  }|||d d| j d|d  |d dd| j	|< qq|dkr|	d D ]X}| d|d  d|d  }|| j d|d  |d d||d dd| j	|< qq|dkr|	d D ]}| d|d  d|d  }|| j	kr"q| d|d  d|d  }|| j	krNq|||d d| j d|d  |d dd| j	|< qqq*q| j
dt| j  | jD ]z}| j r dS tjj|d}| j| D ]H}tjj|dgd}|s| jjd|  q||_|jdd qڐq| jj  | jjdt| j	   dddd}| j	 D ]2\}}| j r dS z| j d|d d  }|d d  }||}|rtjj|d!}ntjj|d}|stjjd d"|gd#}|stj||| jdd$}|jrH|d d% |_|d d& |_|d |_|jdd tjj|d' d( d}|s| jjd)|d' d*  d+|d' d(  d, W qhtjj|d- d( d}|s| jjd.|d- d*  d+|d- d(  d, W qhtjj|d}|stj|| jd/}||_||_||_|jdd W np   |  j d07  _ | jj!d1|d  d2|d' d*  d+|d' d(  d3|d- d*  d+|d- d(  d4d5d6d7 Y nX qh| jj  dS )8u4    Постобработка связей задач r   ry  Nr   r   r  ZlinkTyper  r   rT  Z
issuesSize	directionZINWARD:)r   r  )typeoutwardIssueinwardIssueZOUTWARDZBOTHu   Подзадачи: r   parent_taskr  uq   Не удалось связать задачи, возможно задача не попала в импорт Tr   u   Связи задач: zsystem.finish:finishzsystem.duplicatezsystem.link)ZDependZ	DuplicateZRelatesr;  r'   r  r  r   )r'   r   r   r  ZtargetToSourceZsourceToTargetr<  r   u=   Не удалось найти входящую задачу r  r   u   ). Возможно задача не попала в импорт или находится в проекте, который еще не импортирован.r=  u?   Не удалось найти исходящую задачу r  r   u.   Не удалось создать связь z. in_link: z), out_link: r   zERR-0052r   r   )"r   r   r  r   rZ  r   r6   rm   r   r5   r   r\  r   r   r   r   r>  r   r   r   r   r!  r  ZCmfRelationTyper  Zin_type_nameZout_type_namere  ZCmfRelationOptionin_linkout_linkrelation_typer    r!   )r9   r   ry   ro  rp  Zsubtask_linktype_idZissue_parentZparent_ext_idZ	sub_tasksZ
issue_linkZlinktype_idZlink_directionZ	link_typeZlinktype_ext_idZinward_issueZrelation_ext_idZoutward_issueZ
both_issuer>  Zchild_ext_idZ
child_taskZ	map_namesZissue_relationZrelation_type_ext_idZlink_type_nameZrelation_coderA  r?  r@  Zrelation_optionr(   r(   r)   _process_relations	  s   







  Fz$CmfPluginYouTrack._process_relationsc                 C   st   dd l }|jdddd| jj d| jjj d| d| d	tj d
gddt	ddt	ddd}| j
d|j  |S )Nr   r  r  r  z&cmf_import = models.CmfImport.get(id='z#');cmf_import.process_cross_links('r  r  r  r  Tr  r-  r  r  u   Запустили )r  r  r   r   rH   rb  r>   r   r  rQ   r   r  )r9   
model_namedoner  r  r(   r(   r)   _execute_cross_linksk
  s      .z&CmfPluginYouTrack._execute_cross_linksc                 C   s`  dddgdddgg}dD ]2}| j jd| d	| j  d
}tt| }|j|d}|s\qg }t| jD ]0}| ||}|t	j
7 }|| ||krj qqj| j   ||k rtd t|D ]V}| }	|	dk	r|  j|	7  _|| | ||}
|t	j
7 }||
 | j   qqt|D ]&}|  |jr$|  j|j7  _q$q| j jd dS )uE    Заменим ссылки на задачи и документы r   r5  Nr  r  T)r]  r   r   r  u    Обработка ссылок u+    в несколько процессов: r   r   r   u2   Обработка ссылок завершена)r   r   r   r   varsr   r  r  rE  r   r  r   r  r  r  r  r  r    r=  r  r  )r9   r   rC  rD  rv   Zobj_cntr  r   r  r  r  r(   r(   r)   _process_cross_links
  sD    








z&CmfPluginYouTrack._process_cross_linksc                 C   s8  d| _ || _d| j_d| j_d| j_| j  |   | jjjj| _| 	| jj
d | _t  |   |   |   |   |   |   |   |   d| j_| j  t  |  D ]B}|d dd | jD krq| jjd|d	  d
|d  d q| jjd| j   | jjd| jj  | j  S )Nr   u'   Импорт данных из YouTrackr  r   r   c                 S   s   g | ]}|d  qS r4  r(   r   r(   r(   r)   r   
  s     z4CmfPluginYouTrack.process_import.<locals>.<listcomp>u&   Импортирован проект rE  r  r'   r  u#   Ошибок обнаружено: u-   Импортировано объектов: )r    r   r'   r   r   r   r   r<   r   r  r6  r   r   r  r  r   r  r8  rG  rB  r   r7   r   r   )r9   r   r   r(   r(   r)   process_import
  s<    


z CmfPluginYouTrack.process_import)NrW   rX   )N)r   re   )NN)NN)TTN)Rr   
__module____qualname__r   r.   Zui_meta_skipZapi_methodsrp   __annotations__r   r  r   r4   propertyrH   r0   staticmethodrc   rf   rs   r   r   rx   r   r   r   r   r   r   r   r   r   r   r   r   r  r1   r  r   r  r  r)  r   r1  r   r   r   r-   r   rA  rr  r  r  r  r  r  r5  r  r  r  r  r  r  r   r  r  r   r  r  r  r  r#  r)  r3  r4  r7  r8  rB  rE  rG  rH  __classcell__r(   r(   r:   r)   r.   ,   s   

   
 

)#
 
	
	89

 

   4  f ()@
 
'
4

/

 &@%
F
V
W
*
q.N
<
 9/r.   )#ri  rY   r\   rz  r   r$  r>  r  r_  pathlibr   Zqueuer   	threadingr   typingr   r   r   r   r	   r
   r   ra   Zbs4r   r  r   Zcmf.includeZmodules.youtrack.fieldsr   Z modules.youtrack.youtrack_clientr   r-   r.   r(   r(   r(   r)   <module>   s(    