U
    eɋ                    @   s   d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ d dl	m	Z	 d dl
mZmZmZmZ d dlZd dlmZ d dlT d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlZejG dd dZejG dd dZ G dd dZ!dS )    N)cmf_context)Path)urlparse)datetime)DictUnionListOptional)commit_all_ds)*)CmfActiveEntity)ConfluenceApi)CmfPluginImportMixin)BeautifulSoup)ApiNotFoundErrorc                   @   sv   e Zd ZU dZejedZee	e
jf ed< ejedZee	eee	e	f  f ed< ejedZee	e
jf ed< dS )	TotalDatauJ    Данные используемые в процессе импорта default_factoryuserslink_documentsresult_documentsN)__name__
__module____qualname____doc__dataclassesfielddictr   r   strmodels	CmfPerson__annotations__r   r   r   CmfDocument r#   r#   "./modules/confluence/api_import.pyr      s   
(r   c                   @   s@   e Zd ZU dZejed< eed< ej	e
dZeeef ed< dS )DocDatauR    Данные используемые при создании документа documentdoc_idr   link_attachmentsN)r   r   r   r   r   r"   r!   r   r   r   r   r(   r   r#   r#   r#   r$   r%      s   

r%   c                   @   s  e Zd ZdZeejdddZdd Ze	ddd	Z
eeed
ddZe	dddZdd Zdd ZdedddZedddZdd ZeeedddZdd Zdd!d"Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Z d1d2 Z!ed3d4d5Z"d6d7 Z#d8d9 Z$d:d; Z%ed<d=d>Z&d?d@ Z'eedAdBdCZ(dDdE Z)dFdG Z*dHdI Z+edJdKdLZ,edMdN Z-dOdP Z.ddSdTZ/dUdV Z0e1j2fdWdXZ3dYdZ Z4d[d\ Z5d]d^ Z6d_d` Z7dadb Z8dcdd Z9ededfdgZ:dhdi Z;djdk Z<dldm Z=dndo Z>edpdqdrZ?dsdt Z@dudv ZAdeedxdydzZBd{d| ZCd}d~ ZDeEdddZFdd ZGdeedddZHedddZIdd ZJdd ZKdeeedddZLdd ZMd S )ConfluenceAPIImportu;   Класс загрузки объектов через API)
confluence
cmf_importc                 C   s   || _ || _t | _tjjdd}|j | _	d| _
d| _td}| jjj|_|| jjj |   d| _| j jjr~d| _d| j_d| j_t | _t | _d S )Nzsystem:defaultcoder   zhistory,body.export_view.webresource,body.storage,body.editor,body.view,body.editor2,body.styled_view,body.atlas_doc_format,body.dynamic,children.page,ancestors,body.plain,body.wiki,history.ownedBy,history.lastUpdatedzatlassian.rest_clientZuserKey	accountId)confluence_apir+   r   Z
total_datar   ZCmfSchemeWfgetZdefault_document_workflowloaddoc_workflow
has_errorsexpandloggingZ	getLoggerloggerZhandlersZsetLevellevel_prepare_multiprocessinguser_keyconncloudimported_object_countjson_object_countr   treeset_selected_objs)selfr*   r+   Z	scheme_wfr6   r#   r#   r$   __init__)   s$    

zConfluenceAPIImport.__init__c                 C   s   dd l }dd l}dd l}dd l}|| _ || _tj| _tj| _|	 d | _
| jjd| j
d  ddd tjr~ttj| j
| _
| jjdtj dd | j}| jjdt|d	  d
dd tt|d | j
| _
| j
stdd S )Nr      z
cpu_count=u%   , надо не менее 2 ядерT)	anonymouszconfig.IMPORT_PROCESS=zavailable_memory=i   @u-   Гб, по 2 Гигабайта на ядроl        u   Ресурсов системы недостаточно для импорта, обратитесь в техподдержку для дополнительной информации.)	threadingqueuemultiprocessingpsutilconfigZIMPORT_THREADSZthreading_max_forksZIMPORT_DOWNLOAD_THREADSdownload_threading_max_forks	cpu_countmax_processesr+   logZIMPORT_PROCESSminZvirtual_memoryZ	availableint	Exception)rA   rE   rF   rG   rH   Zavailable_memoryr#   r#   r$   r8   B   s*     
z,ConfluenceAPIImport._prepare_multiprocessing)returnc                 C   s2   dt tjjt tjjdddg ddd dgS )NZcurrent_user)emailname)rS   fieldsselectedObjects)rS   valueimport_type)r   gZcurrent_personrR   rS   rA   r#   r#   r$   calc_import_settingsb   s    
z(ConfluenceAPIImport.calc_import_settings)settingsrQ   c                 C   s   dd | D S )uO   Преобразуем список с настройками в словарьc                 S   s   i | ]}|d  |qS rS   r#   ).0sr#   r#   r$   
<dictcomp>k   s      z;ConfluenceAPIImport._normalize_settings.<locals>.<dictcomp>r#   )r[   r#   r#   r$   _normalize_settingsh   s    z'ConfluenceAPIImport._normalize_settingsc                 C   s   g S )uo    Для импорта из Confluence предварительный просмотр не требуется r#   rY   r#   r#   r$   previewm   s    zConfluenceAPIImport.previewc                 C   s  g g d}d }|  |d D ]}|d dkr|d d d D ]*}d}| || j }|r>|d | q>|d d	 d D ]}d}| jjjrd
| jjjj	 d
|d  d
}	nd
| jjjj	 d
|d  d
}	ddd|	 dg}
t
jj|
d}|rz|d | qz|d dkr|d d d D ]8}|dkr,d}| || j }|r|d | q|d d	 d D ]}|dkrvd}| jjjrd
| jjjj	 d
|d  d
}	nd
| jjjj	 d
|d  d
}	ddd|	 dg}
t
jj|
d}|rd|d | qdq|jr|r||_|jr,|jdd |j  |j  dd|jgddd gg}
t
jj|
dD ]}|jdd |j  qZ|d rt
j|j| jd|d djdd |d rt
j|j| jd|d djdd t
jj  d S )N)readwritepathZ	operationrb   restrictionsuserresultsZprivategroup::idrS   ext_idLIKE%filterupdatereadonlyrc   TZsave_importparent==r+   !=)ZTEXKOM_db_delete)rs   r+   Zaccess_levelZsubjects)_get_restrictions_get_personr9   appendr/   r:   r;   r+   pluginsource_hashr   CmfPersonGroupr0   import_originalperm_policy
is_changedsavedpcommitZperm_aclr1   ZCmfAccessRulelistdelete)rA   docdoc_objZpermsr}   restrictionrf   person
group_infork   _filterrh   Zruler#   r#   r$   _process_restrictionsq   s|    

 

 


 
 z)ConfluenceAPIImport._process_restrictionsc           	      C   s<  | ddd  d }t|j d}t|dkrb|d dkrb|d dkrb|d	 d
krb|d }|S t|d	kr8|d dkr8|\}}}}z |dd}| jj||}W nN tk
r } z0| j	j
d| d| d| d|  W Y d S d }~X Y nX |s| j	j
d| d|  d S | j	j
t| |d }|S )N/r      rC   wiki   Zspaces   pages   Zdisplay+ uC   Ошибка получения документа по pretty url : uo   Не смогли получить документ по pretty url (возможно не тот домен): rj   )splitr   rd   lenreplacer/   r:   Zget_page_by_titlerP   r+   r6   warninginfor   )	rA   urlr-   Zsplitted_url_spacetitleZfind_confl_docer#   r#   r$   _get_pageid_by_url   s6    

z&ConfluenceAPIImport._get_pageid_by_urlFr\   c              	   C   s   | j  | d}| j  | d}| r<|s<d S t|d6}| D ](}| j  jd7  _|t|d  qNW 5 Q R X t	
|| | j jdd | j j  d S )N.jsonz.json.dirtya+rC   
TZ	only_data)r+   get_download_pathjoinpathexistsopenr=   rc   jsondumpsshutilmover   r   r   )rA   Zapi_funcrS   Z	overwrite	file_pathZfile_path_tmpfrowr#   r#   r$   _simple_dump   s    
 z ConfluenceAPIImport._simple_dumpc              	   c   sN   | j  | d}| rJt|d}|D ]}t|V  q.W 5 Q R X d S )Nr   r+)r+   r   r   r   r   r   loads)rA   rS   r   r   r   r#   r#   r$   _simple_get   s    zConfluenceAPIImport._simple_getc              
   c   sJ   | j  d}t|D ]*}t||}t|V  W 5 Q R X qd S )Nr   r+   r   r   oslistdirr   r   r1   )rA   Zdir_pathfpr   r#   r#   r$   _list_users_from_dump   s    z)ConfluenceAPIImport._list_users_from_dump)textattachments_dirobjc                 C   s  |sd S | j jd t|ddd D ]}d}|drBd}|j| }zPd|kr\W q*|dr~| j jd	|  W q*|d
st	j
| jj|}|| jjs| j jd|  W q*tj|dd dd }t|\}}	|s| j jd|  W q*tj|}||}
| j jjj d|d  }tjj||| j jjjd}|sxtj| j ||| j jjjd}|
|_
||_d|_|  |j   W q* t!k
r } z*| j j"  | j jd| d|  W 5 d }~X Y q*X q*d S )Nu/   Обработка ссылок в текстеlxmlc                 S   s   |  dp|  dS Nhrefsrchas_attrtagr#   r#   r$   <lambda>       z1ConfluenceAPIImport._dump_links.<locals>.<lambda>r   r   z/attachments/zmailto:u   Это почта: httpuH   Это внешняя ссылка, оставляем как есть: r   r   ?r   u   Это не файл: ri   rj   r   
obj_ext_idrz   r+   r   r   rz   Fu0   Не удалось скачать ссылку r   )#r+   r6   r   r   find_allr   attrs
startswithr   r   rd   joinr/   r   urllibparseunquoter   	mimetypes
guess_typer   r"   _get_filenamer   ry   rz   CmfImportDownloadr0   rS   
downloadedr   r   r   rP   rollback)rA   r   r   r   r   keyr   	file_name	mime_typeencodingr   rk   download_jobr   r#   r#   r$   _dump_links   sZ    



 


zConfluenceAPIImport._dump_linksc                    s  z|  |W S    | jj|dd  s8| jj|dd  sL| jj|dd  r|d}| slt }n t|d}t	
|}W 5 Q R X | jjjr| jj d d}n| jj d d}  fdd	| D  |  t|d
}t	j||dd W 5 Q R X Y nX d S )N
operationsr4   
users.jsonrr.   )usernamer   c                 3   s*   | ]"\}}| ks|d kr||fV  qdS ) Nr#   r]   kv	user_infor#   r$   	<genexpr>/  s     z5ConfluenceAPIImport._get_user_info.<locals>.<genexpr>w+r   )indent)_get_user_info_from_dumpr/   Zget_user_infoZget_user_info_by_keyZget_user_info_by_usernamer   r   r   r   r   r1   r:   r;   Zget_user_detailrp   itemsrx   dump)rA   user_idZ	dump_path
users_pathr   r   Zuser_detailr#   r   r$   _get_user_info  s*    


z"ConfluenceAPIImport._get_user_infoNc                 C   sr   |  dD ]T}|dd |kr*|  S |dd |krF|  S || j|kr
|  S q
td| d S )Nr   rS   r   r   uQ   Не нашли информацию по пользователю в дампе )r   r0   lowerr9   rP   )rA   r   r   r   r#   r#   r$   r   6  s    
z,ConfluenceAPIImport._get_user_info_from_dumpc                    sh   fdd}t ddD |_d}jjd| d|  j|d ||D ]}	zzj rrW W  qPjjd	|	d
  d t	dD ]P}
z||	 W  qW q   |
dkr jj
d|
 d|	d
  tjd Y qX qj jd7  _W nB   jj  jjd|	d
  d|	d  ddddd Y nX W 5 jj  X qT|| W 5 Q R X d S )Nc              	      s    t| d }| rd S j| d jj| d jd}   t| d d }|jdd | d d 	j
r| d d j
 | | d 	d	}|r|d
 dkrƈ|j
 | | d d d 	j
r| d d d j
 | | d}| d}dd jj| d dD }t|}t|dd}t|| W 5 Q R X |r*tjjjd| d  }	jjjrtjjjd| d  }	d}
| |
}jjjj d| d  }tjj	|	|jjjjd}|stjj|	|jjjjd}||_|
|_d|_|  |j   | d d d ||  | d}| rbt!| jj"#d  t|d!}j d"}j$| d |D ]}|%t&|d#  j j'd$7  _'j(d%  |d d& d ||  |d 	d	r|d d	 j
 | |d 	dr<|d d j
 | |d 	dr|d d d j
 | qW 5 Q R X | d'}| rt!| jj"#d( t|d!\}j)| d D ]D}|%t&|d#  |d) d* d+ D ]}|j
 | qqW 5 Q R X | d,}| r.t!| jj"#d- t|d!2}j*| d D ]}|%t&|d#  qXW 5 Q R X | d.}| rt!| jj"#d/| d0  d1| d  d2 t|d!}d3}j+| d |D ]}|%t&|d#  j j'd$7  _'j(d4  |d5 d d& d ||  |	dr|d d
 dkr|d j
 | qW 5 Q R X t,-|| |jdd | d6}t|| d7< t|d4}t| | jd8| d0   j(d9 W 5 Q R X d S ):Nrj   uX    директории нет, значит документ еще не сдампленr   .dirtyTexist_okhistory	createdByownedBytyperD   lastUpdatedbyattachmentsattachments.jsonc                 S   s   g | ]}|qS r#   r#   r]   r   r#   r#   r$   
<listcomp>Y  s     zMConfluenceAPIImport._dump_document_part.<locals>.dump_doc.<locals>.<listcomp>)page_idr   )modez+pages/downloadallattachments.action?pageId=z%wiki/download/all_attachments?pageId=all_attachments.zipri   r   r   FbodyviewrV   zcomments.jsonu#   Дампим комментарииr   z2,extensions.inlineProperties,extensions.resolutionr   rC   commentZexport_viewzrestrictions.jsonu   Дампим праваre   rf   rg   labels.jsonu   Дампим тегиzversions.jsonu-   Дампим историю страницы r    ()zlcontent.version,content.body.view,content.body.export_view,content.body.atlas_doc_format,content.body.editorversioncontent	info.jsonrd   u    Успешно сдампили r&   ).r   r   r   r+   rM   r/   Zget_page_by_idr4   mkdirr0   r9   r   Zget_all_attachmentboolr   r   r   r   rd   r   r   r:   r;   ry   rz   r   r   rS   r   r   r   r   r   remover6   r   Zget_page_commentsrc   r   r=   inc_statZ get_all_restrictions_for_contentZget_all_page_labelsZget_page_versionsr   r   )r   doc_dirZdoc_dir_tmpownerr   Z	info_fileattach_infoZ
has_attachr   r   r   Zattach_file_pathrk   r   Zcomments_file_namer4   r  Zrestriction_file_namer   rf   Zlables_file_nameZlabelZversions_file_nameZpage_versionZ	info_pathobjs_dirrA   r#   r$   dump_docA  s    








,


$


"


$$
z9ConfluenceAPIImport._dump_document_part.<locals>.dump_docFZinit_views_and_dsr   u   Документы с u    до r   u   Документ 'r   'r      u   Попытка u#    сдампить документ r7   rC   u5   Не удалось скачать документ  r  rj   r  zERR-0025r"   r   
error_codeobj_type
error_type)r   r/   r+   r6   r   get_all_pages_from_spacer   r   	is_cancelrangerM   r5   WARNINGr=   r   	log_errorput)rA   startmaxr  r   obj_apiobjs_that_are_doner  errorsr   ir#   r  r$   _dump_document_part@  s8    r

*  z'ConfluenceAPIImport._dump_document_partc                    s"  t |d  d}|jdd | j }d}| j|d }| jjd|  t	|| j
 d }|sjd	}d}g }|dkr| jj| jd
| || || | ||t| jj| jj| jj| jj| jj| jjjd|dd}	||	 |	  | jjd|	  |d7 }||8 }qr|D ]}	|	  ~	q| j rB| jjd | jjd | sj|| 7 }qP| jjd|  | jd dd | dD  t |D ]^}
|!|
d}|" rt#|,}t$%|D ]}| krֈ | qW 5 Q R X |&  q| ' fdddd |S )Nrd   
/documentsTr   r   r   u:   Дампим документы пространства: rC   r   r*  r   logintokenpassword
verify_sslr;   )r$  r%  r  r   r&  r'  targetrS   kwargsu   Форкаем proc=   Импорт прерванuU   Закончили параллельное скачивание документовu   Ошибок: uC   Соберем пользователей из документовc                 S   s   g | ]}|qS r#   r#   )r]   ur#   r#   r$   r     s     z7ConfluenceAPIImport._dump_documents.<locals>.<listcomp>r   r   c                      s    S )Nr#   r#   r   r#   r$   r     r   z5ConfluenceAPIImport._dump_documents.<locals>.<lambda>)(r   r  rF   Queuer/   Zget_count_pages_from_spacer+   r6   r   rO   rJ   rE   Threadr*  r   r   r-  r.  r/  r0  r:   r;   rx   r$  r   r  r   emptyr0   rM   r   r   r   r   r   r   r   r1   unlinkr   )rA   r   r  r'  r(  cntstepr)  processprocr'   r   r   r5  r#   r6  r$   _dump_documents  sf    

  





z#ConfluenceAPIImport._dump_documentsc              
   C   sL   | j  d}t| d| dd}t|}|W  5 Q R  S Q R X d S )Nprojectsr   
/info.jsonr   )r+   r   r   r   r   r1   )rA   project_keyproject_dirr   projectr#   r#   r$   _get_project  s    
z ConfluenceAPIImport._get_projectc              
   c   sb   | j  d}t|D ]B}|dr*qt| d| dd}t|}W 5 Q R X |V  qd S )Nr@  r   r   rA  r   )	r+   r   r   r   r   endswithr   r   r1   )rA   rC  rB  r   rD  r#   r#   r$   _get_projects  s    
z!ConfluenceAPIImport._get_projectsc           	   	      s  t td fdd jjd }|d d d }|d sDd	S d
d |d D }|sʈ D ]f}d|d< g |d< |d D ]}|d |dg d q~|d D ]}|d |dg d q|| qbt }|D ]}z|d r|d sN|d d }|d D ]}|d |dg d q
|d D ]}|d |dg d q0|d D ]p}|d rV|	|d  |
dstj d|d d |d<  ||d D ]}|	| qqVW q   jjd| d Y qX q|_d	S )uJ   Прогружаем все выбранные документы
        )doc_infor  c                 3   s   | d sd S | d s t|d| d }|sPjjd|  dddd	 d S |d d
 d D ]}| d |d dg d q`| d D ]&}|d r ||E d H  |d V  qd S )N	isCheckedchildren	documentsrj   u'   Документ не загружен zERR-0015r"   r   r  pagerg   Trj   rI  rJ  )_get_documentr   r   r+   r"  rx   )rH  r  Zdoc_dumpchildget_childrenrA   r#   r$   rQ    s"      z=ConfluenceAPIImport._load_selected_objs.<locals>.get_childrenimport_settingsrU   rV   r   rI  Nc                 S   s   g | ]}|d  r|qS rI  r#   r]   setting_objr#   r#   r$   r   $  s      z;ConfluenceAPIImport._load_selected_objs.<locals>.<listcomp>rJ  T
root_pagesrM  archived_pagesr   r   rj   rd   r@  uc   Не удалось вычислить выбранные документы для проекта u4   , скорее всего он не сдамплен)r   r   r`   r+   json_settingsrG  rx   r?   rE  addr0   r   r   r6   r   r@   )	rA   r[   rootselected_spacesrD  r'   resultr   rH  r#   rP  r$   _load_selected_objs  sF    



&z'ConfluenceAPIImport._load_selected_objsc              
   C   s  |  | jjd }|d d d }|d s.dS dd |d	 D | _|d rpt|d	 dkrpd
d | j D | _| j d}|j	dd | jD ]}z| j
 rW  d S | j jd7  _|t|d d }|d}| s&| jj|d d }| jjd|d   |d dkr2td| t||d d  d|d< tj|d dd g |d< g |d< | j|d D ]}|d |d  q| jj|d dddD ]}	|d |	d  q|d stdt|d | t||d< t|d}
t||
 W 5 Q R X t  n t|d}
t|
}W 5 Q R X |  j|  |7  _W q   | jj!"  | jj#d | d!d"d#d$ Y qX qd S )%NrR  rU   rV   r   rI  Tc                 S   s   g | ]}|d  r|qS rS  r#   rT  r#   r#   r$   r   I  s      z4ConfluenceAPIImport._dump_spaces.<locals>.<listcomp>rJ  c                 S   s   g | ]}||d  dqS )rj   )r   rj   r#   r   r#   r#   r$   r   L  s     r@  r   rC   r   r   r  u&   Дампим пространство rS   r   ZpersonaluY   Миграция персональных пространств в разработке r   rd   rV  rW  rj   Zarchived)statusuJ   Пустой проект, возможно нет прав доступаr   r   u1   Ошибка дампа пространства zERR-0026
CmfProjectr   r  )$r`   r+   rX  r[  r   r/   Zget_all_spacesr   r   r  r  r=   r   r   r:   Z	get_spacer6   r   CmfErrorr   makedirsZget_root_pages_from_spacerx   r  r   r   r   r   r   commit_with_eventr1   r3   r?  r   r   r"  )rA   r[   rZ  Zprojects_dirrU  rC  	data_filer   r   Zarchived_docr   r#   r#   r$   _dump_spacesD  s\    


 
  z ConfluenceAPIImport._dump_spacesc                 C   s  | j  d}| rd S |jdd | j D ]^}| jjjrPt	|d }nt	|d 
dd
dd}||}|jdd |d	}| j  jd
7  _t|d}t|| W 5 Q R X |d}| j  d}|jdd |jdd | j|d D ]}	||	| j d }
| j  jd
7  _t|
d}t|	| W 5 Q R X ||	| j d }
|
 rlq t|
d}t|	| W 5 Q R X q q2d S )NgroupsTr   rj   rS   r   r   r   r  rC   r   r   r   )r+   r   r   r   r  r/   Zget_all_groupsr:   r;   r   r   r=   r   r   r   Zget_group_membersr9   )rA   
groups_dirrh   rk   Z	group_dirrc  r   Z	users_dirZall_users_dirrf   Zuser_data_filer#   r#   r$   _dump_groupss  s8    




z ConfluenceAPIImport._dump_groupsc                 C   s   | j  }t|\}}}|| d }| j jd| d | j jd | j jjddr|| j jd | 	| j
jd n| j jd	tjd
 |   d}| dD ]}|d7 }q| j jd|d d S )Nd   u   Свободно места: rm   u$   Скачаем данные из API
load_usersTu'   Дампим пользователейr   uA   Не дампим пользователей из-за опцийr  r   rC   rf   )rV   )r+   r   r   
disk_usager6   r   rX  rV   r0   r   r/   Zget_all_usersrM   r5   r!  rd  r   r  )rA   Zdownload_pathtotalusedfreeZfree_percentZuser_cntr   r#   r#   r$   download_data  s    

z!ConfluenceAPIImport.download_data)r&  c                 C   s  dd l }dd l}|| _d}tdd | j r6q| }|dkrJq| jjd|d   d }t	dD ]l}	z | jj
|d tjdd	}|  t|d
 d"}
|jddD ]}|
| qW 5 Q R X ||d
 \}}|r|dkr||d
 }W 5 Q R X | jjd|d
   tjj|d d}d|_|  |j  | jd W 5 Q R  W  q(W 5 Q R X W qn tk
r } zD| jj  |	dkr| jjd|d  d| ddd|d d W 5 d }~X Y qnX qnq(|| W 5 Q R X d S )Nr   Fr  DONEu    Пытаемся скачать r   r  T)timeoutstreamrd   zwb+i    )Z
chunk_sizezapplication/zipu   Сохранили в rj   rj   
attachmentr   u@   Не удалось скачать файл с 3 попыток r   zERR-0027r"   r   )r  r  r  Zext_href)zipfiler   r/   r   r+   r  r0   r6   r   r   Zconfluence_requestrI   ZIMPORT_DOWNLOAD_TIMEOUTZraise_for_statusr   Ziter_contentrc   r   ZipFiler   r   r   r   r   r   r  rP   r   r"  r#  )rA   r&  download_queue
done_queuert  r   r(  r   resr)  r   chunkZmimetypeencodemyzipZdownload_objr   r#   r#   r$   _download_file_worker  sX    
 


   z)ConfluenceAPIImport._download_file_workerc           	      C   s  | j jd | j }| j }d}| j dg dd| j jjjgdddgg}tj	j
|dsp| j jd	 |S g }t| jD ]v}| jj| jd
| ||t| jj| jj| jj| jj| jj| jjjddd}|| |  | j jd|  q~tj	j|ddgdD ]}||j|j|jd q
|D ]}|d q.|  s^|D ]}|!  qN| j jd | j " rt#  | j j$d |  s||% 7 }q| j jd|  |S )Nu=   Скачиваем все найденные вложенияr   zplugin.plugin.source_hashrz   rt   r   Frn   u   Вложений нетr|  r,  )rv  rw  r&  r1  u    Запустили задачу r   rd   ro   rT   )rj   r   rd   ro  u%   Закончили скачиватьr4  uC   Закончили скачивание файлов, ошибок )&r+   r6   r   rF   r7  load_fieldsry   rz   r   r   countr   rJ   rE   r8  r|  r   r/   r   r-  r.  r/  r0  r:   r;   rx   r$  slistr#  rj   r   rd   r9  r   r  rb  r   r0   )	rA   rv  rw  r3   r   Zprocsr)  r>  r   r#   r#   r$   download_files  sN    

  


z"ConfluenceAPIImport.download_filesc              	   c   s:   | d}t |d}|D ]}t|V  qW 5 Q R X d S )Nz/comments.jsonr   r   r   r   rA   rd   Zcomments_file_pathr   r   r#   r#   r$   _get_comments  s    
z!ConfluenceAPIImport._get_commentsc              	   c   s:   | d}t |d}|D ]}t|V  qW 5 Q R X d S )Nz/restrictions.jsonr   r  r  r#   r#   r$   rv     s    
z%ConfluenceAPIImport._get_restrictionsr   c                    s6    d D ]"}d fdd	  |d qd S )Nrd   c              
      s  zzD| d dkr4j jd|   W W Xd S j jjj d| d  }tjj|dgd	}|rv|j	svW W d S |stj|j d
}n|
dg | d drĈ| d d j |_n2| d dr| d d j |_ntj|_| d d |_| d dr0| d d j |_n|j|_| d drz| d d d j |_| d d d |_n|j|_|j|_|| d d d | d d d |_||jj| d d d |_| |_||_| d d dkrd|_| d d d dkrd|_|jdd | d D ]} || q&|j  |W W >S    |j  j j d d!  d"|  d#d$ Y nX W 5 j dd X d S )%Nr  	processedr^  ZdraftuJ   Не обрабатываем черновики комментариев ri   rj   r|   rk   rT   rs   rk   r+   **r   r   r   createdDater   r   whenr  r  rV   editor
extensionslocationinlineTZ
resolutionZresolvedclosedrr   rJ  u7   Ошибка обработки комментария r   r   zERR-0028r  r   )!r+   r  r6   r   ry   rz   r   
CmfCommentr0   r|   r~  rw   r9   	cmf_ownerrX   anonymous_usercmf_created_at
cmf_authorcmf_modified_bycmf_modified_at_process_mentionsr   _process_linksrV   import_raw_jsontree_parentr  r^  r   r   r   r   r"  )r  r  rk   Zcmf_commentrO  creater   rs   rA   r#   r$   r    sf    



 z9ConfluenceAPIImport._process_obj_comments.<locals>.create)r  )N)r  )rA   rs   r   r  r#   r  r$   _process_obj_comments  s    :z)ConfluenceAPIImport._process_obj_commentsc                 c   s4   | d}t |D ]}|| d| dV  qd S )Nz/attachmentsr   )r   r   )r   r   )rA   Zobj_pathZattachments_pathr   r#   r#   r$   _get_attachments@  s    
z$ConfluenceAPIImport._get_attachments)r  c              	   C   sJ   t t|d}t|}W 5 Q R X |D ]}|d | kr,|  S q,d S )Nr   r   )r   r   r   r   r1   )r   r  r   Zattach_info_listattachr#   r#   r$   _get_confluence_attach_infoE  s
    z/ConfluenceAPIImport._get_confluence_attach_infoc                 C   s  ddl m} dd l}t|d  d}d}| r||8}| D ]&}z|dr`W qJ| ||d }	t	j
|}
t	jj|
|dddd	gd
}|st	j| j|d|
d}|jr:||t}|jdd |j| dd |jdd |	r&|j|	d d ks&td|j d|	d d  d|j  W 5 Q R X W qJ   |j  | jjd| d| d|d Y qJX qJW 5 Q R X | jdd |S )Nr   )RDiskrd   z /attachments/all_attachments.zipr   r|   r   url_preview_imgurl_preview)rS   rs   rT   T)r+   rs   r|   rS   rr   )Zsmart_backupr  ZfileSizeu   Текущий размер  != u    из метыuD   Не удалось обработать вложение file_name=z all_attach_zip_path=zERR-0029r  rs  r  )Zrdisk.rdiskr  rt  r   r   ru  namelistrF  r  r   r"   r   CmfAttachmentr0   r+   r|   r   r   upload_filerb   st_sizeAssertionErrorr   r   r   r"  r  )rA   rs   r   r  rt  Zall_attach_zip_pathr(  r{  Zzip_attach_namer  Zattach_namers  Zattach_fr#   r#   r$   _process_obj_attachmentsM  sJ    



4
 z,ConfluenceAPIImport._process_obj_attachmentsc                 C   s<  | d}|d d }| jjjrz,t|d d }t| |||d }W nZ tk
r   d| d d}| d	r|d
|d	 d  d7 }| j	j
|d|d Y nX | |||d d }| |||d d }| ||}| |||d d }| |||d d }| |||d d }| |||d d }|S )Nr  r  rV   Zatlas_doc_formatr
  uT   Не удалось конвертировать разметку страницы "r   "r	  u    (версия numberr  zERR-0031r  r  )r0   r/   r:   r;   r   r   r   _convert_atlas_docrP   r+   r"  r  r  _process_inline_comments_convert_plantuml_convert_drawio_convert_msoviewer_convert_childpages)rA   doc_datar   Z	body_datar   	atlas_rawZexception_textr#   r#   r$   _convert_doc_textp  s&    


z%ConfluenceAPIImport._convert_doc_textc              	   c   s:   | d}t |d}|D ]}t|V  qW 5 Q R X d S )Nz/versions.jsonr   r  )rA   rd   Zversions_file_pathr   r   r#   r#   r$   _get_versions  s    
z!ConfluenceAPIImport._get_versions)r  c                    s    fdd}t jjddgdD ]}|  |j  q$d } d D ]}||d}|rN|jrN|}qN|_j	rj
dd	 j  d S )
Nc              
      s   d }zzj jd d  d d  d| d   j jjj d	 d  d
| d  }tjj|dgd}|r|j	sW W d S |stj|j d}| d|_
| d|_| dr| d d dkr| d j }||_||_||_ntj|_tj|_tj|_| d|_| d|_| d|_t|jjdd d |_|j|_jjdd|_| di }t|ddk|_ ||_!d|_"| |_#|j$dd |j%&  W nP t'k
r   j j(d d  d d  d|  dd  j)d 7  _)Y nX W 5 j dd X |S )!Nr	  r  u7   Обрабатываем версию страницы r   r  rj   z): version r  ri   r   r  r  r  r  r   r   rD   messagez%Y%m%d%H%M%S%fCLOSEDstatus_typer
  r^  currentTrr   u@   Ошибка обработки истории страницы z): zERR-0033r  rC   )*r+   r  r6   r   ry   rz   r   CmfDocumentHistoryr0   r|   r  r  rw   r9   r  r  r  rX   r  reasonZofficial_numberZofficial_daterO   rV   strftimeZcmf_versionZdoc_versionworkflowget_default_statusr^  r  cur_workflowr  r   Zhas_publishedr  r   r   r   rP   r"  r3   )version_dataZcmf_document_historyrk   r   Zversion_contentr  r   rA   r#   r$   create_version  s\     $
"z=ConfluenceAPIImport._process_versions.<locals>.create_versionrs   =rn   rd   )r  Trr   )r   r  r   r   r   r   r  r  Zcur_workflow_versionr~   r   )rA   r  r   r  ZdhZcurrent_versionr	  Zdocument_historyr#   r  r$   _process_versions  s    C

z%ConfluenceAPIImport._process_versionsc              
   C   s   |  |d}| sd S t|dl}t|}g |d< |  |d}| r~t|d$}|D ]}|d t| qZW 5 Q R X |W  5 Q R  S Q R X d S )Nr  r   labelsr  )r   r   r   r   r1   rx   r   )r  r'   Zdoc_filer   rx  Zlabels_filef2Z	label_strr#   r#   r$   rN    s    
 z!ConfluenceAPIImport._get_documentc                 C   s$   t |d }tdd |}|S )NrK  c                 S   s   |   o| jd S )Nr   )is_dirrS   rF  )	path_objsr#   r#   r$   r     r   z3ConfluenceAPIImport._get_doc_dirs.<locals>.<lambda>)r   r   Ziterdirro   )rA   
space_pathr  Zdoc_dirsr#   r#   r$   _get_doc_dirs  s    z!ConfluenceAPIImport._get_doc_dirsr     c                 c   s\   t | d}d}| |D ]:}|d7 }||k r2q||| d krF qX| ||jV  qd S )Nr+  r   rC   )r   r  rN  rS   )rA   rC  offsetlimitr  enum_dirr'   r#   r#   r$   _get_documents  s    z"ConfluenceAPIImport._get_documentsc                 C   s   t dd | |D S )Nc                 s   s   | ]
}d V  qdS rC   Nr#   r]   r   r#   r#   r$   r     s     z=ConfluenceAPIImport._count_space_documents.<locals>.<genexpr>)sumr  )rA   r  r#   r#   r$   _count_space_documents  s    z*ConfluenceAPIImport._count_space_documentsc           	      C   s   i }d}d}d}|  |D ]`}|d7 }||kr6|}d}||d ||  d7  < tdd | t|D }||d 7 }qdd | D }|S )Nr   r   rC   c                 s   s   | ]
}d V  qdS r  r#   r  r#   r#   r$   r     s     zCConfluenceAPIImport._get_offsets_for_execute_doc.<locals>.<genexpr>c                 S   s   g | ]\}}||fqS r#   r#   )r]   r  r  r#   r#   r$   r     s     zDConfluenceAPIImport._get_offsets_for_execute_doc.<locals>.<listcomp>)r  
setdefaultr  r  r   r   )	rA   r  r  offsetsZcurrent_offsetZ	obj_countr  r  Zversion_countr#   r#   r$   _get_offsets_for_execute_doc
  s    z0ConfluenceAPIImport._get_offsets_for_execute_docc                 C   sr  d}t ddX t B | }|dkr2qP| j r@qPzz| jjjj d|d  }| j	d	|  t
jj|d
}|st
j| jd||d d}|jrF|js|ddg |d d }	| jjd|	  |	d dkrtj}
n| |	| j }
|
s"| jjd|d  d|	  |d d}|rr| jjd|  |d dkr`tj}n| || j }n|
}|d d d }| jjd|  |d dkrtj}n| || j }|d d d }||d  ||
| j| jjt|d d |d d! |d d d" |||d#}|jr*||_|d jd$krB||d%< t|d&d'r\d|d(< |D ]}t||||  q`|jr|j dd) |j!"  | jjjj d*| }t
j#j|d
}|st
j#|| jd+}||_$|d, d-rt%j&'| j(j)|d, d- }n| jjjj*}|j+ d.| d/| d0|_,d1|_-|j dd) |j!"  n| jjd2|  || .||7 }| /|| |jr:g }|d3 D ]p}d| jjjj d|d  d}t
j0jd4d5d6| d6gd7}|r|1| n| jj2d8| d9| d:|d; q||_3| 4|||_,|jr.|j dd) |j!"  | 5|| | 6|| W n t7k
r   t
jj!8  | jj2d<|d  d=d>d?d@ | j9  |dA7 }Y n t:k
r   t
jj!8  | jj2d<|d  dB| dCdD d>d?d@ | j9  |dA7 }Y nF   t
jj!8  | jj2d<|d  d>d?d@ | j9  |dA7 }Y nX W 5 | jdd X q|;| W 5 Q R X W 5 Q R X d S )ENr   Fr  ro  r&   r  ri   rj   zprocess rk   Tr   )r+   r|   rk   rS   r  tagsr   r   u5   Определяем автора документа r   rD   u1   Не найден автор документа: r   r   u:   Определяем владельца документаr   r   =   Определяем последнего редактора r  r  rV   r^  r  r  r  )rs   rS   r  r  r  r^  r  r  rk   r  r  r  r  r   tableZfull_screenrr   z
::comment:)rk   r+   Z_linksZwebuiu4    импортирован из Confluence: <a href="z" target="_blank">z</a>r   uQ   Документ изменен пользователем, пропускаем r  rk   rl   rm   rn   u   Не найден тег z ext_id=zERR-0017r  u   Ошибка создания uS   : попробуйте очистить дамп и повторить импортzERR-0018r"   r  r  rC   u^   : попробуйте отменить импорты связанные с проектом , uW   чтобы он удалился из системы и повторите импорт)<r   cmfutilZdisable_aclr0   r+   r  r  ry   rz   rM   r   r"   r|   is_newr~  r6   r   rX   r  rw   r9   r   r2   r  r   Zget_status_typer  r  r   r   setattrr~   r   r   r   r  rs   r   rd   r   r/   r   ext_urlverbose_namer   	log_levelr  r  CmfTagrx   r"  r  r  r  r   FileNotFoundErrorr   
log_detailAttributeErrorr#  )rA   rD  Zarchive_folderZ	obj_queuerw  r(  r   rk   r   authorr  r  r  modifiedr  r   Zdoc_dictr   Zcomment_ext_idr  r   r  Ztag_rawZ
tag_ext_idr   r#   r#   r$   _process_document_fork!  s    
  

 

 
 
 
z*ConfluenceAPIImport._process_document_forkc                 C   s  d}zt |d}|jdddidD ]}td|jd }tj|d	}tj	j
||d
}	|	s| jjd| d| d|d q$tj	j
dd|gdd| dggdgd}
d}td|jd }|r|d	}d}td|jd }|r|d	}|	jj|	jj||d}|
r|
j|d< nd|d< t |ddjf |d}t |d}|jddidD ]6}|jdd|jd   idrV||j  qqVdd!d" |jjD }q$|W S    | jjd#| d|d Y nX d S )$Nu  
        <div data-drawio-title="{name}" data-drawio-type="diagram" data-attach-id="{attach_id}" class="drawio-content" contenteditable="false">
            <div class="header">Диаграмма: "{name}"</div>
            <div class="content">
                <img cmf_converted=True src="{img_src}" alt="" data-mce-src="{img_src}" width="{width}" height="{height}">
            </div>
        </div>
        r   imgdata-macro-namedrawior   zdiagramName=([^|]+)data-macro-parametersrC   rS   rs   u#   Диаграмма с именем u@    не найдена во вложениях документа zERR-0019r  rs   rt   rS   rl   %.pngr   r}  100%zdiagramWidth=([^|]+)zdiagramHeight=([^|]+)rS   	attach_idwidthheightimg_srcr   r   html.parserrj   zdrawio-macro-content-data-macro-idc                 S   s   g | ]}t |qS r#   r   r]   xr#   r#   r$   r     s     z7ConfluenceAPIImport._convert_drawio.<locals>.<listcomp>uU   Неудалось конвертировать диаграмму из текста )r   r   researchr   r   r"   r   rh   r  r0   r+   r"  rS   rV   rj   r   r   formatfindreplace_with
currentTagr   r  rJ  )rA   r   r   raw_dataTAG_TMPLZsoup_rawr   matchr   r  
attach_imgr  r  datar^   soupZ
drawio_tagr#   r#   r$   r    s^    
 



 z#ConfluenceAPIImport._convert_drawioc              	   C   s   d}|s|S t |d}t |d}|jddidD ]}ztj|j}W n*   d}| jjd|j d|d	 Y nX t |jd
|j|dd}	|jddidD ]}
|
	|	  qqt t
|d}q0ddd |jjD S )Nu  
        <div class="macros-panel plantuml" contenteditable="false" data-macros-parameters="{params}"
            style="display: inline-flex; flex-direction: column; position: relative; width: 100%;"
            data-rendered="true" data-macros="plantuml">
            <div data-layout="default" class="extension-container" contenteditable="false">
                <span role="img" aria-label="Макрос PlantUML">
                    <svg xmlns="http://www.w3.org/2000/svg" id="Layer_1" data-name="Layer 1" viewBox="0 0 24 24" width="16" height="16">
                        <path d="M22,15h2v7h-7v-2h5v-5Zm2-10v6.731l-2-1.976v-.755H7v11h4.738c.033,.036,.057,.078,.092,.113l1.887,1.887H0V5c0-1.654,1.346-3,3-3H21c1.654,0,3,1.346,3,3ZM2,5v2h3v-3H3c-.551,0-1,.448-1,1Zm3,4H2v11h3V9Zm17-2v-2c0-.552-.448-1-1-1H7v3h15Zm-9.715,9.292c-.38,.391-.38,1.025,0,1.416l2.715,2.792v-2.5h2c1.654,0,3-1.346,3-3v-2.023h2.455l-2.756-2.711c-.386-.386-1.012-.386-1.398,0l-2.756,2.711h2.455v2.023c0,.552-.448,1-1,1h-2v-2.5l-2.715,2.792Z"></path>
                    </svg>
                </span>
                <span class="extension-title">
                    <span class="excerpt-title">PlantUML</span>
                </span>
                <span class="macros-actions">
                    <span class="macros-refresh">
                        <svg viewBox="0 0 24 24" style="width: 14px; height: 14px; color: rgb(32, 32, 32);"><path fill="#202020" d="M12,2a10.032,10.032,0,0,1,7.122,3H16a1,1,0,0,0-1,1h0a1,1,0,0,0,1,1h4.143A1.858,1.858,0,0,0,22,5.143V1a1,1,0,0,0-1-1h0a1,1,0,0,0-1,1V3.078A11.981,11.981,0,0,0,.05,10.9a1.007,1.007,0,0,0,1,1.1h0a.982.982,0,0,0,.989-.878A10.014,10.014,0,0,1,12,2Z"></path><path fill="#202020" d="M22.951,12a.982.982,0,0,0-.989.878A9.986,9.986,0,0,1,4.878,19H8a1,1,0,0,0,1-1H9a1,1,0,0,0-1-1H3.857A1.856,1.856,0,0,0,2,18.857V23a1,1,0,0,0,1,1H3a1,1,0,0,0,1-1V20.922A11.981,11.981,0,0,0,23.95,13.1a1.007,1.007,0,0,0-1-1.1Z"></path></svg>
                    </span>
                    <span class="macros-edit" style="margin-right: 7px;">
                        <svg _ngcontent-aiw-c17="" viewbox="0 0 24 24" class="ng-star-inserted" style="width: 14px; height: 14px; color: #444444;">
                            <path _ngcontent-aiw-c17="" fill="#444" d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                        </svg>
                    </span>
                    <span class="macros-delete">
                        <svg viewbox="0 0 18 18" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                            <path fill="#222" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            <path fill="#222" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            <path fill="#222" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                        </svg>
                    </span>
                </span>
            </div>
            <div data-fabric-macro="null" data-macro-body="" class="ak-renderer-wrapper" contenteditable="true">
                <textarea class="puml-code">{uml}</textarea>
            </div>
            <div class="macros-preview" contenteditable="true">
                {svg}
            </div>
        </div>
        r   r  Zplantumlr  erroru.   Не удалось получить svg из zERR-0002r  z{})paramsZumlsvgr  r   c                 S   s   g | ]}t |qS r#   r  r  r#   r#   r$   r     s     z9ConfluenceAPIImport._convert_plantuml.<locals>.<listcomp>)r   r   r   r"   Zconvert_uml2svgr   r+   r"  r  r  r   r   r  rJ  )rA   r   r   r  ZTMPr  	text_soupr   r  new_tagold_tagr#   r#   r$   r    s(    '

 
z%ConfluenceAPIImport._convert_plantumlc                 C   s   d}| dg |j}t|j}| }|  g }t|D ]:\}	}
|	| d|	d  d|	d  |
|d}|| q<ddd	d
dgdddddddgddd}dt|j||d dt|d}|	|
| t|jtj|dd|||d dd}|jS )u8    Создает тег макроса Word или Excel u  
            <div
                class="macros-panel mso-viewer"
                contenteditable="false"
                data-id
                data-macros="msoviewer"
                data-macros-parameters='{params}'
                data-rendered="1"
            >
                <div class="extension-container" contenteditable="false" data-id data-layout="default">
                    <span aria-label="Макрос {plugin_title}" data-id role="img">
                        <svg xmlns="http://www.w3.org/2000/svg" id="Layer_1" data-name="Layer 1" viewbox="0 0 24 24" width="16" height="16">
                            <path d="M22,15h2v7h-7v-2h5v-5Zm2-10v6.731l-2-1.976v-.755H7v11h4.738c.033,.036,.057,.078,.092,.113l1.887,1.887H0V5c0-1.654,1.346-3,3-3H21c1.654,0,3,1.346,3,3ZM2,5v2h3v-3H3c-.551,0-1,.448-1,1Zm3,4H2v11h3V9Zm17-2v-2c0-.552-.448-1-1-1H7v3h15Zm-9.715,9.292c-.38,.391-.38,1.025,0,1.416l2.715,2.792v-2.5h2c1.654,0,3-1.346,3-3v-2.023h2.455l-2.756-2.711c-.386-.386-1.012-.386-1.398,0l-2.756,2.711h2.455v2.023c0,.552-.448,1-1,1h-2v-2.5l-2.715,2.792Z"></path>
                        </svg>
                    </span>
                    <span class="extension-title" data-id>
                        <span class="excerpt-title" data-id>{plugin_title}</span>
                    </span>
                    <span class="macros-actions" data-id>
                        <span class="macros-edit" data-id>
                            <svg _ngcontent-aiw-c17="" viewbox="0 0 24 24" class="ng-star-inserted" style="width: 14px; height: 14px; color: #444444;">
                                <path _ngcontent-aiw-c17="" fill="#444" d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                            </svg>
                        </span>
                        <span class="macros-delete" data-id>
                            <svg viewbox="0 0 18 18" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                                <path fill="#222" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                <path fill="#222" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                <path fill="#222" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            </svg>
                        </span>
                    </span>
                </div>
                <div class="macros-preview" data-id>
                    <div class="mso-preview-wrapper" data-id>
                        <img class="mso-preview-image" data-id id="mso-img_{attach_id}_1" src="{url_preview_img}"/>
                    </div>
                </div>
            </div>
        r  r   rC   u   Лист)numrj   r   r   ZimgUrlzOffice WordZwordz
.doc,.docxz.docz.docx)pluginTitleZ
pluginTypeZacceptTypesZacceptTypesListZ	pageScalezOffice ExcelZexcelz
.xlsx,.xlsz.xlsxz.xlsr   )viewdocviewxlsr   r   )ZverparentIdr   ZcurrentPageRefZslicePageNumZ
pagesCountFZensure_asciir  )r  r  r  Zplugin_titler  )r~  rj   r   r  Zget_fullviewsort	enumeraterx   r   rp   r0   r   r  r   r   r  )rA   r   r  Zplugin_typeTMPLr  r  Zfullview_pagesr   r  Zfullview_pagerL  Zparam_typesr  r  r#   r#   r$   _create_msoviewer_macro_tag  sX    )
	z/ConfluenceAPIImport._create_msoviewer_macro_tagc              	   C   s   |s|S t |d}t |d}ddg}|D ]}|jd|idD ]}|d}	tdd |	d	D }	tj|	d
 }
tjj||
d}|s| j	j
d| d|
 dd|d q<|jd|id}|r|| ||| t t|d}q<q(ddd |jjD S )u7    Конвертирует макросы Word и Excel r   r  r  r  r  r  c                 s   s   | ]}| d V  qdS )r  N)r   )r]   Zparamr#   r#   r$   r     s     z9ConfluenceAPIImport._convert_msoviewer.<locals>.<genexpr>|rS   rs   rS   u*   Ошибка обработки тега "u)   ", не найдено вложение "r  ERR-0012r  r   c                 S   s   g | ]}t |qS r#   r  r  r#   r#   r$   r     s     z:ConfluenceAPIImport._convert_msoviewer.<locals>.<listcomp>)r   r   r0   r   r   r   r"   r   r  r+   r"  r  r  r  r   r   r  rJ  )rA   r   r   r  r  r  Zmacro_types
macro_typer   original_paramsr   r  r  r#   r#   r$   r  v  s.    


 z&ConfluenceAPIImport._convert_msoviewerc           	      C   s   |s|S t |d}t |d}|jddidD ]Z}|d}|sZ| jjd| d|  q,|jddd	d}|rx||d
< t t|d}q,ddd |j	j
D S )u  
        Добавляет параметры настройки макроса из тега в editor разметке в тег во view разметке
        для последующей конвертации макроса при save_import
        r   r  rJ  r  r  u-   В макросе "Children" объекта "u-   " отсутствуют параметры: F)r  original-data-macro-parametersr"  r   c                 S   s   g | ]}t |qS r#   r  r  r#   r#   r$   r     s     z;ConfluenceAPIImport._convert_childpages.<locals>.<listcomp>)r   r   r0   r+   r6   r   r  r   r   r  rJ  )	rA   r   r   r  r  r  r   data_macro_parametersZview_tagr#   r#   r$   r    s    


z'ConfluenceAPIImport._convert_childpages)r   c              	   C   s   t |d}tjjdd|gdddgddd ggddd	gd
D ]}zr|jd d d r|jd|jd d d idD ]<}|jd |jd< |j|jd< |jd |j	 d|jd< qnW q8   | j
jd| d|j d|d Y q8X q8t|S )Nr  rs   rt   r  Tr  ru   r   r^  r}  r  ZinlinePropertiesZ	markerRefzdata-refr  zdata-ref_origclasscmf_converteduO   Не удалось конвертировать inline комментарий r   zERR-0020r  )r   r   r  r  r  r   r   rj   rx   r^  r+   r"  r   r   )rA   r   r   Zdoc_soupr  r   r#   r#   r$   r    s,    


 z,ConfluenceAPIImport._process_inline_commentsc                 C   s~   dd l }|jdddd| jjj d| jj d|j d| d	| d
gddtddtddd}| jd|j  | j  |S )Nr   z/usr/bin/python3z	manage.pyshellz,plugin = models.CmfPluginConfluence.get(id="z+");retcode = plugin.process_document_fork("z", "z", r  z);Tz"/var/log/eva-import-subprocess.logr   z&/var/log/eva-import-subprocess.err.log)Z	close_fdsZstart_new_sessionstdoutstderru   Запустили )	
subprocessPopenr+   ry   rj   r   rM   pidr  )rA   rD  r  r  r)  r>  r#   r#   r$   _execute_doc  s      . 
z ConfluenceAPIImport._execute_docc                    s  dd l }t _|d}|s0t|d d d}i }j|d |d dD ]N}d }|d rp|d d d	 }|d
 d }|dkr|d }||d||d	 < qP fdd  ||d	 d jjdj	  
|d }	g }
tj	D ]4}|	s q&|	d\}}|||}|
| q|	r|d t|
D ]b}| }|d k	r> j|7  _|
| |	sx q&|	d\}}|||}|
| q>q&t|
D ]&}|  |jr j|j7  _qjjd d S )Nr   homepagerV  rr  rd   r  Z	ancestorsr   rj   r  positionnoner   )rs   r/  c                    sp   fdd   D }|j fddd |}g }|D ]&}|d }|||f  ||}q6|rl|j< |S )Nc                    s    g | ]\}}|d   kr|qS rs   r#   )r]   rO  r   r1  r#   r$   r     s      zNConfluenceAPIImport._process_documents.<locals>.build_tree.<locals>.<listcomp>c                    s    |  d S )Nr/  r#   )rO  )r  r#   r$   r     r   zLConfluenceAPIImport._process_documents.<locals>.build_tree.<locals>.<lambda>)r   2   )r   r  rx   r>   )r  rs   ordernorJ  Zcurrent_ordernoZchildren_in_orderrO  Znext_orderno
build_treerA   )r  rs   r$   r5    s    
z:ConfluenceAPIImport._process_documents.<locals>.build_treei uJ   Грузим документы в несколько процессов: rC   u:   Закончили обработку документов)timer   r>   r0   r  r  r+   r6   r   rL   r  r   popr,  rx   sleepr   Zpollr3   r  Zcommunicate
returncode)rA   r   rD  r6  r-  r   r   rs   r/  r  r=  r   r  r  r>  r9  Znew_procr#   r4  r$   _process_documents  sT    
 


z&ConfluenceAPIImport._process_documentsc              	   C   sF  | j  D ]4\}}z| j r(W  qB| jjjj d| }tjj|dgd}|D ]\}}| jjjj d| }tjj|ddddgd}|s| jj	d| d	| d
|d qT|j
rT|j|kr||_|js|j|_||_|jdd qT|r|jsd|_|jdd t  W q
   | jj  | jj	d| ddd Y q
X q
d S )Nri   tree_node_is_branchr  rs   r  r|   r3  u-   Не найден потомок по ext_id=z tree_parent_ext_id=zERR-0003r  Trr   uI   Не получилось привязать ноду tree_parent_ext_id=zERR-0024r"   r  )r>   r   r+   r  ry   rz   r   r"   r0   r"  r|   r  rs   r3  r   r;  rb  r   r   )rA   Ztree_parent_ext_idrJ  r  rk   r3  rO  r#   r#   r$   _process_documents_tree&  s@    
 

 z+ConfluenceAPIImport._process_documents_treec                 C   s  |  | jjd }|d d d dkr<dtjjddd}n`|d d d d	krfdtjjd
dd}n6|d d d dkrdddtjjd
dd}ntd|   |  D ]}z| j	 rW  q|d dd | j
D krW q| jjd|d   |d |d< |d |d< | jjjj d|d  |d< tjjdd|d gddgd}d}|r|jj|d jks|jr|j|d kr|d  d|d  d|d< | jjd|j d|j d |d  d!|j d"|d  
 n(|js|d |_|jd#d$ |j  tjj|d | d%}|sBd#}tj| j|d |d d&}t|d' d(}|d)rv| ||d) d }n^| jjd*|  |d+ D ]@}z| ||}W  qW n    | jd,| d- Y nX q|s| jjd.| d/|d0 W q|d1 d2 }	| jjd3|	  |	d4 d5kr0tj|d6< n|  |	| j! |d6< |d1 d7}
|
r| jjd8|
  |
d4 d5krtj|d9< n|  |
| j! |d9< n|d6 |d9< |d1 d: d; }| jjd<|  |d4 d5krtj|d=< n|  || j! |d=< |d1 d> |d?< |d1 d: d@ |dA< | "|| | #|| |j$sF|j%r|D ]}t&||||  qJ| '|||_(||_)|  |j  | *|| || _+|rntj,jdBdCd|jgdddDggdE}|d d d dkrtj-j|dFdG}|rn|.  nv|d d d d	ks$|d d d dkrntj-j|dFdG}tj-j|dHdG}|rR|.  |r`|.  |rn|.  t/  | 0|| | 1|| | 2  W q   | jj3  | jjdI|d  dJdKdL Y qX qd S )MNrR  rW   rV   rj   rD  zproject.agile:defaultr,   )project_type
logic_typeZproject_wikizproject.wiki:defaultr   sectionzCmfWiki:Class)r=  	parent_idtree_parent_idr>  u   Неизвестный типc                 S   s   g | ]}|d  qS rr  r#   r   r#   r#   r$   r   _  s     z7ConfluenceAPIImport._process_spaces.<locals>.<listcomp>u0   Импортируем пространство r   rS   task_code_prefixri   rk   rt   r>  r}  Fr  r  u   Проект с именем u    уже существует! r  z id=u   Переименуем в Trr   r  )r+   rk   rS   rd   rK  r-  uC   У пространсва нет домашней страницы rV  uW   Не удалось получить данные корневой страницы id=u   , возможно ее нет.uD   Не найдена домашняя страница в дампе zERR-0021r  r   r   uD   Определяем автора домашней страницы r   rD   r  r   uJ   Определяем владельца домашней страницы r  r   r   r  r  r  r  r  r  ZANDrA  u   Документыrn   u   Документ1)r  rS   u   Документ2u5   Ошибка импорта пространства zERR-0032r_  r  )4r`   r+   rX  r   ZCmfLogicTyper0   r`  r]  rG  r  r[  r6   r   ry   rz   r_  r>  rj   rk   r   rS   r   r   r   keysr   r   rN  rM   r"  rX   r  rw   r9   r  r  r|   r  r  r  r   r  r   rD  	CmfFolderr"   r   rb  _process_project_tagsr:  r<  r   )rA   r[   Zproject_fieldsr   rD  Zproject_is_newr  r-  Z	root_pager  r  r  r   Zrm_doc_folderZrm_doc1Zrm_doc2r#   r#   r$   _process_spacesE  s    
<

 


 z#ConfluenceAPIImport._process_spaces)r   c              	   C   s  ddl m} t }| j|d | |d dD ]:}| j rB d S |d D ]}|d |krJ|||d < qJq.| D ]h}| j r d S |d dd	d
d}||ddd}zd| jj	j	j
 d|d  d}	tjjddd|	 dgdgd}
|
s4dddd| dgdd|gddd| dgg}tjj|dgd}
|
sNtj|| jd|	d}
|
js^|	|
_n|	|
jkrz|
j |	 |
_||
_||
_|
jr|
jdd |
j  W qr   | jj  | jjd| d|d Y qrY qrX qrd S )Nr   )translitrd   r.  r  rj   rS   r   r   #r   ruT)Zlanguage_codereversedri   rk   rl   rm   r   r}  ORaliasILIKEr  "%)rS   r+   r|   rk   rr   u*   Не удалось создать тег zERR-0022r  )ZtransliteraterG  r   r  r  r+   r  valuesr   ry   rz   r   r  r0   rk   rS   r  r~   r   r   r   r   r"  )rA   r   rD  rG  r  r   r   Ztag_nameZ
name_aliasrk   Ztag_objr   r#   r#   r$   rE    sR     

  z)ConfluenceAPIImport._process_project_tagsc              
   c   sN   | j  d}t|D ].}t||dd}t|V  W 5 Q R X qd S )Nre  r  r   r   )rA   rf  Zgroup_idr   r#   r#   r$   _get_groups  s    zConfluenceAPIImport._get_groupsc              
   c   sF   | d}t|D ],}t| |d}t|V  W 5 Q R X qd S )Nr   r   )r   r   r   r   r   r1   )rA   Z
group_pathZ	user_pathr   r   r#   r#   r$   _get_group_members	  s    
z&ConfluenceAPIImport._get_group_membersT)r   rQ   c              	   C   sP  | d}| jjd|  t|d t| dd d}|s| jjd|  tjj	j
ttj d }t|d d |  d	tj }t|d ||t| dd d
}d| jjjj d|| j  d}d}|d d}	t|	dkr|	d nd|d< t|	dkr|	d n|	d |d< ddg}
tjj dd|d g|
d}|stjj ddd| dgdgd}|stjjdd|d g|
d}t|dkr| jjd|d  dt| ddd |  jd7  _g }|sftjjdd |d gd!}|sft|	dkrdd |	d g}nHt|	dkrXd"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r|  jd7  _| jjd#|d  dt| ddd |r|d }d}|sl|rdd}d}|d }tjj dd| g|
dr<| jd$| d%tj |d d	\}}| d&| d	| }|d7 }q| jd'|  tj||| jdd(}nd |fS |r8|js|jr|D ]}t||||  q| ddd)g |j!r||j!kr|j! | |_!n||_!tj"# }tj"$ }||j%kr|j%&| ||j%kr|j%&| d|_'|j(r8|j)dd* | j j*d7  _*||fS )+NrR   u2   Обрабатываем пользователя ZdisplayNamer   T)rS   does_not_worku8   Не указан Email для пользователя rC   @)rS   rR   r-   rR  ri   Fr   r   r   Z
first_name	last_namer   rg_member_ofr-  rM  r}  rk   rl   rm   u+   Пользователей с почтой z > zERR-0004rf   r  rS   rt   rn   rK  u+   Пользователей с именем uQ   Обнаружена учетная запись с дублирующим email u   , добавляем цифруr   u1   Создадим пользователя ext_id=)rk   r-  r+   r|   
user_localrr   )+r0   r+   r6   r   r   r  warnZcmfrT   ZCmfEmailZ
max_lengthr   rI   
ORG_DOMAINr  Ztranslit_stripry   rz   r9   r   r   r    r   r"  r3   r   rM   r5   r!  r|   r  r  r~  rk   r{   Zconfluence_group
user_grouprU  rx   rV  r~   r   r<   )rA   r   r  rp   rR   Z	user_dictZmax_lenrk   
is_createdZ	full_namerT   r   Zpersonsr   nr-  Zprefix_emaildomainr   Z
conf_grouprY  r#   r#   r$   _process_person  s    
" "    

z#ConfluenceAPIImport._process_personc           	   	   C   s  | j jjdds(| j jdtjd d S t }| dD ]}| j 	dd | j 
 r\ d S | |\}}|jr|jdd |j  |r|jjtjs||jj |d	g D ]}d
}| jjjrd}d| j jjj d||  d}tjjddd| dgdgd}|s*tjjd
d|d
 gdgd}|sLtj|| j |d
 d|d}n|jr^|d
 |_||jkrz|j | |_|jdd |j  |j | q|jr8|jdd |j  q8|r
| j jjddr
| j j!"dt#| d|  t$tj%j&t'|gd d S )Nri  TuA   Не грузим пользователей из-за опцийr  r   rf   r  rr   re  rS   rj   ri   rk   rl   rm   r   r}  rt   rk   r+   rS   r|   r  send_invitesu,   Отправляем приглашения u    пользователям: )args)(r+   rX  rV   r0   rM   r5   r!  r?   r   r  r  r]  r~   r   r   r   rR   rF  rI   rX  rY  r/   r:   r;   ry   rz   r   r{   r|   rS   rk   rU  rx   r6   r   r   Zschedule_deferred_jobr    Zregister_personsr   )	rA   r_  r   r   rZ  r   r   rk   rh   r#   r#   r$   _process_personsg  sP    


  

z$ConfluenceAPIImport._process_personsc                 C   sF  |   D ]6}d}| jjjr d}d| jjjj 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|| j|d d
|d}n|j
r|d |_||jkr|j | |_|jd
d |j  | | j d|| D ]D}| |d\}}|sq|j| |jr|jd
d |j  qqd S )NrS   rj   ri   rk   rl   rm   r   r}  rt   Tr^  rr   re  F)rP  r/   r:   r;   r+   ry   rz   r   r{   r0   r|   rS   rk   r   r   r   rQ  r   r   r]  rU  rx   r~   )rA   r   r   rk   rh   r   r   r   r#   r#   r$   _process_groups  s6    
  


 z#ConfluenceAPIImport._process_groupsc                 C   s   t dD ]D}|dkr4| jjd| j d| tjd d| _|   | js qNqt dD ]>}d}|dkr| jjd| d| tjd |  }|sV qqV|  j|7  _|   | 	  | 
  | j S )u   
        Запуск импорта

        :return bool: Истина в случае успешного импорта
        r  r   uB   При дампе данных обнаружены ошибки (u0   ), попыка повторного дампа r  uF   При дампе вложений обнаружены ошибки ()r   r+   rM   r3   r5   r!  rn  r  ra  rF  _process_cross_links)rA   r)  r3   r#   r#   r$   process_import  s&     z"ConfluenceAPIImport.process_importc                 C   s<   |j dtdids*|jdks*| dr8||  |S )uS   
        Из документов MS создаем наши превью
        styleZ
backgroundr  r  )r  r  compilerS   r  Zcreate_preview_tag)rA   r   r  r#   r#   r$   _create_preview  s    *z#ConfluenceAPIImport._create_preview)r   r  c                 C   s  dd l }|s|S t|d}t|d}|dd D ]}zz|jdrj| jjd|  W W q2|	dr|jd 
d	r| jjd
|  W W \q2| jjd|  |	dr|jd }n
|jd }|j|d}	|	r|	d|d< |	d|d< W W q2d|jddkr|jd dd dd }
| |
}|r|jd |jd< |j|jd< d|jd< | jjd|j  n| jjd|jd   W W Lq2tdt|}|r:|d}tjj| jjjj d| d}|r d|jd< |jd |jd< |j|jd< nd|d< ||d< W W q2tj|dd dd }tj|}|jdkr|jdr|jd |jdd krt| j d t|j j!" d! d"|jd d#d$}|# s| jj$d%| d&|d' W W q2n|%|d(}||& kr|'|^}tj(j||d)}|sZtj(||| jd*}|j)dd+ |*|+  |j)dd+ |j,-  W 5 Q R X n2| jj$d,| d-| d.|d' W 5 Q R  W W Bq2W 5 Q R X tj(j|d/d0d1g|d2}|r|	dr|jd |jd3< |j.j/|jd< d|jd< |	d4r<|jd4 |jd5< |jd4= t01|jd dd }|r|d r|d 
d6rd6|_2d7|jd7< d8|jd9< d8|jd:< n,|r|d r|d 
d;s| 3|| |	dr|jd |jd< |j.j/|jd< d|jd< t01|jd dd \}}|r|
d6rd6|_2d7|jd7< d8|jd9< d8|jd:< |4d<}|jd |jd< ||jd=< |5| n| 3|| | jjd|j.  n2|jdd>kr| jj$d?| d@|d' W W (q2W n   | jj$dAdB|d' Y nX W 5 | jjd|  X q2t|S )CNr   r  c                 S   s   |  dp|  dS r   r   r   r#   r#   r$   r     r   z4ConfluenceAPIImport._process_links.<locals>.<lambda>u'   Не обработали ссылку r%  u   Уже обработали r   rH  u   Это якорь u&   Обрабатываем ссылку r   )r   data-linked-resource-typedata-linked-resource-idz/people/r   r   r   r   	href_origTu   Заменили на u?   Пользователь не найден для ссылки z+href="/pages/viewpage.action\?pageId=(\d+)"rC   ri   r  rL  r"   z!data-linked-resource-container-idr@  r   rK  r   r  uA   Документ с файлом не найден в дампе zERR-0005r  r   r  )rS   rs   r+   rr   u	   Файл u    не найден в zERR-0006r   r  r  )rS   rT   rs   Zsrc_origZsrcsetZsrcset_origZvideoZcontrolsr  r  r  Zimagesourcer   rs  u%   Не найдено вложение zERR-0007u,   Ошибка обработки ссылкиzERR-0008)6rt  r   r   r+   r6   r   r   r0   r   r   r   r  r   rw   r   r  r  r   rh   r   r"   ry   rz   r   r   r   r   
class_namerk   r   r   r   rs   r  r1   r   r"  ru  r  r   r  r   r  rb   r   r   r   rV   r   r   rS   rg  r  rx   )rA   rs   r   r  Zmake_previewrt  r  r   r   Zraw_tagZ
account_idr   r	  r   Zrel_docrS   r   attach_pathr{  r   Z
attach_objr   rz  rk  r#   r#   r$   r    s    










 

 


 

 






z"ConfluenceAPIImport._process_linksc                 C   s  |j dkrd}nd}| jjd t|d}t|d}|jddidD ]}z|d	rf| |d	 }ntd
t|j	t
|jt
|jt
|jt
|jdd}|jd|d d}	|	r|	|j tt
|d}W qF tk
r }
 z| jjd| d|d W 5 d}
~
X Y qFX qFt
|S )u]   
        Упоминания пользователей
        confluence-userlink
        r  z
                <a class="external" href="{person_href}" rel="noopener" target="_blank" data-macros="mentions" data-mention-type="person" data-object-id="{person_id}">@{person_name}</a>
            u	  
                <span class="macros-panel mentions-macros" contenteditable="false" data-id style="display: inline-flex; flex-direction: column; position: relative;">
                    <span class="extension-container" contenteditable="false" data-id data-layout="default">
                        <span class="extension-title" data-id>
                            @Упоминания <span class="excerpt-title" data-id>| {person_login}</span>
                        </span>
                        <span class="macros-actions" data-id>
                            <span class="macros-delete" data-id>
                                <svg viewbox="0 0 18 18" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                                    <path fill="#222" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                    <path fill="#222" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                    <path fill="#222" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                </svg>
                            </span>
                        </span>
                    </span>
                    <span class="ak-renderer-wrapper" data-id>
                        <a class="external" data-id data-macros="mentions" data-mention-type="person" data-object-id="{person_id}" rel="noopener">
                            <span class="lds-ring" data-id>
                                <span data-id></span>
                                <span data-id></span>
                                <span data-id></span>
                                <span data-id></span>
                            </span>
                        </a>
                    </span>
                </span>
            uH   Конвертируем упоминания пользователейr  rh  Zuserinfor  Zuserkeyu]   Не найдены аттрибуты для определения пользователя)Z	person_idZperson_loginZperson_hrefZperson_namezconfluence-userlinkr   )class_r   uZ   Не удалось преобразовать ссылку на пользователя zERR-0009r  N)rl  r+   r6   r   r   r   r0   rw   rP   r  r   rj   r-  r   rS   r  r  r  r"  )rA   rs   r   r  r  r  r   r   r  r  r   r#   r#   r$   r  ^  s8    



 z%ConfluenceAPIImport._process_mentionsc                 C   s   |dkrd S z|  |}W n,   | jjd| dtjd tj Y S X | |dd\}}|s| jjj	
drtjj
| jjd d}| jjd| d| tjd n | jjd| d	d
dd tj}|S )Nunknownu6   Не найден пользователь user_id = "u9   ", в дампе, указываем системногоr  FZdefault_user_idrr  uA   ", ставим пользователя по умолчанию u*   ", указываем системногоzERR-0023r    r  )r   r+   rM   r5   ZERRORrX   Zsystem_userr]  rX  rV   r0   r   r    r!  r"  )rA   r   rf   r   r   r#   r#   r$   rw     s$      zConfluenceAPIImport._get_personc                 C   sx   |d d d d d }t j|}t jj||d}|s`| jjd|d d  d	| d
d|d || ||| dS )u_    Конвертирует макрос Word или Excel через atlas_doc разметку r   
parametersmacroParamsrS   rV   r  u)   Ошибка обработки тега extensionKeyu(   , не найдено вложение "r  r  r  N)	r   r"   r   r  r0   r+   r"  r  r  )rA   r   elemr   r   r   r  r#   r#   r$   _convert_msoviewer_in_atlas_doc  s    z3ConfluenceAPIImport._convert_msoviewer_in_atlas_doc)r   r  rQ   c           .      C   sR
  dd l }|s$| jjd t|d}t|}d}t|D 
]}| j rN 
qN|d7 }|d dkr4|jddd	d
dd}	dd |j	ddidD 
 }
g }|
jD ]}|dkrq|| qt|d D ]N\}}|d d }|jd| dd	d| ddd}|| j|_|	| q|
|	 tt|d}n|d dk	rZd }
|d dr|jd|d d id}
|
s| jjd|d d  d|d d   q8nNd|d d kr|d d d d r|jd!|d d d d  d" id}
|d d d#krd$}|jd|d d id}
|
	rX|d d d% d& d" }|d d d% d'}|	rXt|dd&j|d" |d(}|
|j tt|d}
q*|d d d)kr2d*}|jd|d d id}
|
	rX|d d d% d& d" }|	rXt|dd&jd&d+d |
jD |d,d}|
|j tt|d}
q*|d d d-r|d d d% d. d" }tj|}tjj||d/}d0}|s|d d d% d1 d" }t| j d2t|jj d3|d4d5}|! s| jj"d6| d7|d8 q8n|#|d9}||$ kr|%|>}tj|}tj||| jd:}|j&d;d< |'|(  W 5 Q R X t)*| d=}|$ D ]v}|+|rl|%|T}tj|}tjj||d/}|stj||| jd:}|j&d;d< |'|(  W 5 Q R X qlW 5 Q R X |s| jj"d>| d?| d@|d8 q8tj|}tjjdAdB|gd'dC| dDggdEgdF}dG}dG}|d d d% dr|d d d% d d" }|d d d% dHr|d d d% dH d" }|j,j-|j.j-||dI} |r|j/| dJ< nd&| dJ< t|dd&jf | d}|
|j tt|d}
q*|d d dKkr>dL}!t|j.}"t|j,}#dM|"|"dNd&dOdMdP}$|d d d% }%|%r|%dQrt01|%dQ d" 2 |$dR< |%dSr|%dS d" }tjj|j3|d/}&|&stj4j|dT}&|&rt|&j.|$dU< t|&j,}#n| jjdV|d   |%dWr$|%dW d" |$dX< |%dYr@|%dY d" |$dZ< |%d[r\|%d[ d" |$d\< |%d]rdOddd^}'|'|%d] d" |$d_< |%d`rd'dadbdc}(|(|%d` d" |$dd< |%dert01|%de d" 2 |$df< dgdhdi |%5 D })t|!j|"|#t0j6|$dMdj|)dkdd&d}*|
|*j tt|d}
q*|d d dlkr|jddld	dmd}+|jdnddoid},|,|d d d% do d"  |+|, |jdpdqddrdsd}-|-|d d d% dt d"  |+|- |
|+ tt|d}nb|d d duk	r(| 7|||
du tt|d}n0|d d dvk
r*| 7|||
dv tt|d}n|d dwk
r*|d d dxk
r*|d d d% d'
r*|d d d% d' d" }dy}|jd|d d id}
|

rt|dd&j|d&dzd |
jD d{d}|
|j tt|d}n| jjd||  |dr8| 8t|||d |}q8|S )}Nr   uC   Конвертация текста из atlassian разметкиr  rC   r   ZlayoutSectionZdivZfalsetruezmceNonEditable selected)contenteditablezdata-layout-sectionr$  r  c                 S   s,   g | ]$}d |j d krd|j d kr|qS )zfixed-widthr$  Zsingler  r   r#   r#   r$   r     s     z:ConfluenceAPIImport._convert_atlas_doc.<locals>.<listcomp>r$  ZcolumnLayoutr   r
  r   r  rm   zflex-basis: )zdata-column-widthzdata-layout-columnre  	extensionZlocalIdzdata-local-idu&   Не удалось найти тег u    для rr  ZmacroMetadatarp  ZmacroIdr  rV   zexcerpt-includeuG  
                    <div class="macros-panel macros-include-block" contenteditable="false" data-include-block-name="{name}" data-localid="{page_name}" data-mce-contenteditable="false">
                    <div class="extension-container" contenteditable="false" data-layout="default" data-mce-contenteditable="false">
                    <span aria-label="Макрос Include. " role="img"> <svg height="14" id="Outline" viewBox="0 0 24 24" width="14" xmlns="http://www.w3.org/2000/svg"><path d="M19.949,5.536,16.465,2.05A6.958,6.958,0,0,0,11.515,0H7A5.006,5.006,0,0,0,2,5V19a5.006,5.006,0,0,0,5,5H17a5.006,5.006,0,0,0,5-5V10.485A6.951,6.951,0,0,0,19.949,5.536ZM18.535,6.95A4.983,4.983,0,0,1,19.316,8H15a1,1,0,0,1-1-1V2.684a5.01,5.01,0,0,1,1.051.78ZM20,19a3,3,0,0,1-3,3H7a3,3,0,0,1-3-3V5A3,3,0,0,1,7,2h4.515c.164,0,.323.032.485.047V7a3,3,0,0,0,3,3h4.953c.015.162.047.32.047.485Z"></path></svg> </span> <span class="extension-title">Макрос Include. "Вставить выборку"</span> <span class="macros-actions"> <span class="macros-edit" style="margin-right: 7px;" data-mce-style="margin-right: 7px;"> <svg _ngcontent-aiw-c17="" class="ng-star-inserted" style="width: 14px; height: 14px; color: #444444;" viewBox="0 0 24 24" data-mce-style="width: 14px; height: 14px; color: #444444;"><path _ngcontent-aiw-c17="" d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z" fill="#444"></path></svg> </span> <span class="macros-delete"> <svg class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;" viewBox="0 0 18 18" data-mce-style="width: 14px; height: 14px; color: #222222;"><path class="ng-star-inserted" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" fill="#222" stroke="none" stroke-width="1"></path><path class="ng-star-inserted" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" fill="#222" stroke="none" stroke-width="1"></path><path class="ng-star-inserted" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" fill="#222" stroke="none" stroke-width="1"></path></svg> </span> </span>
                    </div>
                    <div class="ak-renderer-wrapper" data-fabric-macro="null" data-macro-body="" data-macro-parameters="[object Object]">
                    </div>
                    </div>
                    </div>rq  r   rS   )rS   	page_nameZincludeu  
                    <div class="macros-panel macros-include-page" contenteditable="false" data-macros="include-page"
                         data-param-pageid="{page_name}" data-mce-contenteditable="false"
                         data-rendered="true">
                        <div class="extension-container" contenteditable="false" data-layout="default" data-mce-contenteditable="false">
                            <span aria-label="Макрос Include. " role="img"> <svg xmlns="http://www.w3.org/2000/svg" id="Outline"
                                                                                 viewBox="0 0 24 24" width="14" height="14"><path
                                d="M19.949,5.536,16.465,2.05A6.958,6.958,0,0,0,11.515,0H7A5.006,5.006,0,0,0,2,5V19a5.006,5.006,0,0,0,5,5H17a5.006,5.006,0,0,0,5-5V10.485A6.951,6.951,0,0,0,19.949,5.536ZM18.535,6.95A4.983,4.983,0,0,1,19.316,8H15a1,1,0,0,1-1-1V2.684a5.01,5.01,0,0,1,1.051.78ZM20,19a3,3,0,0,1-3,3H7a3,3,0,0,1-3-3V5A3,3,0,0,1,7,2h4.515c.164,0,.323.032.485.047V7a3,3,0,0,0,3,3h4.953c.015.162.047.32.047.485Z"></path></svg> </span>
                            <span class="extension-title">Макрос Include. "Вставить страницу"</span> <span class="macros-actions"> <span
                            class="macros-edit" style="margin-right: 7px;" data-mce-style="margin-right: 7px;"> <svg _ngcontent-aiw-c17=""
                                                                                                                     viewBox="0 0 24 24"
                                                                                                                     class="ng-star-inserted"
                                                                                                                     style="width: 14px; height: 14px; color: #444444;"
                                                                                                                     data-mce-style="width: 14px; height: 14px; color: #444444;"><path
                            _ngcontent-aiw-c17="" fill="#444"
                            d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path></svg> </span> <span
                            class="macros-delete"> <svg viewBox="0 0 18 18" class="ng-star-inserted"
                                                        style="width: 14px; height: 14px; color: #222222;"
                                                        data-mce-style="width: 14px; height: 14px; color: #222222;"><path fill="#222"
                                                                                                                          d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z"
                                                                                                                          stroke="none"
                                                                                                                          stroke-width="1"
                                                                                                                          class="ng-star-inserted"></path><path
                            fill="#222" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path><path
                            fill="#222" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path></svg> </span> </span>
                        </div>
                        <div class="ak-renderer-wrapper">{content}</div>
                    </div>
                    c                 S   s   g | ]}t |qS r#   r  )r]   valr#   r#   r$   r   $	  s     )r
  rx  r  ZdiagramNamer  u  
                    <div data-drawio-title="{name}" data-drawio-type="diagram" data-attach-id="{attach_id}" class="drawio-content" contenteditable="false">
                        <div class="header">Диаграмма: "{name}"</div>
                        <div class="content">
                            <img cmf_converted=True src="{img_src}" alt="" data-mce-src="{img_src}" width="{width}" height="{height}">
                        </div>
                    </div>
                    ZpageIdr@  rK  r   r  uI   Документ с диаграммой не найден в дампе zERR-0010r  r   )rs   rS   r+   Trr   z.*\.png$u   В документе u$    не найден файл с xml: zERR-0011rs   rt   rl   r  r   r}  r  r  r  r  rJ  u  
                        <div
                            class="macros-panel"
                            contenteditable="false"
                            data-children-docs="{doc_id}"
                            data-id
                            data-macro-parameters='{params}'
                            data-macros="children-docs"
                            original-data-macro-parameters="{original_params}"
                        >
                            <div class="extension-container" data-id data-layout="default">
                                <span aria-label="Макрос " data-id role="img">
                                    <svg xmlns="http://www.w3.org/2000/svg" id="Outline" viewbox="0 0 24 24" width="20" height="20">
                                        <path d="M22.485,10.975,12,17.267,1.515,10.975A1,1,0,1,0,.486,12.69l11,6.6a1,1,0,0,0,1.03,0l11-6.6a1,1,0,1,0-1.029-1.715Z"></path>
                                        <path d="M22.485,15.543,12,21.834,1.515,15.543A1,1,0,1,0,.486,17.258l11,6.6a1,1,0,0,0,1.03,0l11-6.6a1,1,0,1,0-1.029-1.715Z"></path>
                                        <path d="M12,14.773a2.976,2.976,0,0,1-1.531-.425L.485,8.357a1,1,0,0,1,0-1.714L10.469.652a2.973,2.973,0,0,1,3.062,0l9.984,5.991a1,1,0,0,1,0,1.714l-9.984,5.991A2.976,2.976,0,0,1,12,14.773ZM2.944,7.5,11.5,12.633a.974.974,0,0,0,1,0L21.056,7.5,12.5,2.367a.974.974,0,0,0-1,0h0Z"></path>
                                    </svg>
                                </span>
                                <span class="extension-title" data-id>Макрос "Отображение дочерних"</span>
                                <span class="extension-object-name" data-id>| {doc_name}</span>
                                <span class="macros-actions" data-id>
                                    <span class="macros-edit" data-id style="margin-right: 7px;">
                                        <svg _ngcontent-aiw-c17="" viewbox="0 0 24 24" class="ng-star-inserted" style="width: 14px; height: 14px; color: #444444;">
                                            <path _ngcontent-aiw-c17="" fill="#444" d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                                        </svg>
                                    </span>
                                    <span class="macros-delete" data-id>
                                        <svg viewbox="0 0 18 18" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                                            <path fill="#222" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                            <path fill="#222" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                            <path fill="#222" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                        </svg>
                                    </span>
                                </span>
                            </div>
                            <div class="ak-renderer-wrapper" data-fabric-macro="null" data-id data-macro-body=""></div>
                        </div>
                    FZ50r0  )isShowChildrenr  
documentIdchildrenAmountr7   includeViewTypeisOrderByDeskallrz  rL  r\   r{  uE   Не удалось обработать тег оглавления firstr|  depthr7   re  Z
headerTypeZexcerptType)r0  Zsimplezrich contentr}  r  r  r  )r   Zcreationr  ZsortTypereverser~  r  c                 s   s$   | ]\}}| d |d  V  qdS )r  rV   Nr#   r   r#   r#   r$   r   	  s     z9ConfluenceAPIImport._convert_atlas_doc.<locals>.<genexpr>r  )r'   doc_namer  r!  zpaste-code-macro)r$  r%  pr   Zprezlanguage-markup1)r$  rv  zdata-mce-selectedZ__bodyContentr  r  ZbodiedExtensionZexcerptu  
                    <div class="macros-panel macros-excerpt-block" contenteditable="false" data-excerpt-name="{name}" data-mce-contenteditable="false">
                    <div class="extension-container" contenteditable="false" data-layout="default" data-mce-contenteditable="false"><span aria-label="Макрос Include. 'Создать выборку'" role="img"> <svg height="14" id="Outline" viewBox="0 0 24 24" width="14" xmlns="http://www.w3.org/2000/svg"><path d="M19.949,5.536,16.465,2.05A6.958,6.958,0,0,0,11.515,0H7A5.006,5.006,0,0,0,2,5V19a5.006,5.006,0,0,0,5,5H17a5.006,5.006,0,0,0,5-5V10.485A6.951,6.951,0,0,0,19.949,5.536ZM18.535,6.95A4.983,4.983,0,0,1,19.316,8H15a1,1,0,0,1-1-1V2.684a5.01,5.01,0,0,1,1.051.78ZM20,19a3,3,0,0,1-3,3H7a3,3,0,0,1-3-3V5A3,3,0,0,1,7,2h4.515c.164,0,.323.032.485.047V7a3,3,0,0,0,3,3h4.953c.015.162.047.32.047.485Z"></path></svg> </span> <span class="extension-title">Макрос Include. 'Создать выборку' <span class="excerpt-title">| name = {name}</span></span> <span class="macros-actions"> <span class="macros-edit" style="margin-right: 7px;" data-mce-style="margin-right: 7px;"> <svg _ngcontent-aiw-c17="" class="ng-star-inserted" style="width: 14px; height: 14px; color: #444444;" viewBox="0 0 24 24" data-mce-style="width: 14px; height: 14px; color: #444444;"><path _ngcontent-aiw-c17="" d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z" fill="#444"></path></svg> </span> <span class="macros-delete"> <svg class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;" viewBox="0 0 18 18" data-mce-style="width: 14px; height: 14px; color: #222222;"><path class="ng-star-inserted" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" fill="#222" stroke="none" stroke-width="1"></path><path class="ng-star-inserted" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" fill="#222" stroke="none" stroke-width="1"></path><path class="ng-star-inserted" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" fill="#222" stroke="none" stroke-width="1"></path></svg> </span> </span></div>
                    <div class="ak-renderer-wrapper" contenteditable="false" data-fabric-macro="null" data-macro-body="" data-macro-parameters="{name}" data-mce-contenteditable="true">
                    {content}
                    </div>
                    </div>
                    c                 S   s   g | ]}t |qS r#   r  r   r#   r#   r$   r   	  s     )rS   r
  u   Не нашли тег для )9rt  r+   r6   r   r   r   rJ  r  r  r   r7  contentsrx   r  r  r   r0   r  r   r   r  r  r   rF  r   r"   r   r  r   r   r   rs   rB  r   r"  ru  r  r   r   r  rb   r  rf  r	  rS   rV   rj   r   r   r   r   r@  r_  r   r   rt  r  ).rA   r   r   r  r  rt  r;  r)  rs  Ztag_layout_sectionr   r  ccolr  Ztag_layout_colr  rx  Zexcerpt_namer^   rS   r   r  r   rm  r{  r   ZregexpZname_zipZfile_name_zipr
  r  r  r  r@  r  r  r!  Zparent_pageZview_type_mapZsort_type_mapZoriginal_params_strZnew_soupZ
code_blockr   rV   r#   r#   r$   r    s   






**
"

&'


 




*.
z&ConfluenceAPIImport._convert_atlas_docc                    s  t t d fdd}t t d fdd}dddgd	d
dgg}dD ]8}tt| }|j|d} jjd|j d|  d}d}|dkr@ j r jjd  dS |j	|ddddg|| || | gd}	|d7 }||8 }|	D ]}
zRd}t
|
drJ||
jj|
_||
jj|
_|
jr|d7 }|
jdd |
  |
j  nB||
jj|
_||
jj|
_|
jr|d7 }|
jdd |
j  |
jD ]}|jdkrqz8||jj|_|jr|d7 }|jdd |
j  W n>   |
j   jjd| d|j d|
d Y  q"Y nX q jjd |
 d!|  W q   |
j   jjd|
 d|
j d"|
d Y qX qqq@dS )#uU   
        Заменим ссылки на задачи и документы
        )r   rQ   c                    sN  | s| S t | d}|js| S |jddidD ]}d }|d}|sR jjd q,tjj	ddd	| d
gdgd}|D ]}|j
d |krv|} qqv|s jjd| d q,|tj| q,|dD ]f}|jdrq|jd}|s jjd|  q|ds* jjjjj | }| jjjjjrd }d }|d}	|d}
|	dkr4|
r4 jjjj d|
 }tjj|dgd}|stjjdd jjjj dgddd|
 d
ggd}|s jjd|  q|jt|jkst|tjr"d|jd< |jd |jd< |j|jd< q̐n|	d kr|
rtjjddd!|
 gdgd}|s~ jjd"|
  qd|jd< |jd |jd< |j|jd< q̐nxd#|jd krPtd$|jd D ]B} jjjj d|d%d   }tjj|dgd}|r qq|s2 jjd&|jd   q|s" jjd|  qnd'|jd krtd(|jd }|s jjd)|jd   qtjj	ddd	|d*d%d   d
gdgd}|D ].}|j
d |d*d%d  kr|} qq|s" jjd+|d*d%d    qnq|tj| qd,d-d. |jj D S )/Nr   r  Zjirar  zdata-jira-keyuV   Не удалось найти код задачи в атрибуте "data-jira-key"r  rl   z%"key":"rN  r}  r   u;   Не удалось найти задачу по коду "r  ar%  r   u!   Ссылка без адреса r   rh  ri  rL  ri   r  rk   ::%%"homepage":{"id":"rn   u:   Не удалось найти документ по ид Trj  r   z%::uB   Не удалось найти пространство по ид z/wiki/z\/\d+rC   u:   Не удалось найти ид документа в z/browse/z	\/\w+-\d+u6   Не удалось найти код задачи в r   u:   Не удалось найти задачу по коду r   c                 S   s   g | ]}t |qS r#   r  r  r#   r#   r$   r   g
  s     zQConfluenceAPIImport._process_cross_links.<locals>.check_links.<locals>.<listcomp>)!r   r  r   r0   r+   r6   r   r   CmfTaskr   r  r  ZCmfPluginCsvZcreate_tag_linkr   r   ry   r  rV   rz   r"   r_  stringr   rS   
isinstancer   r  findallr  rh   r   rJ  )r   r  r   r   Ztask_keyobjsr   r   rk   Zresource_typeZresource_idZext_coderY   r#   r$   check_links	  s    



 


$
"z=ConfluenceAPIImport._process_cross_links.<locals>.check_linksc                    s&  | s| S t | d}|jddidD ]}|jdr4q"|jd}|sZ jjd|  q"|jd} jjjj d	| }t	j
j|d
}|st	jjdd jjjj dgddd| dggd}|rt|}|jj|d< |jj|d< t||d< d|d< |d= q" jjd|  q"t|S )uz   
            Заменяет ссылку на корневую страницу в макросе Page Tree
            r  zdata-macrosz	page-treer  r%  r  u3   Макрос Page Tree без параметров Zroot_page_originalri   r  rk   rl   r  r  r  rN  rn   rZ  Z
rootLocaleru  ue   В макросе Page Tree не удалось найти корневую страницу по ID )r   r   r   r0   r+   r6   r   ry   rz   r   r"   r_  r   r   rj   rV   rS   r   r   )r   r  r   r#  Zroot_page_idZroot_page_ext_idZpagetree_rootZmacro_paramsrY   r#   r$   check_pagetree_rooti
  s<    

zEConfluenceAPIImport._process_cross_links.<locals>.check_pagetree_rootr+   ru   Nr|   rt   T)r"   r  r_  rD  rn   u)   Конвертируем ссылки в u=    на локальные задачи и документы: rh  r   u'   Отменили конвертациюr   zcomments.log_levelzcomments.text
text_draft)ro   rT   slicerC   rr   r   r   u>   Не удалось конвертировать ссылки r   zERR-0013r  u   Проверили u!    и конвертировали zERR-0014)r   varsr   r  r+   r6   r   r  r  r   hasattrr   rV   r  r~   r   Z
do_approver   r   Zcommentsr  r   r"  )rA   r  r  r   Z	mode_nameZmodelr;  r<  r)  r  r   rx  r  r#   rY   r$   rc  	  st    p+






z(ConfluenceAPIImport._process_cross_links)F)N)r   r  )TT)T)N)Nr   r   r   r   r   r   Z	CmfImportrB   r8   r   rZ   staticmethodr   r   r`   ra   r   r   r   r   r   r   r   r   r   r   r*  r?  rE  rG  r]  rd  rg  rn  r|  r  r  rv   r  r  r  r  r  r  r  rN  r  r  r  rI   ZIMPORT_OBJ_CNTr  r  r  r  r  r  r  r  r,  r:  r<  rF  rE  rP  rQ  r]  ra  rb  r  rd  rg  r  r  rw   rt  r  rc  r#   r#   r#   r$   r)   &   s    ?!.

 1	7/*%>#T

 2;a P *X) B  4r)   )"r   r  r   Zcmf.appr   pathlibr   Zurllib.parser   r   typingr   r   r   r	   r   Zcmf.data_providers.baser
   Zcmf.includeZcommon.models.cmf_active_entityr   Zmodules.confluence.apir   Z%common.models.cmf_plugin_import_mixinr   Zbs4r   Zatlassian.errorsr   r   Z	dataclassr   r%   r)   r#   r#   r#   r$   <module>   s*   	