U
    g                    @   s*  d dl Z d dlZd dlZd dlZd dlZd dlZd dl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mZ d d	lT d d
lmZ d dlmZ d dlmZ d dlmZ d dl m!Z! d dl"Z"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)commit_all_ds)*)CmfActiveEntity)ConfluenceApi)CmfPluginImportMixin)BeautifulSoup)ApiNotFoundError)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                   @   s~  e Zd ZdZeejdddZdd Ze	ddd	Z
eeed
ddZe	dddZdd Zdd ZdedddZedddZdd ZeeedddZdd Zdd!d"Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Z 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+edIdJdKZ,dLdM Z-dNdO Z.dPdQ Z/edRdSdTZ0dUdV Z1eedWdXdYZ2dZd[ Z3dd\d]Z4d^d_ Z5ed`dadbZ6edcdd Z7dedf Z8ddidjZ9dkdl Z:e;j<fdmdnZ=dodp Z>dqdr Z?dsdt Z@dudv ZAdwdx ZBddydzZCd{d| ZDd}d~ ZEdd ZFdd ZGdd ZHdd ZIedddZJdd ZKdddZLdd ZMdd ZNdd ZOdd ZPdd ZQdd ZRdd ZSdd ZTdd ZUdd ZVdd ZWedddZXdd ZYdd ZZdeedddZ[dd Z\dd Z]dd Z^e_dddZ`dd ZadddZbedddZcdd ZddddZedeedddZfddĄ ZgddƄ 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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) confluence_apir-   r   Z
total_datar!   ZCmfSchemeWfgetZdefault_document_workflowloaddoc_workflow
has_errorsexpandloggingZ	getLoggerloggerZhandlersZsetLevellevel_prepare_multiprocessinguser_keyconncloudimported_object_countjson_object_countr   treeset_selected_objsdump_page_versionsconfig$IMPORT_CONFLUENCE_DUMP_LAST_PAGE_VERdump_last_page_ver)selfr,   r-   Z	scheme_wfr8   r%   r%   r&   __init__0   s(    

zConfluenceAPIImport.__init__c                 C   s   dd l }dd l}dd l}dd l}|| _ || _tj| _tj| _|	 d | _
| jjd| j
d  ddd tjr~ttj| j
| _
| jjdtj dd | j}| jjdt|d	  d
dd tt|d | j
| _
| j
stdd S )Nr      z
cpu_count=u%   , надо не менее 2 ядерT)	anonymouszconfig.IMPORT_PROCESS=zavailable_memory=i   @u-   Гб, по 2 Гигабайта на ядроl        u   Ресурсов системы недостаточно для импорта, обратитесь в техподдержку для дополнительной информации.)	threadingqueuemultiprocessingpsutilrD   ZIMPORT_THREADSZthreading_max_forksZIMPORT_DOWNLOAD_THREADSdownload_threading_max_forks	cpu_countmax_processesr-   logZIMPORT_PROCESSminZvirtual_memoryZ	availableint	Exception)rG   rK   rL   rM   rN   Zavailable_memoryr%   r%   r&   r:   M   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)rX   fieldsselectedObjects)rX   valueimport_type)r    gZcurrent_personrW   rX   rG   r%   r%   r&   calc_import_settingsm   s    
z(ConfluenceAPIImport.calc_import_settings)settingsrV   c                 C   s   dd | D S )uO   Преобразуем список с настройками в словарьc                 S   s   i | ]}|d  |qS rX   r%   .0sr%   r%   r&   
<dictcomp>v   s      z;ConfluenceAPIImport._normalize_settings.<locals>.<dictcomp>r%   )r`   r%   r%   r&   _normalize_settingss   s    z'ConfluenceAPIImport._normalize_settingsc                 C   s   g S )uo    Для импорта из Confluence предварительный просмотр не требуется r%   r^   r%   r%   r&   previewx   s    zConfluenceAPIImport.previewc                 C   s  g g d}d }|  |d D ]}|d dkr|d d d D ]*}d}| || j }|r>|d | q>|d d	 d D ]}d}| jjjrd
| jjjj	 d
|d  d
}	nd
| jjjj	 d
|d  d
}	ddd|	 dg}
t
jj|
d}|rz|d | qz|d dkr|d d d D ]8}|dkr,d}| || j }|r|d | q|d d	 d D ]}|dkrvd}| jjjrd
| jjjj	 d
|d  d
}	nd
| jjjj	 d
|d  d
}	ddd|	 dg}
t
jj|
d}|rd|d | qdq|jr|r||_|jr,|jdd |j  |j  dd|jgddd gg}
t
jj|
d t
jj  |d rt
j|j| jd|d djdd |d rt
j|j| jd|d djdd t
jj  d S )N)readwritepath	operationrh   restrictionsuserresultsZprivategroup::idrX   ext_idLIKE%filterupdatereadonlyri   TZsave_importparent==r-   !=)rz   r-   Zaccess_levelsubjects)_get_restrictions_get_personr;   appendr1   r<   r=   r-   pluginsource_hashr!   CmfPersonGroupr2   import_originalperm_policy
is_changedsavedpcommitZperm_aclr3   ZCmfAccessRuleZbulk_delete)rG   docdoc_objZpermsr   restrictionrm   person
group_inforr   _filterro   r%   r%   r&   _process_restrictions|   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r8|d dkr8|\}}}}z |dd}| jj||}W nN tk
r } z0| j	j
d| d| d| d|  W Y d S d }~X Y nX |s| j	j
d| d|  d S | j	j
t| |d }|S )N/r      rI   wiki   spaces   pages   Zdisplay+ uC   Ошибка получения документа по pretty url : uo   Не смогли получить документ по pretty url (возможно не тот домен): rq   )splitr   rj   lenreplacer1   r<   Zget_page_by_titlerU   r-   r8   warninginfor    )	rG   urlr/   Zsplitted_url_spacetitleZfind_confl_docer%   r%   r&   _get_pageid_by_url   s6    

z&ConfluenceAPIImport._get_pageid_by_urlFra   c              	   C   s   | j  | d}| j  | d}| r<|s<d S t|d6}| D ](}| j  jd7  _|t|d  qNW 5 Q R X t	
|| | j jdd | j j  d S )N.jsonz.json.dirtya+rI   
T)Z	only_data)r-   get_download_pathjoinpathexistsopenr?   ri   jsondumpsshutilmover   r   r   )rG   Zapi_funcrX   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)rG   rX   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   r3   )rG   Zdir_pathfpr   r%   r%   r&   _list_users_from_dump   s    z)ConfluenceAPIImport._list_users_from_dump)textattachments_dirobjc                    s@  |sd S | j jd t|ddd D ]}d}|drBd}|j|  tj	 }zddd	g}t
 fd
d|D rW q*td rW q* d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|\}	}
|	s\| 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|_"|#  |j$%  W q* t&k
r8 } z*| j j$'  | j jd  d|  W 5 d }~X Y q*X q*d S )Nu/   Обработка ссылок в текстеlxmlc                 S   s   |  dp|  dS Nhrefsrchas_attrtagr%   r%   r&   <lambda>       z1ConfluenceAPIImport._dump_links.<locals>.<lambda>r   r   z/attachments/z/thumbnails/z/thumbnail/c                 3   s   | ]}| kV  qd S Nr%   )rc   Zurl_partr   r%   r&   	<genexpr>  s     z2ConfluenceAPIImport._dump_links.<locals>.<genexpr>/display/~([^/]+)(?:/)?$zmailto:u   Это почта: httpuH   Это внешняя ссылка, оставляем как есть: r   r   ?r   u   Это не файл: rp   rq   r   
obj_ext_idr   r-   r   r   r   Fu0   Не удалось скачать ссылку r   )(r-   r8   r   r   find_allr   attrsurllibparser   anyresearch
startswithr   schemenetlocurljoinr1   r   unquoter   	mimetypes
guess_typer!   r$   _get_filenamer   r   r   CmfImportDownloadr2   rj   rX   
downloadedr   r   r   rU   rollback)rG   r   r   r   r   keyZ
parsed_urlZ	url_parts	file_name	mime_typeencodingr   rr   download_jobr   r%   r   r&   _dump_links   sp    



 


zConfluenceAPIImport._dump_linksc                    s   z|  |W S    d}| jj||d  s<| jj||d  sP| jj||d  r| jjjrr| 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r6   r0   )usernamer   c                 3   s*   | ]"\}}| ks|d kr||fV  qdS ) Nr%   rc   kv	user_infor%   r&   r   C  s     z5ConfluenceAPIImport._get_user_info.<locals>.<genexpr>
users.jsonr   r   u4   Информация о пользователе ID u    добавлена в дамп)_get_user_info_from_dumpr1   Zget_user_infoZget_user_info_by_keyZget_user_info_by_usernamer<   r=   Zget_user_detailrw   itemsr   r   ri   r   r   r-   r8   r   )rG   user_idZ	dump_pathr6   Zuser_detail
users_pathr   r%   r   r&   _get_user_info3  s$    

z"ConfluenceAPIImport._get_user_infoNc                 C   sz   |  dD ]\}|| j|kr&|  S |dd | krF|  S |dd | kr
|  S q
td| d S )Nr   rX   r   r   uQ   Не нашли информацию по пользователю в дампе )r   r2   r;   lowerrU   )rG   r   r   r   r%   r%   r&   r   L  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	
 }	zX|d	}
t|
d}t|}W 5 Q R X |d
}| rt| t|d}d}| jjjr|d7 }| jj||d d || j dD ]}t|tr:| 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_versionr6   Zlast_versions6   Не удалось сдампить документ r   zERR-0038r$   dump
error_codeobj_type
error_typeFensure_asciir   rI   contentbodyexport_viewr[   bytyperJ   uE   Не удалось сдампить версии документа ERR-0025rC   w+    выполнен за .3f    сек.r   indentr  )rF   r-   r8   r   r   r   r   r   r3   time	monotonicr   remover1   r<   r=   Zget_page_versions
isinstancerU   	log_errorri   r   r?   inc_statr   r2   r   r  )rG   r)   doc_pathdoc_log_msgnum_ver_msgr   	doc_users
users_filer   t1	info_filedoc_dataZversions_file_namer6   Zpage_versionexct2Zusers_fr%   r%   r&   _dump_versionsV  sz    







   	z"ConfluenceAPIImport._dump_versionsc              
      s   fdd} fdd} fdd}t dd | _d	}| }|d krZ|| q jjd
|   d|d  d|d  d}	z6z j
 rW W "q|d dkrֈ jjd|	 dtjd W W q<tdD ]}
zh||d |d |	 ||d |d |	 ||d |d |	 |d r@ |d |d |	 W  qW q   |
dkr^  jjd|	 d|
 tjd Y qX qW n:    jj   jjd|	 dddd |d 7 }Y nX W 5  jj	  X || q<W 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%   rc   r   r%   r%   r&   
<listcomp>  s     z_ConfluenceAPIImport._dump_documents_expand_worker.<locals>.dump_child_pages.<locals>.<listcomp>
pages.jsonr  )	r-   r8   r   r1   get_childrenr   r   r   r  )r)   r  r   children
pages_filer   r^   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   rl   rm   rn   zrestriction )r  r   Fr  )r   r   r   r   r3   r   r  r-   r8   r   r1   Z get_all_restrictions_for_contentri   r   r   r  )	r)   r  r   r"  r#  r   Zrestriction_filer   rm   r^   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-   r8   r   r   r1   Zget_all_page_labelsri   r   r   )r)   r  r   Zlables_filer   labelr^   r%   r&   	dump_tags  s    

zDConfluenceAPIImport._dump_documents_expand_worker.<locals>.dump_tagsFZinit_views_and_dsr   uG   Осталось обработать примерно страниц: "r   " (rq   r1  statustrashed   Документ uW    был удален. Пропускаем дамп расширенных данныхr9   r   rj   rC      uO   Повтор дампа расширенных данных документа    , попытка u\   Не удалось сдампить расширенные данные документа r  r$   r  r  rI   )r   r1   r2   putr-   r8   r   Zqsizer   r   	is_cancelrR   r7   WARNINGranger)  r   r  )rG   obj_api
page_queueobjs_that_are_doner0  r2  r5  errors	page_datapage_log_msgir%   r^   r&   _dump_documents_expand_worker  s^    	




  z1ConfluenceAPIImport._dump_documents_expand_workerc                 C   s  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 ]z}| jj| jd|d  t| jj| jj| jj| jj| jj| jjjd||dd}|| |   | jjd|  q|D ]}|!  ~qX|j "  |# s|| 7 }qt| jjd|  |S )Nr   .dirty.trashed.metarI   r  r   rq   r   rj   r9  rC   )rq   r   rj   r9  rC   uC   Дамп расширенных данных документов: z_dump_documents_expand_worker r   logintokenpassword
verify_sslr=   )rC  rD  rE  targetrX   kwargs   Форк proc=uR   Ошибок дампа расширенных данных документов: )$rL   Queueiterdiris_dirr    rX   endswithr   r   r   r3   r   r2   rC   r?  r-   r8   r   rB  rK   ThreadrJ  r   r1   r   rP  rQ  rR  rS  r<   r=   r   startjoinclearempty)rG   objs_dirmax_workersrF  rD  rE  
page_countdoc_dirr%  r   Z	info_datadataprocessrI  procr%   r%   r&   _dump_documents_expand  s\    








z*ConfluenceAPIImport._dump_documents_expandc                    s   fdd}t dd| |_d}| }|d krD|| q|D ]:}z$zjjj|j	 ddd}	|	d	 d
krW W qHd|	d  d|	d  d}
j
 rW W  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 n:   jj  jjd|
 dddd |d7 }Y nX W 5 jj  X qHq&|| 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|}	t|dd}
t	
||
 W 5 Q R X |	rtjjjd| d  }jjjrtjjjd| d  }d}| |}jjjj d| d  }tjj||jjjjd}|stjj||jjjjd}||_||_d|_||_|  |j  | d d  d! ||  | d"}| rJt| 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r|d	 d |kr||d	 d  |d	 d
rB|d	 d
 |krB||d	 d
  |d	 dr|d	 d d |kr||d	 d d  qW 5 Q R X d| d+< | d,}t|d}
t	j
||
d-dd. W 5 Q R X t'(|| |jdd t|| d/< | d0}t|d}
t	j
| |
dd1 W 5 Q R X j)d2| d3 j&d4 d S )5Nr7  r   r8  rq   r1  rL  Texist_okhistory	createdBylastUpdatedr  ownedByr  rJ   r   attachments.jsonc                 S   s   g | ]}|qS r%   r%   r*  r%   r%   r&   r+  K  s    zUConfluenceAPIImport._dump_documents_main_worker.<locals>.dump_doc.<locals>.<listcomp>r  )page_idr6   r  )modez+pages/downloadallattachments.action?pageId=z%wiki/download/all_attachments?pageId=all_attachments.ziprp   r   r   Fr  viewr[   zcomments.jsonu5   Дамп комментариев документа r   z@,extensions.inlineProperties,extensions.resolution,children.pager   r   rI   commentr  rC   r   r   r  rj   r  r  r;  u     успешно сдампленr(   )*r   r    mkdirr   r2   r1   get_all_attachmentboolr   r   r  r   rj   r^  r   r<   r=   r-   r   r   r!   r   rX   r   import_raw_jsonr   r   r   r   r   r  r8   r   r6   get_page_commentsri   r   r?   r  r   r   rR   )r   r   rd  Zdoc_dir_tmpr"  ownerr   r%  Zattach_infoZ
has_attachr   r   r   Zattach_file_pathrr   r   Zcomments_file_namer6   rt  r   Z	info_pathra  rG   r%   r&   dump_doc6  s    








$

zAConfluenceAPIImport._dump_documents_main_worker.<locals>.dump_docFr6  r   z,versionr   )r6   r9  r9  currentr:  r7  r   r8  rq   r1  u   Дамп документа r   r=  u+   Повтор дампа документа r>  rI   u    из 3r<  r  r  r$   r  r  )r   r1   r2   r?  r-   r   r   r<   Zget_page_by_idr6   r@  r8   r   rB  rR   r7   rA  r?   r   r  )rG   ra  rC  bulk_page_queuerE  r|  rF  Zpage_idsrp  rG  rH  rI  r%   r{  r&   _dump_documents_main_worker5  sX    f




  z/ConfluenceAPIImport._dump_documents_main_workerc           	      C   s   d}| j  }g }t|D ]|}| jj| jd|d  |t| jj| jj	| jj
| jj| jj| jjjd||dd}|| |  | jjd|  q|D ]}|  ~q|j   | s|| 7 }q| jjd|  |S )	Nr   z_dump_documents_main_worker rI   rO  )ra  rC  r  rE  rT  rW  u.   Ошибок дампа документов: )rL   rX  rB  rK   r\  r  r   r1   r   rP  rQ  rR  rS  r<   r=   r   r]  r-   r8   r   r^  r_  r`  r2   )	rG   ra  r  rb  rF  rE  rf  rI  rg  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    страницrL  rI   .uY   Добавление страниц в очередь дампа выполнено за r  r  uU   Дамп основных данных документов пространства r   r  uC   Дамп расширенных данных выполнен за    Импорт прерван)rO   rL   rX  r-   r8   r   r  r  rY  rZ  r    rX   r[  r   r   r   r?  r  rh  r@  r   )rG   r   ra  rF  	space_keyrb  Zmax_bulkr  rc  Z	temp_listr$  rd  rp  r(  r%   r%   r&   _dump_documents  sF    



z#ConfluenceAPIImport._dump_documentsc                 C   sn  i }| j |d }z| j jjr<dddddddd	d
ddddd}|D ]}|d d |d d f}||}|stqH|||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 rHd |d!< qHn|D ]}
|
d" D ]}||d# |d# g g dd}|d$ r| |d$ | j  |d 	|d$  |d% r|d 	d|d% i |d$ sL|d% sLd |d!< qLq@W n"   | jj
d&d'd(d)d*  Y nX t|d+  d,}| r0t| 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  )rt  r  )rt  r  )
attachmentr  )r  r  )r   rh   )r   r  )r   Zrestrict_content)r   Z
administer)r   Zexportrk   Z
targetTypeF)
permissionr   groupsrJ   r}   rm   rn   r   r0   r   ro   r  rq   rX   )rq   rX   ZanonymousAccessTrJ   ZspacePermissionsr  ZuserNameZ	groupNameu>   Не удалось сдампить права доступаzERR-0056
CmfProjectr  )r	  r
  rj   /permissions.jsonr   c                 S   s   g | ]}|qS r%   r%   rc   r   r%   r%   r&   r+    s     z9ConfluenceAPIImport._dump_permissions.<locals>.<listcomp>)	convertedZoriginal)r1   Zget_space_permissionsr<   r=   r2   
setdefaultr   r-   r   r   r  r   r   r   r  r   valuesr   r  )rG   r   Zpermissions_dictpermissionsZmapping_typer  rk   Ztype_permrm   Zpermission_typepermission_filer   Zpermissions_datar%   r%   r&   _dump_permissions)  s    

	



z%ConfluenceAPIImport._dump_permissions   c                 C   s:  | 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j||||
dd}|sq"|D ]}|d dkrq|d  d7  < t|d }|d }z
|d dkrb|d d d r$dd | jj	|d|ddD }||d d d< |d d d rbd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* | rt|| 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 qqP|| W 5 Q R X dS )2u  
        Получает минимальные данные страницы с информацией о последнем изменении
        и зависимыми объектами(комментарии, вложения).
        Вычисляет хеш данных и сравнивает его с хешем предыдущей проверки,
        если хеши отличаются, то помечает каталог документа .dirty для повторного дампа
        r  Tri  zancestors,history.lastUpdatedz%,children.comment,children.attachmentz2,extensions.inlineProperties,extensions.resolutionFr6  r   )rF  allnewupdatedr   )r]  limitr6   r9  r9  r}  r  rI   rq   r   r:  r.  rt  rn   c                 S   s   g | ]}|qS r%   r%   )rc   rt  r%   r%   r&   r+    s    z:ConfluenceAPIImport._check_hash_worker.<locals>.<listcomp>r  )r  r6   r.  r  c                 S   s   g | ]}|qS r%   r%   )rc   r  r%   r%   r&   r+    s    )r  r6   Nz.hashr   )r  Z	sort_keyszutf-8r  r  r  rL  rM  u   Документ "r8  uQ   ) удален. Он не будет сдамплен и импортированuB   Не удалось проверить хеш документа "r1  r  r$   r  r  rF  )r   ru  r   r1   _lock_startr<   get_all_pages_from_spacer    ry  rv  r   r   rh   r   r   hashlibZmd5encodeZ	hexdigestri   r-   r8   r   r   r   r  r?  )rG   r  ra  hash_dirrC  hash_stats_queuer  	dump_dataZcontent_hash_dirr6   Zpage_expandZcomment_expand
hash_statsr]  r   r  rp  Z
page_titleZcommentsr   Zcurrent_hashZ	hash_filer   Zcontent_jsonZnew_hashrd  Zdoc_tmp_dirZdoc_trashed_dirr%   r%   r&   _check_hash_worker  s    


    
	







  z&ConfluenceAPIImport._check_hash_workerc                 C   s  | j  }d| _| j | _| j}|d }t|d  d}|jdd t	
 }g }	t|D ]~}
| jj| jd|
d  |||t| jj| jj| jj| jj| jj| jjjd	|d
d}|	| |  | jjd|  q\|	D ]}|  ~qt	
 | }d}d}d}d}| sR| }||d 7 }||d 7 }||d 7 }||d 7 }q| jjd|dd| d| d| d	 | jjd|  |S )Nr   r   rj   z/hashTri  z_check_hash_worker rI   rO  )r  ra  r  rC  r  rT  rW  rF  r  r  r  uC   Проверка хеша контента выполнена за r  u8    сек. (всего/новых/обновленных: r   r1  u(   Ошибок хеша контента: )rL   rX  r  rK   Lockr  rO   r   ru  r  r  rB  r\  r  r   r1   r   rP  rQ  rR  rS  r<   r=   r   r]  r-   r8   r   r^  r`  r2   )rG   r   ra  r  r  rb  r  r  r$  rf  rI  rg  r(  rF  Zobj_allZobj_newZobj_updatedr  r%   r%   r&   _check_hash  s\    


*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    r;   )rc   ur^   r%   r&   	<setcomp>P  s     z5ConfluenceAPIImport._collect_users.<locals>.<setcomp>r  rJ   r  r   Fr  N)r-   rR   rA   r   r   r   r   r3   r   r   addr;   r   unlinkr  list
differencer   r   )rG   project_dirra  Zcurrent_usersZcurrent_user_idsr#  r   Znew_user_idsr)   r   rm   Z
diff_usersr   r%   r^   r&   _collect_usersE  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   r3   )rG   project_keyr  r   projectr%   r%   r&   _get_projecth  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  rL  rN  u(   Пропускается каталог r   r  r   )r-   r   r   r   r   r[  r8   r   r   r   r3   )rG   r  r  r   r  r%   r%   r&   _get_projectsn  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_inford  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.  	documentsrq   u'   Документ не загружен zERR-0015r$   r  r  r  rn   Trq   r  r.  )_get_documentr   r   r-   r  r   )r  rd  Zdoc_dumpchildr-  rG   r%   r&   r-  }  s"      z=ConfluenceAPIImport._load_selected_objs.<locals>.get_childrenimport_settingsrZ   r[   r   r  Nc                 S   s   g | ]}|d  r|qS r  r%   rc   setting_objr%   r%   r&   r+    s      z;ConfluenceAPIImport._load_selected_objs.<locals>.<listcomp>r.  T
root_pagesr  archived_pagesr   r   rq   rj   r  uc   Не удалось вычислить выбранные документы для проекта u4   , скорее всего он не сдамплен)r   r    rf   r-   json_settingsr  r   rA   r  r  r2   r   r   r8   r   rB   )	rG   r`   rootselected_spacesr  r)   resultr   r  r%   r  r&   _load_selected_objsz  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   r3   r2   )rG   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   r   rq   r  r  Fr  )Zcmf.utilr  r1   Zget_applinksZshort_str_encr-   r   r   r   r   r  )rG   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j|}z| j rW  d S | j jd7  _||}|d}d }	d }
| r6t|d$}t|}|d}	|d}
W 5 Q R X d }tjd k	r~|
d ksr|
dkr~tjdksr|
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j|d dddD ]}|d |d  q>| srt !|d | t
||d< t|d$}|	|d< | j|d< t"|| W 5 Q R X t#  | jjd  | $| t%|d  d!}|j	dd | jjd"|  t
t&' ( ) }| j*|||	d#}|sV||d< t|d}t"|| W 5 Q R X |  j+| ,||7  _+| -|| W q   | jj./  | jj0d$| d%d&d'd( Y qX qd S ))Nr  rZ   r[   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 )rq   )r   rq   r%   r*  r%   r%   r&   r+    s     r  ri  r   r   rI   r  r   Z	dump_daterF   r   u&   Дампим пространство rX   rL  rj   r  rq   uJ   Пустой проект, возможно нет прав доступаr  Zarchived)r9  r  u=   Дампим права доступа (Разрешения)
/documentsuD   Проверка хеша контента пространства )r  u1   Ошибка дампа пространства zERR-0026r  r  r  )1rf   r-   r  r  r   r1   Zget_all_spacesr   r   ru  r    r<   Z	get_spacer@  r?   r   r   r   r3   r2   rD   rE   rC   rF   r8   r   r   makedirsZget_root_pages_from_spacer   CmfErrorr  r   r   r  commit_with_eventr  r   r   ZnowZ
astimezonedater  r5   r  r  r   r   r  )rG   r`   r  Zprojects_dirr  r  r   r  r%  Zlast_dump_dateZprev_dump_last_page_verr   Zcurrent_dumpZnew_dump_last_page_verr   Zarchived_docra  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 ]^}| jjjrPt	|d }nt	|d 
dd
dd}||}|jdd |d	}| j  jd
7  _t|d}t|| W 5 Q R X |d}| j  d}|jdd |jdd | j|d D ]}	||	| j d }
| j  jd
7  _t|
d}t|	| W 5 Q R X ||	| j d }
|
 rlq t|
d}t|	| W 5 Q R X q q2d S )Nr  Tri  rq   rX   r   r   r   r  rI   r  r   r   )r-   r   r   r   ru  r1   Zget_all_groupsr<   r=   r    r   r?   r   r   r  Zget_group_membersr;   )rG   
groups_dirro   rr   Z	group_dirZ	data_filer   Z	users_dirZall_users_dirrm   Zuser_data_filer%   r%   r&   _dump_groups2  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   Свободно места: rt   u$   Скачаем данные из API
load_usersTu'   Дампим пользователейr   uA   Не дампим пользователей из-за опцийr<  r   rI   rm   )r[   )r-   r   r   
disk_usager8   r   r  r[   r2   r   r1   Zget_all_usersrR   r7   rA  r  r  r   r  )rG   Zdownload_pathtotalusedfreeZfree_percentZuser_cntr   r%   r%   r&   download_dataQ  s    

z!ConfluenceAPIImport.download_data)rC  c                 C   sX  dd l }dd l}|| _d}tdd( | j r6q@| }|dkrJq@| jjd|d   d }t	dD ]}	zN| jj
|d tjdd	*}|  t|d
 d"}
|jddD ]}|
| qW 5 Q R X ||d
 \}}|rX|dkrX||d
 P}| D ]@}
|
jdkr q| jjd|d  d|
j d|
j d qW 5 Q R X | jjd|d
  d tjj|d d}d|_|  |j  | jd W 5 Q R  W  q(W 5 Q R X W qn tk
r } z| jj  W 5 d }~X Y qnX qn|d
 dr| jjd|d  d tjj|d dgd}d}t |d
 ! j"}|j#}|D ]h}|$|d  d|d d   }t%j&'| jj(|d! d" }| jjd#| d t	dD ]}z| jj
|tjdd	}|  t|d$}
|jddD ]}|
| qW 5 Q R X | jjd$|d%  d&|  | jd |d'7 }W 5 Q R  W  qXW 5 Q R X W nZ tk
r } z:|d(kr| jj)d)| d*|d  d+| d,d-d.|d/ W 5 d }~X Y nX qqX|t*|krd|_|  t+  n.| jj)d0|d  d1| d2t*| d3d-d.d4 q(| jj)d)|d  d5d6d-d.|d d/ q(|,| W 5 Q R X d S )7Nr   Fr6  DONEu    Пытаемся скачать r   r=  T)timeoutstreamrj   zwb+i    )Z
chunk_sizezapplication/zipr   u   Архив 'u   ' содержит файл '' (z bytes)u   Файл сохранен в ''rq   rq   r  rr  uH   Скачивание отдельных файлов из архива 'u-   ' на основе меты вложенийrx  )rq   rY   r  r  r  _linksZdownloadu   Попытка скачать '
   Файл 'r   u   ' сохранен в rI   r   u-   Не удалось скачать файл 'u   ' из архива 'z': zERR-0123r   r  )r  r	  r
  Zext_hrefuH   Не удалось скачать все файлы из архива 'u   ': скачано u    из zERR-0124r  u   ' с 3 попытокzERR-0027)-zipfiler   r1   r   r-   r@  r2   r8   r   rB  Zconfluence_requestrD   ZIMPORT_DOWNLOAD_TIMEOUTZraise_for_statusr   Ziter_contentri   r   ZipFileinfolistfilename	file_sizer!   r   r   r   r   r   r  rU   r   r[  r   resolverz   rx  r   r   r   r   r   r  r   
cmf_commitr?  )rG   rC  download_queue
done_queuer  r   rF  r   resrI  r   chunkZmimetyper  myzipZdownload_objr   Zattachment_counterr   r   r  Zattachment_pathZattachment_hrefZattemptr'  r%   r%   r&   _download_file_workeri  s    
 
 

 
 	z)ConfluenceAPIImport._download_file_workerc           	      C   s  | j jd | j }| j }d}| j dg dd| j jjjgdddgg}tj	j
|dsp| j jd	 |S g }t| jD ]v}| jj| jd
| ||t| jj| jj| jj| jj| jj| jjjddd}|| |  | j jd|  q~tj	j|ddgdD ]}||j|j|jd q
|D ]}|d q.|  s^|D ]}|!  qN| j jd | j " rt#  | j j$d |  s||% 7 }q| j jd|  |S )Nu=   Скачиваем все найденные вложенияr   zplugin.plugin.source_hashr   r{   r   Fru   u   Вложений нетr  rO  )r  r  rC  rT  u    Запустили задачу r   rj   rv   rY   )rq   r   rj   r  u%   Закончили скачиватьr  uC   Закончили скачивание файлов, ошибок )&r-   r8   r   rL   rX  load_fieldsr   r   r!   r   countrB  rO   rK   r\  r  r   r1   r   rP  rQ  rR  rS  r<   r=   r   r]  Zslistr?  rq   r   rj   r`  r^  r@  r  r   r2   )	rG   r  r  r5   r   ZprocsrI  rg  r   r%   r%   r&   download_files  sN    

  


z"ConfluenceAPIImport.download_filesc              	   c   s:   | d}t |d}|D ]}t|V  qW 5 Q R X d S )Nz/comments.jsonr   r   r   r   rG   rj   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&   r~     s    
z%ConfluenceAPIImport._get_restrictionsr   c                    s6    d D ]"}d fdd	  |d qd S )Nrj   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 ]} || q|j !  |W W >S    |j "  j j#d&d'  d(|  d)d* Y nX W 5 j dd X d S )+Nrt  	processedr9  ZdraftuJ   Не обрабатываем черновики комментариев rp   rq   r   rr   rY   rz   rr   r-   **rk  rn  r  rJ   rl  createdDaterm  r  whenr  rs  r[   editorr   r   c                 S   s   g | ]}t |qS r%   r    rc   xr%   r%   r&   r+  B  s     zMConfluenceAPIImport._process_obj_comments.<locals>.create.<locals>.<listcomp>
extensionslocationinlineT
resolutionZresolvedclosedry   r.  u7   Ошибка обработки комментария r   r   zERR-0028r  r   )$r-   r  r8   r   r   r   r!   
CmfCommentr2   r   r  r   r;   	cmf_ownerr]   anonymous_usercmf_created_at
cmf_authorcmf_modified_bycmf_modified_atr   _convert_mentions_convert_linksr^  r  r.  r   rx  tree_parentr  r9  r   r   r   r   r  )	rt  r  rr   Zcmf_commentrs  r  	view_soupeditor_soupr  r  r   rz   rG   r%   r&   r    sv    





 z9ConfluenceAPIImport._process_obj_comments.<locals>.create)rt  )N)r  )rG   rz   r   rt  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   rr  )r   r   )r   r   r   r   )rG   Zobj_pathattachments_pathr   r%   r%   r&   _get_obj_attachmentsZ  s    z(ConfluenceAPIImport._get_obj_attachments)rd  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st|d |krXt|d d |krX|  S qXd S )	Nz(\d+)\.(\d+)rI   r   ro  r   rq   r  r  )r   	fullmatchr   r   r   r   r3   r    )r   rd  Z
file_matchZfile_idZfile_versionr   Zattach_info_listattachr%   r%   r&   _get_confluence_attach_infod  s    
z/ConfluenceAPIImport._get_confluence_attach_infoc           
   	      s   dd l }d}d d tf fdd	}t d  d}| r||4}| D ]$}|drbqR|||||jd7 }qRW 5 Q R X jdd	 	 d D ](}	|||	d
 |	d 7 }jdd	 q|S )Nr   c                    s  d}d zzH |  d }|r*|d n| }tj|}tjj|ddddgd}|sxtj|jd	d
}|jd	d |jrR|r|dr|d }	|	d|_	|	dr|	d d dkrԈ
|	d j |_ntj|_|d krdnd}
||p| |
R}|j| d	d d	|_|jd	d t  |rH|d d }|j|ksHtW 5 Q R X W n tk
r   jjd|  d|j d| ddd d}Y n\ tk
r   d|  d}|d k	r|d| d7 }jj|dd |j  d}Y nX W 5 |  S X  ) Nr   rj   r   r   r   url_preview_imgurl_preview)rX   rz   rY   TrX   rz   r-   r   ry   r  r  r  r  rJ   rbr   Zsmart_backupr  ZfileSizeu   Размер файла 'u@   ' не соответствует размеру из меты: z	 bytes / z byteszERR-0029r  rI   u;   Не удалось обработать вложение 'r  u    из архива ')r(  r!   r$   r   CmfAttachmentr2   r-   r   r   r  r   r;   r  r]   r  upload_filerh   r  st_sizeAssertionErrorr  rU   r   r   )r   r   zip_fileopen_fnerrorZattachment_metaZattachment_titleZattachment_namer  Zattachment_versionZ	open_moder   Zfile_size_metaZ	error_msgr   rz   rG   r%   r&   _process_attachment{  sx    



zIConfluenceAPIImport._process_obj_attachments.<locals>._process_attachmentrj   z /attachments/all_attachments.zipr   )r2  r3  r  r  r   r   )
r  r   r   r   r  namelistr[  r-   r  r%  )
rG   rz   r   r  rF  r6  Zall_attach_zip_pathr  Zzip_attach_nameZattachment_datar%   r5  r&   _process_obj_attachmentsv  s2    H
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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  rs  r[   r  z<p></p>r   uC   Конвертация текста из atlassian разметкиZatlas_doc_formatr  )soupsubobjuT   Не удалось конвертировать разметку страницы "r   r7  r  u    (версия r  r1  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   r1   r<   r=   r-   r8   r   r   r   _convert_atlas_docrU   r2   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_detailsr^  r  r.  )rG   Zobj_datar   r:  rs  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   )rG   rj   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 ]}|  q$t jj  d }t d D ].\}}|tj	krj q||d}|rT|j
rT|}qTt jdd	d
d}	|	jd	d |	j  |_jrΈjd	d j  d S )Nc              
      s$  d }zzj jd d  d d  d| d   j jjj d	 d  d
| d  }tjj|dgd}|r|j	sW W d S |stj|j d}| d|_
| d|_| dr| d d dkr| d j }||_||_||_ntj|_tj|_tj|_| d|_| d|_| d|_t|jjdd d |_|j|_jjdd|_| di }t|ddk|_j ||d|_!d|_"| |_#|j$dd |j%&  W nP t'k
r
   j j(d d  d d  d|  dd   j)d!7  _)Y nX W 5 j dd X |S )"Nr  r  u7   Обрабатываем версию страницы r    (rq   z): version r  rp   r   r	  r  r  r  r  r  rJ   message%Y%m%d%H%M%S%fCLOSEDstatus_typer  r9  r~  r;  Try   u@   Ошибка обработки истории страницы z): zERR-0033r  rI   )*r-   r  r8   r   r   r   r!   CmfDocumentHistoryr2   r   r  r  r   r;   r  r  r  r]   r  reasonofficial_numberZofficial_daterT   r[   strftimecmf_versionZdoc_versionworkflowget_default_statusr9  rw  cur_workflowrN  r   Zhas_publishedrx  r   r   r   rU   r  r5   )version_dataZcmf_document_historyrr   r   Zversion_contentr&  r   rG   r%   r&   create_version  s`     $
"z=ConfluenceAPIImport._process_versions.<locals>.create_versionrz   =ru   rj   )r_  FTr   )rz   r^  Zcmf_deletedr   ry   )r!   rW  r  r  r   r   	enumeraterO  rD   $IMPORT_CONFLUENCE_PROC_LAST_PAGE_VERr^  r   cur_workflow_versionr   )
rG   r&  r   ra  Zdhr  version_countr  Zdocument_historyZfake_historyr%   r`  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   labelsr3  r,  r  )rn   sizer.  )r   r   r   r   r3   r   r   r   )rd  r)   Zdoc_filer   r  Zlabels_filef2Z	label_strr/  Zf3r   r%   r%   r&   r  u  s"    
 
 z!ConfluenceAPIImport._get_documentc                 C   s$   t |d }tdd |}|S )Nr  c                 S   s   |   o| jd S )NrK  )rZ  rX   r[  )	path_objsr%   r%   r&   r     r   z3ConfluenceAPIImport._get_doc_dirs.<locals>.<lambda>)r   r   rY  rv   )rG   
space_pathrk  Zdoc_dirsr%   r%   r&   _get_doc_dirs  s    z!ConfluenceAPIImport._get_doc_dirsr     c                 c   s\   t | d}d}| |D ]:}|d7 }||k r2q||| d krF qX| ||jV  qd S )Nr  r   rI   )r   rm  r  rX   )rG   r  offsetr  rd  enum_dirr)   r%   r%   r&   _get_documents  s    z"ConfluenceAPIImport._get_documentsc                 C   s   t dd | |D S )Nc                 s   s   | ]
}d V  qdS rI   Nr%   r  r%   r%   r&   r     s     z=ConfluenceAPIImport._count_space_documents.<locals>.<genexpr>)sumrm  )rG   rl  r%   r%   r&   _count_space_documents  s    z*ConfluenceAPIImport._count_space_documentsc           	      C   s   i }d}d}d}|  |D ]`}|d7 }||kr6|}d}||d ||  d7  < tdd | t|D }||d 7 }qdd | D }|S )Nr   r   rI   c                 s   s   | ]
}d V  qdS rr  r%   r  r%   r%   r&   r     s     zCConfluenceAPIImport._get_offsets_for_execute_doc.<locals>.<genexpr>c                 S   s   g | ]\}}||fqS r%   r%   )rc   ro  r  r%   r%   r&   r+    s     zDConfluenceAPIImport._get_offsets_for_execute_doc.<locals>.<listcomp>)rm  r  rs  rO  r    r   )	rG   rl  r  offsetsZcurrent_offsetZ	obj_countrp  rd  rf  r%   r%   r&   _get_offsets_for_execute_doc  s    z0ConfluenceAPIImport._get_offsets_for_execute_docc           
      C   sv  d}t dd\ t F | }|dkr2qT| j r@qTzd|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gd}|std|jr| || n| jj	d|  W q tk
rP }	 z6tjj  | 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   Fr6  r  r7  r   r8  rq   r1  r   r   r   u3   Обработка версий документа r   rp   rz   r\  re  rr   r  u4   Документ не найден в системеQ   Документ изменен пользователем, пропускаем u@   Ошибка обработки версий документа zERR-0084r$   r  r	  rI   )r   cmfutildisable_aclr2   r-   r@  rD   rd  r8   r   r   r   r!   r$   rU   r   rg  r   r   r  r?  )
rG   	obj_queuer  rF  r   r   r!  rr   r   r'  r%   r%   r&   _process_doc_versions_fork  s@    


z.ConfluenceAPIImport._process_doc_versions_forkc                 C   s  d}t dd t v | }|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rh|
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'(  | jjjj	 d*| }tj)j|d+}|stj)|| jd,}|
|_*|d- d.r$t+j,-| j.j/|d- d. }n| jjjj0}|
j1 d/| d0| d1|_2d2|_3|j&dd) |j'(  n| jjd3|
  || 4|
|7 }| 5|
| |
jrPg }|d4 D ]p}d	| jjjj	 d	|d  d	}tj6jdd5d6| d6gd7}|r|7| n| jj8d8| d9| d:|
d; q||
_9| :||
|
_2|
j%rP|
j&dd) |
j'(  | ;||
 W n t<k
r   tjj'=  | jj8d<|d  d=|d  d>d?d@dA | j>  |dB7 }Y n t?k
r   tjj'=  | jj8d<|d  d=|d  dC| dDd?d@dA | j>  |dB7 }Y nR   tjj'=  | jj8d<|d  d=|d  dEd?d@dA | j>  |dB7 }Y nX W 5 | jdd X q|@| W 5 Q R X W 5 Q R X d S )FNr   Fr6  r  r(   r  rd  rq   rp   zprocess Zis_homepager  rr   r  r   TrX   r-   r   rr   r	  tagsrk  rl  u5   Определяем автора документа r  rJ   u1   Не найден автор документа: r   rn  u:   Определяем владельца документаrm  r  =   Определяем последнего редактора r9  rU  r
  r  )rz   rX   r  r  r\  r9  r  r  rr   r  rx  Zfull_screenrT  r  rR  rS  ry   z
::comment:rr   )rr   r-   r  Zwebuiu4    импортирован из Confluence: <a href="z" target="_blank">z</a>r   rw  rh  rs   rt   ru   u   Не найден тег z ext_id=zERR-0017r  u   Ошибка создания z: 'uT   ': попробуйте очистить дамп и повторить импортzERR-0018r$   rx  rI   u_   ': попробуйте отменить импорты связанные с проектом uY   , чтобы он удалился из системы и повторите импортr  )Ar   ry  rz  r2   r-   r@  r  r  r   r   rR   root_parent
class_namedescr_documentr[   r!   r$   r   is_newr  r8   r   r]   r  r   r;   r   r4   r]  r   Zget_status_typerV  setattrrT   r  rZ  r[  r   r   r   r   r  rz   r   rj   r^  r1   r   ext_urlZverbose_namer   Z	log_levelr8  r#  CmfTagr   r  r~  rN  r   FileNotFoundErrorr   
log_detailAttributeErrorr?  )rG   r  Zarchive_folderr{  r  rF  r&  r   rr   Zwiki_project_homepager   authorr  rz  r  modifiedr  Zdoc_dictr   Zcomment_ext_idrt  r   r~  Ztag_rawZ
tag_ext_idr   r%   r%   r&   _process_document_fork  s
   




 




z*ConfluenceAPIImport._process_document_forkc                 C   s  d}zv|j dddidD ]\}td|jd }tj|d}tjj	||d	}|sx| 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rB||j  qqBq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-parametersrI   rX   rz   u#   Диаграмма с именем u@    не найдена во вложениях документа zERR-0019r  rz   r{   rX   rs   %.pngr   r  100%zdiagramWidth=([^|]+)zdiagramHeight=([^|]+)rX   	attach_idwidthheightimg_srcr   r   html.parserrq   zdrawio-macro-content-data-macro-iduU   Неудалось конвертировать диаграмму из текста )r   r   r   r   r!   r$   r   ro   r.  r2   r-   r  rX   r[   rq   r   r   r   formatfindreplace_with
currentTag)rG   r   r   r!  TAG_TMPLr   matchr   r'  
attach_imgr  r  re  rd   Z
drawio_tagr%   r%   r&   r@    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  r4  u.   Не удалось получить svg из zERR-0002r  z{})paramsZumlsvgr  )
r   r!   r$   Zconvert_uml2svgr   r-   r  r   r  r  )	rG   r   r   r!  ZTMPr   r  new_tagold_tagr%   r%   r&   r?    s    ( 
z%ConfluenceAPIImport._convert_plantumlc                 C   s   d}| dg |j}t|j}| }|  g }t|D ]:\}	}
|	| d|	d  d|	d  |
|d}|| q<ddd	d
dgdddddddgddd}dt|j||d dt|d}|	|
| t|jtj|dd|||d dd}|jS )u8    Создает тег макроса Word или Excel u  
            <div
                class="macros-panel mso-viewer"
                contenteditable="false"
                data-id
                data-macros="msoviewer"
                data-macros-parameters='{params}'
                data-rendered="1"
            >
                <div class="extension-container" contenteditable="false" data-id data-layout="default">
                    <span aria-label="Макрос {plugin_title}" data-id role="img">
                        <svg xmlns="http://www.w3.org/2000/svg" id="Layer_1" data-name="Layer 1" viewbox="0 0 24 24" width="16" height="16">
                            <path d="M22,15h2v7h-7v-2h5v-5Zm2-10v6.731l-2-1.976v-.755H7v11h4.738c.033,.036,.057,.078,.092,.113l1.887,1.887H0V5c0-1.654,1.346-3,3-3H21c1.654,0,3,1.346,3,3ZM2,5v2h3v-3H3c-.551,0-1,.448-1,1Zm3,4H2v11h3V9Zm17-2v-2c0-.552-.448-1-1-1H7v3h15Zm-9.715,9.292c-.38,.391-.38,1.025,0,1.416l2.715,2.792v-2.5h2c1.654,0,3-1.346,3-3v-2.023h2.455l-2.756-2.711c-.386-.386-1.012-.386-1.398,0l-2.756,2.711h2.455v2.023c0,.552-.448,1-1,1h-2v-2.5l-2.715,2.792Z"></path>
                        </svg>
                    </span>
                    <span class="extension-title" data-id>
                        <span class="excerpt-title" data-id>{plugin_title}</span>
                    </span>
                    <span class="macros-actions" data-id>
                        <span class="macros-edit" data-id>
                            <svg _ngcontent-aiw-c17="" viewbox="0 0 24 24" class="ng-star-inserted" style="width: 14px; height: 14px; color: #444444;">
                                <path _ngcontent-aiw-c17="" fill="#444" d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                            </svg>
                        </span>
                        <span class="macros-delete" data-id>
                            <svg viewbox="0 0 18 18" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                                <path fill="#222" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                <path fill="#222" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                <path fill="#222" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            </svg>
                        </span>
                    </span>
                </div>
                <div class="macros-preview" data-id>
                    <div class="mso-preview-wrapper" data-id>
                        <img class="mso-preview-image" data-id id="mso-img_{attach_id}_1" src="{url_preview_img}"/>
                    </div>
                </div>
            </div>
        r)  r   rI   u   Лист)numrq   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  rq   r    r)  Zget_fullviewsortrc  r   r   rw   r2   r   r  r   r   r  )rG   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   s   ddg}|D ]}|j d|idD ]}|d}tdd |dD }tj|d	 }	tjj||	d
}
|
sd| d|	 d|j d|j	d  d	}t
|tjr|d|j 7 }| jj|d|p|d q |jd|id}|r || ||
| q qdS )u7    Конвертирует макросы Word и Excel r  r  r  r  r  c                 s   s   | ]}| d dV  qdS rb  rI   Nr   rc   Zparamr%   r%   r&   r   W	  s     z9ConfluenceAPIImport._convert_msoviewer.<locals>.<genexpr>|rX   rz   rX   *   Ошибка обработки тега ")   ". Не найдено вложение "   " документа "r8  rq   r1      для версии v.ERR-0012r  N)r   r2   r   r   r!   r$   r   r.  rX   rx  r  rW  rY  r-   r  r  r  r  )rG   r   r   r!  r:  Zmacro_types
macro_typer   original_paramsr   r'  
error_textr  r%   r%   r&   rA  P	  s"    
$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  childrenAmountr9   includeViewTypeisOrderByDeskc                 s   s.   | ]&}t |d ddkr|d dV  qdS rb  rI   r   Nr   r   r  r%   r%   r&   r   	  s   z:ConfluenceAPIImport._convert_childpages.<locals>.<genexpr>r  r  Tr  1r9   firstr  depthstyle
headerTypeexcerptTyper  r  Zsimplezrich contentr  r  rX   r  r  r   Zcreationr  sortTypereverser  r  r   
documentIdtrue,:r  Z
separatorsr7  &quot;)r)   doc_namer  r  cmf_convertedr   r  N)r<  r   r2   r    rq   r   r   rz   rX   r   r  r   r   r   r  r  r  )rG   r   r   r!  r  r   r  macro_idZdata_macro_parametersr  macro_parametersview_type_mapsort_type_mapr  r  r  r%   r%   r&   rB  j	  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  rX   &   Выборка без названияNr   c                 s   s   | ]}t |V  qd S r   r  rc   r  r%   r%   r&   r   
  s     rX   r  r  )r   r2   r   r   r  r   r  r^  contentsr  r  )
rG   r   r!  r  r   r  r  excerpt_namer  r  r%   r%   r&   rK  	  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  rI   r   r  c                 s   s   | ]}| d dV  qdS r  r  r  r%   r%   r&   r   X
  s     z?ConfluenceAPIImport._convert_excerpt_include.<locals>.<genexpr>r  rX   r  r  	page_namer  r  N)r   r2   r   r  r!   r  rx  r3   rz   r   r   r  r  r  r  )rG   r   r   r!  r  r   r  macro_default_parameterr  r  r  r  r  r  r%   r%   r&   rD   
  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  rI   r   
page_labelr  r  N)r   r2   r   r  r!   r  rx  r3   rz   r   r  r  r  r  )rG   r   r   r!  r  r   r  r  r  r  r  r  r%   r%   r&   rE  l
  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  r7  r  r  r  r  r  Ndiv)r<  r   r2   r   r   r   r   r   r   r  r  r  r  )rG   r   r!  r  r   r  r  
parametersr  r  r  r%   r%   r&   rI  
  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  r9  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   r2   r   r   r   r  copyr  r  r  )rG   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<|}n2t	jj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   r4  z\=r7  inc                 S   s   g | ]}| d qS r7  strip)rc   r4  r%   r%   r&   r+  C  s     z5ConfluenceAPIImport._bql_from_cql.<locals>.<listcomp>z()r  r   #r   ruTZlanguage_codereversedORaliasILIKE"%rX   r/   r  ra   ry   *   Не удалось создать тег r   r  )rX   r/   rq   Z	classNamer~  INr   c                 S   s   g | ]}| d qS r   r  rb   r%   r%   r&   r+  f  s     zcurrentSpace()rr   rs   ::%rx  z%"key":"u.   Не удалось найти проект «   »r  rz   )transliterater  r  r   iterr   nextr  r   r!   r  r2   r   rU   r7   r   rq   r[   r   rX   r/   r  StopIteration)cqlr   rz   r  Zbql_listbql_dictZ	cql_partsZcql_partopr  rh  Ztags_idsZ	tags_listr4  Zlabel_aliasr   r   r   Z
parent_idsZparent_listr   r  r%   r%   r&   _bql_from_cql5  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 rb  rI   r  rc   pr%   r%   r&   r+    s     zAConfluenceAPIImport._convert_content_by_label.<locals>.<listcomp>r  r   r   defaultr  FTr  Truemax   
showLabelsT	showSpacer  r~  )
r  modelr  r  r  r  r   r  bqlr~  ui   Не удалось конвертировать макрос «Содержимое по меткам»     с параметрами: zERR-0034r  r  r  r   z:Truez:truez:Falsez:falser  r  N)r   r2   r    r   r   r  r-   r   r   rT   r  r   r  r   r  r  r  )rG   r   r   r!  r  r   r  r  all_parametersr  r"  r  r  r  r  r%   r%   r&   rF    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|r zj|j  |jjd&krbi |_||jd< |j  |jjd&kri |_||jd< |j d5d6 |j!"  W nR tk
r } z2|j!#  | 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  rq   hiddenFr  )rq   r-  r  r7  r  r   c                 S   s   g | ]}t |qS r%   r  rc   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  )rc   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   E  s      BConfluenceAPIImport._convert_details.<locals>.<listcomp>.<genexpr>)r^  r  )rc   Ztdr%   r%   r&   r+  D  s   rI   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 )	r4  r  r6  r  r   r   c                 s   s   | ]}|d krt |V  qdS r7  r  r.  r%   r%   r&   r   O  s      r8  r3  )r  r  r^  )rc   r2  r%   r%   r&   r+  L  s    r   Try   uE   : не удалось сохранить значения macro_db «u   »: zERR-0037)$r<  r   r2   r    r   r   r-   r  r   r   r   r^  r  r   r  r  insertr  r  r  r  r!   r  rU   ziprW  r8   r   Z	macros_dbr3   r[   Zmacros_db_draftr   r   r   r   )rG   r   r   r!  r:  r  r+  r   r  r  r  r%  r  r0  prmZcontents_strr  r  Z
propertiesZcontents_tableZ	first_rowZ
second_rowr   r%   r%   r&   rL    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+    s     z@ConfluenceAPIImport._convert_details_summary.<locals>.<listcomp>r  r   c                 S   s   g | ]}|  qS r%   r  )rc   r  r%   r%   r&   r+    s     headingsr  showCommentsCountFr  showLikesCountreverseSortpageSize   NsortByfirstcolumn)r=  ZshowCreatorZshowLastModifiedr>  ZshowPageLabelsZshowUnresolvedCommentsCountr?  r@  rq   rB  rC  r<  ZsettingsParamsr"  uv   Не удалось конвертировать макрос «Отчёт по свойствам страницы» r#  zERR-0036r  r  r7  r  r$  r  )r<  r   r2   r    r   r   r  r-   r   r   rz   rT   r^  r  r   r   r   r   r  r  r  r  )rG   r   r   r!  r  r   r  r  r%  r  r"  r  r<  r  r;  r  r  r%   r%   r&   rG  n  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   r2   r    r   r  r   r   quoter  r  r  )	rG   r   r!  r  r   r  Zmacro_param_namer  r  r%   r%   r&   rH    sB    )

z#ConfluenceAPIImport._convert_anchorc                 C   s   d|    d|    d|    d|    d|    d|    d|    d}|jd	d
idD ]}|d}t|d}|d}tdd |dD }|dsq\| |d }	|	|d< t| }
d}|dr|d d}|
||	d }|j	 d| }t
jj|ddgd}|s.t
j|| jdd}|jr<||_|jdd dd d!d"d#d$d%d&d'd(d)g}d*|pl||d+d,dddt|jdd-}tj|d*d.d/d0d1}t|j||d2d3}|r|jd|idnd}|s|jd4d	d
id}|r\||j q\dS )5u   
        Конвертиация макроса "Результаты фильтра" ("Вставить фильтр/проблему 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  c                 s   s   | ]}| d dV  qdS r  r  r  r%   r%   r&   r   %  s     z;ConfluenceAPIImport._convert_task_filter.<locals>.<genexpr>r  jqlQueryZserverIdr  NZ	columnIdsr  r   rp   r   rx  r  T)rr   r-   r   ry   
logic_typer/   rX   Zresponsibler  priorityr9  r  r  r  ZdeadlineFZmaximumIssues   )ZbordercolumnsZ	itemsSizeZfilterIdZ
filterNameZfilterParentNameZuserFilterIdZuseCustomFilterr  r  r7  r  r  r  r  )r<  r   r2   r    r   r   r  r   Zconvert_fieldsrr   r!   CmfTaskFilterr-   r   rx  r   rq   r   r   r   r   r  r  r  r  )rG   r   r   r!  r  r   r  r  r  r  jqlrJ  Z
column_idsZ	tf_ext_idZtfZdefault_columnsr  r  r  r%   r%   r&   rC    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 )"Nrz   r{   r  Trx  r|   r   r9  html_contextr  r  ZinlinePropertiesZ	markerRefzdata-refr  r   c                 S   s   g | ]}t |qS r%   r  r  r%   r%   r&   r+    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  ry   uO   Не удалось конвертировать inline комментарий r   zERR-0020r  )r!   r  r  rx  r   r^  r.  r    r9  r<  r   rq   unwraprM  r   r-   r  r   )rG   r   r   rt  r   Ztag_contextr%   r%   r&   rJ  p  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=r1  	
subprocessPopenr-   r   rq   r   rR   pidr  rG   r  ro  r  r_  rg  r%   r%   r&   _execute_doc  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$   r  rj   r  Z	ancestorsr   rq   r  positionr  r   )rz   rf  c                 S   s   dd t d| D S )Nc                 S   s$   g | ]}|  rt|n| qS r%   )isdigitrT   r   )rc   r   r%   r%   r&   r+    s     zKConfluenceAPIImport._process_documents.<locals>.natsort.<locals>.<listcomp>z(\d+))r   r   )rd   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 rz   r%   )rc   r  r   ri  r%   r&   r+    s      zNConfluenceAPIImport._process_documents.<locals>.build_tree.<locals>.<listcomp>c                    s    |  d S )Nrf  r%   )r  )re  rh  r%   r&   r     r   zLConfluenceAPIImport._process_documents.<locals>.build_tree.<locals>.<lambda>)r   r  )r   r  r   r@   )re  rz   ordernor.  Zcurrent_ordernoZchildren_in_orderr  Znext_orderno
build_treerh  rG   )re  rz   r&   rl    s    
z:ConfluenceAPIImport._process_documents.<locals>.build_treei uJ   Грузим документы в несколько процессов: r   rI   u:   Закончили обработку документов)r   r@   r2   r  r  rq  rt  r    r-   r8   r   rQ   rv  rB  poprc  r   r  sleepr  pollr5   r  communicate
returncode)rG   r   r  rd  r   r   rz   rf  ru  rf  r   ro  r  rg  rq  new_procr%   rk  r&   _process_documents  sZ    


 


z&ConfluenceAPIImport._process_documentsc           	   	   C   s  | j jd |dg |jj}| j D ]v\}}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,   | j j  | j jd| dd	d
 Y q,X q,d S )Nu6   Построение дерева документовr  rp   tree_node_is_branchr  u?   Не найдена родительская страница 'uQ   '. Дочерние страницы будут помещены в корень zERR-0120r$   rx  rz   r  r   rj  u-   Не найден потомок по ext_id=z tree_parent_ext_id=zERR-0003r  Try   uI   Не получилось привязать ноду tree_parent_ext_id=zERR-0024)r-   r8   r   r  r  r[   r@   r   r@  r   r   r!   r$   r2   r  r  r   r  rj  r   rt  r  r   r   )	rG   r  project_homepageZtree_parent_ext_idr.  r  rr   rj  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   rO  rP  rQ  rR  z/");retcode = plugin.process_doc_versions_fork("rS  rT  rU  rV  TrW  r   rX  rY  u2   Запустили process_doc_versions_fork (pid=r\  r]  r1  r^  rb  r%   r%   r&   _execute_doc_versions2  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   Обрабатываем версии документов в несколько процессов: rj   r   rI   uP   Закончили обработку всех версий документов)r-   r8   r   rQ   rv  rB  rm  rw  r   r  rn  r  ro  r5   r  rp  rq  )rG   r   r  ru  rf  r   ro  r  rg  rq  rr  r%   r%   r&   _process_documents_versionsE  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 ]}zt|	|d2 d }|d kr| jjd3|  W qf|D ]4}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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}|sDtjj	ddH|gdDgdG}|r|j sZ||_ n||j krv|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)
r  r  r  r  r  r  r  r  r  r  rj   r  r   rp   rq   r  T)rr   r   r-   r   u?   : Схема проектных прав доступа для rX   ry   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)rz   rY   F)ry  zPPP-OBJ-DELETEr  r  u8   Не найдено соответствие права )r/   Zinclude_deletedu    Не найдено право "u	   " для zERR-0059CmfProjectPermPermissionr	  rI   r   )r|  rz   rY   u2   В схеме не найдено правило "r  r   u)   Не нашли пользователя u    для прав zERR-0060r  rr   rs   rt   r  r	  u   Не нашли группу zERR-0061rJ   u>   Не удалось импортировать правило zERR-0063CmfProjectPermSchemeRule)"r   r   r   r3   r-   r   r   r!   ZCmfProjectPermSchemer2   rx  rX   r   r  r  r   r}  r  r|  r/   rz  r8   r   r~  r  r5   r   r   r1   r<   r=   r   rr   r{  )rG   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_rulerm   r   ro   Z
group_namerr   Z	group_objr%   r%   r&   _process_permissionsm  s   


 
z(ConfluenceAPIImport._process_permissionsc                 C   s@  |  | jjd }|d d d dkr<dtjjddd}n`|d d d d	krfdtjjd
dd}n6|d d d dkrdddtjjd
dd}ntd|   |  D ]}zP| j	 rW  q<|d dd | j
D krW qd|d  d|d  d|d  d}| jjd|  |d |d< |d dkrP|d  d|d< d|d< | j|d |d< | jjjj d|d  }||d < d!}|d d d dkrFtjjd"d#|d" gd$dd%|d gdd%|d gggd"d gd&}|r| jjd'|d  d(|j d)|j d ||jkrd*}|j d| |_|jd*d+ |j  ntjjdd%|d gd"d gd&}|r|jj|d" jks|jr|j|d  kr|d  d,|d   d|d< | jjd-|j d.|j d/|d"  d0|j d1|d  
 n(|js|d  |_|jd*d+ |j  d!}tjj|d  | d2}|s^d*}tjjd d3d4| d4g| d&}|sd!}d*}tj| j|d  |d d5}t|d6 d7}	|d8r|d8 d }
| |	|
}|s|| jjd9|d8 d:  d;|
 d<| d=|d> W qn| jjd?| d@ |dA D ]L}z| |	|}|r2W  q|W n&   | jjdB| dC|  Y nX q| jjdD| dE|d> W q|dF dG }| jjdH|  |d dIkrtj|dJ< n|  || j! |dJ< |dF dK}|r"| jjdL|  |d dIkrtj|dM< n|  || j! |dM< n|dJ |dM< |dF dN dO }| jjdP|  |d dIkrltj|dQ< n|  || j! |dQ< |dF dR |dS< |dF dN dT |dU< |j"s|j#r|s| $||_%|D ]}t&||||  q|  |j  |jj'dkrHtj(jdVd#|jgdd#dWggd gd&}|j"r@||_)|jd*d+ || _*n@|j"sX|j#r||_)|jd*d+ |d8r| +|| || _*|| _,|rtj(jdXdVd#|jgdd#dWggdY}|d d d dkrtj(j|dZd[}|r|-  n|d d d d	ks|d d d dkrtj(j|dZd[}tj(j|d\d[}|rF|-  |rT|-  |rb|-  |.d]g |j/j0}| j|_|jd*d+ t1  | 2|| | 3|| | 4| t5j6rt5j6}t5j6d^krd_}| jjd`| da | 7|| n| jjdb W q   | jj8  | jjdc|d  dddedf Y qX qd S )gNr  r\   r[   rq   r  zproject.agile:defaultr.   )project_typerG  Zproject_wikizproject.wiki:defaultr   sectionzCmfWiki:Class)r  	parent_idtree_parent_idrG  u   Неизвестный типc                 S   s   g | ]}|d  qS r  r%   r*  r%   r%   r&   r+  #  s     z7ConfluenceAPIImport._process_spaces.<locals>.<listcomp>r  rX   z' (id: z, key: r   r1  u0   Импортируем пространство r  Zpersonalu(    (Личное пространство)u%   Личное пространствоdescriptionZtask_code_prefixrp   rr   FrG  r{   r  r	  r  u$   Импортируем проект u<    в раздел "Документы" Agile проекта "r8  Try   rP  u   Проект с именем u    уже существует! z != z id=u   Переименуем в r  rs   rt   )r-   rr   rX   rj   r  rd  u7   Не найдена домашняя страница 'r   r  u)   ) в дампе пространства zERR-0021r  u   У пространсва u    нет домашней страницы. Сведения о создателе и дате создания пространства будут взяты из первой корневой страницы.r  uW   Не удалось получить данные корневой страницы id=u(    в дампе пространства um   Не найдено ни одной корневой страницы в дампе пространства zERR-0119rk  rl  uD   Определяем автора домашней страницы rJ   r  rn  uJ   Определяем владельца домашней страницы r  rm  r  r  r  r
  r  r  r  r  u   ДокументыZANDru   u   Документ1)r  rX   u   Документ2r  r   u   ВсеuY   У документов будет обработано последних версий: u   . Для изменения, поменяйте значение параметра IMPORT_CONFLUENCE_PROC_LAST_PAGE_VER в config.u   Обработка версий документов отключена параметром IMPORT_CONFLUENCE_PROC_LAST_PAGE_VER в config.u5   Ошибка импорта пространства zERR-0032r  rx  )9rf   r-   r  r!   ZCmfLogicTyper2   r  r  r  r@  r  r8   r   Zget_correct_keyr   r   r  rX   rr   r   r   r   rG  rq   r   keysr   r   r  r  r]   r  r   r;   r   r  r  Zproject_perm_schemer  r/   r$   rx  r  r   r  r  r  r  r[   r  _process_project_tagsrs  rv  rD   rd  rx  r   )rG   r`   Zproject_fieldsr   Zspace_full_namerr   Zproject_is_newr  Zproject_mergedrd  Zhomepage_idrd  Z	root_pager  rz  r  r   Z
doc_folderZrm_doc_folderZrm_doc1Zrm_doc2ru  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 ]h}| j r d S |d dd	d
d}||ddd}zd| jj	j	j
 d|d  d}	tjjddd|	 dgdgd}
|
s4dddd| dgdd|gddd| dgg}tjj|dgd}
|
sNtj|| jd|	d}
|
js^|	|
_n|	|
jkrz|
j |	 |
_||
_||
_|
jr|
jdd |
j  W qr   | jj  | jjd| d|d Y qrY qrX qrd S )Nr   r  rj   re  rh  rq   rX   r   r   r  r   r  Tr  rp   rr   rs   rt   r   r  r  r  r	  r7  r
  r}  ry   r  zERR-0022r  )r  r  r   rq  rt  r-   r@  r  r   r   r   r!   r  r2   rr   rX   rx  r   r   r   r   r   r  )rG   r   r  r  r~  r   r   Ztag_nameZ
name_aliasrr   Ztag_objr   r%   r%   r&   r    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   )rG   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   r3   )rG   Z
group_pathZ	user_pathr   r   r%   r%   r&   _get_group_members5  s    
z&ConfluenceAPIImport._get_group_membersT)r   rV   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 )6NrW   u2   Обрабатываем пользователя ZdisplayNameZ
operationsT)rX   does_not_worku8   Не указан Email для пользователя rI   @)rX   rW   r  rp   Fr   r   r   	last_namer   Z
first_nameZsecond_namer=  r   rg_member_ofrr   rs   rt   r  u    ext_id пользователя uN    содержит несколько ID из одного источника: z::.+?::ry   uP   Возможно найден некорректный пользователь ud   ,так как ext_id содержит несколько ID из одного источника: 'uq   '.Необходимо повторно импортировать локальных пользователей.zERR-0004rm   rx  r  zNOT LIKEz%::r  r{   rP  r	  u+   Пользователей с почтой z > rX   u+   Пользователей с именем uQ   Обнаружена учетная запись с дублирующим email u   , добавляем цифруr   u1   Создадим пользователя ext_id=)rr   rP  r-   r   
user_local)1r2   r-   r8   r   r   rw  warnZcmfrY   ZCmfEmailZ
max_lengthr   rD   
ORG_DOMAINry  Ztranslit_stripr   r   r;   r   r!   r"   rr   r[   r   r   r   subr   r5   r  r  r
   r   r   rR   r7   rA  r   r  r  r  r   Zconfluence_group
user_groupr  r  r   r>   )rG   r   r  rw   rW   Z	user_dictZmax_lenrr   
is_createdZ	full_namerY   r   Znot_source_hash_filterZpersonsr   Z
name_combonrP  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 ]}| j 	dd | j 
 r\ d S | |\}}|jr|jdd |j  |r|jjtjs||jj |d	g D ]}d
}| jjjrd}d| j jjj d||  d}tjjddd| dgdgd}|s*tjjd
d|d
 gdgd}|sLtj|| j |d
 d|d}n|jr^|d
 |_|jsn||_n||jkr|j | |_|jdd |j  |j | q|jr8|jdd |j  q8|r| j jjddr| j j!"dt#| d|  t$tj%j&t'|gd d S )Nr  TuA   Не грузим пользователей из-за опцийr<  r   rm   r  ry   r  rX   rq   rp   rr   rs   rt   r   r  r{   rr   r-   rX   r   rx  send_invitesu,   Отправляем приглашения u    пользователям: )args)(r-   r  r[   r2   rR   r7   rA  rA   r   r  r@  r  r   r   r   r   rW   r[  rD   r  r  r1   r<   r=   r   r   r!   r   r   rX   rr   r  r   r8   r   r   Zschedule_deferred_jobr"   Zregister_personsr  )	rG   r  r   r   r  r   r   rr   ro   r%   r%   r&   _process_persons  sT    


  

z$ConfluenceAPIImport._process_personsc                 C   sZ  |   D ]J}d}| jjjr d}d| jjjj d||  d}tjj	ddd| dgdgd}|s~tjj	dd	|d gdgd}|stj|| j|d d
|d}n|j
r|d |_|js||_n||jkr|j | |_|jd
d |j  | | j d|| D ]J}| |d\}}|s&q|j| |jr|jd
d |j  qqd S )NrX   rq   rp   rr   rs   rt   r   r  r{   Tr  ry   r  F)r  r1   r<   r=   r-   r   r   r!   r   r2   r   rX   rr   r   r   r   r  r   r   r  r  r   r   )rG   r   r   rr   ro   r   r   r   r%   r%   r&   _process_groups  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 в фильтрах задач макроса 'Результаты фильтра'rx  rs   z%"jqlQuery":"%r-   r|   Nr   r{   Tubql2r"  rX   r  r7  r8  r1  rF  r  r   Fr  ry   u   Фильтр z: JQL u%    переобразован в UBQL2 z (BQL: "z")u0   : ошибка преобразования JQL zERR-0066rK  r  uC   Обработка JQL в фильтрах выполнена за r  r  )r-   r8   r   r   r  process_timer!   rK  r  rX   r/   rx  r[   r2   Zget_modifiedr  r   r   r"  r   r  )rG   rL  r$  Ztask_filtersZtask_filterZ
filter_msgqueryr   r  r"  r(  r%   r%   r&   _process_jql_in_filters)  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|7  _|   | 	  | 
  |   | j S )u   
        Запуск импорта

        :return bool: Истина в случае успешного импорта
        r=  r   uB   При дампе данных обнаружены ошибки (u0   ), попыка повторного дампа r<  uF   При дампе вложений обнаружены ошибки ()rB  r-   rR   r5   r7   rA  r  r  r  r  _process_cross_linksr  )rG   rI  r5   r%   r%   r&   process_importV  s(     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   compilerX   r  Zcreate_preview_tag)rG   r   r'  r%   r%   r&   _create_previews  s    *z#ConfluenceAPIImport._create_previewc           !      C   s  dd l }|dd D ]}zԐ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 q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 Zq|j
|d}|r|dr|ddkr|d|d< |d|d< |d|d< W W q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 tq|}tj|dd dd }tj|}|jd#}|jd$kr|r||jd d krt| jj  d% }t| jj  d& }t!| j" #d'|d(|d)}| jjjj d | }tjj|d*gd+}|r\|}|$ s|rt!| j" #d't|j%jd% d(|d)}|$ s| jj&d,| d-| d.| d/| d0	d1|d2 W W "q|#d3}|$ r|'|d4}||( kr|)|j}tj*j||d5}|sFtj*||| jdd6}|j+dd7 |j,|- dd8 d|_.|j+dd7 |j/0  W 5 Q R X n4| jj&d9| d:| d;d<|d2 W 5 Q R  W W BqW 5 Q R X tj*j|d=d>d?g|d@}|r|d
r|jd
 |jdA< |j1j2|jd
< d|jd< |dBr4|jdB |jdC< |jdB= t34|jd
 dd }|r|d r|d 	dDrdD|_5dE|jdE< dF|jdG< dF|jdH< n,|r|d r|d 	dIs| 6|| |d	r|jd	 |jd< |j1j2|jd	< d|jd< t34|jd	 dd \}}|rx|	dDrxdD|_5dE|jdE< dF|jdG< dF|jdH< |7dJ} |jd	 | jd
< || jdK< |8|  n| 6|| | jjd|j1  n2|jddkr| jj&dL| dM|d2 W W (qW n   | jj&dNdO|d2 Y nX W 5 | jjd|  X qd S )PNr   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-usernamerI   data-linked-resource-typer  zdata-linked-resource-idz$/pages/viewpage.action\?pageId=(\d+)rp   r  r  z!data-linked-resource-container-idr$   r   rX   r  r  r   zparent.import_raw_jsonr  u   Документ ID u)    с каталогом вложений 'u<   ' не найден в дампе пространства 'r  u~   ). Возможно он находится в пространстве, которое еще не импортированоzERR-0005r  rr  r   r  r+  ry   r-  r  u%   ' не найден в архиве 'r  zERR-0006r   r*  r)  )rX   rY   rz   Zsrc_origZsrcsetZsrcset_origZvideoZcontrolsr  r  r  Zimagesourcer  u%   Не найдено вложение zERR-0007u,   Ошибка обработки ссылкиzERR-0008)9r  r   r-   r8   r   r   r2   r   r   r   r  r   r   rE  lstripr   r   r   r   r   r   ro   r!   r$   r   r   r   r  rr   r    r  rx  r3   r   r   r   r   rz   r  r  r7  r   r.  r   r/  rh   r   r   r   r   r[   r   r   rX   r  r  r   )!rG   rz   r   r!  Zmake_previewr  r   r   Zraw_tagZanchor_nameZanchor_linkZ
account_idr   r  Z	user_namerp  Zrel_docZattach_parentrX   r   Zresource_container_idr  Z
space_namer$  Zresource_ext_idZdoc_with_attachZattachments_zip_filer  r   Z
attach_objr   r  r  r%   r%   r&   r  {  sh   















 

 
	



 

 






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)r  r-   r8   r   r   r2   r   rU   r   r  r    rq   rP  r   rX   r  r  r  r  r  )rG   rz   r   r!  r  r   r   r  r  r  r   r%   r%   r&   r  J  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   ", в дампе, указываем системногоr<  FZdefault_user_idr  uA   ", ставим пользователя по умолчанию u*   ", указываем системногоzERR-0023r"   rx  )r   r-   rR   r7   ZERRORr]   Zsystem_userr  r  r[   r2   r!   r"   rA  r  )rG   r   rm   r   r   r%   r%   r&   r     s$      zConfluenceAPIImport._get_personc           	   	   C   s   |d d d d d }t j|}t jj||d}|sd|d d  d	| d
|j d|jd  d	}t|t jr|d|j	 7 }| j
j|d|p|d || ||| dS )u_    Конвертирует макрос Word или Excel через atlas_doc разметку r   r  macroParamsrX   r[   r  r  extensionKeyr  r  r8  rq   r1  r  r  r  N)r!   r$   r   r.  r2   rX   rx  r  rW  rY  r-   r  r  r  )	rG   r   elemr   r  r:  r   r'  r  r%   r%   r&   _convert_msoviewer_in_atlas_doc  s    ,z3ConfluenceAPIImport._convert_msoviewer_in_atlas_doc)rM  rV   c           1      C   s`
  dd l }t|}d}t|D 
]<}| j r2 
q\|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	rxd }
|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
}
|
	rv|d d d$ d% d! }d&|kr<|d&d\}}n2t|tjrZ|j d' }n|jj d' }|}|d d d$ d(}|	rvt|dd%j|d! ||d)d*}|
|j 
q:|d d d+krd,}|jd|d d id
}
|
	rv|d d d$ d% d! }|	rvd&|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.rh|d d d$ d/ d! }tj|}tjj||d0}d1}|sr|d d d$ d2 d! }t | j! "d3t#| j$j d' d4|d5d6}|% sH| jj&d7| d8|d9 qn|'|d:}||( krB|)|>}tj|}tj||| jd;}|j*d<d= |+|,  W 5 Q R X t-.| d>}|( D ]v}|/|r|)|T}tj|} tjj|| d0}!|!s&tj|| | jd;}!|!j*d<d= |!+|,  W 5 Q R X qW 5 Q R X |sr| jj&d?| d@| dA|d9 qtj|}tjjdBdC|gd(dD| dEggdFgdG}!dH}dH}"|d d d$ dr|d d d$ d d! }|d d d$ dIr|d d d$ dI d! }"|j0j1|j2j1||"dJ}#|!r6|!j3|#dK< nd%|#dK< t|dd%jf |#d*}|
|j 
q:|d d dLkr~dM}$t#|j2}%t#|j0}&dN|%|%dOd%dPdNdQ}'|d d d$ }(|(r.|(dRrt45|(dR d! 6 |'dS< |(dTrX|(dT d! }tjj|j7|d0})|)s tjj|dU})|)r@t#|)j2|'dV< t#|)j0}&n| jjdW|d   |(dXrt|(dX d! |'dY< |(dZr|(dZ d! |'d[< |(d\r|(d\ d! |'d]< |(d^rdPddd_}*|*|(d^ d! |'d`< |(dard(dbdcdd}+|+|(da d! |'de< |(dfr.t45|(df d! 6 |'dg< dh8didj |(9 D },t|$j|%|&t4j:|'dNdk|,dldd%d*}-|
|-j n|d d dmk	r(|jddmddnd
}.|jdoddpid
}/|/	|d d d$ dp d!  |.	|/ |jdqdrddsdtd
}0|0	|d d d$ du d!  |.	|0 |
|. nN|d d dvk	rP| j;|||
dv|dw n&|d d dxk
r:| j;|||
dx|dw n|d dyk
r:|d d dzk
r:|d d d$ d(
r:|d d d$ d( d! }d{}|jd|d d id
}
|

r&t|dd%j|d%8d|d |
jD d}d*}|
|j n| jjd~|  |dr| j<||d ||dw qd S )Nr   rI   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  rt   zflex-basis: )zdata-column-widthzdata-layout-columnr  c                 S   s   g | ]}t  |qS r%   )r  r.  r%   r%   r&   r+    s     	extensionZlocalIdzdata-local-idu&   Не удалось найти тег u    для r  ZmacroMetadatar  ZmacroIdr  r[   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   rX   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pageIdr  r  r   rr  uI   Документ с диаграммой не найден в дампе zERR-0010r  r   )rz   rX   r-   Try   z.*\.png$u   В документе u$    не найден файл с xml: zERR-0011rz   r{   rs   r  r   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  r9   r  r  r  r  r  ra   r  uE   Не удалось обработать тег оглавления r  r  r  r9   r  r  r  r  r  r  r  r  r  r  r  r  r  c                 s   s$   | ]\}}| d |d  V  qdS )rb  r[   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   Не нашли тег для )=r  r   r  r-   r@  r  r   rm  r  r   rc  extendr  r2   r  r8   r   r   r  r!   r  rx  r3   rz   r   r   r  r  r[  r$   r   r.  r   r   r   r    r  r   r  r  r7  r   r   r/  rh   r   r  r  rX   r[   rq   r   r   r   r   r  r^  r   r   r  r=  )1rG   r   rM  r9  r:  r  ZcntrI  r  Ztag_layout_sectionr   r  r/  colr  Ztag_layout_colr  Zmacro_paramsr  r  r  rd   r  rX   r   r'  rp  Zattach_pathr  r   ZregexpZname_zipZfile_name_zipr  r  re  r  r  r  r  r  Zparent_pager  r  Zoriginal_params_strZnew_soupZ
code_blockr   r[   r%   r%   r&   r=    s   




**%
#

&'


 



*!.
z&ConfluenceAPIImport._convert_atlas_docc                 C   s   dd l }|jdddd| jj d| jjjjj d| d| d	tj d
gddt	ddt	ddd}| j
d|j d| d| d |S )Nr   rO  rP  rQ  z&cmf_import = models.CmfImport.get(id="z#");cmf_import.process_cross_links("rS  rT  rU  rV  TrW  r   rX  rY  u,   Запустили process_cross_links (pid=z model_name=z start=r1  )r_  r`  r-   rq   r   r  r[   rD   IMPORT_OBJ_CNTr   rR   ra  )rG   
model_namer]  r_  rg  r%   r%   r&   _execute_cross_links/  s      2"z(ConfluenceAPIImport._execute_cross_linksc                 C   sf  ddd gdddgg}dD ]8}| j jd| d| j  tt| }|j|d	}|sXqt  d
}g }t| jD ]0}| 	||}|
| |tj7 }||krp qqp| j   ||k r"td t|D ]V}| }	|	d k	r|  j|	7  _|| | 	||}
|
|
 |tj7 }| j   qqt|D ]&}|  |jr*|  j|j7  _q*q| j jd d S )Nr-   r|   r   r{   T)r$   ZCmfTaskr  Z	CmfFolderu)   Обрабатываем ссылки в u+    в несколько процессов: ru   r   rI   u2   Закончили обработку ссылок)r-   r8   r   rQ   varsr!   r   r  rB  r  r   rD   r  r  r  rn  r  ro  r5   r  rp  rq  )rG   r   r  r!  Zobj_cntr]  rf  r   rg  rq  rr  r%   r%   r&   r  A  sF    








z(ConfluenceAPIImport._process_cross_links)F)N)r  N)N)N)N)r   rn  )N)N)N)TT)T)N)NN)ir   r   r   r   r   r!   Z	CmfImportrH   r:   r  r_   staticmethodr   r   rf   rg   r   r   r    r   r   r   r   r   r   r   r)  rJ  rh  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r~   r#  r%  r(  r8  rN  rO  rg  r  rm  rq  rt  rD   r  rv  r|  r  r@  r?  r  rA  rB  rK  rD  rE  rI  r>  r  rF  rL  rG  rH  rC  rJ  rc  rs  rv  rw  rx  r  r  r  r  r  r  r  r  r  rw  r  r  r  r  r   r  r=  r  r  r%   r%   r%   r&   r+   -   s    >!=

KZ: %5_
{
B#6
l{%E
c
8\
	
+ %/6a
|:LCW/PJ
 T<r&T5(  }* &+-
 PD
  }r+   ))r  r   r   r   r  r  Zcmf.appr   pathlibr   urllib.parser   r   typingr   r   r   r	   	itertoolsr
   r   Zcmf.data_providers.baser   Zcmf.includeZcommon.models.cmf_active_entityr   Zmodules.confluence.apir   Z%common.models.cmf_plugin_import_mixinr   Zbs4r   Zatlassian.errorsr   r   Zmodules.jira.jql.parserr   Z	dataclassr   r'   r+   r%   r%   r%   r&   <module>   s4   	