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	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                       sZ  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dd ZeedddZ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 d0d1 Z!ed2d3 Z"ed4d5 Z#dd6d7Z$dee ed8d9d:Z%d;d< Z&e
d=d>d?Z'd@dA Z(e
dBdCdDZ)e
dEdFdGZ*e
e
dHdIdJZ+dKdL Z,e-dMdNdOZ.ddPdQZ/dRdS Z0dTdU Z1ddXdYZ2e3dZe
dBd[d\Z4d]d^ Z5e-dMd_d`Z6de
e
dadbdcZ7deee
e
dddedfZ8dgdh Z9didj Z:dkdl Z;dmdn Z<ddpdqZ=e3drdsdt Z>e3dudvdw Z?edxdydzZ@d{d| ZAe3d}e
e
d~ddZBe3ddd ZCe3ddd ZDe3ddd ZEe3ddd ZFe3ddd ZGe3ddd ZHe3ddd ZIdd ZJdd ZKdd ZLdd ZMe3ddd ZNe3ddd ZOe3ddd ZPdd ZQe3ddd ZRdd ZSe3ddd ZTe3ddd ZUeedddZVe3ddd ZWe3ddd ZXdd ZYdd ZZe3dddÄ Z[e3dăddƄ Z\ddȄ Z]ddʄ Z^dd̄ Z_  Z`S )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   :   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tokenusernamepassword
verify_ssl)
load_fieldsr   r<   ext_urlvalue	ext_tokendecrypt	ext_loginext_passwordrB   )r9   r(   r(   r)   ytF   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loadrJ   Z
get_fieldsdump)r9   	file_pathfr(   r(   r)   r0   Y   s    z!CmfPluginYouTrack.youtrack_fieldsNEtc/UTC%Y-%m-%dT%H:%M)datetimetzformatrK   c                 C   sN   | pt jt jj|} t|}tjt j| |	|}||}|S )N)
dtr[   nowtimezoneutcstrftimepytzZlocalizestrptimeZ
astimezone)r[   r\   r]   Zdt_tzZdt_strr(   r(   r)   _datetime_in_user_tzj   s
    

z&CmfPluginYouTrack._datetime_in_user_tz)	timestamprK   c                 C   s   t j| d tj}| S )N  )r^   r[   Zfromtimestamprc   ra   Z	isoformat)rf   Zdt_objr(   r(   r)   	_ts_to_dtv   s    zCmfPluginYouTrack._ts_to_dtc                 C   s,   |sdS |  |}|dr(|r(|d S |S )u`   
        Метод получает значение параметра объекта
        Ncf_rE   )get
startswith)r"   attrrE   r(   r(   r)   
_get_value|   s    
zCmfPluginYouTrack._get_value)
field_namerK   c                 C   s&   |sd S | j |gd}|r"|d S d S )N)Zfields_namer   )import_shop_fields)modelrn   resr(   r(   r)   _get_field_name   s    z!CmfPluginYouTrack._get_field_namec                 C   sJ   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S )	Nr   r         )   ОтложеноLowest   Самый низкий   НизшийVery lowLow   Низкий   НезначительнаяMinor   СреднийMediumMid   ОбычнаяNormalHigh   Высокий   СерьезнаяMajor	Very high   Высший   НаивысшийHighest   КритическаяCritical   Критический   НеотложнаяShow-stopper	Emergency)rj   )prioritymappingr(   r(   r)   _get_priority   s<    zCmfPluginYouTrack._get_priority)issuec                 c   sB   t | d d}t|D ] }|dkr*q|||dV  qd S )N
issue_pathattachmentsall_attachments.zip)	file_namerW   )r   rQ   oslistdir)r   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 )Nr   z/comments.jsonrM   rS   rT   loads)r   Zcomments_file_pathrX   rowr(   r(   r)   _get_issue_comments   s    z%CmfPluginYouTrack._get_issue_commentsc              	   c   s>   | d  d}t |d}|D ]}t|V  qW 5 Q R X d S )Nr   z/worklog.jsonrM   r   )r   Zworklog_file_pathrX   r   r(   r(   r)   _get_issue_worklogs   s    z%CmfPluginYouTrack._get_issue_worklogsc              	   c   s>   | d  d}t |d}|D ]}t|V  qW 5 Q R X d S )Nr   z/activities.jsonrM   r   )r   Zactivities_file_pathrX   r   r(   r(   r)   _get_issue_activities   s    z'CmfPluginYouTrack._get_issue_activitiesc              
   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%""%filterr+   Zsave_importu+   Не удалось создать тег '': )
Ztransliterater   replacemodelsZCmfTagrj   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   Поля контактов)captionfieldsiconu   Поля организацийu   Поля задачu   Поля заметокu   Поля проектовu"   Поля списков задачu   Поля групп)
r   	CmfPersonro   r   Z
CmfCompanyCmfTask
CmfCommentZ
CmfProduct
CmfProjectCmfPersonGroup)rq   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	availableintr   )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   	CmfImportrj   r   r   r   r   r   r   r   commit_with_event)r9   r   r(   r(   r)   _calc_progress3  s    z CmfPluginYouTrack._calc_progressc                 C   sV   ddddddddd	d
d
}||kr*|| S | j |i ddpT| j |i ddS )Nu   ИмяZEmailu(   Не работает/Уволенныйu   Ключu   Наименованиеu   Описаниеu   Созданоu   Обновленоu   Завершеноu
   Автор)
fullNameemailbannedr   summarywikifiedDescriptioncreatedupdatedresolvedauthorlocalizedNamer   r'   )r0   rj   )r9   rl   r   r(   r(   r)   _get_setting_title_from_attrA  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dd}| j  D ]2\}}|||d |d d fd||d qT|S )uO    Сопоставление настроек для модели models.CmfTaskcoder   model_fieldrl   r'   r   textr   cmf_created_atr   cmf_modified_atr   status_closed_atr   r   
logic_typestatusresponsiblefix_versionsaffected_versions
componentsdeadline))Priorityenum)r	   r   )Statestate)ZAssigneeuser)zFix versionsversion)zAffected versionsr   )	Subsystem
ownedField)zDue Datedate	fieldType	valueTypeN)r   rl   	ext_field)r0   itemsappendrj   )r9   Zissue_settingsZdefault_fields_mappingcf_idcfr(   r(   r)   _get_issue_import_settingsS  s4    

	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_settingsu  s
    z+CmfPluginYouTrack._get_user_import_settingsc                  C   s    dddddddddg} | S )uR    Сопоставление настроек для модели models.CmfCommentr   r   r   
cmf_authorr   r   textPreviewr(   )Zcomment_settingsr(   r(   r)   _get_comment_import_settings  s
    z.CmfPluginYouTrack._get_comment_import_settingsc                    s  |dkr|  S |dkr\|d kr$|S d| j d|d  d}tjjddd| dgd}|S |d	kr|d krp|S | j d|d
 d  d|d  }tjjdd|gdgd}	|	S |dkr|d kr|S | |d S |dkrVg }
|d kr|
S |D ]b}| j d|d  }tjj|d}|sF|  jd7  _| j	j
d|d  ddd q|
| q|
S |dkrg }|d krr|S t|tr|g}|D ]d}| j d|d  }tjj|d}|s|  jd7  _| j	j
d|d  ddd n
|| q|S |dkrt|trt|S n|dkrv|d kr.dS |d dd}tjjd|d gd!}|rh||jkrh|S | |d S |d"r|r|d kr|S |d# d$ }|d# d% }|d&kr|stjj||d gd!}|r|d |jkr|d S d S |d&kr6|r6tjd'|}d(d) |D   fd*d)|D }|S |d+kr(|s(zvz| |d }W n2 tk
r } zt| d,W 5 d }~X Y nX | j|d-d-d.\}}|std/| d0|W S  tk
r" } zF|  jd7  _| j	j
d1|d  d2| d3| d4| d5d6d W Y d S d }~X Y nX n|d+kr,|r,g }|D ]}z~z| |d }W n2 tk
r } zt| d,W 5 d }~X Y nX | j|d-d-d.\}}|std/| d0|| W n` tk
r" } z@|  jd7  _| j	j
d1|d  d2| d3| d4| d5d6d W 5 d }~X Y nX q@|S |d7krg }t|trn|D ] }| |}|rJ|| qJn&t|tr| |}|r|| |S |d8krt|trt|S |S )9Nr   r   ::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)r   r   r   r   r   r   -r   choicesr'   parentr   ri   r   r   isMultiValuer   r   c                 S   s   g | ]}|d  qS r+   r(   .0vr(   r(   r)   
<listcomp>  s     z6CmfPluginYouTrack._normalize_value.<locals>.<listcomp>c                    s   g | ]}|d   kr|qS r+   r(   )r  choicevaluesr(   r)   r    s      r   uL   . Возможно пользователь был удален в YouTrack.F)createupdateu   Пользователь u%    не найден в системе.u0   Не удалось присвоить полю r   u   ) значение z. ERR-0038r   group)r   date and time)uppersource_hashr   CmfLogicTyperj   	CmfStatus_get_personr  r    r   r!   r   
isinstancedictr  r   r.   rh   r   CmfCustFieldConfFieldr  r   rk   ZCmfCustomFieldChoiceZlist_choice_get_user_data_from_dumpr   _process_personlist
_get_group)r9   r"   rE   rn   r   cust_field_conflogic_type_ext_idr   status_ext_idr   Zversionsr   version_ext_idZversion_objr   	componentcomponent_ext_idZcomponent_objZvalue_idZfield_configcustom_field_typeis_multi_valuer  rq   Z	user_infoexcpersonr   r  r&  r(   r!  r)   _normalize_value  s8   "














z"CmfPluginYouTrack._normalize_value)settingsrK   c              	   C   s\   i }|D ]N}|d sq|  ||d }| |||d d |d|}|||d d < q|S )uC    Преобразование настроек для модели r   rl   rn   r   )rm   r>  rj   )r9   r"   r?  r4  Znormalized_objsettingrE   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_funcrp   rK   c                    sj   | }|D ]H} | |d |d< ||d |d< |d |d< |j|d< q
 |j|d d S )Nrl   rE   r   titler   )r'   r   )rm   rr   r   r   r   verbose_name)r"   rC  rp   Zobj_settingsr@  resultr9   r(   r)   _get_settingsX  s    z>CmfPluginYouTrack.tmplt_import_settings.<locals>._get_settingsprojectsr   usersc                 S   s   g | ]}|qS r(   r(   r  r"   r(   r(   r)   r  o  s     z;CmfPluginYouTrack.tmplt_import_settings.<locals>.<listcomp>r   )max_resultsr   uT   Не найдено ни одной задачи, импорт невозможен!c                 S   s   g | ]}|qS r(   r(   rK  r(   r(   r)   r  v  s     ub   Не найдено ни одного пользователя, импорт невозможен!TselectedObjects)r'   rE   )r
   r	   r   r   r   r   rC   r   r   r   rP   rQ   rR   _get_projectsget_project_tasks_simple_getrJ   issuesget_allr   rJ  r8   r  r  r   )
r9   r   Z	TypeModelrH  taskr   Zdump_dirr  tasksrJ  r(   rF  r)   tmplt_import_settingsQ  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(   rK  r(   r(   r)   r    s     z6CmfPluginYouTrack.get_all_projects.<locals>.<listcomp>)rJ   rI  r   gdebug)r9   rV  r#   r$   rq   r   r(   r(   r)   r1     s    
z"CmfPluginYouTrack.get_all_projectsc                 C   s<   d}| j  d|d}| r8tdd t|D }|S )Nr   rI  rT  c                 s   s   | ]}| d  V  qdS ).dirtyz.metaN)endswith)r  entryr(   r(   r)   	<genexpr>  s     z9CmfPluginYouTrack._count_project_tasks.<locals>.<genexpr>)r   rP   rQ   rR   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.jsonrM   )r   rP   rQ   rR   rS   rT   r   )r9   r'   rW   rX   r   r(   r(   r)   rP    s    zCmfPluginYouTrack._simple_get)r_  c              	   C   s<   | j  d|}t|dd}t|}W 5 Q R X |S )NrI  rL   rM   )r   rP   rQ   rS   rT   rU   )r9   r_  project_dirrX   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(   )rX   r+   r(   r)   <lambda>      z6CmfPluginYouTrack._get_project_field.<locals>.<lambda>u0   В проекте не найдено поле '')r-  strrf  nextr   
ValueError)r9   r'   r_  re  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:rJ  r   loginr   r   uH   В дампе не найдены данные пользователя )APPREDIS_DBredisrj   r   r   pickler   rP  lowerr   )r9   user_idredis_db	user_datar(   r(   r)   r0    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+FrO   
uS   Не удалось получить данные пользователя по ID )r0  r   rQ   rR   rS   rT   r   rJ   rJ  rj   writedumpsr   r   r   )r9   rw  rz  Z
users_pathrX   r   r"   ry  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!   , указан системный)r0  r   r!   rW  Zsystem_userr1  json_settingsrE   rj   r   r   r   r   r    )r9   rw  r"   r   r=  r   r(   r(   r)   r,    s4    

zCmfPluginYouTrack._get_personc                 C   s\   d| j  d|d  d}tjjddd| dgdgd}|sXtjjdd|d gdgd}|S )	Nr	  r   r
  r  r  r'   r  r   )r)  r   r   rj   r9   Z
group_dataZgroup_ext_idr&  r(   r(   r)   r3    s    zCmfPluginYouTrack._get_groupc              
   c   sf   | j  d}| rbt|D ]>}|dr2q"t| d| dd}t	|V  W 5 Q R X q"d S )NrI  rY  /
/info.jsonrM   )
r   rP   rQ   rR   r   r   r[  rS   rT   rU   )r9   rd  r_  rX   r(   r(   r)   rN    s    
zCmfPluginYouTrack._get_projectsr   rg   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 )	NrI  rT  u   Каталог u    отсутствует. Возможно он был удален или еще не создан. Необходимо повторно запустить импорт проекта rY  r  r  rM   )r   rP   rQ   rR   r   r   	enumerater   r   r[  rS   rT   rU   )r9   r_  startlimitra  iZtask_idrX   r(   r(   r)   rO    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.dirtyrc  r}  r   FrO   r~  Tr   )r   rP   rQ   rR   r   removerS   r   r  rT   r  shutilmover   r   )r9   Zapi_funcr'   Zfile_path_tmprW   rX   r   r(   r(   r)   r   /  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 |S )Nu"   Дамп полей проектаrd  z/fields.jsonrN   FrO   )r   r   rJ   rI  Zcustom_fieldsr   rR   r   r  rS   rT   rV   )r9   project_datare  Zfields_list_filenamerX   r(   r(   r)   _dump_fields?  s    
zCmfPluginYouTrack._dump_fieldsc              
   C   s   | d}| r`t|d>}|D ]2}t|}|d |d kr"|  W  5 Q R  S q"W 5 Q R X t|d}|tj|ddd  W 5 Q R X |S )Ngroups.jsonr|  r'   r}  FrO   r~  )rQ   rR   rS   rT   r   r  r  )r9   r&  rz  Zgroups_pathrX   r   r"   r(   r(   r)   _dump_groupsM  s    

 "zCmfPluginYouTrack._dump_groups)last_dump_datenew_dump_datec	           *      C   sP  t dd: | jjd| d||   |}	d}
z|	jj|d ||||dD ]}zzH| 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 r&| |d d	 | |d rD| |d d	 | |d d D ]}| |d d	 | qP|d D ]}| |d	 | qt|d d D ]}| |d	 | q|
d}|
d}|jdd |d rz| jjd| dt|d   tj| jjjd| d}d }|
|}tjj||| j	d!}|sVtj||| j	| jd"}||_||_d|_|  |j  | jjd#|  |
d$}| rt| t |d%b}|	j!|D ]N}| |d& d	 | |"t#j$|dd'd(  | j j%d7  _%| j&d) qW 5 Q R X d*d+ |	j'|D |d,< d-d+ |	j(|D |d.< d/d+ |	j)|D |d0< |d1 D ]}|d2 d3 d	 }|d2 d3 d4 d5 } |d6 }!d7|*d8d9 }"|||"< | dkr|!rt+|!t,s|!g}!|!D ]}#| |#d	 | qn:| d:krt|!rtt+|!t,s |!g}!|!D ]}$| -|$| q$qt|
d;}%|% rZt|% t |%d<F}|	j.|D ]2}&| |&d& d	 | |"t#j$|&dd'd(  qrW 5 Q R X |
d=}'|' rt|' t |'d<Z}|	j/|D ]F}(| |(d& d	 | | |(d> d	 | |"t#j$|(dd'd(  qW 5 Q R X t|| |
d?})t0|*dd@|d< t |)d<}t#j1||dd' W 5 Q R X | j j%d7  _%| j&dA W n.   |
d7 }
| jj2dB| dCdDdEdF Y nX | jjdG|  W 5 | jj  X qRW n.   |
d7 }
| jj3dH|dI  dJ Y nX |4|
 |	5  W 5 Q R X d S )KNFZinit_views_and_dsu   Дамп задач с u    до r   	shortName)
start_dateend_dateskiprL  r   r   r   r   r   r	     Задача rZ  Texist_okr   reporterupdaterwatchersissueWatchersr   ZmentionedUsersZvotersZoriginalr   u1   Обработка вложений задачи : z/api/issues/z/attachments/allr   )href
obj_ext_idr)  )r  r  r)  r   u/   Дамп комментариев задачи zcomments.jsonr}  r   rO   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customFieldsZprojectCustomFieldrg  r   r   rE   ri   r  r   r&  zactivities.jsonrN   zworklog.jsoncreator	info.jsonr   rS  u9   Не удалось создать дамп задачи zERR-0089r   rV   r  Z
error_typeu#   Создан дамп задачи uA   Не удалось получить задачи проекта r'   u    с сервера)6r   r   r   r   rQ  Zfor_projectr   r   	is_cancelr)  rQ   rR   r  r  mkdirr  lenurllibparseurljoinrJ   _connectionr>   r   CmfImportDownloadrj   pathr'   
downloadedr   r   r  rS   Zcommentsr  rT   r  r   inc_statr  r  r  r   r-  r2  r  Z
activitiestime_trackingrk  rV   r!   	exceptionputclose)*r9   ra  r  r/   tasks_that_are_doner  rL  r  r  rJ   errorsr   Zissue_id	issue_keyZissue_key_idissue_ext_idZtask_dirZtask_dir_tmpwatcherZmentioned_userZvoterZattachments_dirZattachments_dir_tmpZattachments_urlr   Zattach_file_pathdownload_jobZcomments_file_namerX   r  r  field_id
field_typeZfield_valuer  Z
value_userZvalue_groupZactivities_file_nameactivityZworklog_file_nameworklogZ	info_pathr(   r(   r)   _dump_task_part[  s   















&


&


z!CmfPluginYouTrack._dump_task_partr  issues_countr  r  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 t }|D ]8}|j|d | r,| jjddddd tdq,t | }| jjd|dd |  s||! 7 }q| 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/0| q^W 5 Q R X W 5 Q R X W 5 Q R X |1  t'2|| t|d d"}| j% d"}| j% d#}|& rt)|d$3  t'(|| t)|dR}t)|d<}t)|d &}|D ]}||krX|*| qXW 5 Q R X W 5 Q R X W 5 Q R X |1  t'2|| q|S )%Nr   rd  rT  Tr  Zdump_tasks_r=   )ra  r  r  rL  r  r  r  r/   targetr'   r$   u   Форк _dump_task_part proc=r   <   u%   Таймаут дампа задач u    минут)timeoutu/   Возможно завис дамп задачzERR-0055r   rV   r  u"   Ошибка дампа задачuQ   Параллельное скачивание задач выполнено за .3f    сек.u.   Ошибок скачивания задач: r   r  r   r{  zusers.json.newr|  r}  rp  r  zgroups.json.newa)4rr  rs  rt  r   rQ   r  r   mathceildownload_threading_max_forksr   r  r   r<   rD   rE   rF   rG   rH   rI   rB   r   r  r   r   r   time	monotonicjoinis_aliver!   TimeoutErroremptyrj   rO  rb  r  rP   rR   r  copyrS   r  rT   r   setr   ru  r  unlinkr  r  )r9   r  r  r  r  rx  r  ra  r  stepr  rL  processprocr  t1t2r   Zissue_users_pathZall_users_pathZall_users_path_newf1f2Zf3linery  Zissue_groups_pathZall_groups_pathZall_groups_path_newr(   r(   r)   _dump_tasks  s    











&

,zCmfPluginYouTrack._dump_tasksc                 C   s&  | 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 }zP| 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< |d r| $|d d | j  |d  r"| $|d  d | j  | j%|d!}|D ]T}|d" d# d$ }|d%kr2|d& D ]*}|d' rX| $|d' d | j  qXq2| j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/d0 W 5 Q R X t ! | }| jjd1| d| d2|d3d4 t-|d  d5}|r| s| jj.d6| d7|d  d8| d9| d:	 d }n6| /|d s| jj.d;| d7| d<| d: d }t ! }| jj0j1|||d=}d>| }|s|rT|d?7 }|r0|d@| 7 }|rD|dA| 7 }|dB| d7 }| j2| |  j3| j4||||dC7  _3t ! | }| jjdD| dE|d3d4 | j3s||d< t|d.}tj,||d/d0 W 5 Q R X W qn   |  j3d7  _3| jj5dF| dGdHdIdJ Y qnX qn| j2dK d S )LNrM  rE   r   	isCheckedu9   Не выбраны проекты для импорта!rI  Tr  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   r  r'   r   u   Дамп проекта r  z (ID r   rZ  r  ZprofilesZgeneralr`   rY   r|  Z	dump_daterZ   rd  Z	createdByleader)r  rg  r   r   r   r"  ownertimeTrackingSettingsr   NO_CACHEr   1r  rN   FrO   u%   Дамп данных проекта u    выполнен за r  r  z/tasksu$   В каталоге проекта '' (u5   ), отсутствует каталог задач (u@   ). Дата последнего успешного дампа (u   ) будет сброшена.u/   В каталоге задач проекта 'ud   ) отсутствуют задачи. Дата последнего успешного дампа ()r  r  u*   Дампим задачи проекта: u    (в периодu    с u    по u4    включительно, часовой пояс: r  u$   Дамп задач проекта 'u   ' выполнен за u2   Не удалось получить проект zERR-0058r   rV   r  u0   Закончили дампить проекты)6r?  r   r   rP   rQ   r  r7   r  r   r  r   r   r   rJ   rJ  merR   rS   rT   rU   rj   re   r^   r[   r_   r`   ra   rb   r  r  r   makedirsr  process_timerI  rk  r  r  r  environr   r   r   r   rV   r   r   rb  rQ  r`  r   r    r  r!   )r9   rootZprojects_dirZcntr  r  r_  Zproject_keyZproject_namerd  Zproject_tmp_dirZ	data_filery  Zuser_tzr  rX   Zcurrent_dumpZlast_dump_date_utcZnew_dump_date_utcr  r  r  re  rn  r  rE   r  ra  r  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#   Дамп пользователейrJ  9   Отключен импорт пользователей!levelu    Дамп типов ссылок	linktypes   u,   Дамп выбранных проектовN)r   rP   r  
disk_usager   r   r  rE   rj   r   rJ   rJ  rR  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   s  t dd d}| }|dkr"q| j r.qtj|d }| jjd| d z^| j	
|d |d  tjj|d	 d
}d|_|  | jjd|d   | jd W q tk
r } z$|d7 }| jjd| ddd W 5 d }~X Y qX q|| W 5 Q R X d S )NFr  r   DONEr  u   Попытка скачать  ... r  r   r  Tu   Файл сохранен в 
attachmentr   u,   Не удалось скачать файл zERR-0091r  r  )r   rj   r   r  r  r  unquoter   r   rJ   Zdownloadr   r  r  r   r  r   r!   r  )r9   download_queueerror_queuer  r  r  Zdownload_job_objr   r(   r(   r)   _download_file_workerU  s6    
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gdD ],}	| j  r q||	j|	j|	jd q|D ]}
|d q| sH|D ]}|  q8| j  rX|S | j jd | s| j  r|S || 7 }qf|S )Nu)   Cкачивание вложений ... r   zplugin.plugin.source_hashr)  ==r  Fr   u   Вложений нетu   Файлов: Z_download_file_worker_)r	  r
  r  u/   Запуск задачи скачивания r  r  r  r  )r   r  r  r  u8   Скачивание вложений завершено)r   r   r   r   rC   r)  r   r  r`  ranger  r   r  r   r  Zslistr  r  r   r  r  r  r  rj   )r9   r	  r
  rq   r   Zcount_download_filesZprocsr  r  r  r   r(   r(   r)   download_filesx  sb    






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   У пользователя rq  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
  rq  r   import_originalu0   Импортируем пользователя r   )-rA  r?  r   r   rE  r)  rj   r   r   r   Zcmfr   ZCmfEmail
max_lengthr  r   Z
ORG_DOMAINcmfutilZtranslit_stripr   splitmaxr   r  r  r    r!   r2  r   r   INFOrv  r   r   r  setattrr
  r   youtrack_group
user_groupr  r   Z
user_local
is_changedr   )r9   r   r#  r$  r"   Zobj_msgZ	user_dictZperson_ext_idr   Zmax_lenr'   Zcurrent_length_nameZmax_length_namer   r=  Zpersonsr   
is_creatednrq  Zprefix_emaildomainkeyr  r  r(   r(   r)   r1    s    
"2
$&



z!CmfPluginYouTrack._process_personu   Обработка группc              	   C   s4  |  dD ]"}z| j r$W  d S d| j d|d  d}tjjddd| dgdgd}|s|tjjdd	|d gdgd}|stj|d || j|d
d}|jr|d |_|j	s||_	n||j	kr|j	 | |_	|j
d
d |j  | j jd7  _W q
   |  jd7  _| jjd| ddd Y q
X q
d S )Ngroupsr	  r'   r
  r  r  r   r  r   T)r'   r
  r   import_raw_jsonr  r   r   u4   Не удалось загрузить группу r%  r   r  )rP  r   r  r)  r   r   rj   r  r'   r
  r   r   r   r   r    r!   r  r(   r(   r)   _process_groupsF  sL    



z!CmfPluginYouTrack._process_groupsu-   Обработка пользователей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  rJ  Zguestr   z.evateam.ruu@   Не удалось загрузить пользователя r%  r   r  Zsend_invites)r#   )r   r  rE   rj   r   r   r   r  rP  r  r1  r   r   r  r[  addr    r!   Zschedule_deferred_jobr   r   Zregister_personsr2  )r9   Znew_user_emailsr   r=  r   r(   r(   r)   _process_usersr  sB    

z CmfPluginYouTrack._process_users)rg  c                 C   sF  |d d  dd}d| d| j  }|d d|g g g g dd	d	d
}|d d d }|d d d }|dkr|d|d< n|dkrd|d< n|dkrd|d< n|dkrd|d< n|dkr|rdnd|d< dd |d d D |d< n\|dkrd|d< nJ|dkrd|d< n6|dkr*|r d nd|d< n|d!kr>d"|d< nd }|S )#Nr   r   r  r   ri   rD  T)r  workflowr  Zlogic_prefixF)r   Zcustom
class_nameZvisible_filterrequiredZrequiredChangedr   r   r  r   field_custom_typestringrk  Zintegerr   floatr   choice_multi
choice_strc                 S   s   i | ]}|d  |d qS )r   r'   r(   r  r(   r(   r)   
<dictcomp>  s      z0CmfPluginYouTrack._map_field.<locals>.<dictcomp>r"  r  r   r'  r[   r   rJ  r&  r$  )r   r)  rv  )r9   rg  r  r*  rq   r:  r;  r(   r(   r)   
_map_field  sH    









zCmfPluginYouTrack._map_fieldc                 C   s  d | _ | jD ]D}| jtjj d D ],}d|kr0q"|d d |kr"| j| |d< q"q| jjd | j	}tj
j|dgd}|stj
d|d| jd	}d
|_|  tjjdd|d}dd tj D }g }g }| jtjj d D ]L}|ds| jjd|d  d q|d r2| jjd|d  d q| |}	|	s|  jd7  _| jjd|d d  d|d d  d|d d d  d|d  ddd q|d d d d!}
d"|
 d!| j	  }||d< |	d# d$kr|| | j	 d%|d d  }tjj|d&d'd(d)d*gdd+}|sFtj|d |d |	d# d|| jdd,}|jrp| jjd|j d|j d- q||kr|| d& |jjkr|  jd7  _| jjd|d d  d|d d  d.|j d/|| d&  d0|d  
d1dd q|| |d< | jjd2| d|d  d3 n*|| | jjd4| d|d  d3 |jr|d |_|d |_|	d# d5kri }g }|d d6 D ].}|d ||d < |d7 r||d  q||_||_|j rd|_!|| |jdd8 |j"#  |d d9 rtj$j||||d:}|stj$||||d:jdd8 q|j"#  |%  |rtj&t'j() *d;d
d<d= tj+d>d
i d?d tj D }|D ]}||d  |d< q|D ]~}tjj,|d d@  }t-t|j. }|d d6 D ]H}|j|d dA}|s||d dA}|d7d<|_/|j r|  qܐq| jj0j}|dB D ].}|d tjjkr<| jtjj d |d< q<|| j_0dCt1j2dD< | j  | jj"#  dEt1j2dD< d S )FNr   r   r   u0   Обработка кастомных полейr   r
  r   uG   Экран задач проектов YouTrack по умолчаниюTr'   r
  r  r   r   _customr&  r'   typer  c                 S   s   i | ]}|d  |qS rn   r(   r  rX   r(   r(   r)   r1    s      z<CmfPluginYouTrack._process_custom_fields.<locals>.<dictcomp>
   Поле 'rD  u   ' не кастомноеr   u   ' уже смапленоr   u-   Не удалось смапить поле 'r'   r  u   ). Тип поля 'r   r   u%   ' не поддерживается: zERR-0064	CmfUiFormr  r  r   ri   r,  r/  r	  widgetr  r   disabled_choicescmf_deletedr
  r   Zinclude_deleted)r   r'   r,  dirtyr
  r   r  #   ) удалено в системе.u   ). widget поля 'u7   ' не совпадает с существующим 'r   zERR-0065uT   В таблице есть соответствующее поле с именем 'r   u+   Создание поля с именем 'r0  r"  archivedr   ZisAutoAttached
cust_fieldr'   r  ui_form_groupz%Y%m%d%H%M%SF)Zmeta_version
model_nameforcecmf_model_namec                 S   s   i | ]}|d  |qS r8  r(   r9  r(   r(   r)   r1  q  s      rn   r+   import_settingsr   r  r  )3r2   r0   r?  r   r   rE  r   r   r   r)  r;  rj   rH  r   CmfUiFormGroupro   r2  r    r!   r   rv  r   CmfCustFieldr>  r   r'   r   r<  rE   r  r  r=  r  r@  r   r   CmfUiFormFieldinvalidate_cacheZcustom_fields_gen_metar^   r[   r_   rb   Zcustom_field_sync_update_modelsr   varsrp   
cmf_hiddenr  r   r  )r9   Zext_field_idrg  ui_form_ext_idZui_view_formrE  shop_fieldsZ
new_fieldsZ
m2m_fieldsZui_fieldr  rn   cust_field_ext_idrD  r  r=  rE   ui_form_fieldfield_classchoice_modelr   r?  r  r(   r(   r)   _process_custom_fields  s>   


:
	
>









z(CmfPluginYouTrack._process_custom_fieldsuB   Обработка упоминаний пользователей)r   rK   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 )Nlxmlc                 S   s
   |  dS )Ndata-user-idhas_attrr   r(   r(   r)   rh    ri  z5CmfPluginYouTrack._process_mentions.<locals>.<lambda>rX  r  	href_origTcmf_convertedzdata-linked-resource-idzdata-usernamer   uZ   Не удалось преобразовать ссылку на пользователя r  zERR-0098r   r  r   c                 S   s   g | ]}t |qS r(   rk  r  cr(   r(   r)   r    s     z7CmfPluginYouTrack._process_mentions.<locals>.<listcomp>)r   find_allr,  attrsr  r   rE   rq  r   r    r   r!   r  bodyr  )r9   	issue_objr   Zdoc_soupr   r=  r   r(   r(   r)   _process_mentions  s&    

z#CmfPluginYouTrack._process_mentionsu8   Обработка комментариев задачиc           	      C   sb  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j|_||_|jdd |d7 }| jdd q6| jd| d|  d S )Nu$   Комментарий задачи r   r   r   ): 'r   rj  r   r	  r  uN   Комментарий уже существует, и был изменен: zERR-0046r  T)r  r  r
  r   r   r   r  r   r   r  	processedu   Обработано u:    комментариев, из них приватных )r   r)  r   r   rj   r  r   r!   r,  r  	cmf_ownercmf_modified_byrh   r   r   r   re  rE   _process_linksr%  r   r  r   )	r9   rd  
issue_datar"   Zcomment_countZcomment_private_countZcomment_datar
  r  r(   r(   r)   _process_issue_comments  sH    $

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 )Nr  r'   Tr   u1   Не удалось привязать теги 'u   ' к задаче r   r   r   r   zERR-0102r   r  )
rC   r   r  r   r  r   r   r   r   r!   )r9   rd  rk  r   r   r(   r(   r)   _process_issue_tags  s    "z%CmfPluginYouTrack._process_issue_tagsu0   Обработка вложений задачиc                    s  dd l }ddlm} |d  d|d  d}d| d|d	  d
}d}t|d d}|d}	|	 r^||	}
|
 D ]Ήzz
drW W qttfdd|d d }tj}tjj||ddddgd}|stj||d| jd}|jr|r4| j|d d |d|_| |d |_|
`}|jdd || |jdd |r|j|d kst|j d|d  |j  W 5 Q R X W n tk
r  } z:|d 7 }| jjd! d"| d#| d$|d |j  W 5 d }~X Y n>   |d 7 }| jjd% d&| d'|d | jj  Y nX W 5 | j	dd X qW 5 Q R X |  |D ]D z*ztt fd(d|d d }tj d) }tjj||d*}|stj| j|d|d+}|jrR|r | j|d d |d|_| |d |_|jdd |!  t"# d, |j$ tj%jj&' }|(|j)}|*  |j  W nB   |d 7 }| jjd% d)  d&| d'|d | jj  Y nX W 5 | j	dd X qh|S )-Nr   )RDiskr   r   r   r   u   Вложения задачи : 'r   rj  r   r   r   r  rg  r  c                    s   | d  kS )Nr'   r(   r  )zip_attach_namer(   r)   rh    ri  z8CmfPluginYouTrack._process_attachments.<locals>.<lambda>r>   Zurl_previewZurl_preview_imgr  r  T)r'   r  r  r   r   r  r   r   sizez != r   u(   Проблема с вложением 'u   ' в задаче uO   , размер файла не совпадает с метой из YouTrack: zERR-0034u;   Не удалось обработать вложение 'u   ' задачи zERR-0035c                    s   | d  d kS )Nr'   r   r(   rp  )attachment_datar(   r)   rh  ?  ri  r   )r'   r  )r   r  r  r'   rW   )+zipfileZrdisk.rdiskrn  r   rQ   rR   ZipFileZnamelistr   r  r[  rl  r   r   CmfDocument_get_filenameCmfAttachmentrj   r  r,  r  rh   r   rS   r   Zupload_stream_filest_sizeAssertionErrorr   r   r!   Zrollbackr   Z
upload_dirr  r  Zfull_path_fileZCmfRFileZdata_driverZget_rdZ	get_rfileZ
_file_nameZmake_preview)r9   rd  rk  rt  rn  r  r"   r  r   Zall_attach_zip_fileZmyzipZattach_dataZattach_namer  Zattach_fr<  rdiskZrfiler(   )rs  rq  r)   _process_attachments  s    







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   rf  r   rj  r  r  r   r  uI   _process_watchers: Не найден наблюдатель задачи )r,  CmfErrorr   r  rh  Z
spectatorsr   r   )r9   rd  rk  r"   r  r=  r(   r(   r)   _process_watchersg  s    $z#CmfPluginYouTrack._process_watchersr   c                 C   s  | j jd|d  d|d  d d|d  d|d  d|d  d	}| |D ].}i }||d
< d|d< | j|d d |d|d< | j|d d |d|d< |d |d< | |d |d< | |d |d< |d d |d< |d |d< | j d|d  |d< | j |d< ||d< d|d < |d! r:| |d! |d"< tjj	|d d#}|sRtjf |}|j
jtj|jjd$ |_|jd%d& qRd S )'Nu8   Загрузка журнала работ задачи r   r   r   r   u%   Журнал работ задачи rf  r   rj  r  closedr   r   r  r  r  rh  ri  r   r   r   r  Zdurationminutes
time_spentr   r	  r
  r   r%  r   Zremaining_estimater   r   r  )r  Tr   )r   r   r   r   r,  rh   r)  r   ZCmfTimeTrackerHistoryrj   r  rE   r^   Z	timedeltar  r  r   )r9   rd  rk  r"   r  Ztimetracker_historyZtthr(   r(   r)   _process_issue_worklogy  s4    $

z(CmfPluginYouTrack._process_issue_worklogu#   Конвертация ссылокc                    sv  |s|S t |d}|dd D ]:}|jdrH| jjd|  q |dr^|jd }n
|jd }|drtq |d	r|| j	j
jsq | jjd
|  tj|dd dd }|d  stdtj|}|r|d   r&tt fdd|dg d }	|	r&|	d }tj|}
tjj|
|dgd}|r(|dr|jd |jd< |j|jd< d|jd< t|jd }|r|d r|d dr|jdkrd|jjd< d|jjd< d|jjd< |dr|jd |jd< |j|jd< d|jd< | jjd |j  q d!|jdd"krtd#tj|}|r|d }tjjd$d%d&| d'gd$gd(}|D ]V}|jd) |kr|jd |jd< |j |jd< d|jd< | jjd |j    q qq d*|jdd"kr |jd !ddd dd }| "|}|r |jd |jd< |j |jd< d|jd< | jjd |j   q d"#d+d, |j$j%D S )-NrW  c                 S   s   |  dp|  dS )Nr  srcrY  r[  r(   r(   r)   rh    ri  z2CmfPluginYouTrack._process_links.<locals>.<lambda>r]  u"   Тег уже обработан: r  r  )r   zmailto:httpu!   Обработка ссылки: r  ru   ?r   zdata-attachment-idz/api/files/([-0-9]+)/?\?sign=.*r   c                    s   | d  kS )Nr   r(   rp  Zattachment_idr(   r)   rh    ri  r   r'   r>   r  Zsrc_origTZvideosourceZcontrolsz100%widthZheightr\  u   Заменили на z/issue/r   z/issue/([A-Za-z0-9]+-\d+)/?.*r%  r  z%"idReadable":"r   r  r   z/users/c                 S   s   g | ]}t |qS r(   r^  r_  r(   r(   r)   r  	  s     z4CmfPluginYouTrack._process_links.<locals>.<listcomp>)&r   ra  rb  rj   r   r   r   rZ  rk   rJ   r  r>   r  r  r  r  researchrl  r   r   rv  rw  rx  sget	mimetypesZ
guess_typer'   r  r   r2  r%  r  stripr,  r  rc  r  )r9   rd  rk  r   Z	text_soupr   r>   Zattachment_nameZ	url_matchrs  r   Z
attach_objZ	mime_typer  rT  rS  Z
user_loginr=  r(   r  r)   rj    s    




 






$

z CmfPluginYouTrack._process_linksu   Обработка задачиc                 C   s  d}| j  d|d d  }tjjddd| dgd	gd
}|sXtd|d d  d|j}tjj|d}|s~tjjdd}d|d  d|d  d}|d }| j  d|d  }	| || jtj	j
 d |}
| j|
d< d|
d< ||
d< tj	jj}t|
d |kr8d|
d  d|d  |
d< |
d d| |
d< n|d |
d< |	|
d< |
d  rd|
d  j|
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,rh| j|d, d |d#|
d-< |
d- sh|  jd&7  _| jjd.|d,  d(d)d* | jjd.|d, d  tjddd+ |
d/g }|
d0g }|
d1g }| jjd2| d3|
  tj	j|	d4d5 |
D d6}|stj	|
d | jd|	d7}t|d8r|js|jr|
 D ]\}}t||| q|jr.|j dd9 || !||7 }| "||j#j$|_#| %|||j#j$|_#|d: rz| &|| |d; d< r| '|| |d= d> r|d= d? r|d= d? d@ d }|dA|(dBdC }|dD r|)dEg |dD dF |j*_+|j*j$   | ,|| ||_-||_.||_/|dG rB| 0|| |
dH |_1||_|jrf|j dd9 t2  | jj3j3j  dI|d  }tj4j|d}|stj4|| jdJ}||_5t6j78| j9j:j;dK|d  }dL| dM| dN|_#dO|_<|j dd9 |j=>  | j?dPdQ |S )Ru}    Общая логика обработки которая потом разделяется на задачи и эпики r   r	  r  r   r
  r  %::::%r%  r  u2   Не найден проекта с ключем 'r  rj  r  project.agile:defaultr   r  r   ro  r   r   r  TZapprovedr  r'   z<p><strong>z</strong></p><p></p>r   r   Nr   Zcache_status_typer  r  r  rh  r   u*   Не найден автор задачи zERR-0049r   r  )r   exc_infor  ri  uG   Не найден последний обновивший задачу r   r   r   u,   Попытка создать задачу 'u   ' из c                 S   s   g | ]}|qS r(   r(   )r  rn   r(   r(   r)   r  m	  s     z4CmfPluginYouTrack._process_issue.<locals>.<listcomp>r3  )r'   r   r  r
  r  r   ZcommentsCountr  r  r  enabledZestimaterg  ri   r  r   rE   z$op_gantt_task.timetracker_sched_workr  r  r   z
::comment:r
  r   zissue/u@   Задача импортирована из YouTrack: <a href="z" target="_blank">z</a>rv   rS  rg  )@r)  r   r   rj   r}  r%  CmfCustFieldConfrA  r?  r   rE  Zdefault_activityr'   r  r  r  r,  r    r   r!   r   r   ZERRORpopr   r   hasattrr  is_newr   r  r  r   r|  re  r   rE   rj  rl  r~  r   rC   Zop_gantt_taskZ
sched_workr  r   r   r   rm  r   r   r<   r   r  r  r  r  rJ   r  r>   Z	log_levelr   r   r  )r9   r   r  project_ext_idr  r  r4  r"   r  r  Znormalized_issueZmax_task_name_lengthZissue_reporterr   r   r   rd  rn   rE   Zestimation_field_idZestimation_fieldZcomment_ext_idr  r  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   Fr  r  )r   r   r  rj   r   r  )r9   issue_queueissue_queue_errorsr  r   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   rB  r   rI  uD   Обработка задач в несколько потоков: Z_process_issue_thread_)r  r  r  u=   Запущен параллельный обработчик r   r  u3   Ожидание обработки задач ... z-----u&    скорость обработки: r  u    задач в секундуu@   Обработка задач завершена, ошибок: )cmf.appr   r  Zdisable_aclZdisable_notifyr   r   rj   r   r<   r)  _normalize_settingsr  r?  r   r   Zthreading_max_forksr   r  r  r  r   r  r   r  rO  r  r  r  r  )r9   rV  r_  r  r  r   r  r   r  r  Zissue_processr  r  r  Zissue_countr   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
| 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   rS   r   pid
log_detail)r9   r  r  r  r  r  r(   r(   r)   _execute_task
  s      0
zCmfPluginYouTrack._execute_taskc                    sP  |  |d }| jjd| d| j   fdd  || j}t }d}g }t| jD ]0}| |||}||7 }|	| ||kr\ qq\||k rt
d t|D ]L}| }	|	d k	r|  j|	7  _|| | |||}
||7 }|	|
 qqt|D ]&}|  |jr |  j|j7  _q t | }| jjd|d	d
 d S )Nr   u   Обработка u6    задач в несколько процессов: c                    s.   t | | }|tjkr& | |d S |S d S )Nr   )r  r  r   IMPORT_OBJ_CNT)
task_countr   Z
chunk_sizecalc_obj_countr(   r)   r  :
  s    
z8CmfPluginYouTrack._process_tasks.<locals>.calc_obj_countr   r   u?   Обработка всех задач завершена за r  r  )rb  r   r   r   r   r  r  r  r  r   sleepr2  pollr    r  communicate
returncode)r9   r  r  Zimport_obj_countr  r  r  r   r  r  new_procr  r(   r  r)   _process_tasks1
  sB    


z CmfPluginYouTrack._process_tasksu   Обработка версийc           
   
   C   s  t jjddd|d  dgdgd}t jjd|d}t jjd|d}| |d	 }|D ]}|d
 dkrjqV|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rR|	jrR|	jdd |d rd||	_n||	_|	jr|d s|d r|	d n
|	d |	jr|	jr|	jdd | j jd7  _W qr   |  jd7  _| jjd|d  dd d!d" Y qrX qrqVd S )#Nr
  r  r  z"scheme_wf.default_release_workflowr  release)sys_typetree_parentarchiver   z$typeZVersionProjectCustomFieldr"  u!   Обработка версии 'r'   rj  r  r  Tr
  r   r  zlist.release:defaultr  descriptionr   ZreleaseDater   rB  ZreleasedCLOSEDZOPENr   u,   Ошибка загрузки версии 'ERR-0053r  r  )r   r   rj   	CmfFolderrf  r   r  r   r   r)  r  r*  r   r  r'   r   rh   Zrelease_date	scheme_wfZdefault_release_workflowr)  r  r  r   r  Zset_default_statusr   r    r!   )
r9   r  project_objZrelease_folderZarchive_folderre  rg  r   r7  Zversion_listr(   r(   r)   _process_versionsf
  sr    






z#CmfPluginYouTrack._process_versionsu)   Обработка компонентовc              
   C   s2  t jjddd|d  dg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rj| 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   rh  r  r   Ttree_node_is_branch)r  r  Zinclude_systemr   )r   Z
Componentsr      Проект r  r  r'   uC    не содержит компонентов (подсистем).r"  u)   Обработка компонента 'rj  r	  descr_documentdefault_ownerdefault_responsibler  r  r  r3  r  r  u   Компонент r  r   r  r   r   u5   Ошибка обработки компонента r  r  r  )r   r   rj   r  ro  r   r   r   r   r  r   r  r   r)  r  r  r'   r  r,  r  r  r  r  r  Zcreate_descr_documentZ
text_draftrE   r   r    r!   )r9   r  r  Zcomponents_folderZcomponents_fieldr8  r9  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   r  r  r'   )r  rO  rb  r   r  r'  r   )r9   r  r  r   r   r(   r(   r)   _process_tags  s    

zCmfPluginYouTrack._process_tagsc                 C   s  | j  d|d  }tjj|dgd}|shtj|d  d|| jdd}| jd	|d  d
|d   d|_|  tjjdd|d}dd tj	
 D }| |d }|D ]0}|d d dd}d| d| j   }	|	|krq| jtj	j d D ]}
|
dsq|
d d |d d kr| j  d|
d d  }tjj|ddgdd}|jr|| jjd|j d|j d qtjj||	||d}|stj||	||djdd | jd|	 d|
d   d!| d"| d#	  qqq|  |j  |S )$Nr	  r   r   r3  r  u/   : Экран задач по умолчаниюTr'   r
  r   r  u2   Создан экран задач проекта r  r'   r   r5  r&  r6  c                 S   s   i | ]}|d  |qS r8  r(   r9  r(   r(   r)   r1  0  s      z5CmfPluginYouTrack._process_screen.<locals>.<dictcomp>rg  r  r   ri   r   r   r   r>  r?  r:  r  rA  rC  r   rD  u&   ) добавлено на экран 'u   ' в 'rj  )r)  r   r;  rj   r   r   rH  r   rJ  r   ro   rf  r   rv  r?  rE  rK  r>  r   r   r'   r   rL  rM  r   r   )r9   r  rP  ui_formrE  rQ  re  rn  r  rn   rg  rR  rD  rS  r(   r(   r)   _process_screen  s    
 
z!CmfPluginYouTrack._process_screenu,   Обработка схемы экрановc                 C   s   | j  d|d  }tjj|dgd}|sttj|d  d|| jdd}|jdd	 | jd
|d  d|d   | |}|jrtj	j|dgd}|stj	|| jdd}|jr||_
||_d|_|jdd	 t  |S )Nr	  r   r   r3  r  u*   : Схема экранов проектаTr  r   u8   Создана схема экранов проекта r  r'   r  r   )r)  r   ZCmfUiFormSchemerj   r   r   r   r  r  ZCmfUiFormSchemeRuleui_form_schemer  rH  r   )r9   r  Zui_form_scheme_ext_idr  r  ruler(   r(   r)   _process_screen_schemeg  sF    
z(CmfPluginYouTrack._process_screen_schemec              
   C   s.  dd t j D }| |d }|D ] }|d d dd}d| d| j  }||kr`q&| jt jj d D ]}|	d	sqr|d d |d	 d krr| j d
|d d  }	t j
j	|	dddgdd}
|
jr| jjd|
j d|
j d qrt jj	|
|d}|s>t j|
|| jd}| jd| d|d  d|  |d  |_|
jdkri }g }|d D ].}|d ||d < |d rf||d  qf||_||_nz|
jdkrt jj|
j }tt |j }|d D ]H}|j	|d d}|s||d d}|	dd|_|jr|  q|  qrq&d S )Nc                 S   s   i | ]}|d  |qS r8  r(   r9  r(   r(   r)   r1    s      z9CmfPluginYouTrack._process_field_conf.<locals>.<dictcomp>r   rg  r  r   ri   r   r   r	  r,  r   r>  Tr?  r:  r  rA  )rD  r  )rD  r  r   rD  u<   ) добавлено в конфигурацию полей Z
canBeEmptyr0  r"  r'   rB  r/  r+   F)r   r   ro   rf  r   r)  rv  r?  rE  rj   rK  r>  r   r   r   r'   r   r/  r   r+  r,  r   r  r=  r   rN  rp   rO  r  r   )r9   r  r4  rQ  re  rn  r  rn   rg  Zfield_ext_idrD  cust_field_conf_fieldr  r=  rE   rT  rU  r   r(   r(   r)   _process_field_conf  sv    

	
z%CmfPluginYouTrack._process_field_confuA   Обработка схемы конфигурации полейc                 C   s>  | j  d|d  }tjj|dgd}|sttj|d  d|d| jd}|jdd	 | jd
|d  d|d   tjj|dgd}|stj|d  d|d| jd}|jdd	 | jd|d  d|d   | || |j	r2tj
j|dD ]}|jdd q||g | jdd}tj
f |}|jdd	 |  |S )Nr	  r   r   r3  r  u?   : Схема конфигурации полей проектаTr4  r   uM   Создана схема конфигурации полей проекта r  r'   uL   : Конфигурация полей проекта по умолчаниюuB   Создана конфигурация полей проекта r  TEXKOM_db_delete)r  r4  Zlogic_typesr   r  )r)  r   ZCmfCustFieldConfSchemerj   r   r   r   r  r  r  ZCmfCustFieldConfSchemeRuler2  deleterM  )r9   r  Zcust_field_conf_scheme_ext_idcust_field_conf_schemer4  r  	rule_dictr(   r(   r)   _process_field_conf_scheme  sZ    z,CmfPluginYouTrack._process_field_conf_schemeu)   Обработка приоритетовc           	   
   C   s  d}ddddddd}z|  d	|d
 }W n: tk
rd   | jjd|d  d|d  d Y d S X |d D ]6}|d |krqn|d p|d |t|d
 dd< qn| j d|d
  }tj	j
|d}|rtjj
d|dgd}| stjddd|| jd}||_|jdd d S )N)ry   r|   r}   r   r   r   r   r   r   r   r   r   r   r   rx      Минимальныйrz   r{   r~   r   r      Обычныйr   r   r   r   r      Критичныйr   r   r   r  r~   r  r   r  u   Блокирующий)rt   ru   r   r   rv   rw   r   r   r  r  r  r'   u3    не имеет приоритетов задач.r"  r   r  r   r	  r  r   r  r  u   Приоритет)r   r'   Zorig_captionr  r   Tr   )ro  r   r   r   r   r   r   r)  r   r  rj   r/  r  r   )	r9   r  Zpriority_namesr  Zpriority_fieldr   Zcust_field_conf_ext_idr4  r  r(   r(   r)   _process_priorities  sT    #	&z%CmfPluginYouTrack._process_priorities)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< | ||d< | ||d< tjjddd|d  dg| d}|s*tj| j |d |d dd}|jrn|D ]$}|dkrHq6t||||  q6|drnd|_|j}|  |rtjj|dD ]}|jdd q| | | | | | | | | | | j  rd S t  | j  jd7  _|   |S )Nu"   Обработка проекта r  r  r'   r  r   r
  r  r   r   u   Проект с именем u8    уже существует! Переименуем в TZtask_allow_multiple_sprintsr  r  r  r  )r   r
  r'   r  Z
restrictedZprivater  r  r   )r   r   r   r   r   rj   r   r   r
  r   r'   r   r  r  keysr  r  Zperm_policyr  r   r2  r  r  r  r  r  r  r  r   r   r   )r9   r  r  r  r#  r  rS  r(   r(   r)   _process_projectd  sx    






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  r  r  r'   -    не имеет статусов задач.r"  u#   Обработка статуса 'rj  r	  r  r   )r'   r
  r   Z
isResolvedr  Tr   r   )ro  r   r   r   r   r  r   r)  r   CmfStatusCoderj   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  r  r  r'   u<    не имеет логических типов задач.Nr"  u*   Обработка типа задачи 'rj  r	  r
  r  r  r  r   r   r   r  r  Tr   u   Ищем по имени 'r   u	    или 'r   u   Тип 'u.   ' не найден и будет созданr  r   r   )r'   r   templaterH  r
  r   color
background#fffr   r   )ro  r   r   r   r   r   r  r)  r   r*  rj   r
  r   r  Zui_colorr   r   r   )r9   r  Z	name2codeZ
type_fieldZ
issue_typer5  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  r  r  Tr   )r)  r   r  rj   r
  r+  r   r'   r   r  r  Zallow_empty_transitionr   )	r9   Zstatus_datar)  r  r
  r  r6  r   Zfilter_namer(   r(   r)   _create_statusa  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
  r3  zdefault.system:defaultr  r  u3   : Simple бизнес-процесс проекта)r'   r  r
  r   Tr   r   r"  r  r  r'   r  r)  r  r  r  !=r   )r  rG  z
::SIMPLE::r  zsoftdev:defaultu@   : Simple-схема бизнес-процесса проекта)r  r  r   )rH  Ztarget_workflowr  r   )r)  r   ZCmfWorkflowrj   r   r   ro  r  r   r   r   r+  r2  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_idschemeZscheme_templater  r  r(   r(   r)   _create_scheme_wf_for_project  s|    
z/CmfPluginYouTrack._create_scheme_wf_for_projectu#   Обработка проектовc           	      C   sl  t jjddjj}|  D ]J}t|d |d< z| j rJt	  W  d S |d dd | j
D krfW qd| j d|d  d}t jjdd}| | | | | |}|di }|r| |d }n
d	d
d}||d< d|d |d |jj|||d |||d
}| || W q tk
rd   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 r  r(   rK  r(   r(   r)   r    s     z7CmfPluginYouTrack._process_projects.<locals>.<listcomp>r	  r  r  z#default_import_youtrack@evateam.comZdefault_import_youtrack)r   r'   r
  r  r'   ZhtmlDescriptionr  )
Zproject_typer'   r   r   r  r  Ztask_code_prefixrh  r
  r%  r   u<   Не удалось импортировать проект r  zERR-0104r   r  )r   ZCmfActivityrj   r   rE   rN  rk  r   r  r   r7   r)  r*  r  r  r  r,  r  r   r    r!   )	r9   r  r  r  r   r  Zproject_leaderrh  r  r(   r(   r)   _process_projects  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  tjjdd}| jD ]}| j r dS tjj|d}|s| jjd|  q| j| D ]}tjj|dgd}|s:| jjd|  q|j|jkr\||_|jdd nD| d| }tjj|d}|stj||||| jd}|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$ }||}|rLtjj|d}ntjj|d}|sttjjd$d%|gd&}|stj||| jdd'}|jr|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 qtjj|d0 d+ d}|sd| jjd1|d0 d-  d.|d0 d+  d/ W qtjj|d}|stj|| jd2}||_||_||_ |jdd W np   |  j!d37  _!| jj"d4|d#  d5|d* d-  d.|d* d+  d6|d0 d-  d.|d0 d+  d7d8d9d: Y nX q| jj  dS );u4    Постобработка связей задач r   r  Nr   r	  r  ZlinkTyperQ  r   r  Z
issuesSize	directionZINWARD:)r
  r#  )r7  outwardIssueinwardIssueZOUTWARDZBOTHu   Подзадачи: zsystem.additional_parentr  r  uq   Не удалось связать задачи, возможно задача не попала в импорт parent_taskr3  Tr   z:additional_parent:)in_linkout_linkrelation_typer
  r   u   Связи задач: zsystem.finish:finishzsystem.duplicatezsystem.link)ZDependZ	DuplicateZRelatesr7  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  )#rN  rO  rb  r   r  r)  r6   rj   r   r5   r   r  r   ZCmfRelationTyper   r   r   r  r  r   ZCmfRelationOptionr   r   r   r  r   r  Zin_type_nameZout_type_namer%  r  r  r  r    r!   )r9   r  r   r  r  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  r  Zchild_ext_idZ
child_taskZrelation_optionZ	map_namesZissue_relationZrelation_type_ext_idZlink_type_nameZrelation_coder  r  r(   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   rJ   r  r>   r   r  rS   r   r  )r9   rF  doner  r  r(   r(   r)   _execute_cross_links  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   r  Nr  r  T)rv  r   r   r  u    Обработка ссылок u+    в несколько процессов: r   r   r   u2   Обработка ссылок завершена)r   r   r   r   rN  r   r`  r  r   r   r  r   r  r  r  r2  r  r    r  r  r  )r9   r   rF  r  rp   Zobj_cntr  r   r  r  r  r(   r(   r)   _process_cross_links  sD    








z&CmfPluginYouTrack._process_cross_linksc                 C   sP  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'   Импорт данных из YouTrackrI  r   r   c                 S   s   g | ]}|d  qS r  r(   rK  r(   r(   r)   r  ^  s     z4CmfPluginYouTrack.process_import.<locals>.<listcomp>u&   Импортирован проект r  ro  r'   rj  u#   Ошибок обнаружено: u-   Импортировано объектов: )r    r   r'   r   r   r   r   r<   r)  r  r  r?  r   r  r  r   r&  r(  rV  r  r  r  rN  r7   r   r   )r9   r   r  r(   r(   r)   process_import1  sB    

z CmfPluginYouTrack.process_import)NrY   rZ   )NN)N)N)r   rg   )NN)NN)TTN)ar   
__module____qualname__r   r.   Zui_meta_skipZapi_methodsr   __annotations__r   rk  r.  r4   propertyrJ   r0   staticmethodre   rh   rm   r   r   rr   r   r   r   r   r   r   r   r   r   r   r  r  r  r>  rA  rU  r1   rb  rP  rf  ro  r0  r   r  r,  r3  rN  rO  r-   r   r  r  r  r  r  r  r  r  r1  r&  r(  r2  rV  re  rl  rm  r|  r~  r  rj  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  __classcell__r(   r(   r:   r)   r.   -   s8  

   

!

)#"
	
  
 6 9

 

   8  y '(#?
 
+
'5 >
4

z


t
 ?@5
F
V
R
*F
8
R`
*
q.N
<
 T/r.   )$base64r[   r^   r  r  r   ru  r  r  r  pathlibr   Zqueuer   	threadingr   typingr   r   r   r   r	   r
   r   rc   Zbs4r   r  r   Zcmf.includeZmodules.youtrack.fieldsr   Z modules.youtrack.youtrack_clientr   r-   r.   r(   r(   r(   r)   <module>   s*    