U
    .Gf*J                    @   s
  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Zd dlmZ d dlT d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlZej G dd dZ!ej G dd dZ"G dd dZ#dS )    N)cmf_context)Path)urlparse)datetime)DictUnionListOptional)commit_all_ds)*)CmfActiveEntity)ConfluenceApi)CmfPluginImportMixin)BeautifulSoup)ApiNotFoundErrorc                   @   sv   e Zd ZU dZejedZee	e
jf ed< ejedZee	eee	e	f  f ed< ejedZee	e
jf ed< dS )	TotalDatauJ    Данные используемые в процессе импорта default_factoryuserslink_documentsresult_documentsN)__name__
__module____qualname____doc__dataclassesfielddictr   r   strmodels	CmfPerson__annotations__r   r   r   CmfDocument r#   r#   "./modules/confluence/api_import.pyr      s   
(r   c                   @   s@   e Zd ZU dZejed< eed< ej	e
dZeeef ed< dS )DocDatauR    Данные используемые при создании документа documentdoc_idr   link_attachmentsN)r   r   r   r   r   r"   r!   r   r   r   r   r(   r   r#   r#   r#   r$   r%       s   

r%   c                   @   s  e Zd ZdZeejdddZdd Ze	ddd	Z
eeed
ddZe	dddZdd Zdd ZdedddZedddZdd ZeeedddZdd Zdd!d"Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zdd.d/Zdd0d1Z d2d3 Z!d4d5 Z"d6d7 Z#d8d9 Z$d:d; Z%d<d= Z&d>d? Z'ed@dAdBZ(dCdD Z)dEdF Z*dGdH Z+edIdJdKZ,dLdM Z-eedNdOdPZ.dQdR Z/ddSdTZ0dUdV Z1edWdXdYZ2edZd[ Z3d\d] Z4dd`daZ5dbdc Z6e7j8fdddeZ9dfdg Z:dhdi Z;djdk Z<dldm Z=ddndoZ>dpdq Z?drds Z@dtdu ZAedvdw ZBdxdy ZCedzd{d|ZDd}d~ ZEdd ZFdd ZGdd ZHedddZIdd ZJdd ZKdeedddZLdd ZMdd ZNeOdddZPdd ZQdeedddZRedddZSdd ZTdddZUdeeedddZVdd ZWd S )ConfluenceAPIImportu;   Класс загрузки объектов через API)
confluence
cmf_importc                 C   s   || _ || _t | _tjjdd}|j | _	d| _
d| _td}| jjj|_|| jjj |   d| _| j jjr~d| _d| j_d| j_t | _t | _d S )Nzsystem:defaultcoder   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	accountId)confluence_apir+   r   Z
total_datar   ZCmfSchemeWfgetZdefault_document_workflowloaddoc_workflow
has_errorsexpandloggingZ	getLoggerloggerZhandlersZsetLevellevel_prepare_multiprocessinguser_keyconncloudimported_object_countjson_object_countr   treeset_selected_objs)selfr*   r+   Z	scheme_wfr6   r#   r#   r$   __init__+   s$    

zConfluenceAPIImport.__init__c                 C   s   dd l }dd l}dd l}dd l}|| _ || _tj| _tj| _|	 d | _
| jjd| j
d  ddd tjr~ttj| j
| _
| jjdtj dd | j}| jjdt|d	  d
dd tt|d | j
| _
| j
stdd S )Nr      z
cpu_count=u%   , надо не менее 2 ядерT)	anonymouszconfig.IMPORT_PROCESS=zavailable_memory=i   @u-   Гб, по 2 Гигабайта на ядроl        u   Ресурсов системы недостаточно для импорта, обратитесь в техподдержку для дополнительной информации.)	threadingqueuemultiprocessingpsutilconfigZIMPORT_THREADSZthreading_max_forksZIMPORT_DOWNLOAD_THREADSdownload_threading_max_forks	cpu_countmax_processesr+   logZIMPORT_PROCESSminZvirtual_memoryZ	availableint	Exception)rA   rE   rF   rG   rH   Zavailable_memoryr#   r#   r$   r8   C   s*     
z,ConfluenceAPIImport._prepare_multiprocessing)returnc                 C   s2   dt tjjt tjjdddg ddd dgS )NZcurrent_user)emailname)rS   fieldsselectedObjects)rS   valueimport_type)r   gZcurrent_personrR   rS   rA   r#   r#   r$   calc_import_settingsc   s    
z(ConfluenceAPIImport.calc_import_settings)settingsrQ   c                 C   s   dd | D S )uO   Преобразуем список с настройками в словарьc                 S   s   i | ]}|d  |qS rS   r#   .0sr#   r#   r$   
<dictcomp>l   s      z;ConfluenceAPIImport._normalize_settings.<locals>.<dictcomp>r#   )r[   r#   r#   r$   _normalize_settingsi   s    z'ConfluenceAPIImport._normalize_settingsc                 C   s   g S )uo    Для импорта из Confluence предварительный просмотр не требуется r#   rY   r#   r#   r$   previewn   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pathZ	operationrc   restrictionsuserresultsZprivategroup::idrS   ext_idLIKE%filterupdatereadonlyrd   TZsave_importparent==r+   !=)rt   r+   Zaccess_levelZsubjects)_get_restrictions_get_personr9   appendr/   r:   r;   r+   pluginsource_hashr   CmfPersonGroupr0   import_originalperm_policy
is_changedsavedpcommitZperm_aclr1   ZCmfAccessRuleZbulk_delete)rA   docdoc_objZpermsr~   restrictionrg   person
group_inforl   _filterri   r#   r#   r$   _process_restrictionsr   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      rC   wiki   spaces   pages   Zdisplay+ uC   Ошибка получения документа по pretty url : uo   Не смогли получить документ по pretty url (возможно не тот домен): rk   )splitr   re   lenreplacer/   r:   Zget_page_by_titlerP   r+   r6   warninginfor   )	rA   urlr-   Zsplitted_url_spacetitleZfind_confl_docer#   r#   r$   _get_pageid_by_url   s6    

z&ConfluenceAPIImport._get_pageid_by_urlFr\   c              	   C   s   | j  | d}| j  | d}| r<|s<d S t|d6}| D ](}| j  jd7  _|t|d  qNW 5 Q R X t	
|| | j jdd | j j  d S )N.jsonz.json.dirtya+rC   
TZ	only_data)r+   get_download_pathjoinpathexistsopenr=   rd   jsondumpsshutilmover   r   r   )rA   Zapi_funcrS   Z	overwrite	file_pathZfile_path_tmpfrowr#   r#   r$   _simple_dump   s    
 z ConfluenceAPIImport._simple_dumpc              	   c   sN   | j  | d}| rJt|d}|D ]}t|V  q.W 5 Q R X d S )Nr   r+)r+   r   r   r   r   r   loads)rA   rS   r   r   r   r#   r#   r$   _simple_get   s    zConfluenceAPIImport._simple_getc              
   c   sJ   | j  d}t|D ]*}t||}t|V  W 5 Q R X qd S )Nr   r+   r   r   oslistdirr   r   r1   )rA   Zdir_pathfpr   r#   r#   r$   _list_users_from_dump   s    z)ConfluenceAPIImport._list_users_from_dump)textattachments_dirobjc                 C   s  |sd S | j jd t|ddd D ]}d}|drBd}|j| }zPd|kr\W q*|dr~| j jd	|  W q*|d
st	j
| jj|}|| jjs| j jd|  W q*tj|dd dd }t|\}}	|s| j jd|  W q*tj|}||}
| j jjj d|d  }tjj||| j jjjd}|sxtj| j ||| j jjjd}|
|_
||_d|_|  |j   W q* t!k
r } z*| j j"  | j jd| d|  W 5 d }~X Y q*X q*d S )Nu/   Обработка ссылок в текстеlxmlc                 S   s   |  dp|  dS Nhrefsrchas_attrtagr#   r#   r$   <lambda>       z1ConfluenceAPIImport._dump_links.<locals>.<lambda>r   r   z/attachments/zmailto:u   Это почта: httpuH   Это внешняя ссылка, оставляем как есть: r   r   ?r   u   Это не файл: rj   rk   r   
obj_ext_idr{   r+   r   r   r{   Fu0   Не удалось скачать ссылку r   )#r+   r6   r   r   find_allr   attrs
startswithr   r   re   joinr/   r   urllibparseunquoter   	mimetypes
guess_typer   r"   _get_filenamer   rz   r{   CmfImportDownloadr0   rS   
downloadedr   r   r   rP   rollback)rA   r   r   r   r   keyr   	file_name	mime_typeencodingr   rl   download_jobr   r#   r#   r$   _dump_links   sZ    



 


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r4   r.   )usernamer   c                 3   s*   | ]"\}}| ks|d kr||fV  qdS ) Nr#   r^   kv	user_infor#   r$   	<genexpr>*  s     z5ConfluenceAPIImport._get_user_info.<locals>.<genexpr>
users.jsonr   r   u4   Информация о пользователе ID u    добавлена в дамп)_get_user_info_from_dumpr/   Zget_user_infoZget_user_info_by_keyZget_user_info_by_usernamer:   r;   Zget_user_detailrq   itemsr   r   rd   r   r   r+   r6   r   )rA   user_idZ	dump_pathr4   Zuser_detail
users_pathr   r#   r   r$   _get_user_info  s$    

z"ConfluenceAPIImport._get_user_infoNc                 C   sr   |  dD ]T}|| j|kr&|  S |dd |krB|  S |dd |kr
|  S q
td| d S )Nr   rS   r   r   uQ   Не нашли информацию по пользователю в дампе )r   r0   r9   lowerrP   )rA   r   r   r   r#   r#   r$   r   3  s    
z,ConfluenceAPIImport._get_user_info_from_dumpc              
      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}	zzֈ 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 |	 W  qdW 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#   r^   r   r#   r#   r$   
<listcomp>@  s     z_ConfluenceAPIImport._dump_documents_expand_worker.<locals>.dump_child_pages.<locals>.<listcomp>
pages.jsonw+)	r+   r6   r   r/   get_childrenr   r   r   dump)r'   doc_pathdoc_log_msgchildren
pages_filer   rY   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   rzrestrictions.jsonu%   Дамп прав документа r   r   rf   rg   rh   zrestriction )r   r   Findentensure_ascii)r   r   r   r   r1   r   remover+   r6   r   r/   Z get_all_restrictions_for_contentrd   r   ry   r   )	r'   r   r   	doc_users
users_filer   Zrestriction_filer   rg   rY   r#   r$   dump_restrictionsE  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+   r6   r   r   r/   Zget_all_page_labelsrd   r   r   )r'   r   r   Zlables_filer   labelrY   r#   r$   	dump_tags\  s    

zDConfluenceAPIImport._dump_documents_expand_worker.<locals>.dump_tagsFZinit_views_and_dsr   uG   Осталось обработать примерно страниц: "r   " (rk   r   statustrashed   Документ uW    был удален. Пропускаем дамп расширенных данныхr7   r   re      uO   Повтор дампа расширенных данных документа    , попытка u\   Не удалось сдампить расширенные данные документа ERR-0025r"   r   
error_codeobj_type
error_typerC   )r   r/   r0   putr+   r6   r   Zqsizer   r   	is_cancelrM   r5   WARNINGranger   	log_error)rA   obj_api
page_queueobjs_that_are_doner   r  r  errors	page_datapage_log_msgir#   rY   r$   _dump_documents_expand_worker=  sZ    	



  z1ConfluenceAPIImport._dump_documents_expand_workerc                 C   s  d}| j  }| j  }d}| D ]z}| r$t|jds$|d7 }|d}t|d}	t	
|	}
W 5 Q R X |
d |
d t|
d |
d	 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 ]}|  ~qJ|j    |! s||" 7 }qf| jjd|  |S )Nr   .dirtyrC   	info.jsonr   rk   r   re   r  )rk   r   re   r  uC   Дамп расширенных данных документов: z_dump_documents_expand_worker r   logintokenpassword
verify_sslr;   )r  r  r  targetrS   kwargs   Форк proc=uR   Ошибок дампа расширенных данных документов: )#rF   Queueiterdiris_dirr   rS   endswithr   r   r   r1   r   r  r+   r6   r   r  rE   Threadr  r   r/   r   r#  r$  r%  r&  r:   r;   ry   startr   clearemptyr0   )rA   objs_dirmax_workersr  r  r  
page_countdoc_dir	info_filer   Z	info_datadataprocessr  procr#   r#   r$   _dump_documents_expand  sZ    







z*ConfluenceAPIImport._dump_documents_expandc                    s   fdd}t ddv |_d}| }|d krD|| q|D ]4}zzވjjj|j	dd}	|	d d	kr~W 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 }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!}| rBt| 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
r:|d	 d
 |kr:||d	 d
  |d	 dr|d	 d d |kr||d	 d d  qW 5 Q R X jjd*|  | d+}| rt| t|d#}
d,}jj&| d |d%D ]}|
"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  qW 5 Q R X | d0}t|d}
t	j
||
d1dd2 W 5 Q R X t'(|| |jdd t|| d3< | d4}t|d}
t	j
| |
dd- W 5 Q R X j)d5| d6 j%d7 d S )8Nr  r   r  rk   r   r   Texist_okhistory	createdBylastUpdatedbyownedBytyperD   attachmentsattachments.jsonc                 S   s   g | ]}|qS r#   r#   r   r#   r#   r$   r     s     zUConfluenceAPIImport._dump_documents_main_worker.<locals>.dump_doc.<locals>.<listcomp>)page_idr   )modez+pages/downloadallattachments.action?pageId=z%wiki/download/all_attachments?pageId=all_attachments.ziprj   r   r   FbodyviewrV   zcomments.jsonu5   Дамп комментариев документа r   z@,extensions.inlineProperties,extensions.resolution,children.pager   r   rC   commentZexport_viewu)   Дамп версий документа zversions.jsonzlcontent.version,content.body.view,content.body.export_view,content.body.atlas_doc_format,content.body.editorr   versioncontentr   r   r   re   r!  r
  u     успешно сдампленr&   )*r   r   mkdirry   r0   r/   get_all_attachmentboolr   r   r   r   re   r   r   r:   r;   r+   rz   r{   r   r   rS   r   r   r   r   r   r   r   r6   r   r4   get_page_commentsrd   r   r=   inc_statZget_page_versionsr   r   rM   )r   r   r6  Zdoc_dir_tmpr   ownerr   r7  attach_infoZ
has_attachr   r   r   Zattach_file_pathrl   r   Zcomments_file_namer4   rK  Zversions_file_nameZpage_versionr   Z	info_pathr3  rA   r#   r$   dump_doc  s    








$




zAConfluenceAPIImport._dump_documents_main_worker.<locals>.dump_docFr  r   any)r4   r  r  currentr	  r  r   r  rk   r   u   Дамп документа r   r  u+   Повтор дампа документа r  rC   u    из 3r  u6   Не удалось сдампить документ r  r"   r   r  )r   r/   r0   r  r+   r   r   r:   Zget_page_by_idr4   r  r6   r   r  rM   r5   r  r=   r   r  )rA   r3  r  bulk_page_queuer  rW  r  Zpage_idsrF  r  r  r  r#   rV  r$   _dump_documents_main_worker  sP    r



  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 rC   r"  )r3  r  r[  r  r'  r*  u.   Ошибок дампа документов: )rF   r+  r  rE   r/  r\  r   r/   r   r#  r$  r%  r&  r:   r;   ry   r0  r+   r6   r   r   r1  r2  r0   )	rA   r3  r[  r4  r  r  r9  r  r:  r#   r#   r$   _dump_documents_mainm  s<    


z(ConfluenceAPIImport._dump_documents_mainc                 C   s  d}|d }| j d }d}| j }| jjd| d d}g }	t }
| D ]^}|	 rRt
|jdspqR|d7 }|jdd }|	t
| t|	|krR||	 g }	qR|	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   rC   2   uU   Добавление страниц в очередь дампа пачками по u    страницr   .uY   Добавление страниц в очередь дампа выполнено за .3fu    сек.uU   Дамп основных данных документов пространства r   u    выполнен за uC   Дамп расширенных данных выполнен за    Импорт прерван)rJ   rF   r+  r+   r6   r   time	monotonicr,  r-  r   rS   r.  r   ry   r   r  r]  r;  r  r   )rA   r   r3  r  	space_keyr4  Zmax_bulkr[  r5  Z	temp_listt1r6  rF  t2r#   r#   r$   _dump_documents  sF    




z#ConfluenceAPIImport._dump_documents   c                 C   s  | d}|jdd d}	|	 d}
|	 d}tddf 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 }z|d d d rdd | jj	|d|ddD }||d d d< |d d d rLd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$}| r$W q| |}| rHt|| W q|jdd W q   | jjd%| d&d'd(d) |d*  d7  < Y qX qqP|| W 5 Q R X dS )+u  
        Получает минимальные данные страницы с информацией о последнем изменении
        и зависимыми объектами(комментарии, вложения).
        Вычисляет хеш данных и сравнивает его с хешем предыдущей проверки,
        если хеши отличаются, то помечает каталог документа .dirty для повторного дампа
        pageTr<  zancestors,history.lastUpdatedz%,children.comment,children.attachmentz2,extensions.inlineProperties,extensions.resolutionFr  r   )r  allnewupdatedrX  )r0  limitr4   r  r  rY  rj  rC   rk   r   rK  rh   c                 S   s   g | ]}|qS r#   r#   )r^   rK  r#   r#   r$   r     s    z:ConfluenceAPIImport._check_hash_worker.<locals>.<listcomp>rh  )rm  r4   r   
attachmentc                 S   s   g | ]}|qS r#   r#   )r^   rn  r#   r#   r$   r     s    )rm  r4   Nz.hashr   )r   Z	sort_keyszutf-8rk  rl  r   r   u.   Не удалось проверить хеш r  r"   r   r  r  )r   rO  r   r/   _lock_startr:   get_all_pages_from_spacer   rR  rP  r   r   rc   r   r   hashlibZmd5encodeZ	hexdigestrd   r   r   r+   r  r  )rA   rd  r3  hash_dirr  hash_stats_queuerm  	dump_dataZcontent_hash_dirr4   Zpage_expandZcomment_expand
hash_statsr0  r   ri  rF  commentsrD  Zcurrent_hashZ	hash_filer   Zcontent_jsonZnew_hashZdoc_tmp_dirr6  r#   r#   r$   _check_hash_worker  s    


    
	





  z&ConfluenceAPIImport._check_hash_workerc                 C   s  | j  }d| _| j | _| jd }|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}| sV| }||d 7 }||d 7 }||d 7 }||d 7 }q| jjd|dd| d| d| d	 | jjd|  |S )Nr   rC   r   re   z/hashTr<  z_check_hash_worker r"  )rd  r3  rt  r  ru  r'  r*  r  rj  rk  rl  uC   Проверка хеша контента выполнена за r`  u8    сек. (всего/новых/обновленных: r   r   u(   Ошибок хеша контента: )rF   r+  rp  rE   Lockro  rJ   r   rO  rb  rc  r  r/  ry  r   r/   r   r#  r$  r%  r&  r:   r;   ry   r0  r+   r6   r   r   r2  r0   )rA   r   r3  rv  ru  r4  rd  rt  re  r9  r  r:  rf  r  Zobj_allZobj_newZobj_updatedrw  r#   r#   r$   _check_hash0  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   r9   )r^   urY   r#   r$   	<setcomp>}  s     z5ConfluenceAPIImport._collect_users.<locals>.<setcomp>rC  rD   r   r   Fr   N)r+   rM   r?   r   r   r   r   r1   r   r   addr9   ry   unlinkr   list
differencer   r   )rA   project_dirr3  Zcurrent_usersZcurrent_user_idsr   r   Znew_user_idsr'   r   rg   Z
diff_usersr   r#   rY   r$   _collect_usersr  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   r1   )rA   project_keyr  r   projectr#   r#   r$   _get_project  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  r   z.metau(   Пропускается каталог r   r  r   )r+   r   r   r   r   r.  r6   r   r   r   r1   )rA   r  r  r   r  r#   r#   r$   _get_projects  s    

z!ConfluenceAPIImport._get_projectsc           	   	      s  t td fdd jjd }|d d d }|d sDd	S d
d |d D }|sʈ D ]f}d|d< g |d< |d D ]}|d |dg d q~|d D ]}|d |dg d q|| qbt }|D ]}z|d r|d sN|d d }|d D ]}|d |dg d q
|d D ]}|d |dg d q0|d D ]p}|d rV|	|d  |
dstj d|d d |d<  ||d D ]}|	| qqVW q   jjd| d Y qX q|_d	S )uJ   Прогружаем все выбранные документы
        )doc_infor6  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   	documentsrk   u'   Документ не загружен zERR-0015r"   r   r  ri  rh   Trk   r  r   )_get_documentr   r   r+   r  ry   )r  r6  Zdoc_dumpchildr   rA   r#   r$   r     s"      z=ConfluenceAPIImport._load_selected_objs.<locals>.get_childrenimport_settingsrU   rV   r   r  Nc                 S   s   g | ]}|d  r|qS r  r#   r^   setting_objr#   r#   r$   r     s      z;ConfluenceAPIImport._load_selected_objs.<locals>.<listcomp>r   T
root_pagesr  archived_pagesr   r   rk   re   r  uc   Не удалось вычислить выбранные документы для проекта u4   , скорее всего он не сдамплен)r   r   ra   r+   json_settingsr  ry   r?   r  r~  r0   r   r   r6   r   r@   )	rA   r[   rootselected_spacesr  r'   resultr   r  r#   r  r$   _load_selected_objs  sF    



&z'ConfluenceAPIImport._load_selected_objsc              
   C   s*  |  | jjd }|d d d }|d s.dS dd |d	 D | _|d rpt|d	 dkrpd
d | j D | _| j d}|j	dd | jD ]}t
|d d }| jj|}z8| j rW  d S | j jd7  _||}|d}d }	| r(t|d}
t|
}|d}	W 5 Q R X | jjd|d   | stt
|| d|d< tj|d dd g |d< | j|d D ]}|d |d  q|d stdg |d< | jj|d dddD ]}|d |d  q| s
t|d | t
||d< t|d}
|	|d< t||
 W 5 Q R X t  t |d  d}|j	dd | jjd|  t
t!" # $ }| j%|||	d }|s||d< t|d}
t||
 W 5 Q R X |  j&| '||7  _&| (|| W q   | jj)*  | jj+d!| d"d#d$d% Y qX qd S )&Nr  rU   rV   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 )rk   )r   rk   r#   r   r#   r#   r$   r     s     r  r<  r   r   rC   r!  r   Z	dump_dateu&   Дампим пространство rS   r   re   r  rk   uJ   Пустой проект, возможно нет прав доступаr  Zarchived)r  r   
/documentsuD   Проверка хеша контента пространства )rv  u1   Ошибка дампа пространства zERR-0026
CmfProjectr   r  ),ra   r+   r  r  r   r/   Zget_all_spacesr   r   rO  r   r:   Z	get_spacer  r=   r   r   r   r1   r0   r6   r   r   makedirsZget_root_pages_from_spacery   CmfErrorrq  r   r   r   commit_with_eventr   r   ZnowZ
astimezonedater{  r3   rg  r  r   r   r  )rA   r[   r  Zprojects_dirr  rd  r   r  r7  Zlast_dump_dater   Zcurrent_dumpr   Zarchived_docr3  Znew_dump_dateZhash_errorsr#   r#   r$   _dump_spaces  sx    







  z ConfluenceAPIImport._dump_spacesc                 C   s  | j  d}| rd S |jdd | j D ]^}| jjjrPt	|d }nt	|d 
dd
dd}||}|jdd |d	}| j  jd
7  _t|d}t|| W 5 Q R X |d}| j  d}|jdd |jdd | j|d D ]}	||	| j d }
| j  jd
7  _t|
d}t|	| W 5 Q R X ||	| j d }
|
 rlq t|
d}t|	| W 5 Q R X q q2d S )NgroupsTr<  rk   rS   r   r   r   r!  rC   r   r   r   )r+   r   r   r   rO  r/   Zget_all_groupsr:   r;   r   r   r=   r   r   r   Zget_group_membersr9   )rA   
groups_dirri   rl   Z	group_dirZ	data_filer   Z	users_dirZall_users_dirrg   Zuser_data_filer#   r#   r$   _dump_groups.  s8    




z ConfluenceAPIImport._dump_groupsc                 C   s   | j  }t|\}}}|| d }| j jd| d | j jd | j jjddr|| j jd | 	| j
jd n| j jd	tjd
 |   d}| dD ]}|d7 }q| j jd|d d S )Nd   u   Свободно места: rn   u$   Скачаем данные из API
load_usersTu'   Дампим пользователейr   uA   Не дампим пользователей из-за опцийr  r   rC   rg   )rV   )r+   r   r   
disk_usager6   r   r  rV   r0   r   r/   Zget_all_usersrM   r5   r  r  r   rS  )rA   Zdownload_pathtotalusedfreeZfree_percentZuser_cntr   r#   r#   r$   download_dataM  s    

z!ConfluenceAPIImport.download_data)r  c                 C   s  dd l }dd l}|| _d}tdd | j r6q| }|dkrJq| jjd|d   d }t	dD ]l}	z | jj
|d tjdd	}|  t|d
 d"}
|jddD ]}|
| qW 5 Q R X ||d
 \}}|r|dkr||d
 }W 5 Q R X | jjd|d
   tjj|d d}d|_|  |j  | jd W 5 Q R  W  q(W 5 Q R X W qn tk
r } zD| jj  |	dkr| jjd|d  d| ddd|d d W 5 d }~X Y qnX qnq(|| W 5 Q R X d S )Nr   Fr  DONEu    Пытаемся скачать r   r  T)timeoutstreamre   zwb+i    )Z
chunk_sizezapplication/zipu   Сохранили в rk   rk   rn  r   u@   Не удалось скачать файл с 3 попыток r   zERR-0027r"   r   )r  r  r  Zext_href)zipfiler   r/   r   r+   r  r0   r6   r   r  Zconfluence_requestrI   ZIMPORT_DOWNLOAD_TIMEOUTZraise_for_statusr   Ziter_contentrd   r   ZipFiler   r   r   r   r   r   rS  rP   r   r  r  )rA   r  download_queue
done_queuer  r   r  r   resr  r   chunkZmimetypers  myzipZdownload_objr   r#   r#   r$   _download_file_workerb  sX    
 


   z)ConfluenceAPIImport._download_file_workerc           	      C   s  | j jd | j }| j }d}| j dg dd| j jjjgdddgg}tj	j
|dsp| j jd	 |S g }t| jD ]v}| jj| jd
| ||t| jj| jj| jj| jj| jj| jjjddd}|| |  | j jd|  q~tj	j|ddgdD ]}||j|j|jd q
|D ]}|d q.|  s^|D ]}|!  qN| j jd | j " rt#  | j j$d |  s||% 7 }q| j jd|  |S )Nu=   Скачиваем все найденные вложенияr   zplugin.plugin.source_hashr{   ru   r   Fro   u   Вложений нетr  r"  )r  r  r  r'  u    Запустили задачу r   re   rp   rT   )rk   r   re   r  u%   Закончили скачиватьra  uC   Закончили скачивание файлов, ошибок )&r+   r6   r   rF   r+  load_fieldsrz   r{   r   r   countr  rJ   rE   r/  r  r   r/   r   r#  r$  r%  r&  r:   r;   ry   r0  slistr  rk   r   re   r2  r   r  r  r   r0   )	rA   r  r  r3   r   Zprocsr  r:  r   r#   r#   r$   download_files  sN    

  


z"ConfluenceAPIImport.download_filesc              	   c   s:   | d}t |d}|D ]}t|V  qW 5 Q R X d S )Nz/comments.jsonr   r   r   r   rA   re   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$   rw     s    
z%ConfluenceAPIImport._get_restrictionsr   c                    s6    d D ]"}d fdd	  |d qd S )Nre   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 rd 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 |_|jj| d d d |_| |_||_| d d dkrRd|_| d d d dkrnd|_|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 )'NrK  	processedr  ZdraftuJ   Не обрабатываем черновики комментариев rj   rk   r}   rl   rT   rt   rl   r+   **r>  rB  rC  rD   r?  createdDater@  rA  whenrI  rJ  rV   editor
extensionslocationinlineTZ
resolutionZresolvedclosedrs   r   u7   Ошибка обработки комментария r   r   zERR-0028r  r   )!r+   rS  r6   r   rz   r{   r   
CmfCommentr0   r}   r  rx   r9   	cmf_ownerrX   anonymous_usercmf_created_at
cmf_authorcmf_modified_bycmf_modified_at_process_mentionsr   _process_linksrV   import_raw_jsontree_parentr  r  r   r   r   r   r  )rK  r  rl   Zcmf_commentr  creater   rt   rA   r#   r$   r    sv    



 z9ConfluenceAPIImport._process_obj_comments.<locals>.create)rK  )N)r  )rA   rt   r   rK  r#   r  r$   _process_obj_comments  s    >z)ConfluenceAPIImport._process_obj_commentsc                 c   s4   | d}t |D ]}|| d| dV  qd S )Nz/attachmentsr   )r   r   )r   r   )rA   Zobj_pathZattachments_pathr   r#   r#   r$   _get_attachments  s    
z$ConfluenceAPIImport._get_attachments)r6  c              	   C   sJ   t t|d}t|}W 5 Q R X |D ]}|d | kr,|  S q,d S )NrE  r   )r   r   r   r   r1   )r   r6  r   Zattach_info_listattachr#   r#   r$   _get_confluence_attach_info  s
    z/ConfluenceAPIImport._get_confluence_attach_infoc                 C   s  ddl m} dd l}t|d  d}d}| r||8}| D ]&}z|dr`W qJ| ||d }	t	j
|}
t	jj|
|dddd	gd
}|st	j| j|d|
d}|jr:||t}|jdd |j| dd |jdd |	r&|j|	d d ks&td|j d|	d d  d|j  W 5 Q R X W qJ   |j  | jjd| d| d|d Y qJX qJW 5 Q R X | jdd |S )Nr   )RDiskre   z /attachments/all_attachments.zipr   r}   r   url_preview_imgurl_preview)rS   rt   rT   T)r+   rt   r}   rS   rs   )Zsmart_backupr  ZfileSizeu   Текущий размер  != u    из метыuD   Не удалось обработать вложение file_name=z all_attach_zip_path=zERR-0029r  rn  r  )Zrdisk.rdiskr  r  r   r   r  namelistr.  r  r   r"   r   CmfAttachmentr0   r+   r}   r   r   upload_filerc   st_sizeAssertionErrorr   r   r   r  rS  )rA   rt   r   r  r  Zall_attach_zip_pathr  r  Zzip_attach_namerU  Zattach_namern  Zattach_fr#   r#   r$   _process_obj_attachments  sJ    



4
 z,ConfluenceAPIImport._process_obj_attachmentsc                 C   s  | d}|d d }| jjjrz0t|d d }t| 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 | |||d d }| |||d d }| ||}| |||d d }| |||d d }| j|||d d |d}| |||d d }| |||d d }| |||d d }| |||d d }|S )NrI  rJ  rV   Zatlas_doc_formatrN  subobjuT   Не удалось конвертировать разметку страницы "r   r  rM  u    (версия numberr   zERR-0031r  r  )r0   r/   r:   r;   r   r   r   _convert_atlas_docrP   r+   r  r  r  _process_inline_comments_convert_plantuml_convert_drawio_convert_msoviewer_convert_childpages_convert_excerpt_convert_excerpt_include_convert_content_by_label)rA   doc_datar   r  Z	body_datar   	atlas_rawZexception_textr#   r#   r$   _convert_doc_text/  s,    


z%ConfluenceAPIImport._convert_doc_textc              	   c   s:   | d}t |d}|D ]}t|V  qW 5 Q R X d S )Nz/versions.jsonr   r  )rA   re   Zversions_file_pathr   r   r#   r#   r$   _get_versionsK  s    
z!ConfluenceAPIImport._get_versions)r  c           	         s    fdd}t jjddgdD ]}|  |j  q$d } d D ]}||d}|rN|jrN|}qNt jdd	d
}|  t	  |_
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 )"NrM  r  u7   Обрабатываем версию страницы r    (rk   z): version r  rj   r   r  r  r  r  rA  rC  rD   messagez%Y%m%d%H%M%S%fCLOSEDstatus_typerN  r  rZ  r  Trs   u@   Ошибка обработки истории страницы z): zERR-0033r  rC   )*r+   rS  r6   r   rz   r{   r   CmfDocumentHistoryr0   r}   r  r  rx   r9   r  r  r  rX   r  reasonofficial_numberZofficial_daterO   rV   strftimeZcmf_versionZdoc_versionworkflowget_default_statusr  rQ  cur_workflowr  r   Zhas_publishedr  r   r   r   rP   r  r3   )version_dataZcmf_document_historyrl   r   Zversion_contentr  r   rA   r#   r$   create_versionR  s`     $
"z=ConfluenceAPIImport._process_versions.<locals>.create_versionrt   =ro   re   )r  FT)rt   r  Zcmf_deletedrs   )r   r  r  deleter   r   r  r  r   r  Zcur_workflow_versionr   )	rA   r  r   r  ZdhZcurrent_versionrM  Zdocument_historyZfake_historyr#   r  r$   _process_versionsQ  s     D

z%ConfluenceAPIImport._process_versionsc              
   C   s   |  |d}| sd S t|d}t|}g |d< |  |d}| r~t|d$}|D ]}|d t| qZW 5 Q R X |  |d}| rt|d&}	t|	}
d|
t|
di|d< W 5 Q R X |W  5 Q R  S Q R X d S )	Nr!  r   labelsr  r   ri  )rh   sizer   )r   r   r   r   r1   ry   r   r   )r6  r'   Zdoc_filer   r  Zlabels_filef2Z	label_strr   Zf3r   r#   r#   r$   r    s"    
 
 z!ConfluenceAPIImport._get_documentc                 C   s$   t |d }tdd |}|S )Nr  c                 S   s   |   o| jd S )Nr   )r-  rS   r.  )	path_objsr#   r#   r$   r     r   z3ConfluenceAPIImport._get_doc_dirs.<locals>.<lambda>)r   r   r,  rp   )rA   
space_pathr  Zdoc_dirsr#   r#   r$   _get_doc_dirs  s    z!ConfluenceAPIImport._get_doc_dirsr     c                 c   s\   t | d}d}| |D ]:}|d7 }||k r2q||| d krF qX| ||jV  qd S )Nr  r   rC   )r   r  r  rS   )rA   r  offsetrm  r6  enum_dirr'   r#   r#   r$   _get_documents  s    z"ConfluenceAPIImport._get_documentsc                 C   s   t dd | |D S )Nc                 s   s   | ]
}d V  qdS rC   Nr#   r^   r   r#   r#   r$   r     s     z=ConfluenceAPIImport._count_space_documents.<locals>.<genexpr>)sumr  )rA   r  r#   r#   r$   _count_space_documents  s    z*ConfluenceAPIImport._count_space_documentsc           	      C   s   i }d}d}d}|  |D ]`}|d7 }||kr6|}d}||d ||  d7  < tdd | t|D }||d 7 }qdd | D }|S )Nr   r   rC   c                 s   s   | ]
}d V  qdS r  r#   r  r#   r#   r$   r     s     zCConfluenceAPIImport._get_offsets_for_execute_doc.<locals>.<genexpr>c                 S   s   g | ]\}}||fqS r#   r#   )r^   r  rm  r#   r#   r$   r     s     zDConfluenceAPIImport._get_offsets_for_execute_doc.<locals>.<listcomp>)r  
setdefaultr  r  r   r   )	rA   r  rm  offsetsZcurrent_offsetZ	obj_countr  r6  Zversion_countr#   r#   r$   _get_offsets_for_execute_doc  s    z0ConfluenceAPIImport._get_offsets_for_execute_docc                 C   s\  d}t ddB t , | }|dkr2q:| j r@q:zz| jjjj d|d  }| j	d	|  t
jj|d
}|st
j| jd||d d}|jr0|js|ddg |d d }	| jjd|	  |	d dkrtj}
n| |	| j }
|
s"| jjd|d  d|	  |d d}|rr| jjd|  |d dkr`tj}n| || j }n|
}|d d d }| jjd|  |d dkrtj}n| || j }|d d d }||d  ||
| j| jjt|d d |d d! |d d d" |||dd#}|jr.| j|_|d jd$krF||d%< |D ]}t||||  qJ|jr|jdd& |j !  | jjjj d'| }t
j"j|d
}|st
j"|| jd(}||_#|d) d*rt$j%&| j'j(|d) d* }n| jjjj)}|j* d+| d,| d-|_+d.|_,|jdd& |j !  n| jjd/|  || -||7 }| .|| |jr$g }|d0 D ]p}d| jjjj d|d  d}t
j/jd1d2d3| d3gd4}|r|0| n| jj1d5| d6| d7|d8 qt||_2| 3|||_+|jr|jdd& |j !  | 4|| | 5|| W n t6k
r   t
jj 7  | jj1d9|d  d:d;d<d= | j8  |d>7 }Y n t9k
r   t
jj 7  | jj1d9|d  d?| d@dA d;d<d= | j8  |d>7 }Y nF   t
jj 7  | jj1d9|d  d;d<d= | j8  |d>7 }Y nX W 5 | jdd X q|:| W 5 Q R X W 5 Q R X d S )BNr   Fr  r  r&   r  rj   rk   zprocess rl   Tr   )r+   r}   rl   rS   r  tagsr>  r?  u5   Определяем автора документа rC  rD   u1   Не найден автор документа: r   rB  u:   Определяем владельца документаr@  rA  =   Определяем последнего редактора rI  rJ  rV   r  r  r  r  )rt   rS   r  r  r  r  r  r  rl   r  r  Zfull_screenr  r  rs   z
::comment:)rl   r+   Z_linksZwebuiu4    импортирован из Confluence: <a href="z" target="_blank">z</a>r   uQ   Документ изменен пользователем, пропускаем r  rl   rm   rn   ro   u   Не найден тег z ext_id=zERR-0017r  u   Ошибка создания uS   : попробуйте очистить дамп и повторить импортzERR-0018r"   r  r  rC   u^   : попробуйте отменить импорты связанные с проектом , uW   чтобы он удалился из системы и повторите импорт);r   cmfutilZdisable_aclr0   r+   r  rS  rz   r{   rM   r   r"   r}   is_newr  r6   r   rX   r  rx   r9   r   r2   r  r   Zget_status_typeroot_parentr  r  setattrr   r   r   r   r  rt   r   re   r   r/   r   ext_urlverbose_namer   	log_levelr  r  CmfTagry   r  r  r  r  r   FileNotFoundErrorr   
log_detailAttributeErrorr  )rA   r  Zarchive_folderZ	obj_queuer  r  r   rl   r   authorr  rT  r  modifiedr  r   Zdoc_dictr   Zcomment_ext_idrK  r   r  Ztag_rawZ
tag_ext_idr   r#   r#   r$   _process_document_fork  s    
  

 

 
 
 
z*ConfluenceAPIImport._process_document_forkc                 C   s  d}zt |d}|jdddidD ]}td|jd }tj|d	}tj	j
||d
}	|	s| jjd| d| d|d q$tj	j
dd|gdd| dggdgd}
d}td|jd }|r|d	}d}td|jd }|r|d	}|	jj|	jj||d}|
r|
j|d< nd|d< t |ddjf |d}t |d}|jddidD ]6}|jdd|jd   idrV||j  qqVdd!d" |jjD }q$|W S    | jjd#| d|d Y nX d S )$Nu  
        <div data-drawio-title="{name}" data-drawio-type="diagram" data-attach-id="{attach_id}" class="drawio-content" contenteditable="false">
            <div class="header">Диаграмма: "{name}"</div>
            <div class="content">
                <img cmf_converted=True src="{img_src}" alt="" data-mce-src="{img_src}" width="{width}" height="{height}">
            </div>
        </div>
        r   imgdata-macro-namedrawior   zdiagramName=([^|]+)data-macro-parametersrC   rS   rt   u#   Диаграмма с именем u@    не найдена во вложениях документа zERR-0019r  rt   ru   rS   rm   %.pngr   r  100%zdiagramWidth=([^|]+)zdiagramHeight=([^|]+)rS   	attach_idwidthheightimg_srcr   r   html.parserrk   zdrawio-macro-content-data-macro-idc                 S   s   g | ]}t |qS r#   r   r^   xr#   r#   r$   r     s     z7ConfluenceAPIImport._convert_drawio.<locals>.<listcomp>uU   Неудалось конвертировать диаграмму из текста )r   r   researchr   r   r"   r   ri   r  r0   r+   r  rS   rV   rk   r   r   formatfindreplace_with
currentTagr   rI  r   )rA   r   r   raw_dataTAG_TMPLZsoup_rawr   matchr   r  
attach_imgr:  r;  r8  r_   soupZ
drawio_tagr#   r#   r$   r  u  s^    
 



 z#ConfluenceAPIImport._convert_drawioc              	   C   s   d}|s|S t |d}t |d}|jddidD ]}ztj|j}W n*   d}| jjd|j d|d	 Y nX t |jd
|j|dd}	|jddidD ]}
|
	|	  qqt t
|d}q0ddd |jjD S )Nu  
        <div class="macros-panel plantuml" contenteditable="false" data-macros-parameters="{params}"
            style="display: inline-flex; flex-direction: column; position: relative; width: 100%;"
            data-rendered="true" data-macros="plantuml">
            <div data-layout="default" class="extension-container" contenteditable="false">
                <span role="img" aria-label="Макрос PlantUML">
                    <svg xmlns="http://www.w3.org/2000/svg" id="Layer_1" data-name="Layer 1" viewBox="0 0 24 24" width="16" height="16">
                        <path d="M22,15h2v7h-7v-2h5v-5Zm2-10v6.731l-2-1.976v-.755H7v11h4.738c.033,.036,.057,.078,.092,.113l1.887,1.887H0V5c0-1.654,1.346-3,3-3H21c1.654,0,3,1.346,3,3ZM2,5v2h3v-3H3c-.551,0-1,.448-1,1Zm3,4H2v11h3V9Zm17-2v-2c0-.552-.448-1-1-1H7v3h15Zm-9.715,9.292c-.38,.391-.38,1.025,0,1.416l2.715,2.792v-2.5h2c1.654,0,3-1.346,3-3v-2.023h2.455l-2.756-2.711c-.386-.386-1.012-.386-1.398,0l-2.756,2.711h2.455v2.023c0,.552-.448,1-1,1h-2v-2.5l-2.715,2.792Z"></path>
                    </svg>
                </span>
                <span class="extension-title">
                    <span class="excerpt-title">PlantUML</span>
                </span>
                <span class="macros-actions">
                    <span class="macros-refresh">
                        <svg viewBox="0 0 24 24" style="width: 14px; height: 14px; color: rgb(32, 32, 32);"><path fill="#202020" d="M12,2a10.032,10.032,0,0,1,7.122,3H16a1,1,0,0,0-1,1h0a1,1,0,0,0,1,1h4.143A1.858,1.858,0,0,0,22,5.143V1a1,1,0,0,0-1-1h0a1,1,0,0,0-1,1V3.078A11.981,11.981,0,0,0,.05,10.9a1.007,1.007,0,0,0,1,1.1h0a.982.982,0,0,0,.989-.878A10.014,10.014,0,0,1,12,2Z"></path><path fill="#202020" d="M22.951,12a.982.982,0,0,0-.989.878A9.986,9.986,0,0,1,4.878,19H8a1,1,0,0,0,1-1H9a1,1,0,0,0-1-1H3.857A1.856,1.856,0,0,0,2,18.857V23a1,1,0,0,0,1,1H3a1,1,0,0,0,1-1V20.922A11.981,11.981,0,0,0,23.95,13.1a1.007,1.007,0,0,0-1-1.1Z"></path></svg>
                    </span>
                    <span class="macros-edit" style="margin-right: 7px;">
                        <svg _ngcontent-aiw-c17="" viewbox="0 0 24 24" class="ng-star-inserted" style="width: 14px; height: 14px; color: #444444;">
                            <path _ngcontent-aiw-c17="" fill="#444" d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                        </svg>
                    </span>
                    <span class="macros-delete">
                        <svg viewbox="0 0 18 18" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                            <path fill="#222" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            <path fill="#222" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            <path fill="#222" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                        </svg>
                    </span>
                </span>
            </div>
            <div data-fabric-macro="null" data-macro-body="" class="ak-renderer-wrapper" contenteditable="true">
                <textarea class="puml-code">{uml}</textarea>
            </div>
            <div class="macros-preview" contenteditable="true">
                {svg}
            </div>
        </div>
        r   r1  Zplantumlr3  erroru.   Не удалось получить svg из zERR-0002r  z{})paramsZumlsvgr=  r   c                 S   s   g | ]}t |qS r#   r?  r@  r#   r#   r$   r     s     z9ConfluenceAPIImport._convert_plantuml.<locals>.<listcomp>)r   r   r   r"   Zconvert_uml2svgr   r+   r  rD  rF  r   r   rI  r   )rA   r   r   rH  ZTMPrL  	text_soupr   rO  new_tagold_tagr#   r#   r$   r    s(    '

 
z%ConfluenceAPIImport._convert_plantumlc                 C   s   d}| dg |j}t|j}| }|  g }t|D ]:\}	}
|	| d|	d  d|	d  |
|d}|| q<ddd	d
dgdddddddgddd}dt|j||d dt|d}|	|
| t|jtj|dd|||d dd}|jS )u8    Создает тег макроса Word или Excel u  
            <div
                class="macros-panel mso-viewer"
                contenteditable="false"
                data-id
                data-macros="msoviewer"
                data-macros-parameters='{params}'
                data-rendered="1"
            >
                <div class="extension-container" contenteditable="false" data-id data-layout="default">
                    <span aria-label="Макрос {plugin_title}" data-id role="img">
                        <svg xmlns="http://www.w3.org/2000/svg" id="Layer_1" data-name="Layer 1" viewbox="0 0 24 24" width="16" height="16">
                            <path d="M22,15h2v7h-7v-2h5v-5Zm2-10v6.731l-2-1.976v-.755H7v11h4.738c.033,.036,.057,.078,.092,.113l1.887,1.887H0V5c0-1.654,1.346-3,3-3H21c1.654,0,3,1.346,3,3ZM2,5v2h3v-3H3c-.551,0-1,.448-1,1Zm3,4H2v11h3V9Zm17-2v-2c0-.552-.448-1-1-1H7v3h15Zm-9.715,9.292c-.38,.391-.38,1.025,0,1.416l2.715,2.792v-2.5h2c1.654,0,3-1.346,3-3v-2.023h2.455l-2.756-2.711c-.386-.386-1.012-.386-1.398,0l-2.756,2.711h2.455v2.023c0,.552-.448,1-1,1h-2v-2.5l-2.715,2.792Z"></path>
                        </svg>
                    </span>
                    <span class="extension-title" data-id>
                        <span class="excerpt-title" data-id>{plugin_title}</span>
                    </span>
                    <span class="macros-actions" data-id>
                        <span class="macros-edit" data-id>
                            <svg _ngcontent-aiw-c17="" viewbox="0 0 24 24" class="ng-star-inserted" style="width: 14px; height: 14px; color: #444444;">
                                <path _ngcontent-aiw-c17="" fill="#444" d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                            </svg>
                        </span>
                        <span class="macros-delete" data-id>
                            <svg viewbox="0 0 18 18" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                                <path fill="#222" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                <path fill="#222" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                <path fill="#222" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            </svg>
                        </span>
                    </span>
                </div>
                <div class="macros-preview" data-id>
                    <div class="mso-preview-wrapper" data-id>
                        <img class="mso-preview-image" data-id id="mso-img_{attach_id}_1" src="{url_preview_img}"/>
                    </div>
                </div>
            </div>
        r  r   rC   u   Лист)numrk   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
pagesCountFrL  rT  )rN  r9  r  Zplugin_titler=  )r  rk   r   r  Zget_fullviewsort	enumeratery   r   rq   r0   r   rD  r   r   rG  )rA   r   r  Zplugin_typeTMPLr9  r  Zfullview_pagesr   rS  Zfullview_pageri  Zparam_typesrN  rQ  r#   r#   r$   _create_msoviewer_macro_tag  sX    )
	z/ConfluenceAPIImport._create_msoviewer_macro_tagc                 C   s4  |s|S t |d}t |d}ddg}|D ]}|jd|idD ]}	|	d}
tdd |
d	D }
tj|
d
 }tjj||d}|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
|| ||| t t|d}q<q(ddd |jjD S )u7    Конвертирует макросы Word и Excel r   rU  rV  r1  r3  r4  c                 s   s   | ]}| d V  qdS r	  Nr   r^   Zparamr#   r#   r$   r   P  s     z9ConfluenceAPIImport._convert_msoviewer.<locals>.<genexpr>|rS   rt   rS   *   Ошибка обработки тега ")   ". Не найдено вложение "   " документа "r  rk   r       для версии v.ERR-0012r  r   c                 S   s   g | ]}t |qS r#   r?  r@  r#   r#   r$   r   e  s     z:ConfluenceAPIImport._convert_msoviewer.<locals>.<listcomp>)r   r   r0   r   r   r   r"   r   r  rS   r  
isinstancer  r  r+   r  rE  rF  r\  r   r   rI  r   )rA   r   r   rH  r  rL  rP  Zmacro_types
macro_typer   original_paramsr   r  
error_textrR  r#   r#   r$   r  C  s.    


$z&ConfluenceAPIImport._convert_msoviewerc           	      C   s   |s|S t |d}t |d}|jddidD ]Z}|d}|sZ| jjd| d|  q,|jddd	d}|rx||d
< t t|d}q,ddd |j	j
D S )u  
        Добавляет параметры настройки макроса из тега в editor разметке в тег во view разметке
        для последующей конвертации макроса при save_import
        r   r1  r   r3  r4  u-   В макросе "Children" объекта "u-   " отсутствуют параметры: F)r1  original-data-macro-parametersrk  r   c                 S   s   g | ]}t |qS r#   r?  r@  r#   r#   r$   r   ~  s     z;ConfluenceAPIImport._convert_childpages.<locals>.<listcomp>)r   r   r0   r+   r6   r   rE  r   r   rI  r   )	rA   r   r   rH  rL  rP  r   data_macro_parametersZview_tagr#   r#   r$   r  g  s    


z'ConfluenceAPIImport._convert_childpagesc                 C   s   d}|s|S t |d}t |d}|jddidD ]}|d}|d}	tdd	 |	d
D }	|	dd}
|jddid}t |j|
ddd	 |jD dd}|jd|id}|s|jddid}|r|	|j
 t t|d}q0ddd |jj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   r1  excerptr3  r>  r4  c                 s   s   | ]}| d V  qdS r]  r^  r_  r#   r#   r$   r     s     z7ConfluenceAPIImport._convert_excerpt.<locals>.<genexpr>r`  rS   r   classzwysiwyg-macro-bodyc                 s   s   | ]}t |V  qd S )Nr?  )r^   r  r#   r#   r$   r     s     rS   rN  r=  c                 S   s   g | ]}t |qS r#   r?  r@  r#   r#   r$   r     s     z8ConfluenceAPIImport._convert_excerpt.<locals>.<listcomp>)r   r   r0   r   r   rE  rD  r   r   rF  rG  r   rI  )rA   r   r   rH  r[  raw_souprP  r   macro_idmacro_parametersexcerpt_nameZ
macro_bodyrQ  rR  r#   r#   r$   r    s2    "



z$ConfluenceAPIImport._convert_excerptc                 C   s  d}|s|S t |d}t |d}|jddidD ]}|d}|d}	d|	krb|	dd	\}
}n|jj }
|	}|d
}|rtdd |dD }|dd}nd}t |j|||
dd}|j	d|id}|s|j	ddid}|r|
|j t t|d}q0ddd |jj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   r1  excerpt-includer3  r>  zdata-macro-default-parameter:rC   r4  c                 s   s   | ]}| d V  qdS r]  r^  r_  r#   r#   r$   r     s     z?ConfluenceAPIImport._convert_excerpt_include.<locals>.<genexpr>r`  rS   r   )rs  	page_namerd  r=  c                 S   s   g | ]}t |qS r#   r?  r@  r#   r#   r$   r     s     z@ConfluenceAPIImport._convert_excerpt_include.<locals>.<listcomp>)r   r   r0   r   rt   task_code_prefixr1   r   rD  rE  rF  rG  r   r   rI  r   )rA   r   r   rH  r[  rp  rP  r   rq  Zmacro_default_parameterrd  rv  rr  rs  rQ  rR  r#   r#   r$   r    s@    %




	z,ConfluenceAPIImport._convert_excerpt_includec                 C   sV  ddl m} t }t| d}z|D ]}|dkrxt|}t|}|dkr^|dg}n"|dkrdd	 |d
dD }t }|D ]}	|	dddd}	||	ddd}
zZtj	j
dddd|	 dgdd|	gddd|
 dggd}|stj	|	d}|jdd W nB tk
rL } z"td|	 d|  W Y qW 5 d }~X Y nX |t|j q|r6|dd|g q(|dkr(t|}t|}|dkr|dg}n$|dkrdd	 |d
dD }t }|D ]J}tjj
d d|gd}|std!| d"|  q|t|j q|r(|d#d|g q(W n tk
rP   Y nX |S )$Nr   translitr   r  z\=r  inc                 S   s   g | ]}| d qS r  strip)r^   r  r#   r#   r$   r   '  s     z5ConfluenceAPIImport._bql_from_cql.<locals>.<listcomp>z(),r   #r   ruTZlanguage_codereversedORaliasILIKE"%rS   ro   r\   rs   *   Не удалось создать тег r   r  INr   c                 S   s   g | ]}| d qS r{  r|  r]   r#   r#   r$   r   A  s     rw  u.   Не удалось найти проект «u   »: rt   )transliteratery  r  iterr   nextr}  r   r   r)  r0   r   rP   r5   r   ry   r   rk   r  StopIteration)cqlry  bqlZ	cql_partsZcql_partopvaluesr  r  r  Zlabel_aliasr   r   r   r  r   r  r#   r#   r$   _bql_from_cql  sh    



z!ConfluenceAPIImport._bql_from_cqlc                 C   s  d}|s|S t |d}t |d}|jddidD ]L}|d}t|d}	z|	d}
|
d	d
d}tdd |
D }| |}ddd|dddkt	|dd|dddk|dddkd|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'}|jd|id}|s^|jddid}|rp||j t t|d}q0d!d(d |jj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   r1  Zcontentbylabelr3  r>  r4  r`  r   r  r	  c                 S   s   g | ]}| d qS )r	  r^  )r^   pr#   r#   r$   r     s     zAConfluenceAPIImport._convert_content_by_label.<locals>.<listcomp>r   defaultreverseF)TtrueTruemax   
showLabelsT	showSpacenone)	rW  modelrY  r  r  r  r  excerptTyper  ui   Не удалось конвертировать макрос «Содержимое по меткам» u    с параметрами: zERR-0034r  'z&quot;r   r   z:Truez:truez:Falsez:false)
parametersr=  c                 S   s   g | ]}t |qS r#   r?  r@  r#   r#   r$   r     s     )r   r   r0   r   r   poplstripr   r  rO   r+   r  rD  r   rE  rF  rG  r   rI  r   )rA   r   r   rH  r[  rp  rP  r   rq  rr  Zall_parametersr  rN  r  r  rQ  rR  r#   r#   r$   r  Q  sl    





     
z-ConfluenceAPIImport._convert_content_by_label)r   c              	   C   s   t |d}tjjdd|gdddgddd ggddd	gd
D ]}zr|jd d d r|jd|jd d d idD ]<}|jd |jd< |j|jd< |jd |j	 d|jd< qnW q8   | j
jd| d|j d|d Y q8X q8t|S )Nr=  rt   ru   r  Tr  rv   r   r  r  r  ZinlinePropertiesZ	markerRefzdata-refr3  zdata-ref_origrn  cmf_converteduO   Не удалось конвертировать inline комментарий r   zERR-0020r  )r   r   r  r  r  r   r   rk   ry   r  r+   r  r   r   )rA   r   r   Zdoc_souprK  r   r#   r#   r$   r    s,    


 z,ConfluenceAPIImport._process_inline_commentsc                 C   s~   dd l }|jdddd| jjj d| jj d|j d| d	| d
gddtddtddd}| jd|j  | j  |S )Nr   z/usr/bin/python3z	manage.pyshellz,plugin = models.CmfPluginConfluence.get(id="z+");retcode = plugin.process_document_fork("z", "z", r!  z);Tz"/var/log/eva-import-subprocess.logr   z&/var/log/eva-import-subprocess.err.log)Z	close_fdsZstart_new_sessionstdoutstderru   Запустили )	
subprocessPopenr+   rz   rk   r   rM   pidr+  )rA   r  r  rm  r  r:  r#   r#   r$   _execute_doc  s      . 
z ConfluenceAPIImport._execute_docc                    s  t  _|d}|s(t |d d d}i }j|d |d dD ]R}d }|d rh|d d d	 }|d
 d }|dkr|d }|t|d||d	 < qHdd  fdd  ||d	 d jjdj	  
|d }g }	tj	D ]6}
|s q.|d\}}|||}|	| q|rtd t|	D ]b}| }|d k	rF j|7  _|	| |s q.|d\}}|||}|	| qFq.t|	D ]&}|  |jr j|j7  _qjjd d S )Nhomepager  r   r  re   rm  Z	ancestorsr   rk   r  positionr  r   )rt   r  c                 S   s   dd t d| D S )Nc                 S   s$   g | ]}|  rt|n| qS r#   )isdigitrO   r   )r^   r   r#   r#   r$   r     s     zKConfluenceAPIImport._process_documents.<locals>.natsort.<locals>.<listcomp>z(\d+))rB  r   )r_   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 rt   r#   )r^   r  r   r  r#   r$   r     s      zNConfluenceAPIImport._process_documents.<locals>.build_tree.<locals>.<listcomp>c                    s    |  d S )Nr  r#   )r  )r8  r  r#   r$   r     r   zLConfluenceAPIImport._process_documents.<locals>.build_tree.<locals>.<lambda>)r   r^  )r   rY  ry   r>   )r8  rt   ordernor   Zcurrent_ordernoZchildren_in_orderr  Znext_orderno
build_treer  rA   )r8  rt   r$   r    s    
z:ConfluenceAPIImport._process_documents.<locals>.build_treei uJ   Грузим документы в несколько процессов: rC   u:   Закончили обработку документов)r   r>   r0   r  r  r   r+   r6   r   rL   r  r  r  r  ry   rb  sleepr  Zpollr3   r   Zcommunicate
returncode)rA   r   r  r  r   r   rt   r  r  r9  r   r  rm  r:  r  Znew_procr#   r  r$   _process_documents  sT    
 


z&ConfluenceAPIImport._process_documentsc              	   C   sT  | j jd | j D ]4\}}z| j  r6W  qP| j jjj d| }tj	j
|dgd}|D ]\}}| j jjj d| }tj	j
|ddddgd}|s| j jd	| d
| d|d qb|jrb|j|kr||_|js|j|_||_|jdd qb|r|jsd|_|jdd t  W q   | j j  | j jd| ddd Y qX qd S )Nu6   Построение дерева документовrj   tree_node_is_branchr  rt   r  r}   r  u-   Не найден потомок по ext_id=z tree_parent_ext_id=zERR-0003r  Trs   uI   Не получилось привязать ноду tree_parent_ext_id=zERR-0024r"   r   )r+   r6   r   r>   r   r  rz   r{   r   r"   r0   r  r}   r  rt   r  r   r  r  r   r   )rA   Ztree_parent_ext_idr   r  rl   r  r  r#   r#   r$   _process_documents_tree	  sB    
 

 z+ConfluenceAPIImport._process_documents_treec                 C   s  |  | jjd }|d d d dkr<dtjjddd}n`|d d d d	krfdtjjd
dd}n6|d d d dkrdddtjjd
dd}ntd|   |  D ]P}z| j	 rW  q |d dd | j
D krW q| jjd|d   |d |d< |d }|d dkr*|dd}||d< | jjjj d|d  }||d< d}|d d d dkrt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rd&}|j d| |_|jd&d' |j  ntjjdd |d gddgd!}|r|jj|d jksd|jr|j|d kr|d  d(|d  d%|d< | jjd)|j d*|j d+|d  d,|j d-|d  
 n(|js|d |_|jd&d' |j  d}tjj|d | d.}|s,d&}tjjdd/d0| d0g| d!}|srd}d&}tj| j|d |d d1}|d dkrrtjjd2d|_t|d3 d4}	|d5r| |	|d5 d }
n^| jjd6|  |d7 D ]@}z| |	|}
W  qW n    | jd8| d9 Y nX q|
s&| jj d:| d;|d< W q|
d= d> }| jjd?|  |d d@kr`t!j"|dA< n| #|| j$ |dA< |
d= dB}|r| jjdC|  |d d@krt!j"|dD< n| #|| j$ |dD< n|dA |dD< |
d= dE dF }| jjdG|  |d d@krt!j"|dH< n| #|| j$ |dH< |
d= dI |dJ< |
d= dE dK |dL< |j%s^|j&r|s|D ]}t'||||  qh|  |j  |jj(dkr4tj)jdMd|jgdddNggdO}|j%r,| jjjj d|
d  }||_|dA |_*|dD |_+|dH |_,|dJ |_-|dL |_.||_/|jd&d' || _0n(|j%sD|j&rV||_/|jd&d' || _0| 1| j0|
 | 2| j0|
 | j0j%s| j0j&r| 3|
| j0| j0_4| j0jd&d' | j0j  | 5|
| j0 || _6|rtj)jdPdMd|jgdddNggdO}|d d d dkr*tj)j|dQdR}|r|7  nv|d d d d	ksV|d d d dkrtj)j|dQdR}tj)j|dSdR}|r|7  |r|7  |r|7  t8  | 9|| | :|| | ;  W q   | jj<  | jj dT|d  dUdVdW Y qX qd S )XNr  rW   rV   rk   r  zproject.agile:defaultr,   )project_type
logic_typeZproject_wikizproject.wiki:defaultr   sectionzCmfWiki:Class)r  	parent_idtree_parent_idr  u   Неизвестный типc                 S   s   g | ]}|d  qS r  r#   r   r#   r#   r$   r   V	  s     z7ConfluenceAPIImport._process_spaces.<locals>.<listcomp>u0   Импортируем пространство r   rS   rC  Zpersonal~r   rw  rj   rl   Fr  ru   r  r  r  u$   Импортируем проект u<    в раздел "Документы" Agile проекта "r  r   Trs   r  u   Проект с именем u    уже существует! r  z id=u   Переименуем в r  rm   rn   )r+   rl   rS   zsystem.closed:defaultre   r  r  uC   У пространсва нет домашней страницы r  uW   Не удалось получить данные корневой страницы id=u   , возможно ее нет.uD   Не найдена домашняя страница в дампе zERR-0021r  r>  r?  uD   Определяем автора домашней страницы rD   r  rB  uJ   Определяем владельца домашней страницы r  r@  rA  r  r  r  r  r  r  r  u   Документыro   ZANDu   Документ1)r  rS   u   Документ2u5   Ошибка импорта пространства zERR-0032r  r   )=ra   r+   r  r   ZCmfLogicTyper0   r  r  r  r  r  r6   r   r   rz   r{   r  rS   rl   r   r   r   r  rk   r   keysZCmfProjectPermSchemeZproject_perm_schemer   r   r  rM   r  rX   r  rx   r9   r}   r#  r%  r-   r"   r  r  r  r  r  r  r$  r  r  r  r   r   r  r
  r  _process_project_tagsr  r  r   )rA   r[   Zproject_fieldsr   rd  rl   Zproject_is_newr  Zproject_mergedr6  r  Z	root_pager-  rT  r.  r   Z
doc_folderZhomepage_ext_idZrm_doc_folderZrm_doc1Zrm_doc2r#   r#   r$   _process_spaces<	  sd   

<

 







 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   rx  re   r  r  rk   rS   r   r   r  r   r  Tr  rj   rl   rm   rn   r   r  r  r  r  r  r  )rS   r+   r}   rl   rs   r  zERR-0022r  )r  ry  r   r  r  r+   r  r  r   rz   r{   r   r)  r0   rl   rS   r  r   r   r   r   r   r  )rA   r   r  ry  r  r   r   Ztag_nameZ
name_aliasrl   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   )rA   r  Zgroup_idr   r#   r#   r$   _get_groupsF
  s    zConfluenceAPIImport._get_groupsc              
   c   sF   | d}t|D ],}t| |d}t|V  W 5 Q R X qd S )Nr   r   )r   r   r   r   r   r1   )rA   Z
group_pathZ	user_pathr   r   r#   r#   r$   _get_group_membersL
  s    
z&ConfluenceAPIImport._get_group_membersT)r   rQ   c              	   C   sP  | d}| jjd|  t|d t| dd d}|s| jjd|  tjj	j
ttj d }t|d d |  d	tj }t|d ||t| dd d
}d| jjjj d|| j  d}d}|d d}	t|	dkr|	d nd|d< t|	dkr|	d n|	d |d< ddg}
tjj dd|d g|
d}|stjj ddd| dgdgd}|stjjdd|d g|
d}t|dkr| jjd|d  dt| ddd |  jd7  _g }|sftjjdd |d gd!}|sft|	dkrdd |	d g}nHt|	dkrXd"dd |	d gdd |	d ggdd |	d gdd |	d ggg}tjj|d!}t|dkr|  jd7  _| jjd#|d  dt| ddd |r|d }d}|sl|rdd}d}|d }tjj dd| g|
dr<| jd$| d%tj |d d	\}}| d&| d	| }|d7 }q| jd'|  tj||| jdd(}nd |fS |r8|js|jr|D ]}t||||  q| ddd)g |j!r||j!kr|j! | |_!n||_!tj"# }tj"$ }||j%kr|j%&| ||j%kr|j%&| d|_'|j(r8|j)dd* | j j*d7  _*||fS )+NrR   u2   Обрабатываем пользователя ZdisplayNameZ
operationsT)rS   does_not_worku8   Не указан Email для пользователя rC   @)rS   rR   r-   r  rj   Fr   r   r   Z
first_name	last_namer   rg_member_ofr#  r  r  rl   rm   rn   u+   Пользователей с почтой z > zERR-0004rg   r   rS   ru   ro   r  u+   Пользователей с именем uQ   Обнаружена учетная запись с дублирующим email u   , добавляем цифруr   u1   Создадим пользователя ext_id=)rl   r#  r+   r}   
user_localrs   )+r0   r+   r6   r   r   rQ  warnZcmfrT   ZCmfEmailZ
max_lengthr   rI   
ORG_DOMAINr"  Ztranslit_striprz   r{   r9   r   r   r    r  r  r3   r   rM   r5   r  r}   r#  r%  r  rl   r|   Zconfluence_group
user_groupr  ry   r  r   r   r<   )rA   r   r  rq   rR   Z	user_dictZmax_lenrl   
is_createdZ	full_namerT   r   Zpersonsr   nr#  Zprefix_emaildomainr   Z
conf_groupr  r#   r#   r$   _process_personR
  s    
" "    

z#ConfluenceAPIImport._process_personc           	   	   C   s  | j jjdds(| j jdtjd d S t }| dD ]}| j 	dd | j 
 r\ d S | |\}}|jr|jdd |j  |r|jjtjs||jj |d	g D ]}d
}| jjjrd}d| j jjj d||  d}tjjddd| dgdgd}|s*tjjd
d|d
 gdgd}|sLtj|| j |d
 d|d}n|jr^|d
 |_||jkrz|j | |_|jdd |j  |j | q|jr8|jdd |j  q8|r
| j jjddr
| j j!"dt#| d|  t$tj%j&t'|gd d S )Nr  TuA   Не грузим пользователей из-за опцийr  r   rg   r  rs   r  rS   rk   rj   rl   rm   rn   r   r  ru   rl   r+   rS   r}   r  send_invitesu,   Отправляем приглашения u    пользователям: )args)(r+   r  rV   r0   rM   r5   r  r?   r   rS  r  r  r   r   r   r   rR   r.  rI   r  r~  r/   r:   r;   rz   r{   r   r|   r}   rS   rl   r  ry   r6   r   r   Zschedule_deferred_jobr    Zregister_personsr  )	rA   r  r   r   r  r   r   rl   ri   r#   r#   r$   _process_persons
  sP    


  

z$ConfluenceAPIImport._process_personsc                 C   sF  |   D ]6}d}| jjjr d}d| jjjj d||  d}tjj	ddd| dgdgd}|s~tjj	dd	|d gdgd}|stj|| j|d d
|d}n|j
r|d |_||jkr|j | |_|jd
d |j  | | j d|| D ]D}| |d\}}|sq|j| |jr|jd
d |j  qqd S )NrS   rk   rj   rl   rm   rn   r   r  ru   Tr  rs   r  F)r  r/   r:   r;   r+   rz   r{   r   r|   r0   r}   rS   rl   r   r   r   r  r   r   r  r  ry   r   )rA   r   r   rl   ri   r   r   r   r#   r#   r$   _process_groups
  s6    
  


 z#ConfluenceAPIImport._process_groupsc                 C   s   t dD ]D}|dkr4| jjd| j d| tjd d| _|   | js qNqt dD ]>}d}|dkr| jjd| d| tjd |  }|sV qqV|  j|7  _|   | 	  | 
  | j S )u   
        Запуск импорта

        :return bool: Истина в случае успешного импорта
        r  r   uB   При дампе данных обнаружены ошибки (u0   ), попыка повторного дампа r  uF   При дампе вложений обнаружены ошибки ()r  r+   rM   r3   r5   r  r  r  r  r  _process_cross_links)rA   r  r3   r#   r#   r$   process_import
  s&     z"ConfluenceAPIImport.process_importc                 C   s<   |j dtdids*|jdks*| dr8||  |S )uS   
        Из документов MS создаем наши превью
        styleZ
backgroundr3  r0  )rE  rB  compilerS   rF  Zcreate_preview_tag)rA   r   r  r#   r#   r$   _create_preview  s    *z#ConfluenceAPIImport._create_preview)r   rH  c                 C   sn  dd l }|s|S t|d}t|d}|dd D ]0}zz|jdrj| jjd|  W W q2|	dr|jd 
d	r| jjd
|  W W q2| jjd|  |	dr|jd }n
|jd }d|jddkrz|jd dd dd }	| |	}
|
rV|jd |jd< |
j|jd< d|jd< | jjd|
j  n| jjd|jd   W W q2td|}|r&|d}|stj|d}|r&| |}
|
r|jd |jd< |
j|jd< d|jd< | jjd|
j  n| jjd|jd   W W *q2|j|d}|rz|drz|ddkrz|d|d< |d|d< W W q2td|}|r|d}tjj| jjjj d| d}|rd|jd< |jd |jd< |j|jd< nd |d< ||d< W W Rq2|}tj|dd dd }tj|}|jd!}|jd"kr|r||jdd krt| jj d# }t| jj d$ }t | j! "d%|d&|d'd(}|# s| jjjj d| }tjj|d)gd*}|rt | j! "d%t|j$jd# d&|d'd(}|}|# sP| jj%d+| d,| d-| d.| d/	d0|d1 W W q2n|&|d2}||' kr|(|^}tj)j||d3}|stj)||| jd4}|j*dd5 |+|,  |j*dd5 |j-.  W 5 Q R X n2| jj%d6| d7| d8|d1 W 5 Q R  W W Bq2W 5 Q R X tj)j|d9d:d;g|d<}|r|	dr|jd |jd=< |j/j0|jd< d|jd< |	d>r|jd> |jd?< |jd>= t12|jd dd }|r|d r|d 
d@rd@|_3dA|jdA< dB|jdC< dB|jdD< n,|r|d r|d 
dEs| 4|| |	dr|jd |jd< |j/j0|jd< d|jd< t12|jd dd \}}|r|
d@rd@|_3dA|jdA< dB|jdC< dB|jdD< |5dF}|jd |jd< ||jdG< |6| n| 4|| | jjd|j/  n2|jddkr(| jj%dH| dI|d1 W W (q2W n   | jj%dJdK|d1 Y nX W 5 | jjd|  X q2t|S )LNr   r=  c                 S   s   |  dp|  dS r   r   r   r#   r#   r$   r     r   z4ConfluenceAPIImport._process_links.<locals>.<lambda>u'   Не обработали ссылку r  u   Уже обработали r   r  u   Это якорь u&   Обрабатываем ссылку r   z/people/r   r   r   r   	href_origTu   Заменили на u?   Пользователь не найден для ссылки z/display/~([^/]+)(?:/)?$zdata-usernamerC   )r   data-linked-resource-typern  data-linked-resource-idz$/pages/viewpage.action\?pageId=(\d+)rj   r  ri  z!data-linked-resource-container-idr"   r   rS   r  r  rD  rH  zparent.import_raw_jsonr  u   Документ ID u    с вложением (u<   ) не найден в дампе пространства "r  u~   ). Возможно он находится в пространстве, которое еще не импортированоzERR-0005r  r   r5  )rS   rt   r+   rs   u	   Файл u    не найден в zERR-0006r   r  r  )rS   rT   rt   Zsrc_origZsrcsetZsrcset_origZvideoZcontrolsr7  r:  r;  ZimagesourcerC  u%   Не найдено вложение zERR-0007u,   Ошибка обработки ссылкиzERR-0008)7r  r   r   r+   r6   r   r   r0   r   r   r   r   rx   r   rB  rC  r   r   r   ri   rE  r   r"   rz   r{   r   
class_namerl   r   r$  r  r1   r   r   r   r   rt   r  r  r  r   r  r   r  rc   r   r   r   rV   r   r   rS   r  rQ  ry   )rA   rt   r   rH  Zmake_previewr  rP  r   r   Z
account_idr   rJ  Z	user_nameZraw_tagrF  Zrel_docZattach_parentrS   r   Zresource_container_idrd  Z
space_nameattach_pathrl   Zdoc_with_attachr  r   Z
attach_objr   rs  r  r#   r#   r$   r    sF   














 

 


 

 






z"ConfluenceAPIImport._process_linksc                 C   s  |j dkrd}nd}| jjd t|d}t|d}|jddidD ]}z|d	rf| |d	 }ntd
t|j	t
|jt
|jt
|jt
|jdd}|jd|d d}	|	r|	|j tt
|d}W qF tk
r }
 z| jjd| d|d W 5 d}
~
X Y qFX qFt
|S )u]   
        Упоминания пользователей
        confluence-userlink
        r  z
                <a class="external" href="{person_href}" rel="noopener" target="_blank" data-macros="mentions" data-mention-type="person" data-object-id="{person_id}">@{person_name}</a>
            u	  
                <span class="macros-panel mentions-macros" contenteditable="false" data-id style="display: inline-flex; flex-direction: column; position: relative;">
                    <span class="extension-container" contenteditable="false" data-id data-layout="default">
                        <span class="extension-title" data-id>
                            @Упоминания <span class="excerpt-title" data-id>| {person_login}</span>
                        </span>
                        <span class="macros-actions" data-id>
                            <span class="macros-delete" data-id>
                                <svg viewbox="0 0 18 18" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                                    <path fill="#222" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                    <path fill="#222" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                    <path fill="#222" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                </svg>
                            </span>
                        </span>
                    </span>
                    <span class="ak-renderer-wrapper" data-id>
                        <a class="external" data-id data-macros="mentions" data-mention-type="person" data-object-id="{person_id}" rel="noopener">
                            <span class="lds-ring" data-id>
                                <span data-id></span>
                                <span data-id></span>
                                <span data-id></span>
                                <span data-id></span>
                            </span>
                        </a>
                    </span>
                </span>
            uH   Конвертируем упоминания пользователейr=  r  Zuserinfor3  Zuserkeyu]   Не найдены аттрибуты для определения пользователя)Z	person_idZperson_loginZperson_hrefZperson_namezuser-mentionr   )class_r   uZ   Не удалось преобразовать ссылку на пользователя zERR-0009r  N)r  r+   r6   r   r   r   r0   rx   rP   rD  r   rk   r#  r   rS   rE  rF  rG  r  )rA   rt   r   rH  r[  rP  r   r   rQ  rR  r   r#   r#   r$   r    s8    



 z%ConfluenceAPIImport._process_mentionsc                 C   s   |dkrd S z|  |}W n,   | jjd| dtjd tj Y S X | |dd\}}|s| jjj	
drtjj
| jjd d}| jjd| d| tjd n | jjd| d	d
dd tj}|S )Nunknownu6   Не найден пользователь user_id = "u9   ", в дампе, указываем системногоr  FZdefault_user_idr  uA   ", ставим пользователя по умолчанию u*   ", указываем системногоzERR-0023r    r   )r   r+   rM   r5   ZERRORrX   Zsystem_userr  r  rV   r0   r   r    r  r  )rA   r   rg   r   r   r#   r#   r$   rx     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  macroParamsrS   rV   ra  rb  extensionKeyrc  rd  r  rk   r   re  rf  r  N)r   r"   r   r  r0   rS   r  rg  r  r  r+   r  rF  r\  )	rA   r   elemr   rh  r  r   r  rj  r#   r#   r$   _convert_msoviewer_in_atlas_doc"  s    ,z3ConfluenceAPIImport._convert_msoviewer_in_atlas_doc)r   r  rQ   c           /      C   sb
  dd l }|s$| jjd t|d}t|}d}t|D 
]"}	| j rN 
q^|d7 }|	d dkr4|jddd	d
dd}
dd |j	ddidD 
 }g }|jD ]}|dkrq|| qt|	d D ]N\}}|d d }|jd| dd	d| ddd}|| j|_|
| q||
 tt|d}	n|	d dk	rjd }|	d dr|jd|	d d id}|s| jjd|	d d  d|	d d   q8nNd|	d d kr|	d d d d r|jd!|	d d d d  d" id}|	d d d#krd$}|jd|	d d id}|	rh|	d d d% d& d" }|	d d d% d'}|	rht|dd&j|d" |d(}||j tt|d}
q:|	d d d)kr2d*}|jd|	d d id}|	rh|	d d d% d& d" }|	rht|dd&jd&d+d |jD |d,d}||j tt|d}
q:|	d d d-r |	d d d% d. d" }tj|}tjj||d/}d0}|s|	d d d% d1 d" }t| j d2t| jj ! d3 d4|d5d6}|" s| jj#d7| d8|d9 q8n|$|d:}||% kr|&|>}tj|}tj||| jd;}|j'd<d= |(|)  W 5 Q R X t*+| d>}|% D ]v}|,|rt|&|T}tj|}tjj||d/}|stj||| jd;}|j'd<d= |(|)  W 5 Q R X qtW 5 Q R X |s| jj#d?| d@| dA|d9 q8t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" } |j-j.|j/j.|| dJ}!|r|j0|!dK< nd&|!dK< t|dd&jf |!d}||j tt|d}
q:|	d d dLkrFdM}"t|j/}#t|j-}$dN|#|#dOd&dPdNdQ}%|	d d d% }&|&r|&dRrt12|&dR d" 3 |%dS< |&dTr|&dT d" }tjj|j4|d/}'|'stj5j|dU}'|'rt|'j/|%dV< t|'j-}$n| jjdW|	d   |&dXr,|&dX d" |%dY< |&dZrH|&dZ d" |%d[< |&d\rd|&d\ d" |%d]< |&d^rdPddd_}(|(|&d^ d" |%d`< |&dard'dbdcdd})|)|&da d" |%de< |&dfrt12|&df d" 3 |%dg< dhdidj |&6 D }*t|"j|#|$t1j7|%dNdk|*dldd&d}+||+j tt|d}
q:|	d d dmkr|jddmd	dnd},|jdoddpid}-|-|	d d d% dp d"  |,|- |jdqdrddsdtd}.|.|	d d d% du d"  |,|. ||, tt|d}nj|	d d dvk	r4| j8||	|dv|dw tt|d}n4|	d d dxk
r:| j8||	|dx|dw tt|d}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&d|d |jD d}d}||j tt|d}n| jjd~|	  |	dr8| 9t|||	d |}q8|S )Nr   uC   Конвертация текста из atlassian разметкиr=  rC   rC  ZlayoutSectionZdivZfalser  zmceNonEditable selected)contenteditablezdata-layout-sectionrn  r3  c                 S   s,   g | ]$}d |j d krd|j d kr|qS )zfixed-widthrn  Zsingler3  r   r#   r#   r$   r   E  s     z:ConfluenceAPIImport._convert_atlas_doc.<locals>.<listcomp>rn  ZcolumnLayoutr   rN  r   r:  rn   zflex-basis: )zdata-column-widthzdata-layout-columnr  	extensionZlocalIdzdata-local-idu&   Не удалось найти тег u    для r  ZmacroMetadatar  ZmacroIdr>  rV   rt  uG  
                    <div class="macros-panel macros-include-block" contenteditable="false" data-include-block-name="{name}" data-localid="{page_name}" data-mce-contenteditable="false">
                    <div class="extension-container" contenteditable="false" data-layout="default" data-mce-contenteditable="false">
                    <span aria-label="Макрос Include. " role="img"> <svg height="14" id="Outline" viewBox="0 0 24 24" width="14" xmlns="http://www.w3.org/2000/svg"><path d="M19.949,5.536,16.465,2.05A6.958,6.958,0,0,0,11.515,0H7A5.006,5.006,0,0,0,2,5V19a5.006,5.006,0,0,0,5,5H17a5.006,5.006,0,0,0,5-5V10.485A6.951,6.951,0,0,0,19.949,5.536ZM18.535,6.95A4.983,4.983,0,0,1,19.316,8H15a1,1,0,0,1-1-1V2.684a5.01,5.01,0,0,1,1.051.78ZM20,19a3,3,0,0,1-3,3H7a3,3,0,0,1-3-3V5A3,3,0,0,1,7,2h4.515c.164,0,.323.032.485.047V7a3,3,0,0,0,3,3h4.953c.015.162.047.32.047.485Z"></path></svg> </span> <span class="extension-title">Макрос Include. "Вставить выборку"</span> <span class="macros-actions"> <span class="macros-edit" style="margin-right: 7px;" data-mce-style="margin-right: 7px;"> <svg _ngcontent-aiw-c17="" class="ng-star-inserted" style="width: 14px; height: 14px; color: #444444;" viewBox="0 0 24 24" data-mce-style="width: 14px; height: 14px; color: #444444;"><path _ngcontent-aiw-c17="" d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z" fill="#444"></path></svg> </span> <span class="macros-delete"> <svg class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;" viewBox="0 0 18 18" data-mce-style="width: 14px; height: 14px; color: #222222;"><path class="ng-star-inserted" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" fill="#222" stroke="none" stroke-width="1"></path><path class="ng-star-inserted" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" fill="#222" stroke="none" stroke-width="1"></path><path class="ng-star-inserted" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" fill="#222" stroke="none" stroke-width="1"></path></svg> </span> </span>
                    </div>
                    <div class="ak-renderer-wrapper" data-fabric-macro="null" data-macro-body="" data-macro-parameters="[object Object]">
                    </div>
                    </div>
                    </div>r  r   rS   )rS   rv  Zincludeu  
                    <div class="macros-panel macros-include-page" contenteditable="false" data-macros="include-page"
                         data-param-pageid="{page_name}" data-mce-contenteditable="false"
                         data-rendered="true">
                        <div class="extension-container" contenteditable="false" data-layout="default" data-mce-contenteditable="false">
                            <span aria-label="Макрос Include. " role="img"> <svg xmlns="http://www.w3.org/2000/svg" id="Outline"
                                                                                 viewBox="0 0 24 24" width="14" height="14"><path
                                d="M19.949,5.536,16.465,2.05A6.958,6.958,0,0,0,11.515,0H7A5.006,5.006,0,0,0,2,5V19a5.006,5.006,0,0,0,5,5H17a5.006,5.006,0,0,0,5-5V10.485A6.951,6.951,0,0,0,19.949,5.536ZM18.535,6.95A4.983,4.983,0,0,1,19.316,8H15a1,1,0,0,1-1-1V2.684a5.01,5.01,0,0,1,1.051.78ZM20,19a3,3,0,0,1-3,3H7a3,3,0,0,1-3-3V5A3,3,0,0,1,7,2h4.515c.164,0,.323.032.485.047V7a3,3,0,0,0,3,3h4.953c.015.162.047.32.047.485Z"></path></svg> </span>
                            <span class="extension-title">Макрос Include. "Вставить страницу"</span> <span class="macros-actions"> <span
                            class="macros-edit" style="margin-right: 7px;" data-mce-style="margin-right: 7px;"> <svg _ngcontent-aiw-c17=""
                                                                                                                     viewBox="0 0 24 24"
                                                                                                                     class="ng-star-inserted"
                                                                                                                     style="width: 14px; height: 14px; color: #444444;"
                                                                                                                     data-mce-style="width: 14px; height: 14px; color: #444444;"><path
                            _ngcontent-aiw-c17="" fill="#444"
                            d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path></svg> </span> <span
                            class="macros-delete"> <svg viewBox="0 0 18 18" class="ng-star-inserted"
                                                        style="width: 14px; height: 14px; color: #222222;"
                                                        data-mce-style="width: 14px; height: 14px; color: #222222;"><path fill="#222"
                                                                                                                          d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z"
                                                                                                                          stroke="none"
                                                                                                                          stroke-width="1"
                                                                                                                          class="ng-star-inserted"></path><path
                            fill="#222" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path><path
                            fill="#222" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path></svg> </span> </span>
                        </div>
                        <div class="ak-renderer-wrapper">{content}</div>
                    </div>
                    c                 S   s   g | ]}t |qS r#   r?  )r^   valr#   r#   r$   r     s     )rN  rv  r2  ZdiagramNamera  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  rD  rH  uI   Документ с диаграммой не найден в дампе zERR-0010r  r   )rt   rS   r+   Trs   z.*\.png$u   В документе u$    не найден файл с xml: zERR-0011rt   ru   rm   r6  r   r  r7  r;  r8  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>
                    FZ50r  )isShowChildrenrX  
documentIdchildrenAmountr7   includeViewTypeisOrderByDeskrj  r  ri  r\   r  uE   Не удалось обработать тег оглавления firstr  depthr7   r  Z
headerTyper  )r  Zsimplezrich contentr  rY  r  r  )r   Zcreationr.  ZsortTyper  r  r`  c                 s   s$   | ]\}}| d |d  V  qdS )r	  rV   Nr#   r   r#   r#   r$   r   3  s     z9ConfluenceAPIImport._convert_atlas_doc.<locals>.<genexpr>rL  )r'   doc_namerN  ri  zpaste-code-macro)rn  r  r  r   Zprezlanguage-markup1)rn  r  zdata-mce-selectedZ__bodyContentrU  r  rV  ZbodiedExtensionrm  u  
                    <div class="macros-panel macros-excerpt-block" contenteditable="false" data-excerpt-name="{name}" data-mce-contenteditable="false">
                    <div class="extension-container" contenteditable="false" data-layout="default" data-mce-contenteditable="false"><span aria-label="Макрос Include. 'Создать выборку'" role="img"> <svg height="14" id="Outline" viewBox="0 0 24 24" width="14" xmlns="http://www.w3.org/2000/svg"><path d="M19.949,5.536,16.465,2.05A6.958,6.958,0,0,0,11.515,0H7A5.006,5.006,0,0,0,2,5V19a5.006,5.006,0,0,0,5,5H17a5.006,5.006,0,0,0,5-5V10.485A6.951,6.951,0,0,0,19.949,5.536ZM18.535,6.95A4.983,4.983,0,0,1,19.316,8H15a1,1,0,0,1-1-1V2.684a5.01,5.01,0,0,1,1.051.78ZM20,19a3,3,0,0,1-3,3H7a3,3,0,0,1-3-3V5A3,3,0,0,1,7,2h4.515c.164,0,.323.032.485.047V7a3,3,0,0,0,3,3h4.953c.015.162.047.32.047.485Z"></path></svg> </span> <span class="extension-title">Макрос Include. 'Создать выборку' <span class="excerpt-title">| name = {name}</span></span> <span class="macros-actions"> <span class="macros-edit" style="margin-right: 7px;" data-mce-style="margin-right: 7px;"> <svg _ngcontent-aiw-c17="" class="ng-star-inserted" style="width: 14px; height: 14px; color: #444444;" viewBox="0 0 24 24" data-mce-style="width: 14px; height: 14px; color: #444444;"><path _ngcontent-aiw-c17="" d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z" fill="#444"></path></svg> </span> <span class="macros-delete"> <svg class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;" viewBox="0 0 18 18" data-mce-style="width: 14px; height: 14px; color: #222222;"><path class="ng-star-inserted" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" fill="#222" stroke="none" stroke-width="1"></path><path class="ng-star-inserted" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" fill="#222" stroke="none" stroke-width="1"></path><path class="ng-star-inserted" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" fill="#222" stroke="none" stroke-width="1"></path></svg> </span> </span></div>
                    <div class="ak-renderer-wrapper" contenteditable="false" data-fabric-macro="null" data-macro-body="" data-macro-parameters="{name}" data-mce-contenteditable="true">
                    {content}
                    </div>
                    </div>
                    c                 S   s   g | ]}t |qS r#   r?  r   r#   r#   r$   r   \  s     ro  u   Не нашли тег для ):r  r+   r6   r   r   r   r  r  rQ  r   r  contentsry   rZ  rF  r   r0   rE  r   r   rD  rG  r   r.  r   r"   r   r  r   r   r   r$  r  r1   r   r  r  r  r   r   r  rc   rB  r  rJ  rS   rV   rk   r   r   r   r   r  r  r   r   r  r  )/rA   r   r   r  rL  r  r  cntr  r  Ztag_layout_sectionr   r  ccolr:  Ztag_layout_colrI  rv  rs  r_   rS   r   r  rF  r  r  r   ZregexpZname_zipZfile_name_ziprK  r;  r8  r[  r  r  rN  ri  Zparent_pageZview_type_mapZsort_type_mapZoriginal_params_strZnew_soupZ
code_blockr   rV   r#   r#   r$   r  4  s   






**
"
&'


 




*.
z&ConfluenceAPIImport._convert_atlas_docc                    s  t t d fdd}t t d fdd}t t d fdd}dd	d
gdddgg}dD ]T}tt| }|j|d} jjd|j d|  d}d}	|dkrT j r jjd  d
S |j	|ddddg|	| |	| | gd}
|	d7 }	||8 }|
D ]}znd}t
|drl||jj|_||jj|_||jj|_|jr|d7 }|jdd |  |j  nP||jj|_||jj|_||jj|_|jr|d7 }|jdd |j  |jD ]}|jdkr֐qz8||jj|_|jr|d7 }|jdd |j  W n>   |j   jjd| d|j d |d! Y  qRY nX q jjd"| d#|  W q   |j   jjd| d|j d$|d! Y qX qqqTd
S )%uU   
        Заменим ссылки на задачи и документы
        )r   rQ   c                    s@  | s| S t | d}|js| S |jddidD ]}d }|d}|sR jjd q,tjj	ddd	| d
gdgd}|D ]}|j
d |krv|} qqv|s jjd| d q,|tj| q,|dD ]X}|jdrq|jd}|s jjd|  q|ds* jjjjj | }| jjjjjrd }d }|d}	|d}
|	dkr6|
r6 jjjj d|
 }tjj|dgd}|stjjddd jjjj dgddd|
 d
ggd}|s jjd|  q|jt|jks
t|tjrd|jd< |jd |jd < |j|jd< q̐n|	d!kr|
rtjjddd"|
 gdgd}|s jjd#|
  qd|jd< |jd |jd < |j|jd< q̐nhd$|jd krTtd%|jd D ]B} jjjj d|d&d   }tjj|dgd}|r qq|s4 jjd'|jd   q|s jjd|  q̐nd(|jd kr&td)|jd }|s jjd*|jd   qtjj	ddd	|d+d&d   d
gdgd}|D ].}|j
d |d+d&d  kr|} qq|s jjd,|d+d&d    qnd-|jd krtd.|}|sHq|d&}|d/d0d1}tjj	ddd jjjj dgd2d|ggdd3gd}|D ]*}t|j j!" |" kr|} qȐq|s jjd4|d+   qd|jd< |jd |jd < |j|jd< qnq|tj| qd5#d6d7 |jj$D S )8Nr   r1  Zjirar3  zdata-jira-keyuV   Не удалось найти код задачи в атрибуте "data-jira-key"r  rm   z%"key":"r  r  r   u;   Не удалось найти задачу по коду "r  ar  r   u!   Ссылка без адреса r   r  r  ri  rj   r  rl   rn   ::%%"homepage":{"id":"ro   u:   Не удалось найти документ по ид Tr  r   z%::uB   Не удалось найти пространство по ид z/wiki/z\/\d+rC   u:   Не удалось найти ид документа в z/browse/z	\/\w+-\d+u6   Не удалось найти код задачи в r   u:   Не удалось найти задачу по коду z	/display/z#/display/([A-Za-z0-9]+)+(?:/)?(.*)?r   r   r   rS   zparent.task_code_prefixuB   Не удалось найти документ по ссылке r   c                 S   s   g | ]}t |qS r#   r?  r@  r#   r#   r$   r     s     zQConfluenceAPIImport._process_cross_links.<locals>.check_links.<locals>.<listcomp>)%r   rI  r   r0   r+   r6   r   r   CmfTaskr  r  rF  ZCmfPluginCsvZcreate_tag_linkr   r   rz   r&  rV   r{   r"   r  stringr   rS   rg  r   rB  findallrC  ri   r   rt   rw  casefoldr   r   )r   rL  r   r   Ztask_keyobjsr   r   rl   Zresource_typeZresource_idZext_coderJ  rd  rv  Zdocsr   rY   r#   r$   check_linksj  s    



 


$
"


z=ConfluenceAPIImport._process_cross_links.<locals>.check_linksc                    s(  | s| S t | d}|jddidD ]}|jdr4q"|jd}|sZ jjd|  q"|jd} jjjj d	| }t	j
j|d
}|st	jjddd jjjj dgddd| dggd}|r
t|}|jj|d< |jj|d< t||d< d|d< |d= q" jjd|  q"t|S )uz   
            Заменяет ссылку на корневую страницу в макросе Page Tree
            r=  data-macrosz	page-treer3  r  r4  u3   Макрос Page Tree без параметров Zroot_page_originalrj   r  rl   rm   rn   r  r  r  r  ro   r  Z
rootLocaler  ue   В макросе Page Tree не удалось найти корневую страницу по ID )r   r   r   r0   r+   r6   r   rz   r{   r   r"   r  r   r   rk   rV   rS   r   r   )r   rL  r   rl  Zroot_page_idZroot_page_ext_idZpagetree_rootZmacro_paramsrY   r#   r$   check_pagetree_root  s<    

zEConfluenceAPIImport._process_cross_links.<locals>.check_pagetree_rootc                    s   | s| S t | d}|jddidD ]|}|d}|d}tjj|d}|sd jjd| d	 q"tjj||d
}|rt	|j
|d< q" jjd| d q"t	|S )ut   
            Добавляет ID документа в макрос "Включить выборку"
            r=  r  zinclude-excerptr3  zdata-param-projectkeyzdata-param-pagename)rw  u   В макросе "Включить выборку" не удалось найти пространство по task_code_prefix "r  r5  zdata-param-pageidud   В макросе "Включить выборку" не удалось найти по имени "u7   " страницу, содержащую выборку)r   r   r0   r   r  r+   r6   r   r"   r   rk   )r   rL  r   Z
projectkeyrv  r  Zexcerpt_pagerY   r#   r$   check_excerpt_include!  s&    




zGConfluenceAPIImport._process_cross_links.<locals>.check_excerpt_includer+   rv   Nr}   ru   T)r"   r  r  Z	CmfFolderro   u)   Конвертируем ссылки в u=    на локальные задачи и документы: r  r   u'   Отменили конвертациюr   zcomments.log_levelzcomments.text
text_draft)rp   rT   slicerC   rs   r   r   u>   Не удалось конвертировать ссылки r   zERR-0013r  u   Проверили u!    и конвертировали zERR-0014)r   varsr   r  r+   r6   r   r'  r  r  hasattrr   rV   r  r   r   Z
do_approver   r   rx  r(  r   r  )rA   r  r  r   r   Z	mode_namer  r  stepr  r  r   r  rK  r#   rY   r$   r  f  s|     +






z(ConfluenceAPIImport._process_cross_links)F)N)rh  N)N)N)r   r  )N)TT)T)N)NN)Xr   r   r   r   r   r   Z	CmfImportrB   r8   r  rZ   staticmethodr   r   ra   rb   r   r   r   r   r   r   r   r   r   r   r  r;  r\  r]  rg  ry  r{  r  r  r  r  r  r  r  r  r  r  rw   r  r  r  r  r  r  r  r  r  r  r  rI   ZIMPORT_OBJ_CNTr  r/  r  r  r\  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rQ  r  r  r  r  rx   r  r  r  r#   r#   r#   r$   r)   (   s    >!.

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