U
    ^h>                    @   s  d dl Z d dlZd dlZd dlZd dlZd dlZd dl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mZ d dlZd dlT d d	lmZ d d
lmZ d dlmZ d dlZd dlm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)permutations)*)ConfluenceApi)CmfPluginImportMixin)BeautifulSoup)JQLNormalizerc                   @   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                   @   sx  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 dd2d3Z!dd4d5Z"d6d7 Z#d8d9 Z$d:d; Z%d<d= Z&ded>d?d@Z'dAdB Z(dCdD Z)dEdF Z*dGdH Z+dIdJ Z,dKdL Z-dMdN Z.dOdP Z/edQdRdSZ0dTdU Z1eedVdWdXZ2dYdZ Z3dd[d\Z4d]d^ Z5ed_d`daZ6edbdc Z7ddde Z8ddhdiZ9djdk Z:e;j<fdldmZ=dndo Z>dpdq Z?drds Z@dtdu ZAdvdw ZBddxdyZCdzd{ ZDd|d} ZEd~d ZFdd ZGdd ZHdd ZIedddZJdd ZKdddZLdd ZMdd ZNdd ZOdd ZPdd ZQdd ZRdd ZSdd ZTdd ZUdd ZVdd ZWdd ZXdd ZYedddZZdd Z[dd Z\deedddZ]dd Z^dd Z_dd Z`eadddZbdd ZcdddZdedddZedd ZfdddZgdeedÜddńZhd 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r|d| _d| j_d| j_t | _t | _d| _tj| _d S )	Nzsystem:defaultcoder   zancestors,history,history.lastUpdated,history.ownedBy,body,body.editor,body.atlas_doc_format,body.view,body.styled_view,body.wiki,body.plain,body.dynamic,body.storage,body.editor2,body.export_view.webresourcezatlassian.rest_clientZuserKey	accountIdF)r)   r*   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cloudimported_object_countjson_object_countr   treeset_selected_objsdump_page_versionsconfig$IMPORT_CONFLUENCE_DUMP_LAST_PAGE_VERdump_last_page_ver)selfr)   r*   Z	scheme_wfr4   r"   r"   r#   __init__-   s(    
zConfluenceAPIImport.__init__c                 C   s<   dd l }dd l}|| _ || _tj| _tj| _| j | _	d S )Nr   )
	threadingqueuer?   ZIMPORT_THREADSZthreading_max_forksZ"IMPORT_CONFLUENCE_DOWNLOAD_THREADSdownload_threading_max_forksr*   Zget_max_processesmax_processes)rB   rD   rE   r"   r"   r#   r6   J   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)rJ   fieldsselectedObjects)rJ   valueimport_type)r   gZcurrent_personrI   rJ   rB   r"   r"   r#   calc_import_settingsS   s    
z(ConfluenceAPIImport.calc_import_settings)settingsrH   c                 C   s   dd | D S )uO   Преобразуем список с настройками в словарьc                 S   s   i | ]}|d  |qS rJ   r"   .0sr"   r"   r#   
<dictcomp>\   s      z;ConfluenceAPIImport._normalize_settings.<locals>.<dictcomp>r"   )rR   r"   r"   r#   _normalize_settingsY   s    z'ConfluenceAPIImport._normalize_settingsc                 C   s   g S )uo    Для импорта из Confluence предварительный просмотр не требуется r"   rP   r"   r"   r#   preview^   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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rtd}| 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}|rb|d | qbq|jr|r||_|jr$|jdd t  |j  dd|jgddd gg}
t	jj|
d t  |d rt	j|j| jd|d djdd |d rt	j|j| jd|d djdd t  d S )N)readwritepath	operationrZ   restrictionsuserresultsZprivategroup::idrJ   ext_idLIKE%filterupdatereadonlyr[   TZsave_importparent==r*   !=)rl   r*   Zaccess_levelsubjects)_get_restrictions_get_personr7   appendr)   r8   r*   pluginsource_hashr   CmfPersonGroupr.   import_originalperm_policy
is_changedsave
cmf_commitZperm_aclr/   ZCmfAccessRuleZbulk_delete)rB   docdoc_objZpermsrw   restrictionr_   person
group_inford   _filterra   r"   r"   r#   _process_restrictionsb   sz    
 


 

 
 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r6|d dkr6|\}}}}z|dd}| 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         wiki   spaces   pages   Zdisplay+ uC   Ошибка получения документа по pretty url : uo   Не смогли получить документ по pretty url (возможно не тот домен): rc   )splitr   r\   lenreplacer)   Zget_page_by_title	Exceptionr*   r4   warninginfor   )	rB   urlr,   Zsplitted_url_spacetitleZfind_confl_docer"   r"   r#   _get_pageid_by_url   s6    

z&ConfluenceAPIImport._get_pageid_by_urlFrS   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 t  d S )N.jsonz.json.dirtya+r   
TZ	only_data)r*   get_download_pathjoinpathexistsopenr:   r[   jsondumpsshutilmovery   rz   )rB   Zapi_funcrJ   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)rB   rJ   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   r/   )rB   Zdir_pathfpr   r"   r"   r#   _list_users_from_dump   s    z)ConfluenceAPIImport._list_users_from_dump)textattachments_dirobjc                    sJ  |sd S | j jd t|ddd D ]}d}|drBd}|j|  tj	 }zddd	d
g}t
 fdd|D rW q*td rW q*d} dst| r| j jd   W q*|js|jstj| jj  tj	 }|jdr|j| jjkr$| j jd   W q*tj dd dd }	t|	\}
}|
sp| j jd|	  W q*tj|	}||}| j jjj d|d  }tjj || j jjjd}|stj| j  || j jjjd}||_ ||_!d|_"|#  t$  W q* t%k
rB } z$t&  | 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/thumbnails/z/thumbnail/z	/display/c                 3   s   | ]}| kV  qd S Nr"   )rU   Zurl_partr   r"   r#   	<genexpr>   s     z2ConfluenceAPIImport._dump_links.<locals>.<genexpr>/display/~([^/]+)(?:/)?$z3\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\bzmailto:u   Это почта: httpuH   Это внешняя ссылка, оставляем как есть: r   r   ?r   u   Это не файл: rb   rc   )r   
obj_ext_idrt   )r*   r   r   rt   Fu0   Не удалось скачать ссылку r   )'r*   r4   r   r   find_allr   attrsurllibparser   anyresearch
startswithr   schemenetlocurljoinr)   r   unquoter   	mimetypes
guess_typer   r!   Z_get_filenamer   rs   rt   CmfImportDownloadr.   r\   rJ   
downloadedry   rz   r   cmf_rollback)rB   r   r   r   r   key
parsed_urlZ	url_partsZemail_patternrJ   	mime_typeencoding	file_namer   rd   download_jobr   r"   r   r#   _dump_links   st    


 



zConfluenceAPIImport._dump_linksc                    s   z|  |W S    d}| jj||d  s<| jj||d  sP| jj||d  r| jjrp| jj d d}n| jj d d}  fdd| D  |	d}t
|d	}|t d
  W 5 Q R X | jjd| d Y nX d S )Nz%operations,status,email,personalSpacer2   r-   )usernamer   c                 3   s*   | ]"\}}| ks|d kr||fV  qdS ) Nr"   rU   kv	user_infor"   r#   r   +  s     z5ConfluenceAPIImport._get_user_info.<locals>.<genexpr>
users.jsonr   r   u4   Информация о пользователе ID u    добавлена в дамп)_get_user_info_from_dumpr)   Zget_user_infoZget_user_info_by_keyZget_user_info_by_usernamer8   Zget_user_detailri   itemsr   r   r[   r   r   r*   r4   r   )rB   user_id	dump_pathr2   Zuser_detail
users_pathr   r"   r   r#   _get_user_info  s$    
z"ConfluenceAPIImport._get_user_infoNc                 C   s   |  dD ]}|| j|kr&|  S |dd | krF|  S |dd | krf|  S |dd | kr|  S |dd | kr|  S |dd | kr|  S |dd | kr
|  S q
td	| d S )
Nr   rJ   r   r   userNamerI   displayNameZfullNameuQ   Не нашли информацию по пользователю в дампе )r   r.   r7   lowerr   )rB   r   r   r   r"   r"   r#   r   4  s     
z,ConfluenceAPIImport._get_user_info_from_dumpc              
   C   s  | j dkrdn
d| j  }| jjd| d|  |d}g }|d}| rtt|d}t|}W 5 Q R X t	
 }	zV|d	}
t|
d}t|}W 5 Q R X |d
}| rt| t|d}d}| jjr|d7 }| jj||d d || j dD ]}t|tr8| jjd| d| dddd q|tj|ddd  | j jd7  _| jd | |d d d d || |dr|d d  d!kr|d |kr||d  qW 5 Q R X W nD tk
r } z$| jjd"| d| d#ddd W 5 d }~X Y n0X d|d$< t|
d%}tj||dd W 5 Q R X t	
 |	 }| jjd| d&|d'd( t|d%}tj||d)dd* W 5 Q R X d S )+Nr      Все версии.   Последние: u)   Дамп версий документа . attachmentsr   r	info.jsonzversions.jsonr   zNcontent.version,content.body.view,content.body.editor,content.body.export_viewz,content.body.atlas_doc_formatversionnumber)current_versionr2   Zlast_versions6   Не удалось сдампить документ r   zERR-0038r!   dump
error_codeobj_type
error_typeFensure_asciir   r   contentbodyexport_viewrM   bytype	anonymousuE   Не удалось сдампить версии документа ERR-0025r>   w+    выполнен за .3f    сек.r   indentr  )rA   r*   r4   r   r   r   r   r   r/   time	monotonicr   remover)   r8   Zget_page_versions
isinstancer   	log_errorr[   r   r:   inc_statr   r.   rr   r   )rB   r&   doc_pathdoc_log_msgnum_ver_msgr   	doc_users
users_filer   t1	info_filedoc_dataZversions_file_namer2   Zpage_versionexct2Zusers_fr"   r"   r#   _dump_versionsF  sz    






   	z"ConfluenceAPIImport._dump_versionsc           
   
      s   fdd} fdd} fdd}t dd d	}| }|d krT|| q jjd
|   d|d  d|d  d}z j rW q|d dkr jjd| dt	j
d W q6tdD ]}	zh||d |d | ||d |d | ||d |d | |d r, |d |d | W  qpW q   |	dkrJ  jjd| d|	 t	j
d Y qX qW n.    jjd| dddd |d 7 }Y nX || q6W 5 Q R X d S )!Nc              	      sZ    j jd|  dd  j| D }|d}t|d}t|| W 5 Q R X d S )NuI   Дамп списка дочерних страниц документа c                 S   s   g | ]}|qS r"   r"   rU   r   r"   r"   r#   
<listcomp>  s     z_ConfluenceAPIImport._dump_documents_expand_worker.<locals>.dump_child_pages.<locals>.<listcomp>
pages.jsonr	  )	r*   r4   r   r)   get_childrenr   r   r   r   )r&   r  r  children
pages_filer   rP   r"   r#   dump_child_pages  s
    
zKConfluenceAPIImport._dump_documents_expand_worker.<locals>.dump_child_pagesc           	   	      s  g }| d}| r6t|d}t|}W 5 Q R X | d}| rRt|  jj	d|  t|dj} j
| D ]V}|t|d  |d d d	 D ],} jj	d
| d ||kr|| qq~W 5 Q R X t|d}tj||ddd W 5 Q R X d S )Nr   r   zrestrictions.jsonu%   Дамп прав документа r   r   r^   r_   r`   zrestriction )r	  r   Fr  )r   r   r   r   r/   r   r  r*   r4   r   r)   Z get_all_restrictions_for_contentr[   r   rr   r   )	r&   r  r  r  r  r   Zrestriction_filer}   r_   rP   r"   r#   dump_restrictions  s$    


zLConfluenceAPIImport._dump_documents_expand_worker.<locals>.dump_restrictionsc              	      sp   | d}| rt|  jjd|  t|d,} j	| D ]}|
t|d  qHW 5 Q R X d S )Nlabels.jsonu'   Дамп тегов документа r   r   )r   r   r   r  r*   r4   r   r   r)   Zget_all_page_labelsr[   r   r   )r&   r  r  Zlables_filer   labelrP   r"   r#   	dump_tags  s    

zDConfluenceAPIImport._dump_documents_expand_worker.<locals>.dump_tagsFZinit_views_and_dsr   uG   Осталось обработать примерно страниц: "r   " (rc   r'  statustrashed   Документ uW    был удален. Пропускаем дамп расширенных данныхr5   r   r\   r>      uO   Повтор дампа расширенных данных документа    , попытка u\   Не удалось сдампить расширенные данные документа r  r!   r   r   r   )r   r.   putr*   r4   r   Zqsize	is_cancellogr3   WARNINGranger  r  )
rB   
page_queueobjs_that_are_doner&  r(  r+  errors	page_datapage_log_msgir"   rP   r#   _dump_documents_expand_worker  sX    	




  z1ConfluenceAPIImport._dump_documents_expand_workerc              
   C   sz  d}| j  }| j  }d}| D ]}| r$t|jds$|d7 }|d}t|d}	t	
|	}
W 5 Q R X |
d |
d t|
d |
d	 |
d
p| jd}|| q$|d  | jjd|  g }t|D ]N}| jj| jd|d  ||dd}|| |  | jjd|  q|D ]}|  ~q,|j   | sb|| 7 }qH| jjd|  |S )Nr   .dirty.trashed.metar   r   r   rc   r   r\   r/  r>   )rc   r   r\   r/  r>   uC   Дамп расширенных данных документов: z_dump_documents_expand_worker )r:  r;  targetrJ   kwargs   Форк proc=uR   Ошибок дампа расширенных данных документов: )rE   Queueiterdiris_dirr   rJ   endswithr   r   r   r/   r   r.   r>   r5  r*   r4   r   r9  rD   Threadr@  rr   startjoinclearempty)rB   objs_dirmax_workersr<  r:  r;  
page_countdoc_dirr  r   Z	info_datadataprocessr?  procr"   r"   r#   _dump_documents_expand  sN    








z*ConfluenceAPIImport._dump_documents_expandc                    sn   fdd}t ddJ d}| }|d kr>|| qV|D ]}zڈjj|j ddd}|d	 d
krtW qBd|d  d|d  d}	j rW  q jj	d|	  t
dD ]T}
z|| W  qW q   |
dkr jjd|	 d|
d  dtjd Y qX qj jd7  _W qB   jjd|	 dddd |d7 }Y qBX qBq || W 5 Q R X d S )Nc              	      s  d| d  d| d  d}  t| d }  | d  d}|jdd g }| d	 d
 |krr|| d	 d
  | d	 d d |kr|| d	 d d  | d	 d}|r|d dkr| d	 d |kr|| d	 d  | d}| d}dd jj| d ddD }t|dd}	t	||	 W 5 Q R X j
jjj d| d  }
|D ]"}|d }|d }|d d }jjj|}d|kr|d d }n td|}|r|dnd}| | d| }| d| d| }|
 d| }tjj|j
jjjdd d!gd"}|s4tj|j
jjjj
d#}||_||_||_|jsX| sld$|_||_|  t  qP| d% d& d' ||  | d(}| rt| j
j !d)|  t|d*}	j" d+}jj#| d |d,D ]}|	$t%|d-  j
 j&d7  _&j
'd. |d% d/ d' ||  |d	 drr|d	 d |krr||d	 d  |d	 d
r|d	 d
 |kr||d	 d
  |d	 dr|d	 d d |kr||d	 d d  qW 5 Q R X d| d0< | d1}t|d}	tj	||	d2d$d3 W 5 Q R X t()|| |jdd t|| d!< | d4}t|d}	tj	| |	d$d5 W 5 Q R X j
*d6| d7 j
'd8 d S )9Nr-  r   r.  rc   r'  rB  Texist_okhistory	createdBylastUpdatedr  ownedByr  r  r   attachments.jsonc                 S   s   g | ]}|qS r"   r"   r   r"   r"   r#   r!  0  s    zUConfluenceAPIImport._dump_documents_main_worker.<locals>.dump_doc.<locals>.<listcomp>r   )page_idr2   r	  )moderb   _linksdownloadr   z[?&]version=(\d+)r   .rJ   r   r\   )r   rt   rK   )r   rt   r*   Fr  viewrM   zcomments.jsonu5   Дамп комментариев документа r   z@,extensions.inlineProperties,extensions.resolution,children.pager   r   commentr  r>   r   r   r  r   r   r1  u     успешно сдампленr%   )+r   r   mkdirrr   r.   r)   get_all_attachmentr   r   r   r*   rs   rt   
url_joinerr   r   r   ra   r   r   rJ   r   r\   rx   r   r   import_raw_jsonry   rz   r   r   r  r4   r   r2   get_page_commentsr[   r   r:   r  r   r   r7  )r{   r  rU  Zdoc_dir_tmpr  ownerr   r  Zattach_infor   
doc_ext_idZattZatt_idr   Zdownload_linkZdownload_urlr   Zattachment_pathZattachment_path_tmpZ
att_ext_idr   Zcomments_file_namer2   rg  r   Z	info_pathrR  rB   r"   r#   dump_doc  s    









$

zAConfluenceAPIImport._dump_documents_main_worker.<locals>.dump_docFr,  r   z,versionr   )r2   r/  r/  currentr0  r-  r   r.  rc   r'  u   Дамп документа r   r3  u+   Повтор дампа документа r4  r   u    из 3r2  r   r  r!   r   r   )r   r.   r5  r)   Zget_page_by_idr2   r*   r6  r4   r   r9  r7  r3   r8  r:   r  )rB   rR  bulk_page_queuer;  rp  r<  Zpage_idsra  r=  r>  r?  r"   ro  r#   _dump_documents_main_worker  sR    q



  z/ConfluenceAPIImport._dump_documents_main_workerc           	      C   s   d}| j  }g }t|D ]P}| jj| jd|d  |||dd}|| |  | jj	
d|  q|D ]}|  ~qp|j   | s|| 7 }q| jj	
d|  |S )Nr   z_dump_documents_main_worker r   )rR  rs  r;  rE  rH  u.   Ошибок дампа документов: )rE   rI  r9  rD   rM  rt  rr   rN  r*   r4   r   rO  rP  rQ  r.   )	rB   rR  rs  rS  r<  r;  rW  r?  rX  r"   r"   r#   _dump_documents_main  s.    
	

z(ConfluenceAPIImport._dump_documents_mainc                 C   s  d}|d }| j }d}| j }| jjd| d d}g }	t }
| D ]^}|	 rNt
|jdslqN|d7 }|jdd }|	t
| t|	|krN||	 g }	qN|	r||	 |d  t |
 }| jjd	|d
d | jjd| d|  t }
|| |||7 }t |
 }| jjd| d|d
d t }
|| ||7 }t |
 }| jjd|d
d | j r| jjd |S )Nr   r   2   uU   Добавление страниц в очередь дампа пачками по u    страницrB  r   re  uY   Добавление страниц в очередь дампа выполнено за r  r  uU   Дамп основных данных документов пространства r   r
  uC   Дамп расширенных данных выполнен за    Импорт прерван)rF   rE   rI  r*   r4   r   r  r  rJ  rK  r   rJ   rL  r   rr   r   r5  ru  rY  r6  r   )rB   r   rR  r<  	space_keyrS  Zmax_bulkrs  rT  Z	temp_listr  rU  ra  r  r"   r"   r#   _dump_documents  sF    



z#ConfluenceAPIImport._dump_documentsc                 C   sl  i }| j |d }z| j jr:dddddddd	d
ddddd}|D ]}|d d |d d f}||}|srqF|||g g dd}|dr&|d dr|d d d d d }	| |	| j  |d |	 |d dr&|d |d d d d d |d d d d d d |d rFd |d!< qFn|D ]}
|
d" D ]}||d# |d# g g dd}|d$ r| |d$ | j  |d |d$  |d% r|d d|d% i |d$ sJ|d% sJd |d!< qJq>W n"   | jj	d&d'd(d)d*  Y nX t
|d+  d,}| r.t| t|d-*}d.d/ | D |d0}t|| W 5 Q R X d S )1Nr   	EDITSPACE
REMOVEPAGEZEDITBLOGZ
REMOVEBLOGCOMMENTREMOVECOMMENTCREATEATTACHMENTREMOVEATTACHMENT	VIEWSPACEREMOVEOWNCONTENTSETPAGEPERMISSIONSSETSPACEPERMISSIONSZEXPORTSPACE))pagecreate)r  delete)blogpostr  )r  r  )rg  r  )rg  r  )
attachmentr  )r  r  )r   rZ   )r   r  )r   Zrestrict_content)r   Z
administer)r   Zexportr]   Z
targetTypeF)
permissionr   groupsr  ro   r_   r`   r   r-   r   ra   r  rc   rJ   )rc   rJ   ZanonymousAccessTr  ZspacePermissionsr  r   Z	groupNameu>   Не удалось сдампить права доступаzERR-0056
CmfProjectr   )r   r   r\   /permissions.jsonr   c                 S   s   g | ]}|qS r"   r"   rU   r   r"   r"   r#   r!  i  s     z9ConfluenceAPIImport._dump_permissions.<locals>.<listcomp>)	convertedZoriginal)r)   Zget_space_permissionsr8   r.   
setdefaultr   r*   r   rr   r  r   r   r   r  r   valuesr   r   )rB   r   Zpermissions_dictpermissionsZmapping_typer  r]   Ztype_permr_   Zpermission_typepermission_filer   Zpermissions_datar"   r"   r#   _dump_permissions  s    


	



z%ConfluenceAPIImport._dump_permissions   c                 C   s0  | d}|jdd d}| d}	| d}
tdd d	d	d	d	d
}| j | j}|  j|7  _W 5 Q R X | jj||||	dd}|sq|D ]}|d dkrq|d  d7  < t|d }|d }z|d dkrX|d d d rdd | jj|d|
ddD }||d d d< |d d d rXdd | jj	|ddD }||d d d< d}| | d}|
 rt|d }| }W 5 Q R X tj|ddd!}t|d" }||krW q|dkr|d#  d7  < n|d$  d7  < t|d%}|| W 5 Q R X | |}| | d&}| | d'}|d dkr| jjd(| d)| d* |
 r~t|| n|
 rt|| n<|
 rt|| n$|
 rt|| n|jdd W q   | jjd+| d)| d,d-d.d/d0 |d1  d7  < Y qX qqJ|| W 5 Q R X dS )2u  
        Получает минимальные данные страницы с информацией о последнем изменении
        и зависимыми объектами(комментарии, вложения).
        Вычисляет хеш данных и сравнивает его с хешем предыдущей проверки,
        если хеши отличаются, то помечает каталог документа .dirty для повторного дампа
        r  TrZ  zancestors,history.lastUpdatedz%,children.comment,children.attachmentz2,extensions.inlineProperties,extensions.resolutionFr,  r   )r<  allnewupdatedr   )rN  limitr2   r/  r/  rq  r  r   rc   r   r0  r$  rg  r`   c                 S   s   g | ]}|qS r"   r"   )rU   rg  r"   r"   r#   r!    s    z:ConfluenceAPIImport._check_hash_worker.<locals>.<listcomp>r  )r  r2   r$  r  c                 S   s   g | ]}|qS r"   r"   )rU   r  r"   r"   r#   r!    s    r  Nz.hashr   )r  Z	sort_keyszutf-8r  r  r	  rB  rC  u   Документ "r.  uQ   ) удален. Он не будет сдамплен и импортированuB   Не удалось проверить хеш документа "r'  r  r!   r   r   r<  )r   rh  r   _lock_startr)   Zget_all_pages_from_spacer   rl  ri  r   r   rZ   r   r   hashlibZmd5encodeZ	hexdigestr[   r*   r4   r   r   r   r  r5  )rB   rx  rR  hash_dirhash_stats_queuer  	dump_dataZcontent_hash_dirr2   Zpage_expandZcomment_expand
hash_statsrN  r   r  ra  Z
page_titleZcommentsr   Zcurrent_hashZ	hash_filer   Zcontent_jsonZnew_hashrU  Zdoc_tmp_dirZdoc_trashed_dirr"   r"   r#   _check_hash_workern  s    


    
	







  z&ConfluenceAPIImport._check_hash_workerc                 C   sf  | j  }d| _| j | _| j}|d }t|d  d}|jdd t	
 }g }	t|D ]R}
| jj| jd|
d  ||||d	d
}|	| |  | jjd|  q\|	D ]}|  ~qt	
 | }d}d}d}d}| s$| }||d 7 }||d 7 }||d 7 }||d 7 }q| jjd|dd| d| d| d	 | jjd|  |S )Nr   r   r\   z/hashTrZ  z_check_hash_worker r   )rx  rR  r  r  rE  rH  r<  r  r  r  uC   Проверка хеша контента выполнена за r  u8    сек. (всего/новых/обновленных: r   r'  u(   Ошибок хеша контента: )rE   rI  r  rD   Lockr  rF   r   rh  r  r  r9  rM  r  rr   rN  r*   r4   r   rO  rQ  r.   )rB   r   rR  r  r  rS  rx  r  r  rW  r?  rX  r  r<  Zobj_allZobj_newZobj_updatedr  r"   r"   r#   _check_hash  sN    



*zConfluenceAPIImport._check_hashc              
      s8   j d g }t }|d}| rZt|d"}t|} fdd|D }W 5 Q R X t }t	|D ]t}||d}	|	 rjt|	F}t|D ]4}
|
d dkrq|
|
 j  |
|kr||
 qW 5 Q R X |	  qjt|d}tjt||d	d
d W 5 Q R X ||}|D ]} | j   qdS )us    Собирает пользователей из файла users.json в каталогах документов u=   Сбор пользователей из документовr   r   c                    s   h | ]}t | j qS r"   )r   r7   )rU   urP   r"   r#   	<setcomp>-  s     z5ConfluenceAPIImport._collect_users.<locals>.<setcomp>r  r  r	  r   Fr  N)r*   r7  r<   r   r   r   r   r/   r   r   addr7   rr   unlinkr   list
differencer   r   )rB   project_dirrR  Zcurrent_usersZcurrent_user_idsr  r   Znew_user_idsr&   r   r_   Z
diff_usersr   r"   rP   r#   _collect_users"  s2    



 
z"ConfluenceAPIImport._collect_usersc              
   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   r/   )rB   project_keyr  r   projectr"   r"   r#   _get_projectE  s    
z ConfluenceAPIImport._get_projectc              
   c   s   | j  d}t|D ]h}|dr*q|drP| j jd| d|  qt| d| dd}t	
|}W 5 Q R X |V  qd S )Nr  rB  rD  u(   Пропускается каталог r   r  r   )r*   r   r   r   r   rL  r4   r   r   r   r/   )rB   r  r  r   r  r"   r"   r#   _get_projectsK  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_inforU  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	isCheckedr$  	documentsrc   u'   Документ не загружен zERR-0015r!   r   r   r  r`   Trc   r  r$  )_get_documentr   r   r*   r  rr   )r  rU  Zdoc_dumpchildr#  rB   r"   r#   r#  Z  s"      z=ConfluenceAPIImport._load_selected_objs.<locals>.get_childrenimport_settingsrL   rM   r   r  Nc                 S   s   g | ]}|d  r|qS r  r"   rU   setting_objr"   r"   r#   r!  n  s      z;ConfluenceAPIImport._load_selected_objs.<locals>.<listcomp>r$  T
root_pagesr  archived_pagesr   r   rc   r\   r  uc   Не удалось вычислить выбранные документы для проекта u4   , скорее всего он не сдамплен)r   r   rX   r*   json_settingsr  rr   r<   r  r  r.   r   r   r4   r   r=   )	rB   rR   rootselected_spacesr  r&   resultr   r  r"   r  r#   _load_selected_objsW  sF    



&z'ConfluenceAPIImport._load_selected_objs)
applink_idc              	   C   sB   | j  d}t|d}t|}W 5 Q R X |r>||S |S )Napplinks.jsonr   )r*   r   r   r   r   r/   r.   )rB   r  r   r   applinksr"   r"   r#   _get_applinks  s    
z!ConfluenceAPIImport._get_applinksc              	   C   sz   ddl m} i }| j D ]$}||d d|d< |||d < q| j d}t|d}t	j
||d	d
 W 5 Q R X d S )Nr   )cmf_hashlibZrpcUrlr   rt   rc   r  r	  Fr   )Zcmf.utilr  r)   Zget_applinksZshort_str_encr*   r   r   r   r   r   )rB   r  r  applinkr   r   r"   r"   r#   _dump_applinks  s    z"ConfluenceAPIImport._dump_applinksc              
   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 ]}t
|d d }| j|}z| j rW  d S | j jd7  _||}|d}d }	d }
| r4t|d$}t|}|d}	|d}
W 5 Q R X d }tjd k	r||
d ksp|
dkr|tjdksp|
tjk r|d| _tj}|p|
pd| _| jjd|d   | st
|| d|d< tj|d dd g |d< | j|d D ]}|d |d  q|d stdg |d< | j|d D ]}|d |d  q6| sjt |d | t
||d< t|d$}|	|d< | j|d< t!|| W 5 Q R X | jjd | "| t#|d  d}|j	dd | jjd |  t
t$% & ' }| j(|||	d!}|sH||d< t|d}t!|| W 5 Q R X |  j)| *||7  _)| +|| | jj,dd" t-  W q   t.  | jj/d#| d$d%d&d' Y qX qd S )(Nr  rL   rM   r   r  Tc                 S   s   g | ]}|d  r|qS r  r"   r  r"   r"   r#   r!    s      z4ConfluenceAPIImport._dump_spaces.<locals>.<listcomp>r$  c                 S   s   g | ]}||d  dqS )rc   )r   rc   r"   r   r"   r"   r#   r!    s     r  rZ  r   r   r   r   r   Z	dump_daterA   r   u&   Дампим пространство rJ   rB  r\   r  rc   uJ   Пустой проект, возможно нет прав доступаr  r	  u=   Дампим права доступа (Разрешения)
/documentsuD   Проверка хеша контента пространства )r  r   u1   Ошибка дампа пространства zERR-0026r  r   r   )0rX   r*   r  r  r   r)   Zget_all_spacesr   r   rh  r   Z	get_spacer6  r:   r   r   r   r/   r.   r?   r@   r>   rA   r4   r   r   makedirsZget_root_pages_from_spacerr   CmfErrorZ get_all_pages_from_space_archiver   r   r   r  r   r   ZnowZ
astimezonedater  r1   ry  r  ry   rz   r   r  )rB   rR   r  Zprojects_dirr  rx  r   r  r  Zlast_dump_dateZprev_dump_last_page_verr   Zcurrent_dumpZnew_dump_last_page_verr{   Zarchived_docrR  Znew_dump_dateZhash_errorsr"   r"   r#   _dump_spaces  s    











  z ConfluenceAPIImport._dump_spacesc                 C   s  | j  d}| rd S |jdd | j D ]X}| jjrNt|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 }
|
 rhqt|
d}t|	| W 5 Q R X qq2d S )Nr  TrZ  rc   rJ   r   r   r   r   r   r	  r   r   )r*   r   r   r   rh  r)   Zget_all_groupsr8   r   r   r:   r   r   r   Zget_group_membersr7   )rB   
groups_dirra   rd   Z	group_dirZ	data_filer   Z	users_dirZall_users_dirr_   Zuser_data_filer"   r"   r#   _dump_groups  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   Свободно места: rf   u$   Скачаем данные из API
load_usersTu'   Дампим пользователейr   uA   Не дампим пользователей из-за опцийr2  r   r   r_   )rM   )r*   r   r   
disk_usager4   r   r  rM   r.   r   r)   Zget_all_usersr7  r3   r8  r  r  r   r  )rB   Zdownload_pathtotalusedfreeZfree_percentZuser_cntr   r"   r"   r#   download_data0  s    

z!ConfluenceAPIImport.download_datac                 C   s  d}t dd | j r q| }|dkr4qtjj|ddddd	gd
}t|j}t|j}t|j	}t|j
d}	t|	dkrd|	d  dnd}
d| d}|jr|jd d }|d }| d|dd}| jj|
 d| d| d zX| jj||tjd | jj|
 d| d| d d|_|  t  | jd W q tk
r } z6t  | jj|
 d| d| d| d d!d"|d# W 5 d }~X Y qX q|| W 5 Q R X d S )$Nr   Fr,  DONErJ   r   r\   r   rk  )rc   rK   rb   r   u   [Страница ID: z] r   '
extensionsfileSizei    (z.2fz MB)u   Скачивание : ')timeoutu	   Файл u    сохранен в 'Tr  u"   Ошибка скачивания z'. zERR-0027r   r   )r   r   r   Zext_href)r   r*   r6  r.   r   r   r   rJ   r   r\   r   r   r   rk  r4   r   r)   Zdownload_filer?   ZIMPORT_DOWNLOAD_TIMEOUTr   ry   rz   r  r   r   r  r5  )rB   download_queue
done_queuer<  Zdownload_job_idZdownload_objr   Zfile_urlr   Zext_id_splitZpage_id_msg	file_sizeZfile_size_mbr  r"   r"   r#   _download_file_workerG  sd    




  z)ConfluenceAPIImport._download_file_workerc                 C   s  | j  }| j  }d}| jdg dd| jjjjgdddgddd	gg}| j d
}d}g }| jD ]v}t	|d d }	||	}
t	|

dst	|
d }
dd|
 dgg}tjj|| d}|rh||7 }|||  qh|s| jjd |S | jjd|  g }t| jD ]L}| jj| jd| ||dd}|| |  | jjd|  q|D ],}tjj|dgdD ]}||j qqjt  |D ]}|d q| s|D ]}|  q| j r| jjd | s|| 7 }q| jjd|  |S )Nr   zplugin.plugin.source_hashrt   rm   r   FrJ   rn   all_attachments.zipr  r   r   r   r\   re   rf   rg   u3   Нет вложений для скачиванияu'   Скачивание вложений: r  )r  r  rE  u    Запустили задачу --rh   rK   r  rw  uC   Закончили скачивание файлов, ошибок ) rE   rI  r*   load_fieldsrs   rt   r   r   r  r   rL  r   r   countrr   r4   r   r9  rF   rD   rM  r  rN  slistr5  rc   rz   rQ  rO  r6  r   r.   )rB   r  r  r1   Zmain_filterZprojects_pathZattachment_countfiltersr   rx  Zproject_pathZpath_filterZdownload_countZprocsr?  rX  Zfilter_r   r"   r"   r#   download_files  sh    






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   rB   r\   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#   rp     s    
z%ConfluenceAPIImport._get_restrictionsr   c                    s6    d D ]"}d fdd	  |d qd S )Nr\   c           	   
      s  zz| d dkr4j jd|   W W d 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 d dkr؈| d d j |_nJ| d dr| d d d dkr| d d j |_ntj|_| d d |_| d drr| d d d dkrr| d d j |_n|j|_| d dr| d d d d dkrֈ| d d d j |_| d d d |_n|j|_|j|_| d d d }| d d d }|r\|r\t|d}t|d}||| || ddd |jjD |_| |_||_| d d dkrd |_| d d! d d"krd#|_|jd d$ | d% D ]} || qt   |W W :S    t!  j j"d&d'  d(|  d)d* Y nX W 5 j dd X d S )+Nrg  	processedr/  ZdraftuJ   Не обрабатываем черновики комментариев rb   rc   rv   rd   rK   rl   rd   r*   **r\  r_  r  r  r]  createdDater^  r  whenr  rf  rM   editorr   r   c                 S   s   g | ]}t |qS r"   r   rU   xr"   r"   r#   r!    s     zMConfluenceAPIImport._process_obj_comments.<locals>.create.<locals>.<listcomp>r  locationinlineT
resolutionZresolvedclosedrk   r$  u7   Ошибка обработки комментария r   r   zERR-0028r   r   )#r*   r  r4   r   rs   rt   r   
CmfCommentr.   rv   r  rq   r7   	cmf_ownerrO   anonymous_usercmf_created_at
cmf_authorcmf_modified_bycmf_modified_atr   _convert_mentions_convert_linksrO  r  r$  r   rk  tree_parentr  r/  ry   rz   r   r  )	rg  r
  rd   Zcmf_commentrf  r  	view_soupeditor_soupr  r  r   rl   rB   r"   r#   r    sv    



 z9ConfluenceAPIImport._process_obj_comments.<locals>.create)rg  )N)r  )rB   rl   r   rg  r"   r  r#   _process_obj_comments  s    Az)ConfluenceAPIImport._process_obj_commentsc                 c   s>   t |d}t|D ] }|dkr&q|||dV  qd S )Nr   r  )r   r   )r   r   r   r   )rB   Zobj_pathattachments_pathr   r"   r"   r#   _get_obj_attachments  s    z(ConfluenceAPIImport._get_obj_attachments)rU  c              	   C   s   t d| }|r|d nd }|r(|d nd }tt|d}t|}W 5 Q R X |D ]~}d|krvt|d d }n4tj	
|d d }	tj	|	j}
|
dd	gd
 }|d | kst|d |krX||krX|  S qXd S )Nz((?:att)?\d+)\.(\d+)r   r   r`  r   r   rc  rd  1r   r   rc   )r   	fullmatchr   r   r   r   r/   r   r   r   r   parse_qsqueryr.   )r   rU  Z
file_matchZfile_idZfile_versionr   Zattach_info_listattachr   r   Zquery_paramsr"   r"   r#   _get_confluence_attach_info   s$    
z/ConfluenceAPIImport._get_confluence_attach_infoc                    sP   d} fdd}  d D ](}|||d |d 7 }jdd q"|S )	Nr   c           
         s  d}d zƐz8 |  d }|r*|d nd}|r:|d n| }tjj|dddd	gd
}|s|tj|jdd}|jdd |jrB|r|dr|d }|d|_|dr|d d dkr؈|d j	 |_
ntj|_
t|dR}|j| dd d|_|jdd t  |r8|d d }	|j|	ks8tW 5 Q R X W n tk
r   jjd| d| d|j d|	 d	dd d}Y n@ tk
r   t  jjd| d| d dd d}Y nX W 5 |  S X  )!Nr   r\   rc   r   r   rv   r   url_preview_imgurl_preview)rJ   rl   rK   TrJ   rl   r*   rv   rk   r   r  r  r  r  rbZsmart_backupr  r  u   Размер файла '' (u@   ) не соответствует размеру из меты: z	 bytes / z byteszERR-0029r  r   u;   Не удалось обработать вложение 'r'  )r  r   CmfAttachmentr.   r*   ry   rv   r  rq   r7   r  rO   r  r   upload_filerZ   rz   st_sizeAssertionErrorr  r   r   )
r   r   errorZattachment_metaZattachment_idZattachment_namer  attachment_versionr   Zfile_size_metar   rl   rB   r"   r#   _process_attachment<  sp    

zIConfluenceAPIImport._process_obj_attachments.<locals>._process_attachmentr\   r   r   r  r  )r  r*   r  )rB   rl   r   r<  r$  Zattachment_datar"   r#  r#   _process_obj_attachments9  s    Bz,ConfluenceAPIImport._process_obj_attachmentsc                 C   s   t jj| _|d d d }|d d d }|s6|s6|S |sB|rBd}t|d}t|d}| jjrz>| jj	d t
|d d d }| j||d	 ||d
 W nZ tk
r   d|d d}	|dr|	d|d d  d7 }	| jj|	d|d Y nX | ||| | || | ||| | ||| | j||||d | ||| | ||| | ||| | ||| | ||| | ||| | || | || | ||| | || | || | j ||||d d!dd |j"j#D }
|
S )Nr  rf  rM   r  z<p></p>r   uC   Конвертация текста из atlassian разметкиZatlas_doc_formatr  )soupsubobjuT   Не удалось конвертировать разметку страницы "r   r-  r       (версия r   r'  zERR-0031r   r'  r   c                 S   s   g | ]}t |qS r"   r  r  r"   r"   r#   r!    s     z9ConfluenceAPIImport._convert_doc_text.<locals>.<listcomp>)$r   r!   Zget_data_iddata_idr   r)   r8   r*   r4   r   r   r   _convert_atlas_docr   r.   r  r  _convert_status_convert_plantuml_convert_drawio_convert_msoviewer_convert_childpages_convert_task_filter_convert_excerpt_include_convert_include_convert_content_by_label_convert_details_summary_convert_anchor_convert_tocr	  _convert_inline_comments_convert_excerpt_convert_detailsrO  r  r$  )rB   Zobj_datar   r'  rf  r  r  r  	atlas_rawZexception_textr   r"   r"   r#   _convert_doc_text  sL    



z%ConfluenceAPIImport._convert_doc_textc              	   c   sF   t | d}| rBt|d}|D ]}t|V  q&W 5 Q R X d S )Nz/versions.jsonr   )r   r   r   r   r   )rB   r\   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D ]}|jdd q&t  d }t d D ].\}}|tjkrj q||d	}|rT|j	rT|}qTt jd
ddd}	|	j
dd |_jrj
dd t  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|_j ||d|_!d|_"| |_#|j$dd t%  W nV t&k
r   t'  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  rc   z): version r   rb   r   r  r  r  r  r  r  r  message%Y%m%d%H%M%S%fCLOSEDstatus_typer  r/  rr  r)  Trk   u@   Ошибка обработки истории страницы z): zERR-0033r  r   )*r*   r  r4   r   rs   rt   r   CmfDocumentHistoryr.   rv   r  r  rq   r7   r  r  r  rO   r  reasonofficial_numberZofficial_dateintrM   strftimecmf_versionZdoc_versionworkflowget_default_statusr/  boolcur_workflowr<  r   Zhas_publishedrk  ry   rz   r   r   r  r1   )version_dataZcmf_document_historyrd   r~   Zversion_contentr  r|   rB   r"   r#   create_version  sb     $

"z=ConfluenceAPIImport._process_versions.<locals>.create_versionrl   =T)rh   include_deletedZTEXKOM_db_deleter\   )rN  Fr   )rl   rM  Zcmf_deletedr   rk   )r   rD  r  r  rz   	enumerater=  r?   $IMPORT_CONFLUENCE_PROC_LAST_PAGE_VERrM  ry   cur_workflow_versionrx   )
rB   r  r|   rP  Zdhr   version_countr   Zdocument_historyZfake_historyr"   rO  r#   _process_versions  s(    D



z%ConfluenceAPIImport._process_versionsc              
   C   s   |  |d}| sd S t|d}t|}g |d< |  |d}| r~t|d$}|D ]}|d t| qZW 5 Q R X |  |d}| rt|d&}	t|	}
d|
t|
di|d< W 5 Q R X |W  5 Q R  S Q R X d S )	Nr   r   labelsr)  r"  r  )r`   sizer$  )r   r   r   r   r/   rr   r   r   )rU  r&   Zdoc_filer   resZlabels_filef2Z	label_strr%  Zf3r   r"   r"   r#   r  %  s"    
 
 z!ConfluenceAPIImport._get_documentc                 C   s$   t |d }tdd |}|S )Nr  c                 S   s   |   o| jd S )NrA  )rK  rJ   rL  )	path_objsr"   r"   r#   r   <  r   z3ConfluenceAPIImport._get_doc_dirs.<locals>.<lambda>)r   r   rJ  rh   )rB   
space_pathr]  Zdoc_dirsr"   r"   r#   _get_doc_dirs9  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   r   )r   r_  r  rJ   )rB   r  offsetr  rU  enum_dirr&   r"   r"   r#   _get_documentsB  s    z"ConfluenceAPIImport._get_documentsc                 C   s   t dd | |D S )Nc                 s   s   | ]
}d V  qdS r   Nr"   r  r"   r"   r#   r   R  s     z=ConfluenceAPIImport._count_space_documents.<locals>.<genexpr>)sumr_  )rB   r^  r"   r"   r#   _count_space_documentsP  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   r   c                 s   s   | ]
}d V  qdS rd  r"   r  r"   r"   r#   r   d  s     zCConfluenceAPIImport._get_offsets_for_execute_doc.<locals>.<genexpr>c                 S   s   g | ]\}}||fqS r"   r"   )rU   ra  r  r"   r"   r#   r!  g  s     zDConfluenceAPIImport._get_offsets_for_execute_doc.<locals>.<listcomp>)r_  r  re  r=  r   r   )	rB   r^  r  offsetsZcurrent_offsetZ	obj_countrb  rU  rW  r"   r"   r#   _get_offsets_for_execute_docT  s    z0ConfluenceAPIImport._get_offsets_for_execute_docc           
      C   sr  d}t ddX t B | }|dkr2qP| j r@qPzd|d  d|d  d	}tjd
krld}ndtj }| jj	d| d|  | jj
j
j d|d  }tjj|dddddgd}|std|jr| || n| jj	d|  W q tk
rL }	 z0t  | jjd| d|	 ddd |d7 }W 5 d }	~	X Y qX q|| W 5 Q R X W 5 Q R X d S )Nr   Fr,  r  r-  r   r.  rc   r'  r   r   r   u3   Обработка версий документа r   rb   rl   rJ  rV  rd   rk  r  u4   Документ не найден в системеQ   Документ изменен пользователем, пропускаем u@   Ошибка обработки версий документа zERR-0084r!   r   r   r   )r   cmfutildisable_aclr.   r*   r6  r?   rU  r4   r   rs   rt   r   r!   r   rv   rX  r   r  r5  )
rB   	obj_queuer  r<  r{   r  r  rd   r|   r  r"   r"   r#   _process_doc_versions_forkk  sJ    


z.ConfluenceAPIImport._process_doc_versions_forkc                 C   s  d}t ddf t P | }|dkr2q^| j r@q^zz| |d |d }| jjjj	 d	|d  }| j
d
|  |d o| jjdk}	|	r|jj}
n.tjj|dgd}
|
stj|d | jd|d}
|
jrZ|
js|
ddg |d d }| jjd|  |d dkr*tj}n| || j }|s^| jjd|d  d|  |d d}|r| jjd|  |d dkrtj}n| || j }n|}|d d d }| jjd|  |d dkrtj}n| || j }||d  ||| j| jjt|d  d!|d d" |d d d# |||dd$}|d  jd%krb||d&< |D ]}t |
|||  qft!|
j"j#d'd d( |
_$|
j%r|
j&dd) |
jrR| jjjj	 d*| }tj'j|d+}|stj'|
d,|| jd-}|d. d/r | j()| j(j*|d. d/ }n| jjjj+}|
j, d0| d1| d2|_-|j&dd) t.  n| jjd3|
  || /|
|7 }| 0|
| |
jr>g }|d4 D ]p}d	| jjjj	 d	|d  d	}tj1jdd5d6| d6gd7}|r|2| n| jj3d8| d9| d:|
d; q||
_4| 5||
|
_-|
j%r>|
j&dd) t.  | 6||
 W n t7k
r   t8  | jj3d<|d  d=|d  d>d?d@dA | j9  |dB7 }Y n t:k
r   t8  | jj3d<|d  d=|d  dC| dDd?d@dA | j9  |dB7 }Y nL   t8  | jj3d<|d  d=|d  dEd?d@dA | j9  |dB7 }Y nX W 5 | jdd X q|;| W 5 Q R X W 5 Q R X d S )FNr   Fr,  r  r%   r  rU  rc   rb   zprocess Zis_homepager  rd   r  r   TrJ   r*   rv   rd   r  tagsr\  r]  u5   Определяем автора документа r  r  u1   Не найден автор документа: r   r_  u:   Определяем владельца документаr^  r  =   Определяем последнего редактора r/  rB  r  r  )rl   rJ   r  r  rJ  r/  r  r  rd   r  rk  Zfull_screenrA  r
  r?  r@  rk   z
::comment:rd   r   )rl   Z	log_levelrd   r*   rc  Zwebuiu4    импортирован из Confluence: <a href="z" target="_blank">z</a>ri  rY  re   rf   rg   u   Не найден тег z ext_id=zERR-0017r   u   Ошибка создания r  uT   ': попробуйте очистить дамп и повторить импортzERR-0018r!   rj  r   u_   ': попробуйте отменить импорты связанные с проектом uY   , чтобы он удалился из системы и повторите импортr  )<r   rk  rl  r.   r*   r6  r  r  rs   rt   r7  root_parent
class_namedescr_documentrM   r   r!   rv   is_newr  r4   r   rO   r  rq   r7   r   r0   rK  r   Zget_status_typerC  setattrrG  r  rH  rI  rx   ry   r  r)   rj  r   Zext_urlZverbose_namer   rz   r%  r  CmfTagrr   r  rp  r<  r   FileNotFoundErrorr   
log_detailAttributeErrorr5  )rB   r  Zarchive_folderrm  r  r<  r  r{   rd   Zwiki_project_homepager|   authorr  rm  r  modifiedr  Zdoc_dictr   Zcomment_ext_idrg  r   rp  Ztag_rawZ
tag_ext_idr   r"   r"   r#   _process_document_fork  s   




 



z*ConfluenceAPIImport._process_document_forkc                 C   s  d}zn|j dddidD ]T}td|jd }|d}tjj||d	}|sp| 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}|j ddidD ]4}|jdd|jd  idr:||j  qq:qW n$   | 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>
        imgdata-macro-namedrawior   zdiagramName=([^|]+)data-macro-parametersr   rJ   rl   u#   Диаграмма с именем u@    не найдена во вложениях документа zERR-0019r   rl   rm   rJ   re   %.pngr   r  100%zdiagramWidth=([^|]+)zdiagramHeight=([^|]+)rJ   	attach_idwidthheightimg_srcr   r   html.parserrc   zdrawio-macro-content-data-macro-iduU   Неудалось конвертировать диаграмму из текста )r   r   r   r   ra   r   r  r.   r*   r  rJ   rM   rc   r   r   r   formatfindreplace_with
currentTag)rB   r   r  r  TAG_TMPLr   matchr   r  
attach_imgr  r  rV  rV   Z
drawio_tagr"   r"   r#   r.  J  sV    
 

 z#ConfluenceAPIImport._convert_drawioc           	   	   C   s   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 ]}|	|  qq~q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  Zplantumlr  r!  u.   Не удалось получить svg из zERR-0002r   z{})paramsZumlsvgr  )
r   r   r!   Zconvert_uml2svgr   r*   r  r   r  r  )	rB   r|   r  r  ZTMPr   r  new_tagold_tagr"   r"   r#   r-  y  s    ( 
z%ConfluenceAPIImport._convert_plantumlc                 C   s  d}| dg |j}t|j}| }|  g }t|D ]R\}	}
|	| d|	d  |
d dkrj|
d n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   r   Z
sheet_namer   u   Листr   )numrc   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   )verparentIdr   ZcurrentPageRefZslicePageNumZ
pagesCountFr   r  )r  r  r  Zplugin_titler  )r  rc   r   r  Zget_fullviewsortrT  rr   r   ri   r.   r   r  r   r   r  )rB   r|   r  Zplugin_typeTMPLr  r  Zfullview_pagesr   r  Zfullview_pager  Zparam_typesr  r  r"   r"   r#   _create_msoviewer_macro_tag  sX    )
 	z/ConfluenceAPIImport._create_msoviewer_macro_tagc                 C   s4  ddg}|D ] }|j d|idD ]}zz|d}tdd |dD }|d	 }	tjj||	d
}
|
sxtd|	 d|jd|id}|r|| 	||
| W q" tk
r* } zhd| d|j
 d|jd  d}t|tjr|d|j d7 }|d| 7 }| jj|d|p|d W 5 d}~X Y q"X q"qdS )u7    Конвертирует макросы Word и Excel r  r  r  r  r  c                 s   s   | ]}| d dV  qdS rQ  r   Nr   rU   paramr"   r"   r#   r   	  s     z9ConfluenceAPIImport._convert_msoviewer.<locals>.<genexpr>|rJ   rl   rJ   &   Не найдено вложение 'r  0   Ошибка обработки макроса '   ' в документе 'r  rc   r'  r(  r   ERR-0012r   N)r   r.   r   r   r   r  r   r  r  r  rJ   rk  r  rD  rF  r*   r  )rB   r|   r  r  r'  Zmacro_types
macro_typer   original_paramsr   r  r  r  
error_textr"   r"   r#   r/  	  s0    

z&ConfluenceAPIImport._convert_msoviewerc                 C   sR  d|    d|    d|    d|    d|    d|    d|    d|    d	|    d
}|jddidD ]}d}|d}|dd}dt|jddddd}	tdd |dD }
|
drd|	d< nd|	d< |
dr|
d |	d< |
d r
|
d  |	d< |
d!r"|
d! |	d"< |
d#rLdd$d$d%}||
d# |	d&< |
d'rvd(d)d*d+}||
d' |	d,< |
d-rd|	d.< d}|
d/r|
d/ d0krt|jj|	d1< t|jj}d2}n nd2}t	|j
t|j|tj|	dd3d4d5d6||d7d8dd9}|r"|jd|idnd:}|s<|jddid}|rp||j qpd:S );ua   
        Конвертирует макрос "Отображение дочерних"
        z
            <div
                class="macros-panel"
                contenteditable="false"
                data-children-docs="{doc_id}"
                data-id="a  "
                data-macro-parameters="{params}"
                data-macros="children-docs"
                original-data-macro-parameters="{original_params}"
                cmf_converted="{cmf_converted}"
            >
                <div class="extension-container" data-id="uW   " data-layout="default">
                    <span aria-label="Макрос " data-id="aq  " 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="u   ">Макрос "Отображение дочерних"</span>
                    <span class="extension-object-name" data-id="zQ"> | {doc_name}</span>
                    <span class="macros-actions" data-id="z>">
                        <span class="macros-edit" data-id="a  " 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="aD  ">
                            <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="z7" data-macro-body=""></div>
            </div>
        r  r$  r  falser  r  r   F50none)isShowChildrenr  childrenAmountr5   includeViewTypeisOrderByDeskc                 s   s.   | ]&}t |d ddkr|d dV  qdS rQ  r   r   Nr   r   r  r"   r"   r#   r   k	  s   z:ConfluenceAPIImport._convert_childpages.<locals>.<genexpr>r  r  Tr  r  r5   firstr  depthstyle
headerTypeexcerptTyper  r  Zsimplezrich contentr  r  rJ   r  r  r   Zcreationr}  sortTypereverser  r  r   
documentIdtrue,:r  Z
separatorsr-  &quot;)r&   doc_namer  r  cmf_convertedr   r  N)r*  r   r.   r   rc   r   r   rl   rJ   r   r  r   r   r   r  r  r  )rB   r|   r  r  r  r   r  macro_idZdata_macro_parametersr  macro_parametersview_type_mapsort_type_mapr  r  r  r"   r"   r#   r0  0	  s    (
	


 
 z'ConfluenceAPIImport._convert_childpagesc           
      C   s   d}|j ddidD ]}|d}|d}tdd |d	D }|d
d}|rd|jd|idnd}|s||jddid}|rt|j|ddd |jD dd}	|	|	j
 qdS )uH   
        Конвертирует макрос "Выборка"
        u~  
        <div
            class="macros-panel macros-excerpt-block"
            contenteditable="false"
            data-id
            data-macros="exceprt"
            data-param-name="{name}"
        >
            <div class="extension-container" contenteditable="false" data-id data-layout="default">
                <span aria-label="Макрос Include. 'Создать выборку'" data-id 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" data-id>Макрос Include. 'Создать выборку' <span class="excerpt-title" data-id>| name = {name}</span></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" contenteditable="true" data-fabric-macro="null" data-id data-macro-body="">{content}</div>
        </div>
        r  excerptr  r  r  c                 s   s   | ]}| d dV  qdS r  r  r  r"   r"   r#   r   	  s     z7ConfluenceAPIImport._convert_excerpt.<locals>.<genexpr>r  rJ   &   Выборка без названияNr   c                 s   s   | ]}t |V  qd S r   r  rU   r  r"   r"   r#   r   	  s     rJ   r  r  )r   r.   r   r   r  r   r  rO  contentsr  r  )
rB   r  r  r  r   r  r  excerpt_namer  r  r"   r"   r#   r9  	  s$    "

z$ConfluenceAPIImport._convert_excerptc                 C   s  d}|j ddidD ]}|d}|d}d|krF|dd\}}	n0t|tjrb|j d	 }n|jj d	 }|}	|d
}
|
rt	dd |
dD }
|
dd}nd}t
|j||	|dd}|r|jd|idnd}|s|jddid}|r||j qdS )u~   
        Конвертирует макрос "Включить выборку"("Вставить фрагмент")
        u  
        <div
            class="macros-panel macros-include-block"
            contenteditable="false"
            data-id
            data-macros="include-excerpt"
            data-param-excerpt="{excerpt_name}"
            data-param-pageid=""
            data-param-pagename="{page_name}"
            data-param-projectkey="{space_key}"
        >
            <div class="extension-container" contenteditable="false" data-id data-layout="default">
                <span aria-label="Макрос Include. " data-id 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" data-id>Макрос Include. "Вставить выборку" <span class="excerpt-title" data-id>| Имя = {excerpt_name}</span></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-id></div>
        </div>
        r  excerpt-includer  r  data-macro-default-parameterr  r   r   r  c                 s   s   | ]}| d dV  qdS r  r  r  r"   r"   r#   r   
  s     z?ConfluenceAPIImport._convert_excerpt_include.<locals>.<genexpr>r  rJ   r  r  	page_namerx  r  N)r   r.   r   r  r   r  rk  r/   rl   r   r   r  r  r  r  )rB   r   r  r  r  r   r  macro_default_parameterrx  r  r  r  r  r  r"   r"   r#   r2  	  s8    %


	z,ConfluenceAPIImport._convert_excerpt_includec                 C   s   d}|j ddidD ]}|d}|d}d|krF|dd\}}	n0t|tjrb|j d	 }n|jj d	 }|}	t	|j
|	|d
d}
|r|jd|idnd}|s|jddid}|r||
j qdS )u[   
        Конвертирует макрос "Включить страницу"
        uM  
        <div
            class="macros-panel macros-include-page"
            contenteditable="false"
            data-macros="include-page"
            data-param-pageid=""
            data-param-page-label="{page_label}"
            data-param-projectkey="{space_key}"
            data-rendered="true"
        >
            <div data-layout="default" class="extension-container" contenteditable="false">
                <span role="img" aria-label="Макрос Include. ">
                    <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 class="excerpt-title">| Имя = {page_label}</span></span>
                <span class="macros-actions">
                    <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 class="ak-renderer-wrapper"></div>
        </div>
        r  includer  r  r  r  r   r   
page_labelrx  r  N)r   r.   r   r  r   r  rk  r/   rl   r   r  r  r  r  )rB   r   r  r  r  r   r  r  rx  r  r  r  r"   r"   r#   r3  2
  s,    $

z$ConfluenceAPIImport._convert_includec                 C   s  d|    d|    d|    d|    d|    d|    d|    d|    d	|    d
|    d}|jddidD ]$}|dd}tdd |dD }|dd|dd|dd|dd|ddd|dd  d|d!d" |d#|d$|d%d&|d'd&|d(d)}tj|dd*d+d,d-}t|j	||d.d/}|d0}	|	rt|j
d0|	idnd1}
|
s|j
d2ddid}
|
rz|
|j qzd1S )3uN   
        Конвертирует макрос "Оглавление"
        zr
        <div 
            class="macros-panel wiki-toc"
            contenteditable="false"
            data-id="z"
            data-macros="wikitoc"
            data-macros-parameters="{params}"
            data-macro-parameters-original="{original_params}"
        >
            <div class="extension-container" contenteditable="false" data-id="uR   " data-layout="default">
                <span aria-label="Макрос" data-id="a  ">
                    <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24" width="14px" height="14px">
                        <path d="M5 5c.6 0 1 .4 1 1s-.4 1-1 1a1 1 0 110-2zm3 0h11c.6 0 1 .4 1 1s-.4 1-1 1H8a1 1 0 110-2zm-3 8c.6 0 1 .4 1 1s-.4 1-1 1a1 1 0 010-2zm3 0h11c.6 0 1 .4 1 1s-.4 1-1 1H8a1 1 0 010-2zm0-4c.6 0 1 .4 1 1s-.4 1-1 1a1 1 0 110-2zm3 0h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 010-2zm-3 8c.6 0 1 .4 1 1s-.4 1-1 1a1 1 0 010-2zm3 0h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 010-2z" fill="var(--theme-hack-color, black)"></path>
                    </svg>
                </span>
                <span class="extension-title" data-id="<">
                    <span class="excerpt-title" data-id="u{   ">Макрос "Оглавление"</span>
                </span>
                <span class="macros-actions" data-id="z<">
                    <span class="macros-action" data-id="a	  " data-macros-action="macros-edit">
                        <svg viewbox="0 0 24 24" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                            <path fill="var(--color-gray-222, #222)" 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-action macros-delete" data-id="ao  " data-macros-action="macros-delete">
                        <svg viewbox="0 0 18 18" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                            <path fill="var(--color-gray-222, #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="var(--color-gray-222, #222)" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            <path fill="var(--color-gray-222, #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-id="z">
                <p data-id="z1"></p>
            </div>
        </div>
        r  Ztocr  r  r   c                 s   s.   | ]&}t |d ddkr|d dV  qdS r  r  r  r"   r"   r#   r   
  s   z3ConfluenceAPIImport._convert_toc.<locals>.<genexpr>r  r  r  outlineF	separatorZbracketsr  Z40pxr  ZmixedhminLevelr  maxLevel6excluder  	printableTabsoluteUrlclass)r  r  r  r  r  r  r  r  r  r  r  r  r  r  r-  r  r  r  r  r  Ndiv)r*  r   r.   r   r   r   r   r   r   r  r  r  r  )rB   r  r  r  r   r  r  
parametersr  r  r  r"   r"   r#   r7  u
  sx    '






 	
z ConfluenceAPIImport._convert_tocc                 C   s   d}|j dddidD ]}|d}|dd}td	d
 |dD }|dd}|dd}	t|j||	dd}
t|
}||
j |r|j	d|idnd}|s|j	ddid}|r||j qdS )uF   
        Конвертирует макрос 'Статус'
        z
        <span
            data-macros="wiki-status"
            text="{text}"
            color="{color}"
            class="statusView-content-wrap"
            contenteditable="false"
        >
            <span>{text}</span>
        </span>
        r  r  r/  r  r  r  r   c                 s   s   | ]}| d dV  qdS r  r  r  r"   r"   r#   r   
  s   z6ConfluenceAPIImport._convert_status.<locals>.<genexpr>r  r   ZcolourZneutral)r   colorr  N)
r   r.   r   r   r   r  copyr  r  r  )rB   r  r  r  r   r  r  r  r   r  r  new_tag_viewr  r"   r"   r#   r,  
  s.    

z#ConfluenceAPIImport._convert_statusc                 C   s  ddl m} t }t }t| d}z|D ]}|dkrt|}t|}	|dkrd|	dg}
n"|dkrdd	 |	d
dD }
t }t }|
D ]}|dddd}||ddd}z`t	j
jdddd| dgdd|gddd| dggddgd}|st	j
|d}|jdd W nB tk
r` } z"td| d|  W Y qW 5 d }~X Y nX |jj|kr||jj ||jj|jj|jjdd q|r|dd |g ||d< q.|d!kr.t|}t|}	|dkr|	dg}n$|dkrd"d	 |	d
dD }t }t }|D ]}|d#kr<|r<|}n4t	jjd$d%d&| d'gd(d%d)| dggddgd}|std*| d+ q"|jj|kr"||jj ||jj|jj|jjd,d q"|r.|d-d |g ||d-< q.W n tk
r   Y nX ||fS ).Nr   translitr   r*  z\=r-  inc                 S   s   g | ]}| d qS r-  strip)rU   r*  r"   r"   r#   r!  	  s     z5ConfluenceAPIImport._bql_from_cql.<locals>.<listcomp>z()r  r   #r   ruTZlanguage_codereversedORaliasILIKE"%rJ   r,   r  rS   rk   *   Не удалось создать тег r   rx  )rJ   r,   rc   Z	classNamerp  INr   c                 S   s   g | ]}| d qS r  r  rT   r"   r"   r#   r!  ,  s     zcurrentSpace()rd   re   %::::%rk  z%"key":"u.   Не удалось найти проект «   »r  rl   )transliterater  r  r   iterr   nextr  r   r   rx  r.   ry   r   r3   r   rc   rM   rr   rJ   r,   r  StopIteration)cqlrt   rl   r  Zbql_listbql_dictZ	cql_partsZcql_partopr  rY  Ztags_idsZ	tags_listr*  Zlabel_aliasr   r   r   Z
parent_idsZparent_listr   r  r"   r"   r#   _bql_from_cql
  s    






z!ConfluenceAPIImport._bql_from_cqlc                 C   sl  d}|j ddidD ]P}|d}t|d}z|d}tdd	 |D }	| |	d
d| jjjj\}
}ddd|	dddkt	|	dd|	dddk|	dddkd|
|dg d
}W n*   | jj
d| d| d|d Y nX t|jt|ddddd d!d"d#d$d%}|r<|jd|idnd&}|sV|jddid}|r||j qd&S )'u`   
        Конвертирует макрос "Содержимое по меткам"
        u  
        <div
            class="macros-panel content-by-label"
            contenteditable="false"
            data-id
            data-macros="contentbylabel"
            data-macros-parameters="{parameters}"
        >
            <div class="extension-container" contenteditable="false" data-id data-layout="default">
                <span aria-label="Макрос Содержимое по тегам" data-id role="img"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24" width="14" height="14">
                    <path d="M20.457,4.555,12.486.126a1,1,0,0,0-.972,0L3.543,4.555A3,3,0,0,0,2,7.177V19a5.006,5.006,0,0,0,5,5H17a5.006,5.006,0,0,0,5-5V7.177A3,3,0,0,0,20.457,4.555ZM20,19a3,3,0,0,1-3,3H7a3,3,0,0,1-3-3V7.177A1,1,0,0,1,4.515,6.3L12,2.144,19.486,6.3A1,1,0,0,1,20,7.177Z"></path><circle cx="12" cy="7" r="1.5"></circle></svg>
                </span>
                <span class="extension-title" data-id><span class="excerpt-title" data-id>Содержимое по тегам</span></span>
                <span class="macros-actions" data-id>
                    <span class="macros-action" data-id data-macros-action="macros-edit">
                        <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-action macros-delete" data-id data-macros-action="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 class="macros-preview" data-id></div>
        </div>
        r  Zcontentbylabelr  r  r  r  c                 S   s   g | ]}| d dqS rQ  r   r  rU   pr"   r"   r#   r!  s  s     zAConfluenceAPIImport._convert_content_by_label.<locals>.<listcomp>r  r   r   defaultr  FTr  Truemax   
showLabelsT	showSpacer  rp  )
r  Zmodelr  r  r  r  r  r  bqlrp  ui   Не удалось конвертировать макрос «Содержимое по меткам»     с параметрами: zERR-0034r   r  r  r   z:Truez:truez:Falsez:falser  r  N)r   r.   r   r   r   r  r*   rs   rt   rG  r  r   r  r   r  r  r  )rB   r|   r  r  r  r   r  r  all_parametersr  r  r  r  r  r  r"   r"   r#   r4  L  s`    

 

     
z-ConfluenceAPIImport._convert_content_by_labelc                 C   s  d|    d|    d|    d|    d|    d|    d|    d|    d	|    d
}i }|jddidD ]}|d}t|d}	t }
z,|	r|	dkr|	d}tdd |D }
W n*   | jjd| d|	 d|d Y nX |
d|
dddkd}|   }tj	|dd
dd}d d!d |jD }t|j||rR|nd ||d rdd"nd d#d$}|d r|jd%|j n|r|jd|idnd&}|s|jddid}|rd d'd( |jD }t|j||r|nd ||d rd"nd d#d$}||j t|tjr$qti }zt|d)d*}|sHtd+|d,d% jd-d.idsd/d |d,d% jd-d0idD }d1d |d,d2 jd-d.idD }tt||}ntd3d |d,D }t|tjs|||< W qt tk
r8 } z,t|tjs(| jjd| d4|  W 5 d&}~X Y qtX qt|rzf|j  |jjd&krbi |_||jd< |j  |jjd&kri |_||jd< |j d5d6 t!  W nN tk
r } z.t"  | jjd| d7| d8| d9|d W 5 d&}~X Y nX d&S ):u[   
        Конвертирует макрос "Свойства страницы"
        aS  
        <div
            class="macros-panel details{details_hidden}"
            contenteditable="false"
            data-macros="details"
            data-macros-parameters="{parameters}"
            data-id="{macro_data_id}"
        >
            <div class="extension-container" contenteditable="false" data-layout="default" data-id="ui   ">
                <span aria-label="Макрос Свойства страницы" role="img" data-id="  ">
                    <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="r  uy   ">Свойства страницы</span>
                </span>
                <span class="macros-actions" data-id="U">
                    <span class="macros-edit" style="margin-right: 7px;" 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="J  ">
                        <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" contenteditable="true" data-fabric-macro="null" data-macro-body="" data-id="za">
                {content}
            </div>
            <div class="macros-preview" data-id=" "></div>
        </div>
        r  detailsr  r  r  Noner  c                 S   s   g | ]}| d dqS r  r  r	  r"   r"   r#   r!    s     z8ConfluenceAPIImport._convert_details.<locals>.<listcomp>ud   Не удалось конвертировать макрос «Свойства страницы» r  zERR-0035r   rc   hiddenFr  )rc   r  r   r-  r  r   c                 S   s   g | ]}t |qS r"   r  rU   cr"   r"   r#   r!    s     z details-hidden)macro_data_idr  r  Zdetails_hiddenr  r   Nc                 s   s   | ]}t |V  qd S r   r  r  r"   r"   r#   r     s     z7ConfluenceAPIImport._convert_details.<locals>.<genexpr>r   tableu5   Отсутствует таблица свойств.trr  confluenceTdc                 S   s   g | ]}d |j d  qS )key_details r   )r  )rU   thr"   r"   r#   r!    s   confluenceThc                 S   s"   g | ]}d  dd |jD qS )r   c                 s   s   | ]}|d krt |V  qdS r   Nr  r  r"   r"   r#   r     s      BConfluenceAPIImport._convert_details.<locals>.<listcomp>.<genexpr>)rO  r  )rU   Ztdr"   r"   r#   r!  
  s   r   c              	   S   sJ   g | ]B}d |j ddidjd  ddd |j ddidjD fqS )	r$  r  r&  r  r   r   c                 s   s   | ]}|d krt |V  qdS r'  r  r  r"   r"   r#   r     s      r(  r#  )r  r  rO  )rU   r"  r"   r"   r#   r!    s    r   Trk   uE   : не удалось сохранить значения macro_db «u   »: zERR-0037)#r*  r   r.   r   r   r   r*   r  r   r   r   rO  r  r   r  r  insertr  r  r  r  r   r  r   ziprD  r4   r   Z	macros_dbr/   rM   Zmacros_db_draftry   rz   r   )rB   r|   r  r  r'  r  r  r   r  r  r  r  r  r   prmZcontents_strr  r  Z
propertiesZcontents_tableZ	first_rowZ
second_rowr   r"   r"   r#   r:    s    '

 

		.




 z$ConfluenceAPIImport._convert_detailsc                 C   s  d|    d|    d|    d|    d|    d|    d|    d|    d	|    d
|    d}|jddidD ]t}|d}t|d}z|d}tdd |D }	| |	dd| jjjj	|j
\}
}dd |	dddD }|	dddkdd|	dddkdd|	dddkt|	ddd |	d!|	d"d|||
d#}W n*   | jjd$| d%| d&|d' Y nX tj|dd(d)d*}t|j|d+d,}|r|jd|idnd }|s|jddid}|rz||j qzd S )-um   
        Конвертирует макрос "Отчёт по свойствам страницы"
        a6  
        <div
            class="macros-panel details-summary"
            contenteditable="false"
            data-macros="detailssummary"
            data-macros-parameters="{parameters}"
            style="display: inline-flex; flex-direction: column; position: relative; width: 100%;"
            data-id="zp"
        >
            <div class="extension-container" contenteditable="false" data-layout="default" data-id="u{   ">
                <span aria-label="Макрос Отчёт по свойствам страницы" role="img" data-id="r  z;>
                    <span class="excerpt-title" data-id="u   ">Отчёт по свойствам страницы</span>
                </span>
                <span class="macros-actions" data-id="r  r  r  z:"></div>
            <div class="macros-preview" data-id="r  r  Zdetailssummaryr  r  r  r  c                 S   s   g | ]}| d dqS r  r  r	  r"   r"   r#   r!  c  s     z@ConfluenceAPIImport._convert_details_summary.<locals>.<listcomp>r  r   c                 S   s   g | ]}|  qS r"   r  )rU   r  r"   r"   r#   r!  e  s     headingsr  showCommentsCountFr  showLikesCountreverseSortpageSize   NsortByfirstcolumn)r-  ZshowCreatorZshowLastModifiedr.  ZshowPageLabelsZshowUnresolvedCommentsCountr/  r0  rc   r2  r3  r,  ZsettingsParamsr  uv   Не удалось конвертировать макрос «Отчёт по свойствам страницы» r  zERR-0036r   r   r-  r  r  r  )r*  r   r.   r   r   r   r  r*   rs   rt   rl   rG  rO  r  r   r   r   r   r  r  r  r  )rB   r|   r  r  r  r   r  r  r  r  r  r  r,  r  r+  r  r  r"   r"   r#   r5  4  s|    &

$
 z,ConfluenceAPIImport._convert_details_summaryc           	      C   s   d|    d|    d|    d|    d|    d|    d|    d|    d	|    d
}|jddidD ]r}|d}t|d}t|jtj|dd}|r|j	d|idnd}|s|j	ddid}|rp|
|j qpdS )uD   
        Конвертирует макрос "Якорь"
        a:  
        <span
            class="macros-panel anchor-macros"
            contenteditable="false"
            style="display: inline-flex; flex-direction: column; position: relative;"
            data-param-name="{param_name}"
            data-rendered="true"
            data-macros="anchor"
            data-id="z'"
        >
            <span data-id="zl" data-layout="default" class="extension-container" contenteditable="false">
                <span data-id="ur  " role="img" aria-label="Макрос Якорь">
                    <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Capa_1" x="0px" y="0px" viewbox="0 0 204.851 204.851" style="enable-background: new 0 0 204.851 204.851;" xml:space="preserve" width="16" height="16">
                        <path xmlns="http://www.w3.org/2000/svg" style="fill: #010002;" d="M139.518,128.595l16.834,16.336c0,0-20.644,29.877-42.725,30.473 c0.479,0,0.117-84.092,0.039-104.472c14.694-4.797,25.402-18.182,25.402-34.117c0-20.009-16.697-36.218-37.273-36.218 c-20.615,0-37.312,16.209-37.312,36.208c0,15.671,10.376,28.929,24.748,33.961l0.098,104.277 c-26.643-1.837-42.061-27.474-42.061-27.474l17.997-17.41L0,120.505l9.887,63.301l17.362-16.795 c15.036,12.105,32.017,37.244,72.876,37.244c51.332-1.309,63.184-28.939,76.344-39.804l18.993,18.514l9.389-63.907 L139.518,128.595z M82.558,36.208c0-10.298,8.608-18.661,19.218-18.661s19.257,8.363,19.257,18.661 c0,10.327-8.647,18.681-19.257,18.681S82.558,46.535,82.558,36.208z"></path>
                    </svg>
                </span>
                <span data-id="u^   " class="extension-title">Якорь
                    <span class="excerpt-title" data-id="z>">| {param_name}</span></span>
                <span data-id="z=" class="macros-actions">
                    <span data-id="u  " class="anchor-copy" role="img" title="Скопировать ссылку" area-label="Скопировать ссылку">
                        <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24" width="14" height="14">
                            <path d="M22,4.145,17.986,0H10A3,3,0,0,0,7,3V4H5A3,3,0,0,0,2,7V24H18V19h4ZM16,22H4V7A1,1,0,0,1,5,6H7V19h9ZM9,17V3a1,1,0,0,1,1-1h6V6h4V17Z"></path>
                        </svg>
                    </span>
                    <span data-id="a  " 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 data-id="a   " 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>
            </span>
        </span>
        r  anchorr  r  r  )Z
param_namer  N)r*  r   r.   r   r   r  r   r   quoter  r  r  )	rB   r  r  r  r   r  Zmacro_param_namer  r  r"   r"   r#   r6    sB    )

z#ConfluenceAPIImport._convert_anchorc                 C   sF  d|    d|    d|    d|    d|    d|    d|    d}|jd	d
idD ]}|d}|d}i }td|D ]$}	|	dd\}
}| ||
 < q|dsq\|d dd}tdd|}tdd|}||d< | |d }||d< t	| }d}|dr8|d d}|
||d }|j d| }tjj|dd gd!}|sttj|| jd"d#}|jr||_|jd"d$ d%d&d'd(d)d*d+d,d-d.d/g}d0|p||d1d2dddt|jd"d3}tj|d0d4d5d6d7}t|j||d8d9}|r|jd|idnd}|s0|jd:d	d
id}|r\||j q\dS );u   
        Конвертиация макроса "Результаты фильтра" ("Вставить фильтр/проблему Jira")
        zw
        <div
            class="macros-panel wiki-task-list"
            contenteditable="false"
            data-id="z"
            data-macro-parameters="{params}"
            data-macro-parameters-original="{original_params}"
            data-macros="bql-task-filter"
        >
            <div class="extension-container" data-id="ui   " data-layout="default">
                <span aria-label="Результаты фильтра" data-id="uo   " role="img">Результаты фильтра</span>
                <span class="extension-title" data-id="z@"></span>
                <span class="macros-actions" data-id="z:">
                    <span class="macros-edit" data-id="a  " style="margin-right: 7px;">
                        <svg viewbox="0 0 24 24" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                            <path fill="var(--color-gray-222, #222)" 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="a  ">
                        <svg viewbox="0 0 18 18" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                            <path fill="var(--color-gray-222, #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="var(--color-gray-222, #222)" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            <path fill="var(--color-gray-222, #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"></div-->
        </div>
        r  Zjirar  r  r  z	(?<!\\)\|rQ  r   jqlQuery\r   z\|\|?r  z&&?ZANDZserverIdr  NZ	columnIdsr  rt   rb   rv   rk  r  T)rd   r*   rv   rk   
logic_typer,   rJ   Zresponsibler  priorityr/  r  r  r  ZdeadlineFZmaximumIssues   )ZbordercolumnsZ	itemsSizeZfilterIdZ
filterNameZfilterParentNameZuserFilterIdZuseCustomFilterr  r  r-  r  r  r  r  )r*  r   r.   r   r   r  r   subr  r   Zconvert_fieldsrd   r   CmfTaskFilterr*   rv   rk  ry   r   rc   r   r   r   r  r  r  r  )rB   r|   r  r  r  r   r  r  r  r  r   rM   Z	jql_queryr  jqlr;  Z
column_idsZ	tf_ext_idZtfZdefault_columnsr  r  r  r"   r"   r#   r1    s    




 	z(ConfluenceAPIImport._convert_task_filterc              	   C   s*  t jjdd|gdddgddd ggdddd	gd
D ]}z|jd d d r|jd|jd d d idD ]}ddd |jD }t|jdkr| 	 |j
d< t|j|j
d< dg|j
d< d|j
d< d|j
d< d|j
d< n|  ||_|jdd qfW q0   | jjd| d|j d |d! Y q0X q0d S )"Nrl   rm   r  Trk  rn   r   r/  html_contextr  r  ZinlinePropertiesZ	markerRefzdata-refr  r   c                 S   s   g | ]}t |qS r"   r  r  r"   r"   r#   r!  P  s     z@ConfluenceAPIImport._convert_inline_comments.<locals>.<listcomp>r   zdata-idzdata-object-idzinline-highlightr  ZinlineCommentzdata-mark-annotation-typeZ
annotationzdata-mark-typer  rk   uO   Не удалось конвертировать inline комментарий r   zERR-0020r   )r   r  r  rk  r   rO  r$  r   r/  r*  r   rc   unwrapr?  ry   r*   r  r   )rB   r   r  rg  r   Ztag_contextr"   r"   r#   r8  =  s@    



 z,ConfluenceAPIImport._convert_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 d| d| d | j  |S )Nr   /usr/bin/python3	manage.pyshell,plugin = models.CmfPluginConfluence.get(id="z+");retcode = plugin.process_document_fork("", "", , );T"/var/log/eva-import-subprocess.logr   &/var/log/eva-import-subprocess.err.logZ	close_fdsZstart_new_sessionstdoutstderru.   Запустили process_document_fork (pid= offset= limit=r'  	
subprocessPopenr*   rs   rc   r   r7  pidrz  rB   r  ra  r  rQ  rX  r"   r"   r#   _execute_docc  s      . "
z ConfluenceAPIImport._execute_docc                    s  t  _|d}|r"jjdkr,t d d}i }j|d |d dD ]R}d }|d rl|d d d }|d	 d
 }|dkr|d }|t|d||d < qLdd  fdd  ||d d jj	
dj  |d }g }	tjD ]6}
|s
 q2|d\}}|||}|	| q|rtd t|	D ]b}| }|d k	rJ j|7  _|	| |s q2|d\}}|||}|	| qJq2t|	D ]&}|  |jr j|j7  _qjj	
d d S )Nhomepager!   rc   r\   r  Z	ancestorsr   rc   r  positionr  r   )rl   rX  c                 S   s   dd t d| D S )Nc                 S   s$   g | ]}|  rt|n| qS r"   )isdigitrG  r   )rU   r   r"   r"   r#   r!    s     zKConfluenceAPIImport._process_documents.<locals>.natsort.<locals>.<listcomp>z(\d+))r   r   )rV   r"   r"   r#   natsort  s    z7ConfluenceAPIImport._process_documents.<locals>.natsortc                    sr   fdd   D }|j fddd |}g }|D ]&}|d }|||f  ||}q8|rn|j< |S )Nc                    s    g | ]\}}|d   kr|qS rl   r"   )rU   r  r   r[  r"   r#   r!    s      zNConfluenceAPIImport._process_documents.<locals>.build_tree.<locals>.<listcomp>c                    s    |  d S )NrX  r"   )r  )rV  rZ  r"   r#   r     r   zLConfluenceAPIImport._process_documents.<locals>.build_tree.<locals>.<lambda>)r   rv  )r   r  rr   r;   )rV  rl   ordernor$  Zcurrent_ordernoZchildren_in_orderr  Znext_orderno
build_treerZ  rB   )rV  rl   r#   r^    s    
z:ConfluenceAPIImport._process_documents.<locals>.build_treei uJ   Грузим документы в несколько процессов: r   r   u:   Закончили обработку документов)r   r;   r.   rs  rt  rc  rf  r   r*   r4   r   rG   rh  r9  poprU  rr   r  sleepr  pollr1   r  communicate
returncode)rB   r   r  rV  r   r{   rl   rX  rg  rW  r   ra  r  rX  rc  new_procr"   r]  r#   _process_documentsv  sZ    


 


z&ConfluenceAPIImport._process_documentsc           	   	   C   s  | j jd |dg |jj}| j D ]p\}}z:| j  rLW  q|r| j j	j	j
 d| }tjj|dgd}|s| j jd| d| j dd	d
 n| j}|D ]\}}| j j	j	j
 d| }tjj|ddddgd}|s| j jd| d| d|d q|jr|r||kr$| j|_n|j|kr6||_||_|jdd q|rj|jsjd|_|jdd t  W q,   t  | j jd| dd	d
 Y q,X q,d S )Nu6   Построение дерева документовru  rb   tree_node_is_branchr  u?   Не найдена родительская страница 'uQ   '. Дочерние страницы будут помещены в корень zERR-0120r!   rj  rl   r
  rv   r\  u-   Не найден потомок по ext_id=z tree_parent_ext_id=zERR-0003r   Trk   uI   Не получилось привязать ноду tree_parent_ext_id=zERR-0024)r*   r4   r   r  ru  rM   r;   r   r6  rs   rt   r   r!   r.   r  rs  rv   r
  r\  ry   rf  rz   r   )	rB   r  project_homepageZtree_parent_ext_idr$  r
  rd   r\  r  r"   r"   r#   _process_documents_tree  sb    
 

 z+ConfluenceAPIImport._process_documents_treec                 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 d| d| d | j  |S )Nr   rA  rB  rC  rD  z/");retcode = plugin.process_doc_versions_fork("rE  rF  rG  rH  TrI  r   rJ  rK  u2   Запустили process_doc_versions_fork (pid=rN  rO  r'  rP  rT  r"   r"   r#   _execute_doc_versions  s      . "
z)ConfluenceAPIImport._execute_doc_versionsc                 C   s  | j jd| j  | |d }g }t| jD ]2}|s> qf|d\}}| |||}|| q2|rt	
d t|D ]Z}| }	|	d k	r||  j|	7  _|| |s qf|d\}}| |||}
||
 q|qft|D ]"}|  |jr|  j|j7  _q| j jd d S )Nue   Обрабатываем версии документов в несколько процессов: r\   r   r   uP   Закончили обработку всех версий документов)r*   r4   r   rG   rh  r9  r_  ri  rr   r  r`  r  ra  r1   r  rb  rc  )rB   r   r  rg  rW  r   ra  r  rX  rc  rd  r"   r"   r#   _process_documents_versions  s4    

z/ConfluenceAPIImport._process_documents_versionsc                 C   s  dddddgdgddd	gd
gdgdgdgdgg dgd
}t |d  d}t|d}t|}W 5 Q R X | jjjj d|d  }tjj	|d}|stj|d| jd}||_
|d  d|d  |_|jdd dddd d!d"d#d$d%d&d'd(d)d*d+g}|d,d-g }	tjj||	d.D ]L}
|
jrg |
_|D ]}t|
|d/ q&|
jjd0krNd|
_|
jdd q|d1 D ]}zr|	|d2 d }|d kr| jjd3|  W qf|D ]2}tjj	|dd4}|s| jjd5| d6| d7d8d9 |  jd:7  _qtjj	||d;d-gd<}|s@| jjd=| d6| d7|d> |  jd:7  _q|jsLq|d? D ]P}| |}|rv|j| n,| jjd@| dA| dB|d> |  jd:7  _qT|dC D ]}|d }| jjrd| jjjj d|d  d}nd| jjjj d|d  d}tjj	dDdEdF| dFgdDgdG}|sBtjj	ddH|gdDgdG}|r|jsX||_n||jkrt|j | |_|jdd |j| n,| jjdI| dA| dJ|d> |  jd:7  _q|dK rd|_ |jdd qW n2   | jjdL| dMdNd9 |  jd:7  _Y nX qf|S )ONzPPP-DOC-CREATEzPPP-DOC-EDITzPPP-DOC-PUBLISHzPPP-DOC-TREEMOVEzPPP-OBJ-ORDERPPP-DOC-DELETEzPPP-COM-ADDzPPP-COM-EDIT-OWNzPPP-COM-DELETE-OWNzPPP-COM-DELETE-ALLzPPP-ATT-CREATEzPPP-ATT-DELETE-ALLzPPP-PR-BROWSEzPPP-ATT-DELETE-OWNzPPP-PR-ADMIN)
rz  r{  r|  r}  r~  r  r  r  r  r  r\   r  r   rb   rc   rr  T)rd   rv   r*   r   u?   : Схема проектных прав доступа для rJ   rk   Zaccess_local_userZaccess_ownerZaccess_owner_assistantaccess_authorZaccess_spectatorsZaccess_executorsZaccess_responsibleZaccess_list_ownerZaccess_project_owner_assistantZaccess_project_spectatorsZaccess_project_executorsZaccess_sdesk_clientaccess_anonymousZaccess_guestZaccess_sharelink_anonymousproject_permissionaccess_members)rl   rK   F)rk  zPPP-OBJ-DELETEr  r  u8   Не найдено соответствие права )r,   rR  u    Не найдено право "u	   " для zERR-0059CmfProjectPermPermissionr   r   r   )rn  rl   rK   u2   В схеме не найдено правило "r  r   u)   Не нашли пользователя u    для прав zERR-0060r  rd   re   rf   r  r  u   Не нашли группу zERR-0061r  u>   Не удалось импортировать правило zERR-0063CmfProjectPermSchemeRule)!r   r   r   r/   r*   rs   rt   r   ZCmfProjectPermSchemer.   rk  rJ   ry   rr  r  rv   ro  rw  rn  r,   rl  r4   r   rp  r  r1   rq   rr   r)   r8   ru   rd   rm  )rB   r   Zmapping_permr  r   Z	perm_listZperm_scheme_ext_idZperm_schemeZrule_bool_fieldsZrule_fieldsZruler   Z	perm_dictr  r  r  Zscheme_ruler_   r~   ra   Z
group_namerd   Z	group_objr"   r"   r#   _process_permissions:  s   



 
z(ConfluenceAPIImport._process_permissionsc           	      C   s   g }|}|}d}t jjdddgddd|gdd|gggd	d
ddgd}|D ]L}|j | krp|d7 }|d |j | krH|d7 }|d qH|rd	}| jj	dd
| d| d| dtjd	d |||fS )u8  
        Добавляет суффикс 'Wiki' к названию или коду импортируемого проекта,
        если есть существующие НЕ Wiki-проекты с аналогичными названиями или кодами

        Args:
            space_name (str): название проекта
            space_key (str): код проекта

        Returns:
            tuple[str, str, bool]: новые названия и код проекта и флаг добавления суффикса
        Flogic_prefixrn   project.wikir  rJ   r  task_code_prefixTr  rh   rR  rK   z Wikiu   названиеZWIKIu   кодu   В u    и u9    проекта добавлен суффикс 'Wiki': 'r  r'  r5   r  )r   r  r  rJ   r   rr   rv  upperr*   r7  rO  r3   r8  )	rB   
space_namerx  r  Znew_space_nameZnew_space_key
has_suffixZmatching_projectsZmatching_projectr"   r"   r#   _add_project_suffix  s@    
z'ConfluenceAPIImport._add_project_suffixc                 C   s   dddd| dgdddgg}t jj|dd|ggd	dgd
}|rr|d| d7 }| jjd|j d| dddd |}d}t jj|dd|ggdd	gdr|d7 }| | }qz||kr| jjd| d| dddd ||fS )ue  
        Проверяет унакальность названия и кода проекта

        Args:
            space_name (str): название проекта
            space_key (str): код проекта

        Returns:
            space_name, space_key (tuple[str, str]): новые названия и код проекта
        r  rd   NOT LIKErf   rQ  NrJ   r  r  r  r  r'  u   Проект с именем 'ud   ' уже существует. Импортируемый проект переименован в 'r  zERR-0131r  rj  r   rv  Trw  r   u   Проект с кодом 'ug   ' уже существует. Код импортируемого проекта изменен на 'zERR-0132)r   r  sgetr*   r  rJ   )rB   rz  rx  rd   Zext_id_filterr  Zoriginal_space_keyZcounterr"   r"   r#   _check_project_uniqueness  s>    z-ConfluenceAPIImport._check_project_uniquenessc                 C   s  |  | jjd }|d d d }| jjjd}|   |  D ]z}i }d}z| j rfW  q|d dd | jD krW qBd	|d
  d|d  d|d  d}| jj	
d|  t|d d}|dr|d d }	| ||	}
|
std|d d  d|	 dnt| jj	d| d |d D ]L}z| ||}
|
rTW  qW n&   | jj	d| d|  Y nX q4td|
d d }| jj	
d|  |d d krtj|d!< n| || j |d!< |
d d"}|r0| jj	
d#|  |d d krtj|d$< n| || j |d$< n|d! |d$< |
d d% d& }| jj	
d'|  |d d krztj|d(< n| || j |d(< |
d d) |d*< |
d d% d+ |d,< |d
 }|d d-kr|d.7 }d/|d0< | j|d }d1| jjjj d1|d  d1}tjjd2d3d4| d4gt| d5d6d7g d8}|rd9}d:| }|jd;krnd<| d=| d| d}| jj|dd> n$|d?krd@| d| d}dAtjjdBdCdD}|dEkrdF| d| dG}|dHdIdIdJ | jj|dd> tj|| j|ddK}n|dAkrtjjd5dLd;gdMd6dN|gd
dN|gggd5d6d2gd8}|sPtdO| jjdP| d| dQ| dd> |j d1| |_|j ddR t!  ntdS| |jd;krtj"jdTdL|j#gd
dLdUggd2gd8}|stdV| |j$r||_%|j ddR || _&n|j$rt'|j%o*|j%jdW}|s:|rT| (||\}}}||dW< | )|||\}}||d
< ||d6< | *||dX< ||d7< |D ]}t+||||  q|j,j-r|. |_/|   t!  |dr | 0|
| n| jjdY| dZt1j2dd[ || _&|| _3|rtj"jdTdL|j#gd
dLdUggd\}|jd;krbtj"j|d]d^}|r|j4dd_ n|jd`krtj"j|d]d^}tj"j|dad^}|r|j4dd_ |r|j4dd_ |r|j4dd_ |5dbg |j6j}| j|_|j ddR t!  | 7|| | 8|| | 9| t:j;rVt:j;}t:j;dckr2dd}| jj	
de| df | <|| n| jj	
dg W qB t=k
r } z6t>  | jj?dh|d
  d|d  di| djdkdl W 5 d }~X Y qBX qBd S )mNr  rN   rM   rc   
add_suffixTc                 S   s   g | ]}|d  qS rW  r"   r   r"   r"   r#   r!  M  s     z7ConfluenceAPIImport._process_spaces.<locals>.<listcomp>r  rJ   z' (id: z, key: r   r'  u0   Импортируем пространство r\   r  rV  uE   В дампе не найдена домашняя страница 'r   r  u   У пространсва u    нет домашней страницы. Сведения о создателе и дате создания пространства будут взяты из первой корневой страницы.r  uW   Не удалось получить данные корневой страницы id=u(    в дампе пространства uS   В дампе не найдено ни одной корневой страницыr\  r]  uD   Определяем автора домашней страницы r  r  r  r_  uJ   Определяем владельца домашней страницы r  r^  r  rq  r  r  r  r  r  Zpersonalu(    (Личное пространство)u%   Личное пространствоdescriptionrb   rd   re   rf   rt  rv  rk  r  FuI   Найден ранее импортированный Wiki-проект zproject.agileu    Найден Agile-проект u_    с импортированным в раздел 'Документы' Wiki-проектом ')r  )Zproject_wikir   u3   Создание нового Wiki-проекта 'r  zproject.wiki:defaultr+   )project_typer8  r   u,   Создание нового раздел 'u-   ) в портале 'Моя компания'sectionzCmfWiki:Class)r  	parent_idtree_parent_id)rJ   r*   rd   rv   rm   r  r  u   Не найден Agile-проект для объединения. Создайте или импортируйте одноименный Agile-проект и повторите импорт проектаu"   Импорт Wiki-проекта 'u<   ) в раздел 'Документы' Agile-проекта rk   u8   Неизвестный тип опции импорта r  u   ДокументыuL   Не найден раздел 'Документы' в Agile-проекте r{  Zproject_perm_schemeu"   Настройки проекта u    были изменены пользователем. Изменения из импорта не будут примененыrx  rg   u   Документ1)r
  rJ   rS  ru  u   Документ2ru  r   u   ВсеuY   У документов будет обработано последних версий: u   . Для изменения, поменяйте значение параметра IMPORT_CONFLUENCE_PROC_LAST_PAGE_VER в config.u   Обработка версий документов отключена параметром IMPORT_CONFLUENCE_PROC_LAST_PAGE_VER в config.u6   Ошибка импорта пространства 'z). zERR-0032r  rj  )@rX   r*   r  rM   r.   r  r  r6  r  r4   r   r   r   r  r  r   rO   r  rq   r7   Zget_correct_keyrs   rt   r   r  r  keysrt  r7  ZCmfLogicTyperi   rd   ry   rz   r!   rc   rv   rk  rs  rL  r|  r  rs  rw  rJ   rx   Zgen_coder,   r   r3   r8  r  r  r  ru  _process_project_tagsre  rh  r?   rU  rj  r   r   r  )rB   rR   rN   r  r   Zproject_fieldsZproject_is_newZspace_full_namerU  Zhomepage_idrV  Z	root_pager|  rm  r}  rz  rx  rd   r  Zlog_msgZ
doc_folderr{  r   Zrm_doc_folderZrm_doc1Zrm_doc2rg  r  r  r"   r"   r#   _process_spaces@  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 ]^}| 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 t  W qr   t  | jjd| d|d Y qrY qrX qrd S )Nr   r  r\   r  rY  rc   rJ   r   r   r  r   r  Tr  rb   rd   re   rf   r   r  r  r  r  r-  r  ro  rk   r  zERR-0022r   )r   r  r   rc  rf  r*   r6  r  r   rs   rt   r   rx  r.   rd   rJ   rk  rx   ry   rz   r   r  )rB   r   r  r  rp  r{   r   Ztag_nameZ
name_aliasrd   Ztag_objr   r"   r"   r#   r  W  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 )Nr  r   r   r   )rB   r  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   r/   )rB   Z
group_pathZ	user_pathr   r   r"   r"   r#   _get_group_members  s    
z&ConfluenceAPIImport._get_group_membersT)r   rH   c              	   C   s  | 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d}	t|	dkr|	d |d< d|d< d|d< nbt|	dkr>|	d |d< |	d |d< d|d< n2t|	dkrp|	d |d< |	d |d< |	d |d< ddg}
tjj ddd| dg|
d}|rH|jjd| jjjj ddkrH|r| jjd| d|j  td| jjjj dd|jj|_|jdd d }n0|  jd7  _| jjd| d |j d!d"d#d$ |s:d%dd&d'| jjjj d(gdd)d gg}tjj d*d+|d g|g|
d}|s:tjjdd+|d g|g|
d}t|dkr| jjd,|d  d-t| d"d#d$ |  jd7  _g }|sd.d+|d. g|g}tjj||
d}|sd%g}t |	t|	D ]}t|	dkr`dd+|d g}nnt|	dkr|!dd+|d gdd+|d gg n<t|	dkr>|!dd+|d gdd+|d gdd+|d gg q>||g}tjj||
d}t|dkr,|  jd7  _| jjd/|d.  d-t| d"d#d$ |r:|d }d}|s|rd}d}|d }tjj d*d+|" g|
dr| j#d0| d1t$j% |d d	\}}| d2| d	| }|d7 }qZ| j#d3|  tj||| jdd4}nd |fS |r|j&s|j'r"|D ]}t(||||  q
|)ddd5g |jrX||jkr^|j | |_n||_tj*+ }tj*, }||j-kr|j-!| ||j-kr|j-!| d|_.|j/r|jdd | j j0d7  _0||fS )6NrI   u2   Обрабатываем пользователя r   Z
operationsT)rJ   does_not_worku8   Не указан Email для пользователя r   @)rJ   rI   r  rb   Fr   r   r   	last_namer   Z
first_nameZsecond_namer3  r   rg_member_ofrd   re   rf   r  u    ext_id пользователя uN    содержит несколько ID из одного источника: z::.+?::rk   uP   Возможно найден некорректный пользователь ud   ,так как ext_id содержит несколько ID из одного источника: 'uq   '.Необходимо повторно импортировать локальных пользователей.zERR-0004r_   rj  r  r}  r  r  rm   loginr  u+   Пользователей с почтой z > rJ   u+   Пользователей с именем uQ   Обнаружена учетная запись с дублирующим email u   , добавляем цифруr   u1   Создадим пользователя ext_id=)rd   r  r*   rv   
user_local)1r.   r*   r4   r   r   rL  warnZcmfrK   ZCmfEmailZ
max_lengthr   r?   
ORG_DOMAINrk  Ztranslit_striprs   rt   r7   r   r   r   rd   rM   r  r   r   r<  ry   r1   r  r  r
   rr   r   r7  r3   r8  rv   rv  rw  r  ru   Zconfluence_group
user_groupr  r  rx   r9   )rB   r   r  ri   rI   Z	user_dictZmax_lenrd   
is_createdZ	full_namerK   r~   Znot_source_hash_filterZpersonsr   Z
name_combonr  Zprefix_emaildomainr   Z
conf_groupr  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 ]x}| j 	dd | j 
 r\ d S | |\}}|jr||jdd |r|jjtjs||jj |d	g D ]}d
}| 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}|s@tj|| j |d
 d|d}n|jrR|d
 |_|jsb||_n||jkr~|j | |_|jdd |j| q|jr|jdd t  q8|r| j jjddr| j j dt!| d|  t"tj#j$t%|gd d S )Nr  TuA   Не грузим пользователей из-за опцийr2  r   r_   r  rk   r  rJ   rc   rb   rd   re   rf   r   r  rm   rd   r*   rJ   rv   rk  send_invitesu,   Отправляем приглашения u    пользователям: )args)&r*   r  rM   r.   r7  r3   r8  r<   r   r  r6  r  rx   ry   rI   rL  r?   r  r  r)   r8   rs   rt   r   ru   rv   rJ   rd   r  rr   rz   r4   r   r   Zschedule_deferred_jobr   Zregister_personsr  )	rB   r  r   r~   r  r   r   rd   ra   r"   r"   r#   _process_persons1  sP    
  
z$ConfluenceAPIImport._process_personsc                 C   sP  |   D ]@}d}| 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s||_n||jkr|j | |_|jd
d t  | | j d|| D ]@}| |d\}}|s q|j| |jr|jd
d qt  qd S )NrJ   rc   rb   rd   re   rf   r   r  rm   Tr  rk   r  F)r  r)   r8   r*   rs   rt   r   ru   r.   rv   rJ   rd   ry   rz   r  r   r   r  r  rr   rx   )rB   r   r   rd   ra   r   r~   r   r"   r"   r#   _process_groupsZ  s:      

 z#ConfluenceAPIImport._process_groupsc                 C   sD  | j jd t| }t }tjjdddgdddgdd	d
ggddddgd}|D ]}d|j	 d|j
 d}|jjd}|sqR|jjd d }z^|||\}}	||_tj|	dd|_|jd
d | j jd| d| d| d|	 d	 W qR   | j jd| d| ddd  Y qRX qRt | }
| j jd!|
d"d# dS )$u   
        Пост обработка JQL в фильтрах задач макроса "Результаты фильтра"
        uj   Обработка JQL в фильтрах задач макроса 'Результаты фильтра'rk  re   z%"jqlQuery":"%r*   rn   Nrv   rm   Tubql2r  rJ   r  r-  r.  r'  r6  r  rt   Fr   rk   u   Фильтр z: JQL u%    переобразован в UBQL2 z (BQL: "z")u0   : ошибка преобразования JQL zERR-0066r=  rq  uC   Обработка JQL в фильтрах выполнена за r  r  )r*   r4   r   r   r  process_timer   r=  r  rJ   r,   rk  rM   r.   Zget_modifiedr  r   r   r  ry   r  )rB   r>  r  Ztask_filtersZtask_filterZ
filter_msgr  rt   r  r  r  r"   r"   r#   _process_jql_in_filtersx  sD    
z+ConfluenceAPIImport._process_jql_in_filtersc                 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	  |  j|7  _| 
  |   |   | jjjddr|  j| j 7  _n| jjd	 t  | jd
 |  D ]}|d dd | jD kr8q| jjd|d  d z6d| jjjj d|d  d}| jj|| jjd W n8 tk
r } z| jjd|  W 5 d}~X Y nX q| j S )u   
        Запуск импорта

        :return bool: Истина в случае успешного импорта
        r3  r   uB   При дампе данных обнаружены ошибки (u0   ), попыка повторного дампа r2  uF   При дампе вложений обнаружены ошибки (Zprocess_linksTu2   Отключена обработка ссылокz2--------------------------------------------------rc   c                 S   s   g | ]}|d  qS rW  r"   r   r"   r"   r#   r!    s     z6ConfluenceAPIImport.process_import.<locals>.<listcomp>u'   Импортирован проект 'rJ   r  rb   )rL  uC   Не удалось создать отчет по проекту. N)r9  r*   r7  r1   r3   r8  r  r  r)   closer  r  r  r  rM   r.   Zprocess_cross_linksr4   r   rz   r  r  r   rs   rt   Zproject_statsr   r!  )rB   r?  r1   r  Zproject_ext_idr  r"   r"   r#   process_import  sD     
*z"ConfluenceAPIImport.process_importc                 C   s<   |j dtdids*|jdks*| dr8||  |S )uS   
        Из документов MS создаем наши превью
        r  Z
backgroundr  r  )r  r   compilerJ   r  Zcreate_preview_tag)rB   r   r  r"   r"   r#   _create_preview  s    *z#ConfluenceAPIImport._create_previewc           !      C   s  dd l }|dd D ]b}zDz|jdrN| jjd|  W W q| jjd| d|  |d	r~|jd	 }n
|jd
 }|d	rL|jd	 	drL|j
|d}|r|ds| jjd|jd	   W W qtj|d d}	|j d|	 }
|jd	 |jd< |
|jd	< d|jd< | jjd|
  W W qd|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 vqtd|}|r|d}|s$tj|d}|r| |}|rx|jd	 |jd< |j|jd	< d|jd< | jjd|j  n| jjd|jd	   W W q|j
|d}|r|dr|ddkr|d|d< |d|d< |d|d< W W hqtd|}|r|d}tjj| jjjj d | d!}|rhd|jd< |jd	 |jd< |j|jd	< nd"|d< ||d< W W q|}tj|dd dd }|}|jd#}|jd$kr.|r.||jd d kr.t| jj d% }t| jj d& }t | j! "d'|d(|d)}| jjjj d | }tjj|d*gd+}|rT|}|# s|rt | j! "d't|j$jd% d(|d)}|# s| jj%d,| d-| d.| d/| d0	d1|d2 W W qtj&j'd&d3|gd4d5| d6gd7d3dggd8d9d:gd;}|rt |j(# rtj)j||d<}|stj)||| jdd=}|jr|jd>r|jd> }|d?|_*|d@r|d@ dA dBkr| |d@ | j+ |_,nt-j.|_,|j/ddC t0t |j(dD*}|j1|2 ddE d|_3|j/ddC W 5 Q R X t4  n0| jj%dF| dG| dH| dIdJ|d2 W W 8qtj)j|dKdLdMg|dN}|r|d
r0|jd
 |jdO< |j5j6|jd
< d|jd< |dPr|jdP |jdQ< |jdP= t78|jd
 dd }|r|d r|d 	dRrdR|_9dS|jdS< dT|jdU< dT|jdV< n,|r$|d r0|d 	dWs0| :|| |d	r|jd	 |jd< |j5j6|jd	< d|jd< t78|jd	 dd \}}|r|	dRrdR|_9dS|jdS< dT|jdU< dT|jdV< |;dX} |jd	 | jd
< || jdA< |<|  n| :|| | jjd|j5  n2|jddkr>| jj%dY| dZ|d2 W W (qW n   | jj%d[d\|d2 Y nX W 5 | jjd|  X qd S )]Nr   c                 S   s   |  dp|  dS r   r   r   r"   r"   r#   r     r   z4ConfluenceAPIImport._convert_links.<locals>.<lambda>u'   Не обработали ссылку r  u   Уже обработали u&   Обрабатываем ссылку u    на странице r   r   r  )r   zdata-anchoru1   Не найден якорь для ссылки z##Z	href_origTu   Заменили на z/people/r   r   r   r   u?   Пользователь не найден для ссылки r   zdata-usernamer   data-linked-resource-typer  zdata-linked-resource-idz$/pages/viewpage.action\?pageId=(\d+)rb   rr  r  z!data-linked-resource-container-idr!   r   rJ   r  r  r   zparent.import_raw_jsonr  u   Документ ID u)    с каталогом вложений 'u<   ' не найден в дампе пространства 'r  u~   ). Возможно он находится в пространстве, которое еще не импортированоzERR-0005r   rQ  r   re   r  r   r  r\   rk  r  r  r  r   r  r  r  r  rk   r  r  u   Не найден файл '   ' страницы ID r  r  zERR-0006r   r  r  )rJ   rK   rl   Zsrc_origZsrcsetZsrcset_origZvideoZcontrolsr  r  r  Zimagesourceu%   Не найдено вложение zERR-0007u,   Ошибка обработки ссылкиzERR-0008)=zipfiler   r*   r4   r   r   r.   r   r   r   r  r   r   r5  lstripr   r   rq   r   r   r   ra   r   r!   rs   rt   rt  rd   r   rs  rk  r/   r   r   r   r   rl   r  r   r~  r\   r  r  r7   r  rO   r  ry   r   r  rZ   rv   rz   r   rM   r   r   rJ   r  r  rr   )!rB   rl   r  r  Zmake_previewr  r   r   Zraw_tagZanchor_nameZanchor_linkZ
account_idr~   r  Z	user_namera  Zrel_docZattach_parentrJ   r   Zresource_container_idrx  rz  r  Zresource_ext_idZdoc_with_attachZdownloaded_fileZ
attach_objr"  r   r   r  r  r"   r"   r#   r	    s   















 

 
	



 

 






z"ConfluenceAPIImport._convert_linksc                 C   s  |j dkrd}nd}| jjd |jddidD ]}z|drR| |d }ntd	t|j	t
|jt
|jt
|jt
|jd
d}t|}||j |jd|d d}	|	r|	|j W q2 tk
r }
 z| jjd| d|d W 5 d}
~
X Y q2X q2dS )u]   
        Упоминания пользователей
        confluence-userlink
        r  z
                <a cmf_converted="true" 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 cmf_converted="true" 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  userinfor  Zuserkeyu]   Не найдены аттрибуты для определения пользователя)Z	person_idZperson_loginZperson_hrefZperson_namer  zuser-mentionr   )class_r   uZ   Не удалось преобразовать ссылку на пользователя zERR-0009r   N)rt  r*   r4   r   r   r.   rq   r   r   r  r   rc   r  r   rJ   r  r  r  r  r  )rB   rl   r  r  r  r   r~   r  r  r  r   r"   r"   r#   r    s4    


 z%ConfluenceAPIImport._convert_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   ", в дампе, указываем системногоr2  FZdefault_user_idrW  uA   ", ставим пользователя по умолчанию u*   ", указываем системногоzERR-0023r   rj  )r   r*   r7  r3   ZERRORrO   Zsystem_userr  r  rM   r.   r   r   r8  r  )rB   r   r_   r~   r   r"   r"   r#   rq     s$      zConfluenceAPIImport._get_personc           
   
   C   s   zT|d d d d d }t jj||d}|s>td| d|| ||| W n tk
r } znd	|d d
  d|j d|jd  d}	t|t j	r|	d|j
 d7 }	|	d| 7 }	| jj|	d|p|d W 5 d}~X Y nX dS )u_    Конвертирует макрос Word или Excel через atlas_doc разметку r   r  macroParamsrJ   rM   r  r  r  r  extensionKeyr  r  rc   r'  r(  r   r  r   N)r   r  r.   r   r  r  rJ   rk  r  rD  rF  r*   r  )
rB   r   elemr   r  r'  r   r  r  r  r"   r"   r#   _convert_msoviewer_in_atlas_doc  s"    &z3ConfluenceAPIImport._convert_msoviewer_in_atlas_doc)r;  rH   c           2   
   C   s8  dd l }t|}d}t|D ]}| j r2 q4|d7 }|d dkr|jddddd	d
}	dd |jddid
D  }
g }|
jD ]}|dkrq|	| qt
|d D ]\\}}|d d }|jd| ddd| ddd
}|dd || jD  |		| q|
|	 	n|d dk
rPd }
|d dr|jd|d d id
}
|
s| jjd|d d  d|d d   qnNd|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
}
|

rN|d d d$ d% d! }d&|kr<|d&d\}}n2t|tjrZ|j d' }n|jj d' }|}|d d d$ d(}|
rNt|dd%j|d! ||d)d*}|
|j q|d d d+krd,}|jd|d d id
}
|

rN|d d d$ d% d! }|
rNd&|kr*|d&d\}}n2t|tjrH|j d' }n|jj d' }|}t|dd%j||d-d*}|
|j q|d d d.r@|d d d$ d/ d! }|}tjj||d0}d1}|sR|d d d$ d2 d! }| jjjj d3| }tj j!d(d4|gd5d6| d7gd8d4d9ggd:d;d<gd=}|rt"|j#$ rtj||| jd9d>}|jr|jd?r|jd? }|d@|_%|dAr|dA d dBkr| &|dA | j' |_(nt)j*|_(|j+d9dC t,t"|j#dD*}|j-|. d9dE d9|_/|j+d9dC W 5 Q R X tj j!d(d6| dFgd5d6| d7gd8d4d9ggd:d(d;gd=}|rt"|j#$ r|j0} tjjd(d4| gdGdH|ggdI}!|!stj| ||j%|j(| jd9dJ}!|!j+d9dC t,t"|j#dD*}|!j-|. d9dE d9|!_/|!j+d9dC W 5 Q R X t1  nTt"| j2 3dKt4| j5j d' dL|dM}"| jj6dN| dO| dP|" dQdR|dS q|}tjjdGdH|gd(d6| dFggdTgd=}!dU}dU}#|d d d$ dr|d d d$ d d! }|d d d$ dVr|d d d$ dV d! }#|j0j7|j8j7||#dW}$|!r|!j9|$dX< nd%|$dX< t|dd%jf |$d*}|
|j q|d d dYk	rVdZ}%t4|j8}&t4|j0}'d[|&|&d\d%d]d[d^}(|d d d$ })|)	r|)d_rt:;|)d_ d! < |(d`< |)dar0|)da d! }tj=j|j>|d0}*|*stjj|db}*|*rt4|*j8|(dc< t4|*j0}'n| jjdd|d   |)derL|)de d! |(df< |)dgrh|)dg d! |(dh< |)dir|)di d! |(dj< |)dkrd]dddl}+|+|)dk d! |(dm< |)dnrd(dodpdq},|,|)dn d! |(dr< |)ds	rt:;|)ds d! < |(dt< du?dvdw |)@ D }-t|%j|&|'t:jA|(d[dx|-dydd%d*}.|
|.j n|d d dzk
r |jddzdd{d
}/|jd|dd}id
}0|0	|d d d$ d} d!  |/	|0 |jd~ddddd
}1|1	|d d d$ d d!  |/	|1 |
|/ nN|d d dk
r(| jB|||
d|d n&|d d dkr| jB|||
d|d n|d dkr|d d dkr|d d d$ d(r|d d d$ d( d! }d}|jd|d d id
}
|

rt|dd%j|d%?dd |
jD dd*}|
|j n| jjd|  |dr| jC||d ||d qd S )Nr   r   r  ZlayoutSectionr  r  r  z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  rf   zflex-basis: )zdata-column-widthzdata-layout-columnr  c                 S   s   g | ]}t  |qS r"   )r  r  r"   r"   r#   r!  K  s     	extensionZlocalIdzdata-local-idu&   Не удалось найти тег u    для r  ZmacroMetadatar  ZmacroIdr  rM   r  uU  
                    <div
                        class="macros-panel macros-include-block"
                        contenteditable="false"
                        data-id
                        data-macros="include-excerpt"
                        data-param-excerpt="{excerpt_name}"
                        data-param-pageid=""
                        data-param-pagename="{page_name}"
                        data-param-projectkey="{space_key}"
                    >
                        <div class="extension-container" contenteditable="false" data-id data-layout="default">
                            <span aria-label="Макрос Include. " data-id 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" data-id>Макрос Include. "Вставить выборку" <span class="excerpt-title" data-id>| Имя = {excerpt_name}</span></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-id></div>
                    </div>
                    r  r   r  r   rJ   r  r  r  u  
                    <div
                        class="macros-panel macros-include-page"
                        contenteditable="false"
                        data-macros="include-page"
                        data-param-pageid=""
                        data-param-page-label="{page_label}"
                        data-param-projectkey="{space_key}"
                        data-rendered="true"
                    >
                        <div data-layout="default" class="extension-container" contenteditable="false">
                            <span role="img" aria-label="Макрос Include. ">
                                <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 class="excerpt-title">| Имя = {page_label}</span></span>
                            <span class="macros-actions">
                                <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 class="ak-renderer-wrapper"></div>
                    </div>
                    r  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pageIdrb   rQ  r   re   r  r   Tr  r\   rk  r  r  r   r  r  r  rk   r  r  r  rl   rm   rg   )rJ   rl   r  r  r*   rv   r  r  r   u7   Не найден файл Draw.io диаграммы 'r  r  r  zERR-0010r   r   r  r  r  r  r$  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>
                    Fr  r  )r  r  r  r  r5   r  r  r  r  r  rS   r  uE   Не удалось обработать тег оглавления r  r  r  r5   r  r  r  r  r  r  r  r  r  r  r  r  r  c                 s   s$   | ]\}}| d |d  V  qdS )rQ  rM   Nr"   r   r"   r"   r#   r     s     z9ConfluenceAPIImport._convert_atlas_doc.<locals>.<genexpr>r   )r&   r  r  r  zpaste-code-macro)r  r  r
  r   Zprezlanguage-markupr  )r  r  zdata-mce-selectedZ__bodyContentr  r)  r  ZbodiedExtensionr  u  
                    <div
                        class="macros-panel macros-excerpt-block"
                        contenteditable="false"
                        data-id
                        data-macros="exceprt"
                        data-param-name="{name}"
                    >
                        <div class="extension-container" contenteditable="false" data-id data-layout="default">
                            <span aria-label="Макрос Include. 'Создать выборку'" data-id 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" data-id>Макрос Include. 'Создать выборку' <span class="excerpt-title" data-id>| name = {name}</span></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" contenteditable="true" data-fabric-macro="null" data-id data-macro-body="">{content}</div>
                    </div>
                    c                 S   s   g | ]}t |qS r"   r  r   r"   r"   r#   r!    s     r  u   Не нашли тег для )Dr  r   r  r*   r6  r  r   r_  r  rr   rT  extendr  r.   r  r4   r   r   r  r   r  rk  r/   rl   r   r   r  r  rL  r  rs   rt   r   r~  r   r\   r   r  rq   r7   r  rO   r  ry   r   r  rZ   rv   rJ   rz   r   r   r   rs  r  rM   rc   r   r   r   r   r!   r  rO  r   r   r  r+  )2rB   r   r;  r&  r'  r  Zcntr?  r  Ztag_layout_sectionr   r  r  colr  Ztag_layout_colr  Zmacro_paramsrx  r  r  rV   r  rJ   r   r  ra  rn  r  r"  r   Z
drawio_imgZfile_name_imgr  r   r  rV  r  r  r  r  r  Zparent_pager  r  Zoriginal_params_strZnew_soupZ
code_blockr   rM   r"   r"   r#   r+  0  s   




**%
#

'


 



*!.
z&ConfluenceAPIImport._convert_atlas_doc)F)N)r  N)N)N)N)r   r`  )N)N)N)TT)T)N)NN)ir   r   r   r   r   r   Z	CmfImportrC   r6   r  rQ   staticmethodr   r   rX   rY   r   r   r   r   r   r   r   r   r   r   r  r@  rY  rt  ru  ry  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rp   r  r  r  r%  r<  r=  rX  r  r_  rc  rf  r?   ZIMPORT_OBJ_CNTrh  rn  r~  r.  r-  r  r/  r0  r9  r2  r3  r7  r,  r  r4  r:  r5  r6  r1  r8  rU  re  rh  ri  rj  rs  r|  r  r  r  r  r  r  r  r  r  rL  r  r  r	  r  rq   r  r+  r"   r"   r"   r#   r(   *   s   	>!?
KU4 "5_
x
<#6
n=AE
N
8^
	
1 //6a
 |:LCW/PJ
 T<y&T5( 55  ) &)-1
 cD
r(   )#r  r   r   r   r  r  Zcmf.appr   pathlibr   urllib.parser   r   typingr   r   r   r	   	itertoolsr
   r   Zcmf.includeZmodules.confluence.apir   Z%common.models.cmf_plugin_import_mixinr   Zbs4r   r   Zmodules.jira.jql.parserr   Z	dataclassr   r$   r(   r"   r"   r"   r#   <module>   s.   	