U
    >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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 d dlZd dlmZ d dlmZ d d	lT d d
lmZ d dlmZ d dlmZm Z  d dl!m"Z" G dd de#Z$G dd de#Z%G dd de&eZ'e(j)j*Z*e(j)j+Z+G dd dZ,dS )    N)contextmanager)Enum)permutations)Path)List)BeautifulSoup)cmf_context)*)CmfPluginImportMixin)ConfluenceApi)EmptySQLiteQueueBroker)JQLNormalizerc                   @   s   e Zd ZdZdS )ObjectModifiedErroru<   Объект был изменен после импортаN__name__
__module____qualname____doc__ r   r   "./modules/confluence/api_import.pyr      s   r   c                   @   s   e Zd ZdZdS )RemoteDeletedSourceErroru   Файл существует локально, но удален в исходной системе (нет метаданных)Nr   r   r   r   r   r   !   s   r   c                   @   s    e Zd ZdZdZdZdd ZdS )GetPageModeu=   Способ получения страниц через APIZbatchsinglec                 C   s   | j S Nvalueselfr   r   r   __str__+   s    zGetPageMode.__str__N)r   r   r   r   BATCHSINGLEr   r   r   r   r   r   &   s   r   c                   @   s  e Zd ZdZdZdddZeejdddZ	d	d
 Z
dd Zdd Zdd Zdd Zdd Zed7edddZedd Zedd ZedddZeeed d!d"Zedd#d$Zd%d& Zd8edd(d)Zedd*d+Zeeed,d-d.Z d/d0 Z!d9d1d2Z"d3d4 Z#d5d6 Z$d7d8 Z%ed9d:d;Z&d<d= Z'd>d? Z(d@dA Z)dBdC Z*dDdE Z+eedFdGdHZ,dIdJ Z-dKdL Z.d:dOdPZ/dQdR Z0d;dTdUZ1dVdW Z2dXdY Z3dZd[ Z4d\d] Z5d^d_ Z6d<d`daZ7dbdc Z8ddde Z9dfdg Z:dhdi Z;djdk Z<dldm Z=dndo Z>dpdq Z?drds Z@dtdu ZAdvdw ZBdxdy ZCdzd{ ZDd|d} ZEd~d ZFdd ZGdd ZHedd ZIdd ZJdd ZKd=ddZLdd ZMdd ZNdd ZOdd ZPedddZQdd ZRdd ZSdd ZTedddZUdd ZVdd ZWdd ZXdd ZYdd ZZdd Z[dd Z\dd Z]d>ddZ^dd Z_dd Z`dd Zadd Zbdd Zcdd Zddd Zedd ZfddÄ Zgddń ZhddǄ ZiddɄ Zjed?dd˄Zkdd̈́ Zld@ddτZmddф Znddӄ ZoddՄ Zpddׄ Zqddل Zrddۄ Zsdd݄ Ztdd߄ Zudd Zvdd Zwdd Zxdd Zydd Zzdd Z{dd Z|dd Z}dd Z~dd Zdd Zdd Zdd Zdd Zdd Zdd Zd d Zdd Zdd Zdd Zdd	 Zd
d Zdd Zdd ZdAeedddZdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" ZdBd#d$Zd%d& Zd'd( Zd)d* Zedd+d,ZdCd-d.ZdDd/d0ZdEeed1d2d3ZdFd5d6ZdS (G  ConfluenceAPIImportu;   Класс загрузки объектов через API).meta.dirty.trashed.remoteCmfDocument	CmfFolder)pagefolder)
confluence
cmf_importc                 C   s   || _ || _| j jrdnd| _| j | _| jjjj| _| | jj	d | _
tjjdd| _|   |   |   |   |   |   | jjdd t | _d S )N	accountIduserKeyZimport_settingszdefault.system:defaultcodeF)log)r+   r,   clouduser_keyZget_download_pathdownload_pathpluginsource_hash_normalize_settingsjson_settingssettingsmodelsZCmfWorkflowgetdefault_workflow_setup_config_params_setup_rest_client_logger_setup_queue_broker_logger_setup_projects_dir_setup_expand_params_setup_fallback_personget_max_processes	threadinglocal_local)r   r+   r,   r   r   r   __init__C   s    zConfluenceAPIImport.__init__c                 C   s   t tdd| _t tdd| _t tdtj| _| jtjtjfkrv| jj	
d| j dtj dtj d	tj d
	 tj| _t tddpd| _t tddpd| _t tddpd| _t tddpd| _t| j| _t tddpd| _t td| _dS )uB   Настраивает параметры конфигурацииZ"IMPORT_CONFLUENCE_DOWNLOAD_THREADS   ZIMPORT_REFRESH_DUMPFZIMPORT_CONFLUENCE_GET_PAGE_MODEuN   Недопустимое значение 'IMPORT_CONFLUENCE_GET_PAGE_MODE': 'u+   '. Допустимые значения: '', 'u   '. Проверьте настройки в config.py. Будет установлено значение по умолчанию: ''Z IMPORT_CONFLUENCE_GET_PAGE_LIMITZ&IMPORT_CONFLUENCE_GET_ATTACHMENT_LIMIT   Z#IMPORT_CONFLUENCE_GET_COMMENT_LIMIT2   Z$IMPORT_CONFLUENCE_DUMP_LAST_PAGE_VERr   Z$IMPORT_CONFLUENCE_PROC_LAST_PAGE_VERZIMPORT_QUEUE_BROKER_DIRN)getattrconfignum_download_threadsZrefresh_dumpr   r    	page_moder!   r,   loggerwarning
page_limitattachment_limitcomment_limitdump_last_versions_countbooldump_versionsprocess_last_versions_countqueue_broker_dirr   r   r   r   r=   Y   s    $z(ConfluenceAPIImport._setup_config_paramsc                 C   s*   t d}| jjj|_|| jjj dS )u/   Настраивает логгер rest_clientzatlassian.rest_clientNloggingZ	getLoggerr,   rQ   ZhandlersZsetLevellevelr   rQ   r   r   r   r>   |   s    
z-ConfluenceAPIImport._setup_rest_client_loggerc                 C   s*   t d}| jjj|_|| jjj dS )u0   Настраивает логгер queue_brokerZqueue_brokerNr[   r^   r   r   r   r?      s    
z.ConfluenceAPIImport._setup_queue_broker_loggerc                 C   s    | j d| _| jjdd dS )uC   Подготовка каталога для пространствprojectsTexist_okN)r4   joinpathprojects_dirmkdirr   r   r   r   r@      s    z'ConfluenceAPIImport._setup_projects_dirc           	      C   s   dddg}ddg}| j jr$|d ddg}d	g}d
dddg}ddddg}| j jr\|d ddg}dddddddg}d|| _d|| | | | | _d|| _d|| _d|| dg | | _dS )uk   Настройка списка свойств для расширения данных в запросах	ancestorszhistory.lastUpdatedzhistory.ownedByzbody.editorzbody.storagezbody.atlas_doc_formatzchildren.attachment.versionzchildren.commentzmetadata.labelsz$restrictions.read.restrictions.groupz#restrictions.read.restrictions.userz&restrictions.update.restrictions.groupz%restrictions.update.restrictions.userzcontent.body.editorzcontent.body.storagezcontent.body.viewzcontent.versionzcontent.body.atlas_doc_formatzextensions.inlinePropertieszextensions.resolutionzdescription.plainzhomepage.history.lastUpdatedzhomepage.history.ownedByz-homepage.restrictions.read.restrictions.groupz,homepage.restrictions.read.restrictions.userz/homepage.restrictions.update.restrictions.groupz.homepage.restrictions.update.restrictions.user,	body.viewN)	r+   r2   appendjoinexpand_spaceexpand_current_pageZexpand_trashed_pageexpand_version_pageexpand_comment)	r   mainbodychildrenmetadatarestrictionsversion
extensionsspacer   r   r   rA      sT    


z(ConfluenceAPIImport._setup_expand_paramsc                 C   s>   | j jjd}t|| _| jr2tjj|d| _nt	j
| _dS )u   
        Устанавливает резервного пользователя,
        если пользователь не будет найден в методе _get_person()
        default_user_id)idN)r,   r8   r   r;   rW   _is_default_userr:   	CmfPerson_fallback_persongZsystem_user)r   rv   r   r   r   rB      s
    
z*ConfluenceAPIImport._setup_fallback_personNnamec           
      c   s   d}|r| d| }| j j| t }dV  t | }t|d\}}t|d\}}dt|ddt|dd|d	}	|r| d|	 }	| j j|	 dS )
u0   Замеряет время выполненияu   Запуск. N  <   u   Выполнено за 02d:06.3f)r,   rQ   infotimeperf_counterdivmodint)
r   r}   Z	log_startstartelapsedhours	remainderminutessecondsZ	log_timerr   r   r   timer   s    $zConfluenceAPIImport.timerc                 c   sr   | j |}|d}z@| r,|| n|jdd || _|V  || || _W n tk
rl    Y nX dS )u|   Контекстный менеджер для атомарного обновления директории проектаr$   Tr`   N)rc   rb   with_suffixexistsreplacerd   project_dir	Exception)r   	space_key	clean_dir	dirty_dirr   r   r   project_directory   s    


z%ConfluenceAPIImport.project_directoryc                 c   s   | j |}|d}zNd}| r0|| n| r>d}n|jdd ||fV  |rb|| W n tk
rz    Y nX dS )u~   Контекстный менеджер для атомарного обновления директории контентаr$   TFr`   N)contents_dirrb   r   r   r   rd   r   )r   
content_idr   r   Zshould_replacer   r   r   content_directory   s    

z%ConfluenceAPIImport.content_directory)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)emailr}   )r}   fieldsselectedObjects)r}   r   import_type)strr{   Zcurrent_personr   r}   r   r   r   r   calc_import_settings  s    
z(ConfluenceAPIImport.calc_import_settings)r9   r   c                 C   s   dd | D S )uO   Преобразуем список с настройками в словарьc                 S   s   i | ]}|d  |qS r|   r   .0sr   r   r   
<dictcomp>  s      z;ConfluenceAPIImport._normalize_settings.<locals>.<dictcomp>r   )r9   r   r   r   r7     s    z'ConfluenceAPIImport._normalize_settingsc                 C   s   g S )uo    Для импорта из Confluence предварительный просмотр не требуется r   r   r   r   r   preview!  s    zConfluenceAPIImport.previewc                 C   s  g g d}d }t |d  d d }|D ]}|d dkr|d d d D ]*}d}| || j }|rL|d | qL|d d	 d D ]t}	d}| jjrd
| j d
|	d  d
}
nd
| j d
|	d  d
}
ddd|
 dg}tj	j
|d}|r|d | q|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rd
| j d
|	d  d
}
nd
| 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  dd|jgddd gg}tjj|d |d rntj|j| jd|d djdd |d rtj|j| jd|d djdd d S )N)readwriterr   	operationr   userresultsZprivategroup::rw   r}   ext_idLIKE%filterupdatereadonlyr   TZsave_importparent==r,   !=)r   r,   Zaccess_levelsubjects)listvalues_get_personr3   rh   r+   r2   r6   r:   CmfPersonGroupr;   import_originalperm_policy
is_changedsaveZperm_aclloadZCmfAccessRulebulk_deleter,   )r   content_objcontent_dataZpermsr   rr   restrictionr   person
group_infor   _filterr   r   r   r   _process_content_restrictions%  sz    





 
 z1ConfluenceAPIImport._process_content_restrictionsFc              	   C   sr   | j | d}|d}| r.t| t|d&}| D ]}|t	|d  q@W 5 Q R X |
| d S )N.jsonr$   a+
)r4   rb   r   r   osremoveopenr   jsondumpsr   )r   Zapi_funcr}   Z	overwrite	file_pathZfile_path_tmpfrowr   r   r   _simple_dumpf  s    


 z ConfluenceAPIImport._simple_dumpc              	   c   sJ   | j | d}| rFt|d}|D ]}t|V  q*W 5 Q R X d S )Nr   r+)r4   rb   r   r   r   loads)r   r}   r   r   r   r   r   r   _simple_getp  s    zConfluenceAPIImport._simple_get)textattachments_dirobjc                    sd  |sd S | j jd tj| jj}t|d	dd D ]"}|
drNdnd}|j|   sbq:zddd	d
dg}t fdd|D rW q:td rW q:d} dst| r| j jd   W q:tj }	|	js
|	js
tj| jj  tj }	|	jdr8|	j| jjkr8|	j|jsP| j jd   W q:tj dd dd }
t|
\}}|s| j jd|
  W q:tj|
}||}| j d|d  }tjj || jd}|stj| j  || jd}||_||_ d|_!|"  t#  W q: t$k
r\ } z$t%  | j jd  d|  W 5 d }~X Y q:X q:d S ) Nu/   Обработка ссылок в текстеlxmlc                 S   s   |  dp|  dS Nhrefsrchas_attrtagr   r   r   <lambda>      z1ConfluenceAPIImport._dump_links.<locals>.<lambda>r   r   z/attachments/z/thumbnails/z/thumbnail/z	/display/z/servlet/benryanconversionc                 3   s   | ]}| kV  qd S r   r   )r   Zurl_parturlr   r   	<genexpr>  s     z2ConfluenceAPIImport._dump_links.<locals>.<genexpr>/display/~([^/]+)(?:/)?$z3\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\bzmailto:u   Это почта: httpuH   Это внешняя ссылка, оставляем как есть: /r   ?r   u   Это не файл: r   rw   )r   
obj_ext_idr6   )r,   r   r   r6   Fu6   Не удалось обработать ссылку : )&r,   rQ   r   urllibparseurlparser+   r   r   find_allr   attrsanyresearch
startswithrR   schemenetlocurljoinpathunquotesplit	mimetypes
guess_typer:   r'   Z_get_filenamerb   r6   CmfImportDownloadr;   r}   
downloadedr   
cmf_commitr   Zcmf_rollback)r   r   r   r   parsed_confluence_urlr   keyZ	url_partsZemail_pattern
parsed_urlr}   	mime_typeencoding	file_namer   r   download_jober   r   r   _dump_linksx  s|    

 

zConfluenceAPIImport._dump_linksc                    s   z|  |W S    d}| jj||d  s<| jj||d  sP| jj||d  r| jjrp| jj d d}n| jj d d}  fdd| D  |	d}t
|d	}|t d
  W 5 Q R X | jjd| d Y nX d S )Nz%operations,status,email,personalSpaceexpandr-   )usernamer  c                 3   s*   | ]"\}}| ks|d kr||fV  qdS ) Nr   r   kv	user_infor   r   r     s     z5ConfluenceAPIImport._get_user_info.<locals>.<genexpr>
users.jsonr   r   u4   Информация о пользователе ID u    добавлена в дамп)_get_user_info_from_dumpr+   Zget_user_infoZget_user_info_by_keyZget_user_info_by_usernamer2   Zget_user_detailr   itemsrb   r   r   r   r   r,   rQ   r   )r   user_id	dump_pathr  Zuser_detail
users_pathr   r   r  r   _get_user_info  s$    
z"ConfluenceAPIImport._get_user_infoc                 C   s   |  dD ]}|| j|kr&|  S |dd | krF|  S |dd | krf|  S |dd | kr|  S |dd | kr|  S |dd | kr|  S |dd | kr
|  S q
td	| d
d S )Nusersr}   r  r  userNamer   displayNameZfullNameu   Пользователь 'u!   ' не найден в дампе)r   r;   r3   lowerr   )r   r  r  r  r   r   r   r    s     
z,ConfluenceAPIImport._get_user_info_from_dumpc                 C   sh  ddddddddd	d
d
ddddd}i }z| j d }t|dd }| j||}| jjrV|D ]}|d d |d d f}||}	|	sqd||	|	g g dd}
|dr@|d dr|d d d d d }| || j	 |
d 
| |d dr@|
d 
|d d d d d |d d d d d d |d  rdd!|
d"< qdnr|d#kr$|D ]}|d d |d d$ f}||}	|	sqd||	|	g g dd}
|d% }|d& }|dkr|d' }| || j	 |
d 
| n4|dkr|
d 
d|d i n|d"krdd!|
d"< qdn|D ]}|d( D ]}||d& |d& g g dd}
|d) r| |d) | j	 |
d 
|d)  |d* r|
d 
d|d* i |d) s4|d* s4d!|
d"< q4q(| jd+}| rt| t|d,*}d-d. | D |d/}t|| W 5 Q R X W n> tk
rb } z| jjd0| d1d2d3d4 W 5 d }~X Y nX d S )5N	EDITSPACE
REMOVEPAGEZEDITBLOGZ
REMOVEBLOGCOMMENTREMOVECOMMENTCREATEATTACHMENTREMOVEATTACHMENT	VIEWSPACEREMOVEOWNCONTENTSETPAGEPERMISSIONSSETSPACEPERMISSIONSZEXPORTSPACE))r)   create)r)   delete)blogpostr-  )r/  r.  )commentr-  )r0  r.  )
attachmentr-  )r1  r.  )ru   r   )ru   r.  )ru   Z
delete_own)ru   Zrestrict_content)ru   Zrestrict)ru   Z
administer)ru   Zexportrs   .r   r   Z
targetTypeF)
permissionr  groups	anonymousr   r   r   r-   r  r   r4  rw   r}   )rw   r}   ZanonymousAccessTr5  
   ZoperationKeysubjecttyper.   ZspacePermissionsr   Z	groupNamepermissions.jsonr   c                 S   s   g | ]}|qS r   r   r   _r   r   r   
<listcomp>a  s     z?ConfluenceAPIImport._dump_space_permissions.<locals>.<listcomp>)	convertedZoriginalu@   Не удалось сдампить права доступа. zERR-0056
CmfProjectdump)obj_type
error_type)system_infor   r   r+   Zget_space_permissionsr2   r;   
setdefaultr  r4   rh   r   rb   r   r   r   r   r   r   r?  r   r,   	log_error)r   r   Zmapping_typeZpermissions_dictZconfluence_versionZmain_versionpermissionsr3  r   type_permr   r7  Zsubject_typer3   Zpermission_typepermission_filer   Zpermissions_dataexcr   r   r   _dump_space_permissions  s    







	


	



z+ConfluenceAPIImport._dump_space_permissionsc              
      s@  g }t  } jd}| rPt|d"}t|} fdd|D }W 5 Q R X t  } j D ]}|	 r`|j
 jr|q`|d}| r`t|F}t|D ]4}|d dkrq|| j  ||kr|| qW 5 Q R X |  q`t|d}tjt||dd	d
 W 5 Q R X ||}	|	D ]}
 |
 j q&dS )us    Собирает пользователей из файла users.json в каталогах документов r  rc                    s   h | ]}t | j qS r   )r   r3   )r   ur   r   r   	<setcomp>v  s     z5ConfluenceAPIImport._collect_users.<locals>.<setcomp>r8  r5  w+   Findentensure_asciiN)setr   rb   r   r   r   r   r   iterdiris_dirr}   endswithEXCLUDED_DIR_SUFFIXESaddr3   rh   unlinkr?  r   
differencer  r4   )r   Zcurrent_usersZcurrent_user_ids
users_filer   Znew_user_idsZdoc_dirr  r   Z
diff_usersr  r   r   r   _collect_usersm  s4    



 
z"ConfluenceAPIImport._collect_usersc              
   c   sx   | j d}| D ]^}|jdr&q|d}| sP| jjd| d qt	|d}t
|V  W 5 Q R X qd S )Nr_   )r$   r#   	info.jsonuN   Отсутствует файл info.json в каталоге проекта 'rJ   rK  )r4   rb   rT  r}   rV  r   r,   rQ   rR   r   r   r   )r   rc   r   	info_filer   r   r   r   _get_projects  s    

z!ConfluenceAPIImport._get_projects)
applink_idc              	   C   s:   | j d}t|d}t|}W 5 Q R X ||p8i S )Napplinks.jsonr   )r4   rb   r   r   r   r;   )r   r`  r   r   applinksr   r   r   _get_applinks  s    z!ConfluenceAPIImport._get_applinksc              	   C   sv   ddl m} i }| j D ]$}||d d|d< |||d < q| jd}|d}tj	||d	d
 W 5 Q R X d S )Nr   )cmf_hashlibZrpcUrl   r6   rw   ra  wFrR  )
Zcmf.utilrd  r+   Zget_applinksZshort_str_encr4   rb   r   r   r?  )r   rd  rb  applinkr   r   r   r   r   _dump_applinks  s    z"ConfluenceAPIImport._dump_applinksc                 c   s   | j jrX| j j|ddD ]&}|V  | j j|d dddE d H  q| j j|ddE d H  n| j j|ddddE d H  | j j|d dE d H  d S )	Nre   r  rw   rK   limitr  current)rk  r  status)r   )r+   r2   Zget_root_pages_from_spaceZget_descendantsZ get_all_pages_from_space_archiveget_all_pages_from_spaceZget_all_pages_from_space_trash)r   r   Z	root_pager   r   r   _get_all_space_content  s,    
z*ConfluenceAPIImport._get_all_space_contentc              	      sl  i _  fdd}i }|D ]}|d }|dg }t|D ]X\}}	|dkrh|d dkrbdnd	}
n||d
  d }
||
t |	d  ||	|
 qB|r|d d }nddd}||d d	}||t | ||| q"jd}|	d}t
jj |ddd W 5 Q R X dd | D _jd}|	d}t
jj|ddd W 5 Q R X d S )Nc                    sV   | d }|j krd S || d | d | d | di d|| kd}|j |< d S )Nrw   r8  rm  titlert   position)rw   r8  rm  rp  rq  r   is_homepage)all_content_metar;   )content	parent_idr   content_metahomepage_idr   r   r   add_content  s    
	zAConfluenceAPIImport._build_content_hierarchy.<locals>.add_contentrw   re   r   rm  archivedarchiveroot   r   trash)rz  trashedall_content_meta.jsonrf  FrO  rR  rQ  c                 S   s   i | ]\}}|t |qS r   )r   r  r   r   r   r     s      z@ConfluenceAPIImport._build_content_hierarchy.<locals>.<dictcomp>parent_to_children.json)rs  ro  r;   	enumeraterC  rS  rX  r   rb   r   r   r?  r  parent_to_children)r   r   rx  ry  r  rt  r   re   iZancestorZancestor_parent_idZdirect_parent_idZstatus_to_parentall_content_filer   parent_to_children_filer   rw  r   _build_content_hierarchy  s6    z,ConfluenceAPIImport._build_content_hierarchyc              	   C   s  g g g g dddd}| j  D ]\}}|d}|d}|dkrp|d | |dd	kr|d
 | n.|dkr|d | n|dkr|d | |dkr|d d  d7  < |dkr |d d  d7  < q t| j }| jj| j d | jjdt|d  dt|d
  d | jjdt|d   | jjdt|d   | jjd| d|d d  d|d d  d |S )Nr   )pagesfolders)root_idscurrent_idsarchived_idstrashed_idstotalsrm  r8  rl  r  r   r|  r  rz  r  r  r  r)   r  r  r}  r*   r  u'    Статистика контента:u       Текущий: u   , из них u    - корневойu       В архиве: u       В корзине: u,       Всего (страниц/папок):  (r   ))	rs  r  r;   rh   lenr,   rQ   r   	log_space)r   statsr   rt  rm  content_typetotalr   r   r   _calculate_content_stats	  sD    


 &z,ConfluenceAPIImport._calculate_content_statsc              	   C   s   | j j|| jd}| jj| j d | | t||d< | j	
d}|d}t|| W 5 Q R X | | j d$ |di d}| || W 5 Q R X | jstd	|  }|d
 |d< |d |d< |d}t|| W 5 Q R X |S )Nr  u8    Дамп прав доступа (Разрешения)r   r]  rf  u?    Получение структуры пространстваhomepagerw   uP   Пустой проект или возможно нет прав доступаr  
root_pagesr  Zarchived_pages)r+   Z	get_spacerj   r,   rQ   r   r  rJ  r   r   rb   r   r   r?  r   r;   r  rs  CmfErrorr  )r   r   r   ru   r^  r   rx  Zcontent_statsr   r   r   _dump_space6  s$    
zConfluenceAPIImport._dump_space)	new_userscontent_dirc           	   	      s   | d}z$|d}t|}W 5 Q R X W n tk
rF   g }Y nX  fdd|D }|D ]>}|shq^|d dkrvq^| j }||kr^|| || q^|d}tj||dd	d
 W 5 Q R X d S )Nr  rK  c                    s   h | ]}| j  qS r   )r3   )r   r   r   r   r   rM  [  s     z<ConfluenceAPIImport._append_content_users.<locals>.<setcomp>r8  r5  rf  rO  FrP  )	rb   r   r   r   FileNotFoundErrorr3   rX  rh   r?  )	r   r  r  r[  r   Zexisting_usersZexisting_user_idsZnew_userZnew_user_idr   r   r   _append_content_usersR  s$    



z)ConfluenceAPIImport._append_content_usersc                 C   s   t |d S )Nzutf-8)hashlibZsha256encodeZ	hexdigest)r   Z	body_datar   r   r   _get_body_hashj  s    z"ConfluenceAPIImport._get_body_hashc              	   C   sD  |d }| j jd| d |d}zZt|d}t|}W 5 Q R X |d d d }|d	}	|d
 d}
|dp~d}W n$ tk
r   d }d }	d }
d}Y nX g }|	|d d |	|d di d |	|d d t
|d  d d }|D ](}|d d d D ]}|	| q q| || |d dkr |d}|jdd |d d }|di drd}n>d}|d }|d}|d }tj||d!dd" W 5 Q R X |d#dr| j||f |d d$ d#dr| j| n|d%}|d& | |d
 d' d( }|
rZ|	|krZ|d
 d|
i n| j||d) f |d*}||d d d k}|dko| j|ko| j|kp| jdk}| r|s|r |d d d+ }| j||f | jr | j|d< t||d,< |d }tj||d!dd" W 5 Q R X | j d- d S ).Nrw   [ID:u   ] Дамп метаданныхr]  rK  historylastUpdatedwhen	body_hashro   viewlast_versions_countr   	createdBybyownedByrr   r   r   r   r8  r)   attachmentsTr`   rp   r1  _linksnextFattachments.jsonrf  rO  rP  sizer0  comments.jsonr  storager   rm  versionsnumberr   document)r,   rQ   r   rb   r   r   r   r;   r   rh   r   r   r  rd   r?  content_attachments_queueputcontent_comments_queue
write_textr  r   content_rendered_queuerV   r   content_versions_queuer   inc_stat)r   r   r   r   r   r^  r   current_dataZcurrent_last_updatedZcurrent_body_hashZcurrent_body_viewZcurrent_last_versions_countr  rr   r   r   r   r  	skip_dumpattachments_dataattachments_filecomments_fileZnew_body_hashversions_dirZhas_updatedZversions_config_changedcurrent_versionr   r   r   _dump_content_basicm  s|    









z'ConfluenceAPIImport._dump_content_basicrl  rL   c           
      C   s  t ddt | j rq|| j | j}|  j|7  _W 5 Q R X z| jj| j d| d| d|  | jj	||||| j
d}|sW q||D ]|}z0| |d \}}| ||| W 5 Q R X W q tk
r
 }	 z&| jjd|d  d	|	 d
dd W 5 d}	~	X Y qX qW q tk
rx }	 zH| jj| j d| d| d| j
 d| d|	 d
ddd W Y q|W 5 d}	~	X Y qX qW 5 Q R X dS )u4   Получение контента пакетамиFZinit_views_and_dsuB    Дамп метаданных пакета страниц: start=z, limit=z	, status=)r   rk  rm  r  rw   r  =   ] Не удалось получить метаданные. ERR-0025r?  
error_coderA  Nu^    Не удалось получить метаданные пакета страниц: start=z	, expand=r~   r'   r  r@  rA  )r   r,   	is_cancel
start_lock_startrQ   r   r  r+   rn  rk   r   r  r   rD  )
r   r   rm  rk  r   contentsrt  r   r   rI  r   r   r   _dump_content_basic_batch  sJ    
(	z-ConfluenceAPIImport._dump_content_basic_batchc                 C   s
  t dd | j s| j r"qz|jdd}W n0 tjk
rb   | rZ| j rZY qY qY nX |d }zD| j	j
|| j|d d}| |\}}| ||| W 5 Q R X W n@ tk
r } z"| jjd| d	| d
dd W 5 d}~X Y nX |  qW 5 Q R X dS )u5   Получение контента по одномуFr        ?timeoutrw   rm  r  rm  r  r  r  r?  r  N)r   
stop_eventis_setr,   r  r;   queuer   emptyr+   get_page_by_idrk   r   r  r   rD  	task_done)r   content_queuerv  r   r   r   r   rI  r   r   r   _dump_content_basic_single  s4    


z.ConfluenceAPIImport._dump_content_basic_singleTc                 C   s2   |r$| j tjkr$| j||| jd n
| | d S )N)r   rm  rk  )rP   r   r    r  rS   r  )r   r  all_contentr   rm  r   r   r   _dump_content_basic_worker  s    z.ConfluenceAPIImport._dump_content_basic_workerc              
   C   s  zh| j  d| }|d}|d}|D ]2}|d }	|d }
| jjr^d| d|	 d}n$|d d	 }|d
|krxdnd
d 7 }| j| jj|}d|kr|d d }ntd|}|r|dnd}| d|	 }t	j
j|| j dddgd}|s
t	j
|| j | jd}|
|_||_||	 d| |_|jsL||	 d|  s,d|_||_|  q,t  W nD tk
r } z$| jjd| d| dddd W 5 d }~X Y nX d S )Nr   r  rw   rp  zrest/api/content/z/child/attachment/z	/downloadr  downloadr   &zdownload=truers   r  z[?&]version=(\d+)r}  r}   r   r   )r   r6   r   )r   r6   r,   r2  Fr  uf   ] Ошибка при планировании задач на скачивание вложений. r  r?  T)r  rA  rollback)r6   rb   r+   r2   
url_joinerr   r   r   r   r:   r  r;   r,   r}   r   r   r   r   r  import_raw_jsonr   r  r   rD  )r   r   r  r   r   content_ext_idZattachments_clean_dirZattachments_dirty_dirattatt_idr  Zdownload_linkZdownload_urlrs   Z
att_ext_idr  rI  r   r   r   _schedule_download_jobs(  s\    




z+ConfluenceAPIImport._schedule_download_jobsc                 C   s  t dd| | j s| j r(qz|jdd\}}W n2 tjk
rn   | rf| j rfY qY qY nX d| d}| jj	
| d | |\}}zz|d}|r|d	}t|}	W 5 Q R X nFd
d | jj|| jddD }	|d}tj|	|ddd W 5 Q R X W nD tk
r^ }
 z$| jj| d|
 ddd g }	W 5 d }
~
X Y nX | ||	|| W 5 Q R X |  qW 5 Q R X d S )NFr  r  r  r  ]u    Дамп вложенийr  rK  c                 S   s   g | ]}|qS r   r   )r   r  r   r   r   r<  {  s    zHConfluenceAPIImport._dump_content_attachments_worker.<locals>.<listcomp>rs   rj  rf  rO  rP  uM    Не удалось получить метаданные вложений. r  r?  r  )r   r  r  r,   r  r;   r  r   r  rQ   r   r   rb   r   r   r   r+   Zget_all_attachmentrT   r?  r   rD  r  r  )r   r  r   r  log_contentr   r   r  r   r  rI  r   r   r    _dump_content_attachments_workera  sH    


 z4ConfluenceAPIImport._dump_content_attachments_workerc                 C   s  t dd | j s| j r(qz|jdd}W n2 tjk
rj   | rb| j rbY qY qY nX d| d}| jj	
| d z2dd	 | jj|| j| jdd
D }g }g }| D ]}|d s|| n,|d d d }||kr|| d | ||d d ||d di d ||d d | jd q| |V\}	}
|
d}|d&}|D ]}|t|d  qW 5 Q R X | ||
 W 5 Q R X W n@ tk
r  } z | jj| d| ddd W 5 d }~X Y nX |  qW 5 Q R X d S )NFr  r  r  r  r  u"    Дамп комментариевc                 S   s"   i | ]}|d  dkr|d |qS )rm  rl  rw   r   )r   r0  r   r   r   r     s    zEConfluenceAPIImport._dump_content_comments_worker.<locals>.<dictcomp>)rk  r  rp   re   r   rw   rp   r  r  r  r  r  r0  r  rf  r   u>    Не удалось получить комментарии. r  r?  r  )r   r  r  r,   r  r;   r  r   r  rQ   r   r+   Zget_page_commentsrU   rm   r   rh   r  r   rb   r   r   r   r   r  r   rD  r  )r   r  r   r  Zcommentsr  rootsr0  ru  r   r   r  r   rI  r   r   r   _dump_content_comments_worker  s\    



"z1ConfluenceAPIImport._dump_content_comments_workerc                 C   s  t dd | j s| j r(qz|jdd\}}W n2 tjk
rn   | rf| j rfY qY qY nX d| d}| jj	
| d z| |\}}|d}t|d	}t|}	W 5 Q R X | jj|d
|d}
|	d d|
d d i | |	d d d }||	d< |d}tj|	|ddd W 5 Q R X W 5 Q R X W n@ tk
r } z | jj| d| ddd W 5 d }~X Y nX |  qW 5 Q R X d S )NFr  r  r  r  r  u=    Дамп отрендеренного содержимогоr]  rK  rg   r  ro   r  r  r   r  rf  rO  rP  uW    Не удалось получить отрендеренное содержимое. r  r?  r  )r   r  r  r,   r  r;   r  r   r  rQ   r   r   rb   r   r   r   r+   r  r   r  r?  r   rD  r  )r   r  r   Zcontent_statusr  r   r   r^  r   r  Znew_datar  rI  r   r   r   _dump_content_rendered_worker  sD    


*z1ConfluenceAPIImport._dump_content_rendered_workerc                 C   s  t dd | j s| j r(qz|jdd\}}W n2 tjk
rn   | rf| j rfY qY qY nX d| d}| jj	
| d g }| |\}}|d}|jd	d
 |d}	|	 rt|	 |	  | jj||| j| jdD ]}
t|
tr&| jj| d|
 dddd q|	d|
d dd}|d}tj|
|ddd W 5 Q R X ||
d | jd q| || W 5 Q R X |  qW 5 Q R X d S )NFr  r  r  r  r  u:    Дамп версий (история изменений)zversions.jsonT)
missing_okr  )r  r  Zlast_versionsu&    Не удалось получить zERR-0038r'   r?  r  Zversion_r  Z03dr   rf  rO  r  r  rs   ) r   r  r  r,   r  r;   r  r   r  rQ   r   r   rb   rY  r   shutilrmtreerd   r+   Zget_page_versionsrl   rV   
isinstancer   rD  r   r   r?  rh   r  r  r  )r   r  r   r  r  r  r   r   Zversions_filer  Zpage_versionversion_filer   r   r   r   _dump_content_versions_worker  sR    





z1ConfluenceAPIImport._dump_content_versions_workerc                 C   sp   d| _ g }t| jD ](}tj||f|d}|  || q|  | j	  |D ]}|  qT| j
  d S )Nr   )targetargskwargs)r  rangerO   rD   Threadr   rh   ri   r  rS  clear)r   r  r  r  threadsr  threadr   r   r   _run_dump_stage5  s    

z#ConfluenceAPIImport._run_dump_stagec           
      C   s  | j j| j d|d rdnd d t | _t | _t	
 }t	
 }t	
 }t	
 | _t	
 | _t	
 | _t	
 | _|d r| jtjkr| j D ]&}|d dkr|d d	kr|| qnF|d
 D ]<}| j| }|d dkr|| q|d dkr|| qd| j||d |dddd| j||d |dd| jjdd| j|| jjdd| j| jdd| j| jdd| j| jdd| j| j| jdg}|D ]l}	| j  r d S |	ddsq|  | j d|	d  " | !|	d |	d |	d W 5 Q R X qd S ) Nu
    Дамп allu
   всегоu!   только выбранногоu    контентаr8  r*   rm  )rl  rz  idsrl  rz  u.   Дамп метаданных контента)r  r   rm  )r}   r  r  target_kwargsu@   Дамп метаданных контента (в архиве))r}   r  r  r  run_ifu(   Дамп метаданных папок)r}   r  r  r   u*   Дамп вложений контента)r}   r  r  u2   Дамп комментариев контентаuM   Дамп отрендеренного содержимого контентаuJ   Дамп версий контента (история изменений)r   T r}   r  r  r  )"r,   rQ   rR   r  rD   Lockr  Eventr  r  Queuer  r  r  r  rP   r   r    rs  r   r  r  r+   r2   r  r  r  r  r  rX   r  r;   r   r  )
r   r   selected_contentZselected_current_content_queueZselected_archived_content_queueZfolders_queuerv  r   ZpipelineZstager   r   r   _dump_space_contentsJ  s    









9z(ConfluenceAPIImport._dump_space_contentsc                    s   g ddt d fdd |dsfg |d< dD ].}j|g D ]}|d |dg d qHq6|dg D ]F}|d	 rd
|d krd |d  d  | qrdd< qrS )NT)r  r  )rt  c                    s   |  ddsdd< g S g }|  dsFdd j | d g D | d< | d D ]2}|d rx| | ||d  qNdd< qN|S )	N	isCheckedTFr  rp   c                 S   s   g | ]}|d g dqS )Trw   r  rp   r   )r   child_idr   r   r   r<    s   zUConfluenceAPIImport._collect_selected_content.<locals>._walk_tree.<locals>.<listcomp>rw   )r;   r  extendrh   )rt  Zchildren_idschild
_walk_treer  r   r   r   r    s    


zAConfluenceAPIImport._collect_selected_content.<locals>._walk_treerp   )r|  r{  r  r  Z_archived_pagesrw   r  Fr  )dictr;   r  rh   r
  )r   ru   ru  r   Zroot_contentr   r  r   _collect_selected_content  s(    

z-ConfluenceAPIImport._collect_selected_contentc                 C   s  | j d| _| jjdd | j D ]V}| r&|jdr@q&|j}|| j	kr&|
|d | jj| j d| d q&| jdg D ]}| jj| j d	| d
 | j|}|d}|d}|d}| r|
| q| r|
| q| r|
| q|D ]z}| j|}dD ]*}||}	|	 r*|	
|  qbq*|jdd | j	|}
|d}|tj|
ddd qd S )N	documentsTr`   r#   r&   u    Контент ID:u    был полностью удален, либо перемещен в другое пространство. Каталог помечен '.remote'r~  u    Контент ID uN    удален в корзину. Он не будет импортированr$   r%   )r$   r%   r&   rO  FrP  )r   rb   r   rd   rT  rU  r}   rV  stemrs  r   r   r,   rQ   rR   r  r  r;   r   r  r   r   )r   Zselected_idsr  r   r   r   Ztrashed_dir
remote_dirsuffixZold_dirrv  	meta_filer   r   r   _prepare_selected_content_dirs  sH    








z2ConfluenceAPIImport._prepare_selected_content_dirsc           	      C   s  | j D ]}| j r d S |d }|d }|dp<|d }d| d| d| _z| jj| j d| d	 | |}| || W 5 Q R X | 	|}||d
< | 
| j d | |d  W 5 Q R X | 
| j d | || W 5 Q R X | 
| j d |   W 5 Q R X | jd}|tj|ddd W q tk
r } z,| jj| j d| d| ddddd W 5 d }~X Y qX qd S )Nrw   r  original_namer}   
[SPACE ID: KEY:r  u$    Дамп пространства 'rJ   r  uK    Подготовка каталогов для дампа контентаr  u    Дамп контентаuH    Агрегация пользователей из документовr#   rO  FrP  u3    Ошибка дампа пространства ''. zERR-0026r>  r?  T)r  r@  rA  r  )selected_spacesr,   r  r;   r  rQ   r   r   r  r  r   r  r  r\  r   rb   r  r   r   r   rD  )	r   
space_metaspace_idr   
space_namer   r  r  rI  r   r   r   _dump_spaces  s:    

z ConfluenceAPIImport._dump_spacesc                 C   sH   | j jjddr2| j jd | | jjd n| j j	dt
jd d S )N
load_usersTu#   Дамп пользователейr  u4   Дамп пользователей отключёнr]   )r,   r8   r   r;   rQ   r   r   r+   Zget_all_usersr1   r\   WARNINGr   r   r   r   _dump_usersG  s    zConfluenceAPIImport._dump_usersc                 C   sj  | j d}| rd S |jdd | j D ]4}| jjrJt|d }nt|d dddd}||}|jdd |d	}t	|d
}t
|| W 5 Q R X |d}| j d}|jdd |jdd | j|d D ]|}	||	| j d }
t	|
d
}t
|	| W 5 Q R X ||	| j d }
|
 r@qt	|
d
}t
|	| W 5 Q R X qq.d S )Nr4  Tr`   rw   r}   r  r;  r   r]  rN  r  r   )r4   rb   r   rd   r+   Zget_all_groupsr2   r   r   r   r   r?  Zget_group_membersr3   )r   
groups_dirr   r   Z	group_dirZ	data_filer   Z	users_dirZall_users_dirr   Zuser_data_filer   r   r   _dump_groupsN  s4    



z ConfluenceAPIImport._dump_groupsc                 C   s   | j  | _| jS r   )r+   Zget_system_inforB  r   r   r   r   _get_system_infok  s    z$ConfluenceAPIImport._get_system_infoc              	   C   s8   | j d}t|d}tj||ddd W 5 Q R X d S )Nzsystem_info.jsonrf  rO  FrP  )r4   rb   r   r   r?  )r   r   Zsystem_info_filer   r   r   r   _save_system_infoo  s    z%ConfluenceAPIImport._save_system_infoc              	   C   sf   | j jd |ddrdnd}| j jd| d|dd	  | j jd
|dd	 d d S )Nu-   Сведения о системе ConfluenceZisCloudFZCloudZServerz    Confluence r  rs   ZUnknownz    Confluence URL 'r   rJ   )r,   rQ   r   r;   )r   r   Zconfluence_typer   r   r   _log_system_infot  s    z$ConfluenceAPIImport._log_system_infoc                 C   s    |   }| | | | d S r   )r%  r&  r'  )r   r   r   r   r   _collect_system_info  s    
z(ConfluenceAPIImport._collect_system_infoc              
   C   s   | j d d d }|d s"td|dg }|rrg | _|D ]2}|d sJq<|d  }|d |d< | j| q<nt| j | _| j	j
dt| j  | jD ]@}|d	p|d
 }| j	j
d|d  d|d  d| d qd S )Nr   r   r   r  u>   Не выбрано ни одного пространстваrp   r   u=   Для импорта выбрано пространств: r  r}   z    [SPACE ID:rw   r  r  z] 'rJ   )r9   r   r;   r  copyrh   r   r+   Zget_all_spacesr,   rQ   r   r  )r   Z
all_spacesrp   ru   
space_datar  r   r   r   _collect_selected_spaces  s&    
z,ConfluenceAPIImport._collect_selected_spacesc              	   C   s2   |  d |   |   |   W 5 Q R X d S )Nu0   Скачивание данных через API)r   ri  r"  r  r   r   r   r   download_data  s    z!ConfluenceAPIImport.download_datac                 C   s  d}t dd | j r q| }|dkr4qtjj|ddddd	gd
}t|j}t|j}t|j	}t|j
d}	t|	dkrd|	d  dnd}
d| d}|jr|jd d }|d }| d|dd}| jj|
 d| d| d zX| jj||tjd | jj|
 d| d| d d|_|  t  | jd W q tk
r } z:| jj|
 d| d| d| d d!d"|dd# |d7 }W 5 d }~X Y qX q|| W 5 Q R X d S )$Nr   Fr  DONEr}   r   r   r   r  rw   r   r   r}  u   [Страница ID: z] r  rJ   rt   fileSizei   r  .2fz MB)u   Скачивание : 'r  u	   Файл u    сохранен в 'Tr1  u"   Ошибка скачивания r  zERR-0027r  r?  )r  r@  rA  Zext_hrefr  )r   r,   r  r;   r:   r  r   r}   r   r   r   r   r  r  rQ   r   r+   Zdownload_filerN   ZIMPORT_DOWNLOAD_TIMEOUTr  r   r  r  r   rD  r  )r   download_queue
done_queueerrorsZdownload_job_idZdownload_objr  Zfile_urlr   Zext_id_splitZpage_id_msg	file_sizeZfile_size_mbrI  r   r   r   _download_file_worker  sf    




  z)ConfluenceAPIImport._download_file_workerc                 C   s  t  }t  }d}| jdg dd| jgdddgddd	gg}| jd
}d}g }| jD ]j}||d }	t|		dst|	d }	dd|	 dgg}
t
jj||
 d}|rZ||7 }|||
  qZ|s| jjd |S | jjd|  g }t| jD ]J}tj| jd| ||dd}|| |  | jjd|   q|D ],}t
jj|dgdD ]}||j qdqNt  |D ]}|d q| s|D ]}|  q| j r| jjd | s|| 7 }q| jjd|  d S )Nr   zplugin.plugin.source_hashr6   r   r  Fr}   r   all_attachments.zipr_   r  r   r   r   r   r   uC   Отсутствуют вложения для скачиванияu'   Скачивание вложений: r6  )r2  r3  r  r}   r  u    Запустили задачу --r   r   r-  u   Импорт прерванuC   Закончили скачивание файлов, ошибок )r  r  r,   load_fieldsr6   r4   rb   r  r   rV  r:   r  countrh   rQ   r   r  rO   rD   r  r6  r   slistr  rw   r  r  ri   r  rR   r;   )r   r2  r3  Z
has_errorsZmain_filterZprojects_pathZattachment_countfiltersru   Zproject_pathZpath_filterZdownload_countZprocsr  procZfilter_r  r   r   r   download_files  sd    




z"ConfluenceAPIImport.download_filesc              	   c   s>   | j |d}|d}|D ]}t|V  qW 5 Q R X d S )Nr  rK  )r   rb   r   r   r   )r   r   r  r   r   r   r   r   _get_content_comments!  s    z)ConfluenceAPIImport._get_content_commentsc                    s0    |D ] }d fdd	|d q
d S )Nc           	   
      s  zz| d dkr4j jd|   W W d S j d| d  }tjj|dgd	}|rp|jspW W d S |stj |j d
}n|	dg | d dr| d d d dkr҈
| d d j |_nJ| d dr| d d d dkr
| d d j |_ntj|_| d d |_| d drl| d d d dkrl
| 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 }|rV|rVt|d}t|d}|||  || ddd |jjD |_| |_||_| d d dkrzd |_| d d! d d"krd#|_|jd d$ | d% D ]}|| q|W W 4S    j jj j! d&|  d' d d( Y nX W 5 j dd X d S ))Nr0  	processedrm  ZdraftuJ   Не обрабатываем черновики комментариев r   rw   r   r   r   )r   r   r,   **r  r  r8  r5  r  createdDater  r  r  ro   r  r   editorr   r  c                 S   s   g | ]}t |qS r   r   r   xr   r   r   r<  T  s     zQConfluenceAPIImport._process_content_comments.<locals>.create.<locals>.<listcomp>rt   locationinlineT
resolutionZresolvedclosedr   rp   u9    Ошибка обработки комментария: zERR-0028r  r   r  )"r,   r  rQ   rR   r6   r:   
CmfCommentr;   r   r;  r   r3   	cmf_ownerr{   anonymous_usercmf_created_at
cmf_authorcmf_modified_bycmf_modified_atr   _convert_mentions_convert_linksri   ro   rp   r   r  tree_parentrK  rm  r   rD  rF   r  )	r0  rX  r   Zcmf_commentr  rF  	view_soupeditor_soupr  r   r-  r   r   r   r-  )  sv    



z=ConfluenceAPIImport._process_content_comments.<locals>.create)r0  )N)rA  )r   r   r   r0  r   r[  r   _process_content_comments'  s    Cz-ConfluenceAPIImport._process_content_commentsc                 c   sP   | j |d}| D ]4}| s$q|j}|dks|dr>q||dV  qd S )Nr  r7  r#   )r  r   )r   rb   rT  is_filer}   rV  )r   r   attachments_pathr   r  r   r   r   _get_content_attachmentsn  s    z,ConfluenceAPIImport._get_content_attachmentsc           	      C   s   t d| }|r|d nd }|r(|d nd }|D ]~}d|krNt|d d }n4tj|d d }tj|j}|ddgd	 }|d
 | kst|d |kr0||kr0|  S q0|r|rt	d S )Nz((?:att)?\d+)\.(\d+)r}  rO  rs   r  r  r  1r   rp  rw   )
r   	fullmatchr   r   r   r   parse_qsqueryr;   r   )	r  r  Z
file_matchZfile_idZfile_versionattachrs   r  Zquery_paramsr   r   r   _get_attachment_meta{  s$    

z(ConfluenceAPIImport._get_attachment_metac                 C   s   g }|D ]&}t |d }|| j d|  qdd|gddd gdd|gddd gg}tjj|d	d
}|r| jj| j	j
 d| d t  d S )Nrw   r   r   =r   r   zNOT INr,   Tr   include_deletedu    Удалено u    вложений)r   rh   r6   r:   CmfAttachmentr   r,   rQ   rR   rF   r  r  )r   r   r  Zattachment_ext_idsZatt_datar  attachment_filterresultr   r   r   _delete_content_attachments  s    z/ConfluenceAPIImport._delete_content_attachmentsc                    sP       fdd}|D ]$}||d |d  jdd q&d S )Nc                    s  ddddg}d }z |  }|r,|d nd}|r<|d n| }|rdj d| }tjj||d	}|sd
d|gddgddd gg}tjj||d}|stj|jdd}|jdd |jr|r||_nd|_	j
|_|rL|drL|d }	|	d|_|	dr6|	d d dkr6|	d j |_ntj|_|j|_||_t|d}
|j|
 ddd W 5 Q R X d|_|jdd |r|d d }|j|kstt  W n tk
r   jjjj d|  d| d Y n tk
r<   t  jjjj d| d | d!|j d"| d#
d$d% Y n@ t k
rz   jjjj d&| d | d'd$dd( Y nX d S ))Nr   r   url_preview_imgurl_previewrw   r  rp  r   rC  r}   rf  r   r   r:  Tr}   r   r,   r   r   rs   r  r  r8  r5  rbFZsmart_backupZ
mark_dirtyrt   r/  u    Файл 'u)   ' существует локально 'uU   ', но удален в исходной системе (нет метаданных)u    Размер файла '' (u@   ) не соответствует размеру из меты: z	 bytes / z byteszERR-0029r   u<    Не удалось обработать вложение 'r  r   r  )!re  r6   r:   ri  r;   r,   r   r   r   Zembeddedr   projectrR  r   r3   rS  r{   rQ  rP  r  r   upload_filer   st_sizeAssertionErrorr  r   rQ   debugrF   r  rD  r   )r  r   Zattachment_fieldsr1  Zattachment_metaZattachment_idZattachment_nameZattachment_ext_idrj  attachment_versionr   Zfile_size_metar  r   r   r   r   _process_attachment  s    
&
zMConfluenceAPIImport._process_content_attachments.<locals>._process_attachmentr  r   r1  rB  )rl  r_  r,   r  )r   r   r   r  r|  Zattachment_datar   r{  r   _process_content_attachments  s    ^z0ConfluenceAPIImport._process_content_attachmentsc              
   C   s  |d d d }|d d d }|d d d }|s<|s<|S |sH|rHd}z>t |d}t |d}t |d}	| jjr zH| jj| jj d	 t	|d d
 d }
| j
||
d ||d W nX tk
r   | jj d}|dr|d|d d  d7 }| jj|d|d Y nX | | | || | || | |||	 | ||	 | ||	 | |||	 | |||	 | j|||	|d | |||	 | |||	 | |||	 | |||	 | |||	 | |||	 | ||	 | ||	 | ||	 |  |||	 | !|||	 | "|| | #|| | $||	 | %|| | &||	 | j'|||	|d d(dd |j)j*D }W nN tk
r } z.|}| jj| jj d| d| d|d W 5 d }~X Y nX |S )Nro   r  r   r  rF  z<p></p>html.parserr   uD    Конвертация текста из atlassian разметкиZatlas_doc_formatrt  )soupsubobjuS    Не удалось конвертировать разметку страницыrs       (версия r  r  zERR-0031r  r   r  r  c                 S   s   g | ]}t |qS r   rG  rH  r   r   r   r<  P  s     z=ConfluenceAPIImport._convert_content_text.<locals>.<listcomp>uB    Ошибка обработки текста документа. r~   zERR-0039)+r   r+   r2   r,   rQ   r   rF   r  r   r   _convert_atlas_docr   r;   rD  _convert_text_color_convert_code_convert_panelrV  _convert_status_convert_status_handy_convert_plantuml_convert_drawio_convert_msoviewer_convert_childpages_convert_task_filter_convert_excerpt_include_convert_include_convert_content_by_label_convert_details_summary_convert_anchor_convert_toc_convert_livesearch_convert_recently_updatedrW  _convert_table_filter_convert_pivot_table_convert_tabs_convert_inline_comments_convert_excerpt_convert_detailsri   ro   rp   )r   r   r   r  r  r  rF  storage_souprY  rZ  	atlas_rawZexception_textr   rI  r   r   r   _convert_content_text  st    





z)ConfluenceAPIImport._convert_content_textc              
   c   sj   | j |d}| rfdd | D }|jdd dd |D ]&}|d}t|V  W 5 Q R X q>d S )	Nr  c                 S   s   g | ]}|  r|qS r   )r]  )r   r   r   r   r   r<  ^  s      z=ConfluenceAPIImport._get_content_versions.<locals>.<listcomp>c                 S   s   | j S r   r|   )r   r   r   r   r   _  r   z;ConfluenceAPIImport._get_content_versions.<locals>.<lambda>T)r  reverserK  )r   rb   r   rT  sortr   r   r   )r   r   r  Zversion_filesr  r   r   r   r   _get_content_versions[  s    z)ConfluenceAPIImport._get_content_versionsc                 C   s8   d|_ d|_|jdd tjjdd|gdd t  dS )u8    Удаляет все версии документа. NT)Z	only_datar   rf  rg  )Zcur_published_versioncur_workflow_versionr   r:   CmfDocumentHistoryr   r  )r   doc_objr   r   r   _delete_all_content_versionse  s    z0ConfluenceAPIImport._delete_all_content_versionsc                 C   sF  |d }| dr8|d d dkr8| |d | j }ntj}ttj| d	dd d }| di }| d	d
k}z|d d d  W n8 t
k
r   | jjd |d dddii Y nX ||||| d| d||| d|| d||d||j d| | jd}	tjf |	}
| j|||
d|
_|
jdd |
S )Nr  r  r8  r5  r  %Y%m%d%H%M%S%frt  rm  rl  ro   r  r   u\   Некорректный дамп версии документа. Обновите дампr  messageTr  )r   rP  rS  rT  rR  rU  cmf_versionZdoc_versionZofficial_dateofficial_numberreasonrm  cur_workflowZhas_publishedr  r   r,   r  r   )r;   r   r3   r{   rQ  r   dateutilparserr   strftimer   r,   rQ   rR   r   r   r:   r  r  r   r   )r   r  version_datarm  version_numberZversion_authorr  Zversion_contentZis_current_versionZdocument_history_dataZcmf_document_historyr   r   r   _process_content_versionp  sX    z,ConfluenceAPIImport._process_content_versionc                 C   s"   t j|dddd}|jdd dS )uL    Создает фейковую версию с текущей датой. FTr  )r   r  Zcmf_deletedr   r   N)r:   r  r   )r   r  Zfake_historyr   r   r   _create_fake_content_version  s    z0ConfluenceAPIImport._create_fake_content_version)doc_datac                 C   sZ  |  | ddd}|d }|d }|jjdd}d }t| |D ]\}}	|| jkr\ q,|	d }
d|
 d	| d
}zzN| jj	| j
j d|  | ||	|}|jr|}t  |d  d7  < W nN tk
r   | jj| j
j d| d|	 d|dd |d  d7  < Y nX W 5 | jdd X qD||_|jrF|jdd | | t  |S )Nr   	succeededfailedrw   rp  CLOSEDstatus_typer  u   версии u    документа 'rJ   rs   rB      Обработка r  r}  u!    Ошибка обработки r~   zERR-0033Trt  r  r   )r  workflowget_default_statusr  r  rY   r,   r  rQ   r   rF   r  r  r  r  r   rD  r  r   r   r  )r   r  r  rk  page_idZ
page_titleZdefault_statusr  version_countr  r  Zlog_page_verZdocument_historyr   r   r   _process_content_versions  sJ    


z-ConfluenceAPIImport._process_content_versionsc           	   	   C   s   | j |}| sT|d}| r4d| d}nd| d}t| j d| |d}| s|t| j d| d|d	}t|}W 5 Q R X g |d
< |d}| r|d	}t||d
< W 5 Q R X |S )Nr&   u   Контент ID:un    был полностью удален, либо перемещен в другое пространство.u-   Не найден каталог дампа 'rJ   r  r]  u*    Не найден файл данных 'rK  r  r  )	r   rb   r   r   r  r  r   r   r   )	r   r   r  r  	error_msgr^  r   r   r  r   r   r   _get_content_data  s&    



z%ConfluenceAPIImport._get_content_datac              	   c   sV   | j  D ]F}| r
|j| js
z| |jV  W q
 tk
rN   Y q
Y q
X q
d S r   )	r   rT  rU  r}   rV  rW  r  r  r   )r   r  r   r   r   _get_contents	  s    z!ConfluenceAPIImport._get_contentsc                 C   s  t dd t  | j s| j r4q| j( | j|kr^| j	  W 5 Q R  qW 5 Q R X z"| j
jdd}|d }|d }W nZ tk
r   Y qY nB tk
r } z$| jjd| dd	 W Y qW 5 d }~X Y nX | j* |  jd7  _| j|kr| j	  W 5 Q R X |d }|d
 }d| d| j_z| jdkrPd}nd| j }| jj| jj d| d|  | j d| }	tjj|	dddddgd}
|
stdd| d|
j d| j_|
jr| ||
}| j
|| ntdW q tk
rX } z<| jj| jj d|  d|d d}| j
|| W 5 d }~X Y q tk
r } z8| jj| jj d | d| d!d"d#d$ | j
| W 5 d }~X Y qX q| j
  W 5 Q R X W 5 Q R X d S )%NFr  r}  r  rw   payloadH   Ошибка при получении элемента очереди: ERR-0018r  rp  r  r  r   u   Все версии.u   Последние: u5    Обработка версий документа 'r  r   r   r  r  r   r  rC  u4   Документ не найден в системеz CODE:u:   Документ изменен пользователемr  r   r  r  uB    Ошибка обработки версий документа 'ERR-0084r'   Tr  r@  r  )r   cmfutildisable_aclr  r  r,   r  counter_lockitems_processed_counterrS  
item_queuer;   r   r   rD  rF   r  rY   rQ   r   r6   r:   r'   r0   r   r  completer   rR   failclose_local_conn)r   	max_itemsitemitem_idrv  rI  r   content_titleZnum_ver_msgr   r  rk  r   r   r   _process_versions	  s    




 z%ConfluenceAPIImport._process_versions)labelsc                 C   s   g }|D ]t}|d }d| j  d| d}tjjddd| dgd}|rT|| q| jj| jj d| d| d	d
|d q|S )u;  
        Возвращает список тегов документа

        Args:
            content_obj (CmfDocument): объект документа
            labels (list): список тегов страницы Confluence

        Returns:
            list: список тегов (CmfTag)
        rw   r   r   r   r   r   u    Не найден тег 'rr  r  zERR-0017r  )	r6   r:   CmfTagr;   rh   r,   rD  rF   r  )r   r   r  tagslabelZlabel_idZ
tag_ext_idr   r   r   r   _get_content_tagsb	  s    z%ConfluenceAPIImport._get_content_tagsc                 C   s   | j  d|d  }tjj|dgd}|s@tj|d|| jdd}|d d	rj| j| jj|d d	 }n| jjjj	}|j
 d
| d| d|_|jdd dS )u#  
        Создает комментарий со ссылкой на оригинальную страницу в Confluence

        Args:
            content_obj (CmfDocument): объект документа
            content (dict): данные страницы Confluence
        z
::comment:rw   r   rC  rO  T)r   Z	log_levelr   r,   r   r  Zwebuiu4    импортирован из Confluence: <a href="z" target="_blank">z</a>"r   N)r6   r:   rO  r;   r,   r+   r  r   r5   Zext_urlZverbose_namer   r   )r   r   rt  Zcomment_ext_idr0  r   r   r   r   _add_external_link_comment|	  s,    
z.ConfluenceAPIImport._add_external_link_commentc                 C   s   | j |d}tt| }|o(| jjdk}|r:| jjj}n$|j|dgd}|s^|| j	d|d}|j
sr|ddg |jst||S )	Nr'   r>  r   rC  T)r,   r   r   rD  r  )TYPE_MODEL_MAPr;   varsr:   root_parent
class_nameru  descr_documentr   r,   is_newr;  r   r   )r   r  r   rr  content_model_nameZcontent_modelZwiki_project_homepager   r   r   r   _get_or_create_content_obj	  s(    z.ConfluenceAPIImport._get_or_create_content_objc                 C   s  |d d }| j j| jj d|  |d dkr<tj}n| || j }|sl| j j	| jj d|  |d 
d}|r| j j| jj d|  |d dkrtj}q| || j }n|}|d d	 d
 }| j j| jj d|  |d dkrtj}	n| || j }	|dkr,| jjj}
n| j}
|
jt|d d}|d | j|
||||	|d d	 d |d d t|jdk||d}|S )Nr  r  u$    Определяем автора: r8  r5  u    Не найден автор: r  u*    Определяем владельца: r  r  u?    Определяем последнего редактора: r)   rm  r  rp  r  rE  r  )r}   r   r  rm  rP  rS  rT  rU  rR  cmf_archivedr   r  )r,   rQ   r   rF   r  r{   rQ  r   r3   rR   r;   ru  Z	scheme_wfZdefault_document_workflowr<   r  r
   Zget_status_typerW   r  )r   rt  r  r   authorrS  ownerrP  modifiedrT  r  rm  r   r   r   r   _prepare_content_data	  sR    

z)ConfluenceAPIImport._prepare_content_datac           	      C   s  |  |}|d }|d }| j d| }| |||}| |||}|D ]}t||||  qJ|jrr|jdd | || |dkr| |||d  | 	|| t
|jjdd d	 |_d|_| ||d
 d d |_| |||_|jr|jdd |jr| || d S )Nrw   r8  r   Tr   r)   r  r  r  rq   r  r   )r  r6   r  r  setattrr   r   r   r}  r\  r   rU  r   r  r  Zfull_screenr  r  r  r   r  r  )	r   r   rr  rt  r  r  r   r   r  r   r   r   _process_content	  s2    

z$ConfluenceAPIImport._process_contentc           	      C   s(  t dd t  | j s| j r4q| j( | j|kr^| j	  W 5 Q R  qW 5 Q R X z"| j
jdd}|d }|d }W nZ tk
r   Y qY nB tk
r } z$| jjd| dd	 W Y qW 5 d }~X Y nX | j* |  jd7  _| j|kr| j	  W 5 Q R X |d }|d
 }| j|dd}d| d| j_| j|| j_| j| jj d| d ztz(| ||d  t  | j
| W nF tk
r } z4| jj| jj d| dtjdd | j
| W 5 d }~X Y n tk
rD   | jj| jj dd|dd | j  | j
| Y n t k
r   | jj| jj d| j! dd|dd | j  | j
| Y n\ tk
r } z<| jj| jj d| d|dd | j  | j
| W 5 d }~X Y nX W 5 | jdd X q| j
"  W 5 Q R X W 5 Q R X d S )NFr  r}  r  rw   r  r  r  r  rp  r8  r'   r  r  u    Обработка 'rJ   r  rB  rr  r  u|    был изменен пользователем. Изменения из импорта не будут примененыTr]   r5  uq    Ошибка создания. Попробуйте очистить дамп и повторить импортr  u|    Ошибка создания. Попробуйте отменить импорты связанные с проектом uY   , чтобы он удалился из системы и повторите импортu     Ошибка создания: )#r   r  r  r  r  r,   r  r  r  rS  r  r;   r   r   rD  r  rF   r  r   rb   r  r1   r  r  r  r  r   r\   r!  r  r  
log_detailAttributeErrorru  r  )	r   r  r  r  rv  rI  r   r  r  r   r   r   _process_contents
  s    






"z%ConfluenceAPIImport._process_contentsc                 C   s  d}ddg}zn|j dd|idD ]T}td|jd }|d	}tjj||d
}	|	sx| jj	d| d| d|d q"tjjdd|gdd| dggdgd}
d}td|jd }|r|d	}d}td|jd }|r|d	}|	j
j|	jj||d}|
r|
j|d< nd|d< t|ddjf |d}|j d|idD ]4}|jdd|jd   idrB||j  q"qBq"W n$   | jj	d!| d|d Y nX d S )"Nu  
        <div data-drawio-title="{name}" data-drawio-type="diagram" data-attach-id="{attach_id}" class="drawio-content" contenteditable="false">
            <div class="header">Диаграмма: "{name}"</div>
            <div class="content">
                <img cmf_converted=True src="{img_src}" alt="" data-mce-src="{img_src}" width="{width}" height="{height}">
            </div>
        </div>
        drawiozdrawio-sketchimgdata-macro-namer   zdiagramName=([^|]+)data-macro-parametersr}  r}   r   u#   Диаграмма с именем u@    не найдена во вложениях документа zERR-0019r  r   r   r}   r   %.pngr   r:  100%zdiagramWidth=([^|]+)zdiagramHeight=([^|]+)r}   	attach_idwidthheightimg_srcr  r   r~  rw   zdrawio-macro-content-data-macro-iduU   Неудалось конвертировать диаграмму из текста )r   r   r   r   r   r:   ri  r;   r,   rD  r}   r   rw   r   r   r   formatfindreplace_with
currentTag)r   r   rY  rZ  TAG_TMPLZ
macro_namer   matchr  rd  
attach_imgr  r  datar   Z
drawio_tagr   r   r   r  s
  sX    
 

 z#ConfluenceAPIImport._convert_drawioc           	   	   C   s   d}|j ddidD ]}ztj|j|jj}W n*   d}| jjd|j d|d Y nX t	|j
d	|j|d
d}|j ddidD ]}||  qqqd S )Nu  
        <div class="macros-panel plantuml" contenteditable="false" data-macros-parameters="{params}"
            style="display: inline-flex; flex-direction: column; position: relative; width: 100%;"
            data-rendered="true" data-macros="plantuml">
            <div data-layout="default" class="extension-container" contenteditable="false">
                <span role="img" aria-label="Макрос PlantUML">
                    <svg xmlns="http://www.w3.org/2000/svg" id="Layer_1" data-name="Layer 1" viewBox="0 0 24 24" width="16" height="16">
                        <path d="M22,15h2v7h-7v-2h5v-5Zm2-10v6.731l-2-1.976v-.755H7v11h4.738c.033,.036,.057,.078,.092,.113l1.887,1.887H0V5c0-1.654,1.346-3,3-3H21c1.654,0,3,1.346,3,3ZM2,5v2h3v-3H3c-.551,0-1,.448-1,1Zm3,4H2v11h3V9Zm17-2v-2c0-.552-.448-1-1-1H7v3h15Zm-9.715,9.292c-.38,.391-.38,1.025,0,1.416l2.715,2.792v-2.5h2c1.654,0,3-1.346,3-3v-2.023h2.455l-2.756-2.711c-.386-.386-1.012-.386-1.398,0l-2.756,2.711h2.455v2.023c0,.552-.448,1-1,1h-2v-2.5l-2.715,2.792Z"></path>
                    </svg>
                </span>
                <span class="extension-title">
                    <span class="excerpt-title">PlantUML</span>
                </span>
                <span class="macros-actions">
                    <span class="macros-refresh">
                        <svg viewBox="0 0 24 24" style="width: 14px; height: 14px; color: rgb(32, 32, 32);"><path fill="#202020" d="M12,2a10.032,10.032,0,0,1,7.122,3H16a1,1,0,0,0-1,1h0a1,1,0,0,0,1,1h4.143A1.858,1.858,0,0,0,22,5.143V1a1,1,0,0,0-1-1h0a1,1,0,0,0-1,1V3.078A11.981,11.981,0,0,0,.05,10.9a1.007,1.007,0,0,0,1,1.1h0a.982.982,0,0,0,.989-.878A10.014,10.014,0,0,1,12,2Z"></path><path fill="#202020" d="M22.951,12a.982.982,0,0,0-.989.878A9.986,9.986,0,0,1,4.878,19H8a1,1,0,0,0,1-1H9a1,1,0,0,0-1-1H3.857A1.856,1.856,0,0,0,2,18.857V23a1,1,0,0,0,1,1H3a1,1,0,0,0,1-1V20.922A11.981,11.981,0,0,0,23.95,13.1a1.007,1.007,0,0,0-1-1.1Z"></path></svg>
                    </span>
                    <span class="macros-edit" style="margin-right: 7px;">
                        <svg _ngcontent-aiw-c17="" viewbox="0 0 24 24" class="ng-star-inserted" style="width: 14px; height: 14px; color: #444444;">
                            <path _ngcontent-aiw-c17="" fill="#444" d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                        </svg>
                    </span>
                    <span class="macros-delete">
                        <svg viewbox="0 0 18 18" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                            <path fill="#222" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            <path fill="#222" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            <path fill="#222" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                        </svg>
                    </span>
                </span>
            </div>
            <div data-fabric-macro="null" data-macro-body="" class="ak-renderer-wrapper" contenteditable="true">
                <textarea class="puml-code">{uml}</textarea>
            </div>
            <div class="macros-preview" contenteditable="true">
                {svg}
            </div>
        </div>
        r  Zplantumlr  erroru.   Не удалось получить svg из zERR-0002r  z{})paramsZumlsvgr~  )r   r:   r'   Zconvert_uml2svgr   rw   r   r,   rD  r   r  r  )	r   r  rY  rZ  ZTMPr   r	  new_tagold_tagr   r   r   r  
  s    ( 
z%ConfluenceAPIImport._convert_plantumlc                 C   s  d}| dg |j}t|j}| }|jdd d g }t|D ]R\}	}
|	| d|	d  |
d d	krr|
d nd
|	d  |
d |d}|| qDd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>
        rm  c                 S   s   | d S )Nr   r   )r  r   r   r   r   	  r   zAConfluenceAPIImport._create_msoviewer_macro_tag.<locals>.<lambda>r  r;  r}  Z
sheet_namer  u   Листr   )numrw   rp  r   ZimgUrlzOffice WordZwordz
.doc,.docxz.docz.docx)pluginTitleZ
pluginTypeZacceptTypesZacceptTypesListZ	pageScalezOffice ExcelZexcelz
.xlsx,.xlsz.xlsxz.xlsrO  )viewdocviewxlsr      )verparentIdr  ZcurrentPageRefZslicePageNumZ
pagesCountFrg  r  )r  r  rm  Zplugin_titler~  )r;  rw   r   rm  Zget_fullviewr  r  rh   r  r   r;   r   r  r   r   r  )r   r  rd  Zplugin_typeTMPLr  rm  Zfullview_pagesr  r  Zfullview_pager)   Zparam_typesr  r
  r   r   r   _create_msoviewer_macro_tag
  sX    )
 	z/ConfluenceAPIImport._create_msoviewer_macro_tagc                 C   s4  ddg}|D ] }|j d|idD ]}zz|d}tdd |dD }|d	 }	tjj||	d
}
|
sxtd|	 d|jd|id}|r|| 	||
| W q" tk
r* } zhd| d|j
 d|jd  d}t|tjr|d|j d7 }|d| 7 }| jj|d|p|d W 5 d}~X Y q"X q"qdS )u7    Конвертирует макросы Word и Excel r  r  r  r  r  c                 s   s   | ]}| d dV  qdS rf  r}  Nr   r   paramr   r   r   r   B  s     z9ConfluenceAPIImport._convert_msoviewer.<locals>.<genexpr>|r}   r   r}   &   Не найдено вложение 'rJ   0   Ошибка обработки макроса '   ' в документе 'rr  rw   r  r  r~   ERR-0012r  N)r   r;   r  r   r:   ri  r   r   r  r  r}   r  r  r  r  r,   rD  )r   r  rY  rZ  r  Zmacro_types
macro_typer   original_paramsr  rd  r  rI  
error_textr   r   r   r  :  s0    

z&ConfluenceAPIImport._convert_msoviewerc                 C   s>  dt   dt   dt   dt   dt   dt   dt   dt   d	t   d
}|jddidD ]}d}|d}|dd}dt|jddddd}	tdd |dD }
|
drd|	d< nd|	d< |
dr|
d |	d< |
d r|
d  |	d< |
d!r|
d! |	d"< |
d#r8dd$d$d%}||
d# |	d&< |
d'rbd(d)d*d+}||
d' |	d,< |
d-rvd|	d.< d}|
d/r|
d/ d0krt|jj|	d1< t|jj}d2}n nd2}t	|j
t|j|tj|	dd3d4d5d6||d7d8dd9}|r|jd|idnd:}|s(|jddid}|r^||j q^d:S );ua   
        Конвертирует макрос "Отображение дочерних"
        z
            <div
                class="macros-panel"
                contenteditable="false"
                data-children-docs="{doc_id}"
                data-id="a  "
                data-macro-parameters="{params}"
                data-macros="children-docs"
                original-data-macro-parameters="{original_params}"
                cmf_converted="{cmf_converted}"
            >
                <div class="extension-container" data-id="uW   " data-layout="default">
                    <span aria-label="Макрос " data-id="aq  " role="img">
                        <svg xmlns="http://www.w3.org/2000/svg" id="Outline" viewbox="0 0 24 24" width="20" height="20">
                            <path d="M22.485,10.975,12,17.267,1.515,10.975A1,1,0,1,0,.486,12.69l11,6.6a1,1,0,0,0,1.03,0l11-6.6a1,1,0,1,0-1.029-1.715Z"></path>
                            <path d="M22.485,15.543,12,21.834,1.515,15.543A1,1,0,1,0,.486,17.258l11,6.6a1,1,0,0,0,1.03,0l11-6.6a1,1,0,1,0-1.029-1.715Z"></path>
                            <path d="M12,14.773a2.976,2.976,0,0,1-1.531-.425L.485,8.357a1,1,0,0,1,0-1.714L10.469.652a2.973,2.973,0,0,1,3.062,0l9.984,5.991a1,1,0,0,1,0,1.714l-9.984,5.991A2.976,2.976,0,0,1,12,14.773ZM2.944,7.5,11.5,12.633a.974.974,0,0,0,1,0L21.056,7.5,12.5,2.367a.974.974,0,0,0-1,0h0Z"></path>
                        </svg>
                    </span>
                    <span class="extension-title" data-id="u   ">Макрос "Отображение дочерних"</span>
                    <span class="extension-object-name" data-id="zQ"> | {doc_name}</span>
                    <span class="macros-actions" data-id="z>">
                        <span class="macros-edit" data-id="a  " style="margin-right: 7px;">
                            <svg _ngcontent-aiw-c17="" viewbox="0 0 24 24" class="ng-star-inserted" style="width: 14px; height: 14px; color: #444444;">
                                <path _ngcontent-aiw-c17="" fill="#444" d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                            </svg>
                        </span>
                        <span class="macros-delete" data-id="aD  ">
                            <svg viewbox="0 0 18 18" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                                <path fill="#222" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                <path fill="#222" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                <path fill="#222" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            </svg>
                        </span>
                    </span>
                </div>
                <div class="ak-renderer-wrapper" data-fabric-macro="null" data-id="z7" data-macro-body=""></div>
            </div>
        r  rp   r  falser  r  r  F50none)isShowChildrenr  childrenAmountr]   includeViewTypeisOrderByDeskc                 s   s.   | ]&}t |d ddkr|d dV  qdS rf  r}  rO  Nr  r   r  r   r   r   r     s   z:ConfluenceAPIImport._convert_childpages.<locals>.<genexpr>r  r  Tr&  r`  r]   firstr'  depthstyle
headerTypeexcerptTypert  r%  Zsimplezrich contentr(  r  r}   rR  rU  rp  Zcreationr  sortTyper  r)  r)   r   
documentIdtruerf   r   rR  Z
separators"&quot;)doc_iddoc_namer  r!  cmf_convertedr   r~  N)get_data_idr   r;   r   rw   r  r   r   r}   r   r  r   r   r   r   r  r  )r   r  rY  rZ  r  r   r<  macro_idZdata_macro_parametersr  macro_parametersview_type_mapsort_type_mapr;  r
  r  r   r   r   r  Z  s    (
	



 
 z'ConfluenceAPIImport._convert_childpagesc           
      C   s   d}|j ddidD ]}|d}|dd}tdd	 |d
D }|dd}|rf|jd|idnd}|s~|jddid}|rt|j|ddd	 |jD dd}	|	|	j
 qdS )uH   
        Конвертирует макрос "Выборка"
        u~  
        <div
            class="macros-panel macros-excerpt-block"
            contenteditable="false"
            data-id
            data-macros="exceprt"
            data-param-name="{name}"
        >
            <div class="extension-container" contenteditable="false" data-id data-layout="default">
                <span aria-label="Макрос Include. 'Создать выборку'" data-id role="img">
                    <svg xmlns="http://www.w3.org/2000/svg" id="Outline" viewbox="0 0 24 24" width="14" height="14">
                        <path d="M19.949,5.536,16.465,2.05A6.958,6.958,0,0,0,11.515,0H7A5.006,5.006,0,0,0,2,5V19a5.006,5.006,0,0,0,5,5H17a5.006,5.006,0,0,0,5-5V10.485A6.951,6.951,0,0,0,19.949,5.536ZM18.535,6.95A4.983,4.983,0,0,1,19.316,8H15a1,1,0,0,1-1-1V2.684a5.01,5.01,0,0,1,1.051.78ZM20,19a3,3,0,0,1-3,3H7a3,3,0,0,1-3-3V5A3,3,0,0,1,7,2h4.515c.164,0,.323.032.485.047V7a3,3,0,0,0,3,3h4.953c.015.162.047.32.047.485Z"></path>
                    </svg>
                </span>
                <span class="extension-title" data-id>Макрос Include. 'Создать выборку' <span class="excerpt-title" data-id>| name = {name}</span></span>
                <span class="macros-actions" data-id>
                    <span class="macros-edit" data-id style="margin-right: 7px;">
                        <svg _ngcontent-aiw-c17="" viewbox="0 0 24 24" class="ng-star-inserted" style="width: 14px; height: 14px; color: #444444;">
                            <path _ngcontent-aiw-c17="" fill="#444" d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                        </svg>
                    </span>
                    <span class="macros-delete" data-id>
                        <svg viewbox="0 0 18 18" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                            <path fill="#222" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            <path fill="#222" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            <path fill="#222" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                        </svg>
                    </span>
                </span>
            </div>
            <div class="ak-renderer-wrapper" contenteditable="true" data-fabric-macro="null" data-id data-macro-body="">{content}</div>
        </div>
        r  excerptr  r  r  r  c                 s   s.   | ]&}t |d ddkr|d dV  qdS r*  r+  r  r   r   r   r      s   z7ConfluenceAPIImport._convert_excerpt.<locals>.<genexpr>r  r}   &   Выборка без названияNc                 s   s   | ]}t |V  qd S r   rG  r   rt  r   r   r   r     s     r}   rt  r~  )r   r;   r  r   r   r   r  ri   r  r  r  )
r   rY  rZ  r  r   r>  r?  excerpt_namer  r
  r   r   r   r    s(    "
z$ConfluenceAPIImport._convert_excerptc              	   C   s&  d}|j ddidD ]
}|d}|d}d|krH|dd\}}	n0t|tjrd|j d	 }n|jj d	 }|}	|d
}
|
rt	dd |
dD }
|
dd}nd}t
|j|t|	ddt|dddd}|r|jd|idnd}|s|jddid}|r||j qdS )u~   
        Конвертирует макрос "Включить выборку"("Вставить фрагмент")
        u  
        <div
            class="macros-panel macros-include-block"
            contenteditable="false"
            data-id
            data-macros="include-excerpt"
            data-param-excerpt="{excerpt_name}"
            data-param-pageid=""
            data-param-pagename="{page_name}"
            data-param-projectkey="{space_key}"
        >
            <div class="extension-container" contenteditable="false" data-id data-layout="default">
                <span aria-label="Макрос Include. " data-id role="img">
                    <svg xmlns="http://www.w3.org/2000/svg" id="Outline" viewbox="0 0 24 24" width="14" height="14">
                        <path d="M19.949,5.536,16.465,2.05A6.958,6.958,0,0,0,11.515,0H7A5.006,5.006,0,0,0,2,5V19a5.006,5.006,0,0,0,5,5H17a5.006,5.006,0,0,0,5-5V10.485A6.951,6.951,0,0,0,19.949,5.536ZM18.535,6.95A4.983,4.983,0,0,1,19.316,8H15a1,1,0,0,1-1-1V2.684a5.01,5.01,0,0,1,1.051.78ZM20,19a3,3,0,0,1-3,3H7a3,3,0,0,1-3-3V5A3,3,0,0,1,7,2h4.515c.164,0,.323.032.485.047V7a3,3,0,0,0,3,3h4.953c.015.162.047.32.047.485Z"></path>
                    </svg>
                </span>
                <span class="extension-title" data-id>Макрос Include. "Вставить выборку" <span class="excerpt-title" data-id>| Имя = {excerpt_name}</span></span>
                <span class="macros-actions" data-id>
                    <span class="macros-edit" data-id style="margin-right: 7px;">
                        <svg _ngcontent-aiw-c17="" viewbox="0 0 24 24" class="ng-star-inserted" style="width: 14px; height: 14px; color: #444444;">
                            <path _ngcontent-aiw-c17="" fill="#444" d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                        </svg>
                    </span>
                    <span class="macros-delete" data-id>
                        <svg viewbox="0 0 18 18" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                            <path fill="#222" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            <path fill="#222" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            <path fill="#222" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                        </svg>
                    </span>
                </span>
            </div>
            <div class="ak-renderer-wrapper" data-id></div>
        </div>
        r  excerpt-includer  r  data-macro-default-parameterr   r}  r  r  c                 s   s   | ]}| d dV  qdS r  r  r  r   r   r   r   L  s     z?ConfluenceAPIImport._convert_excerpt_include.<locals>.<genexpr>r  r}   rC  	&#9;rF  	page_namer   r~  N)r   r;   r   r  r:   r>  r  r   r   r  r   r  htmlescaper   r   r  r  )r   r   rY  rZ  r  r   r>  macro_default_parameterr   rL  r?  rF  r
  r  r   r   r   r    s8    %


	z,ConfluenceAPIImport._convert_excerpt_includec                 C   s   d}|j ddidD ]}|d}|d}d|krF|dd\}}	n0t|tjrb|j d	 }n|jj d	 }|}	t	|j
t|	d
dt|d
ddd}
|r|jd|idnd}|s|jddid}|r||
j qdS )u[   
        Конвертирует макрос "Включить страницу"
        uM  
        <div
            class="macros-panel macros-include-page"
            contenteditable="false"
            data-macros="include-page"
            data-param-pageid=""
            data-param-page-label="{page_label}"
            data-param-projectkey="{space_key}"
            data-rendered="true"
        >
            <div data-layout="default" class="extension-container" contenteditable="false">
                <span role="img" aria-label="Макрос Include. ">
                    <svg xmlns="http://www.w3.org/2000/svg" id="Outline" viewbox="0 0 24 24" width="14" height="14">
                        <path d="M19.949,5.536,16.465,2.05A6.958,6.958,0,0,0,11.515,0H7A5.006,5.006,0,0,0,2,5V19a5.006,5.006,0,0,0,5,5H17a5.006,5.006,0,0,0,5-5V10.485A6.951,6.951,0,0,0,19.949,5.536ZM18.535,6.95A4.983,4.983,0,0,1,19.316,8H15a1,1,0,0,1-1-1V2.684a5.01,5.01,0,0,1,1.051.78ZM20,19a3,3,0,0,1-3,3H7a3,3,0,0,1-3-3V5A3,3,0,0,1,7,2h4.515c.164,0,.323.032.485.047V7a3,3,0,0,0,3,3h4.953c.015.162.047.32.047.485Z"></path>
                    </svg>
                </span>
                <span class="extension-title">Макрос Include. "Вставить страницу" <span class="excerpt-title">| Имя = {page_label}</span></span>
                <span class="macros-actions">
                    <span class="macros-edit" style="margin-right: 7px;">
                        <svg _ngcontent-aiw-c17="" viewbox="0 0 24 24" class="ng-star-inserted" style="width: 14px; height: 14px; color: #444444;">
                            <path _ngcontent-aiw-c17="" fill="#444" d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                        </svg>
                    </span>
                    <span class="macros-delete">
                        <svg viewbox="0 0 18 18" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                            <path fill="#222" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            <path fill="#222" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            <path fill="#222" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                        </svg>
                    </span>
                </span>
            </div>
            <div class="ak-renderer-wrapper"></div>
        </div>
        r  includer  r  rH  r   r}  r  rI  rJ  
page_labelr   r~  N)r   r;   r   r  r:   r>  r  r   r   r   r  rM  rN  r   r   r  r  )r   r   rY  rZ  r  r   r>  rO  r   rR  r
  r  r   r   r   r  `  s,    $

z$ConfluenceAPIImport._convert_includec                 C   s  dt   dt   dt   dt   dt   dt   dt   dt   d	t   d
t   d}|jddidD ]$}|dd}tdd |dD }|dd|dd|dd|dd|ddd|dd  d|d!d" |d#|d$|d%d&|d'd&|d(d)}tj|dd*d+d,d-}t|j	||d.d/}|d0}	|	r`|j
d0|	idnd1}
|
s||j
d2ddid}
|
rf|
|j qfd1S )3uN   
        Конвертирует макрос "Оглавление"
        zr
        <div 
            class="macros-panel wiki-toc"
            contenteditable="false"
            data-id="z"
            data-macros="wikitoc"
            data-macros-parameters="{params}"
            data-macro-parameters-original="{original_params}"
        >
            <div class="extension-container" contenteditable="false" data-id="R   " data-layout="default">
                <span aria-label="Макрос" data-id="a  ">
                    <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24" width="14px" height="14px">
                        <path d="M5 5c.6 0 1 .4 1 1s-.4 1-1 1a1 1 0 110-2zm3 0h11c.6 0 1 .4 1 1s-.4 1-1 1H8a1 1 0 110-2zm-3 8c.6 0 1 .4 1 1s-.4 1-1 1a1 1 0 010-2zm3 0h11c.6 0 1 .4 1 1s-.4 1-1 1H8a1 1 0 010-2zm0-4c.6 0 1 .4 1 1s-.4 1-1 1a1 1 0 110-2zm3 0h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 010-2zm-3 8c.6 0 1 .4 1 1s-.4 1-1 1a1 1 0 010-2zm3 0h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 010-2z" fill="var(--theme-hack-color, black)"></path>
                    </svg>
                </span>
                <span class="extension-title" data-id="<">
                    <span class="excerpt-title" data-id="u{   ">Макрос "Оглавление"</span>
                </span>
                <span class="macros-actions" data-id="<">
                    <span class="macros-action" data-id="a	  " data-macros-action="macros-edit">
                        <svg viewbox="0 0 24 24" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                            <path fill="var(--color-gray-222, #222)" d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                        </svg>
                    </span>
                    <span class="macros-action macros-delete" data-id="ao  " data-macros-action="macros-delete">
                        <svg viewbox="0 0 18 18" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                            <path fill="var(--color-gray-222, #222)" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            <path fill="var(--color-gray-222, #222)" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            <path fill="var(--color-gray-222, #222)" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                        </svg>
                    </span>
                </span>
            </div>
            <div class="ak-renderer-wrapper" data-id="z">
                <p data-id="z1"></p>
            </div>
        </div>
        r  Ztocr  r  r  c                 s   s.   | ]&}t |d ddkr|d dV  qdS r*  r+  r  r   r   r   r     s   z3ConfluenceAPIImport._convert_toc.<locals>.<genexpr>r  r8  r   outlineF	separatorZbracketsrQ  Z40pxr.  ZmixedhminLevelr`  maxLevel6excluderP  	printableTabsoluteUrlclass)r8  rV  rW  rQ  r.  rY  rZ  r\  rP  r]  r^  r_  r6  r7  r8  r9  r  r!  r~  r  Ndiv)r=  r   r;   r  r   r   r   r   r   r  r   r  r  )r   rY  rZ  r  r   r?  r  
parametersr
  r>  r  r   r   r   r    sx    '






 	
z ConfluenceAPIImport._convert_tocc                 C   s  dt   dt   dt   dt   dt   dt   dt   dt   d	t   d
}|jddidD ]4}d}|dd}tdd |dD }|dd}|d}	|	rtjjddd| j dgddd|	 dggdgd }
|
r|
j	}	nd!}|	d"d# |d$dd%D ||d&d'd(}t
j|d)d*d+d,d-}t|j||||d.d/}|d0}|rh|jd0|idnd1}|s|jd2ddid}|r^||j q^d1S )3uj   
        Конвертирует макрос "Livesearch" (Динамический поиск)
        #
        <div
            data-id="a>  "
            class="macros-panel wiki-live-search"
            contenteditable="false"
            data-macros-parameters="{params}"
            data-macro-parameters-original="{original_params}"
            data-macros="wikilivesearch"
            cmf_converted="{cmf_converted}"
        >
            <div data-id="l" data-layout="default" class="extension-container" contenteditable="false">
                <span data-id="u  " aria-label="Макрос">
                    <svg viewbox="0 0 24 24" width="12px" height="12px" class="ng-star-inserted">
                        <path fill="currentColor" d="M23.707,22.293l-5.969-5.969a10.016,10.016,0,1,0-1.414,1.414l5.969,5.969a1,1,0,0,0,1.414-1.414ZM10,18a8,8,0,1,1,8-8A8.009,8.009,0,0,1,10,18Z" ></path>
                    </svg>
                </span>
                <span data-id="zT" class="extension-title">
                    <span class="excerpt-title" data-id="us   ">Макрос "Динамический поиск"</span>
                </span>
                <span data-id="=" class="macros-actions">
                    <span data-id="'  " class="macros-action" data-macros-action="macros-edit">
                        <svg _ngcontent-aiw-c17="" viewbox="0 0 24 24" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                            <path _ngcontent-aiw-c17="" fill="var(--color-gray-222, #222)" d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                        </svg>
                    </span>
                    <span data-id="ax  " class="macros-action macros-delete" data-macros-action="macros-delete">
                        <svg viewbox="0 0 18 18" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;" >
                            <path fill="var(--color-gray-222, #222)" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            <path fill="var(--color-gray-222, #222)" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            <path fill="var(--color-gray-222, #222)" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                        </svg>
                    </span>
                </span>
            </div>
            <div data-id="u  " class="ak-renderer-wrapper" contenteditable="false">
                <div class="search-preview-wrapper temporary-element search-preview-wrapper_large">
                    <div class="search-preview-icon">
                        <svg viewbox="0 0 24 24" width="14px" height="14px" class="ng-star-inserted">
                            <path fill="currentColor" d="M23.707,22.293l-5.969-5.969a10.016,10.016,0,1,0-1.414,1.414l5.969,5.969a1,1,0,0,0,1.414-1.414ZM10,18a8,8,0,1,1,8-8A8.009,8.009,0,0,1,10,18Z"></path>
                        </svg>
                    </div>
                    <input class="search-preview" placeholder="{placeholder}" type="text" /> <button class="search-button">Поиск</button>
                </div>
            </div>
        </div>
        r  Z
livesearchr  r5  r  r  c                 s   s.   | ]&}t |d ddkr|d dV  qdS r*  r+  r  r   r   r   r   1  s   z:ConfluenceAPIImport._convert_livesearch.<locals>.<genexpr>r  placeholderu
   ПоискZspaceKeyr   r   %::::%r  ILIKE%"key":""%r9  r:  r#  c                 S   s   g | ]}|r|  qS r   strip)r   Zlabler   r   r   r<  H  s   z;ConfluenceAPIImport._convert_livesearch.<locals>.<listcomp>r  rf   r  Zmedium)ZcurrentSpaceKeyr  rg  r  Fr6  r7  r8  r9  )r  r!  rg  r<  r~  r  Nra  )r=  r   r;   r  r   r:   r>  sgetr6   rw   r   r   r   r   r  r   r  r  )r   rY  rZ  r  r   r<  r?  r  rg  r   ru  rb  r
  r>  r  r   r   r   r    s    /


 
z'ConfluenceAPIImport._convert_livesearchc                    s  dt   dt   dt   dt   dt   dt   dt   dt   d	}|jd
ddidD ]d}d}|dd}tdd |dD }d}	|dddd }
|
r|
d }tjjddd| j	 dgddd| d ggd!gd"}|r|j
}	nd#|
krt|jj
}	nd$}nt|jj
}	|d%ddd }|sD|d& nd'd(g  fd)d*|D }d}|d+ddd }t|d,krz&| j|d d-d.}|rt|j
}W n8 tk
r } z| jj|d/|d0d1 W 5 d}~X Y nX t|d2d3d4||	pd|d5d6|pd|d7ddd |d8d9|d:d4d;	}tj|d4d<d=d>d?}t|j|||d@dA}|dB}|r|jdB|idnd}|s|jdCddid}|rX||j qXdS )Dut   
        Конвертирует макрос "Recently Updated Macro" (Недавно обновлено)
        rc  aW  "
            class="macros-panel mceNonEditable wiki-recently-updated"
            contenteditable="false"
            data-macros-parameters="{params}"
            data-macro-parameters-original="{original_params}"
            data-macros="wikirecentlyupdated"
            cmf_converted="{cmf_converted}"
        >
            <div data-id="zT" data-layout="default" class="extension-container">
                <span data-id="uO  " aria-label="Макрос">
                    <svg viewbox="0 0 24 24" width="14px" height="14px" class="ng-star-inserted">
                        <path fill="currentColor" d="M12,0A11.972,11.972,0,0,0,4,3.073V1A1,1,0,0,0,2,1V4A3,3,0,0,0,5,7H8A1,1,0,0,0,8,5H5a.854.854,0,0,1-.1-.021A9.987,9.987,0,1,1,2,12a1,1,0,0,0-2,0A12,12,0,1,0,12,0Z"></path>,
                        <path fill="currentColor" d="M12,6a1,1,0,0,0-1,1v5a1,1,0,0,0,.293.707l3,3a1,1,0,0,0,1.414-1.414L13,11.586V7A1,1,0,0,0,12,6Z"></path>
                    </svg>
                </span>
                <span data-id="u   " class="extension-title">
                    <span class="excerpt-title">Макрос "Недавние обновления"</span>
                </span>
                <span data-id="re  rf  aw  " class="macros-action macros-delete" data-macros-action="macros-delete">
                        <svg viewbox="0 0 18 18" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                            <path fill="var(--color-gray-222, #222)" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            <path fill="var(--color-gray-222, #222)" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            <path fill="var(--color-gray-222, #222)" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                        </svg>
                    </span>
                </span>
            </div>
            <div data-id="z<" class="ak-renderer-wrapper"></div>
        </div>
        r  r  zrecently-updatedr  r5  r  r  c                 s   s.   | ]&}t |d ddkr|d dV  qdS r*  r+  r  r   r   r   r     s   z@ConfluenceAPIImport._convert_recently_updated.<locals>.<genexpr>r  Nspacesrf   r  r   r   r   rh  ri  r  rj  rk  rl  r9  r:  z@selfr#  typesr  r/  newsc                    s   g | ]}| kr|qS r   r   )r   rF  Zunsupported_typesr   r   r<    s      zAConfluenceAPIImport._convert_recently_updated.<locals>.<listcomp>r  r}  T)raise_on_errorzERR-0133ry   r  r   r@  max   FthemeZconciser  r  r  hideHeading)	rv  Z	maxTogglerq  ru   rx  r  r  r  ry  r6  r7  r8  r9  )r  r!  r<  r~  r  ra  )r=  r   r;   r  r   r   r:   r>  ro  r6   rw   r   ru  rh   r  r   r   r,   rD  r   r   r   r   r  r   r  r  )r   r   rY  rZ  r  r   r<  r?  r  ru   Z
space_keysr   ru  rq  r  Zauthorsr   rI  rb  r
  r>  r  r   rs  r   r  h  s    '




 

z-ConfluenceAPIImport._convert_recently_updatedc           "         s,  d}| d}t|D ]}|dd| dd}qdddd	d
g}ddddg}dddddddg}ddddd}	ddd}
dddddd d!d" d#d$d%d&d'}|jd(d)d*id+D ]z}|d,}i }d-d.i}|d/D ]R}|d)d0}|jr|j nd1}|||< ||kr
q|	|p|}|d1k	r||krRtd2|}|dkrRd3d4 |D }||krt	|t
rxd5d4 |D }nt|}nh|dkr fd6d4|D }d|}n@|d7kr |}n*|d8kr|
|}n|d9kr||}t	|tr| d:kr
d.}n| d;krd<}|||< qg }d=d>d?d@dAd?dBdCd?dDdEd?dFdGd?dHdId?dJdKd?dL}t| dD ]\}\}}||}|sqv|dMkr||dN dO|dN |d |dP n6td2|}|D ]$}||dO|dN |d |dP qԐqvd1gt| }|dpg }t|D ]\}}|| ||< q$|}||dQ< |r^|jdR|id+nd1}|sx|jdSd*id+}|rdTdU t|D }dVtdW |dX< tj|d<dYdZd[d\|d]< tj|d<dYdZd[d\|d^< |jd_d`daid+}d0dbdc |jD |dd< |jf |} t| de}!||!j qd1S )fuS   
        Конвертирует макрос 'Фильтр таблиц'
        u  
        <div
            id="{macro_id}"
            data-id="{data_id}"
            class="macros-panel table-filters"
            contenteditable="false"
            original-data-macro-parameters='{original_params}'
            data-macros-parameters='{params}'
            data-rendered="true"
            data-macros="tablefilters"
        >
            <div data-layout="default" class="extension-container" contenteditable="false" data-id="{data_id}">
                <span role="img" aria-label="Макрос Фильтры таблиц" data-id="{data_id}">
                    <svg xmlns="http://www.w3.org/2000/svg" id="Layer_1" height="16" viewbox="0 0 24 24" width="16" data-name="Layer 1">
                        <path d="m14 24a1 1 0 0 1 -.6-.2l-4-3a1 1 0 0 1 -.4-.8v-5.62l-7.016-7.893a3.9 3.9 0 0 1 2.916-6.487h14.2a3.9 3.9 0 0 1 2.913 6.488l-7.013 7.892v8.62a1 1 0 0 1 -1 1zm-3-4.5 2 1.5v-7a1 1 0 0 1 .253-.664l7.268-8.177a1.9 1.9 0 0 0 -1.421-3.159h-14.2a1.9 1.9 0 0 0 -1.421 3.158l7.269 8.178a1 1 0 0 1 .252.664z"></path>
                    </svg>
                </span>
                <span class="extension-title" data-id="{data_id}">
                    <span class="excerpt-title" data-id="{data_id}">Фильтры таблиц</span>
                </span>
                <span class="macros-actions" data-id="{data_id}">
                    <span class="macros-edit" style="margin-right: 7px;" data-id="{data_id}">
                        <svg _ngcontent-aiw-c17="" viewbox="0 0 24 24" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                            <path _ngcontent-aiw-c17="" fill="var(--color-gray-222, #222)" d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                        </svg>
                    </span>
                    <span class="macros-delete" data-id="{data_id}">
                        <svg viewbox="0 0 18 18" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                            <path fill="var(--color-gray-222, #222)" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            <path fill="var(--color-gray-222, #222)" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            <path fill="var(--color-gray-222, #222)" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                        </svg>
                    </span>
                </span>
            </div>
            <div data-fabric-macro="null" data-macro-body="" class="ak-renderer-wrapper" contenteditable="true" data-id="{data_id}">
                {content}
            </div>
            <div class="macros-preview" data-id="{data_id}"></div>
        </div>
        	{data_id}	{data_id_}r}  rw   customNoTableMsgTextcustomNoTableMsgZenabledInEditorZhideFiltersorderZinverser  ZtotalRowZ	fixedColsZlimitHeightZrowsPerPageZignoreFirstNRowsZheightValueZshowNRowsifNotFiltered
iconFilterZthousandSeprator)ZtotalrowZ
iconfilterZignoreFirstNrowsZthousandSeparatorr2  rf   )	Point (.)	Comma (,)sumZaverageZmuiltiplicationminrv  r<  ZnonemptyCount)ZSumZAverageZMultiplicationZMinZMaxZCountzCount not emptyZ
dynamicAscZdynamicDescZ	staticAscZ
staticDesc)zDynamic AscendingzDynamic DescendingzStatic AscendingzStatic Descendingac:structured-macroac:nameztable-filterr  ac:macro-idZddSeparatorsTac:parameterr  Nu   (?<!\s)[,‚](?!\s)c                 S   s   g | ]}|  d kqS )r5  )r"  r   r  r   r   r   r<  i  s     z=ConfluenceAPIImport._convert_table_filter.<locals>.<listcomp>c                 S   s   g | ]}t |qS r   )r   r  r   r   r   r<  m  s     c                    s   g | ]}  ||qS r   )r;   r  Z	total_mapr   r   r<  q  s     ZtotalcolrW  Z	numberingr5  r#  Fcolumnu!   Выпадающий список)rw   r  
userfilteru   Текстовой списокnumberfilteru   Числовой фильтр
datefilteru   Фильтр по датамZvisualu!   Визуальный фильтрglobalu!   Глобальный фильтрZhiddensu   Скрыть столбцы)r  r  r  r  r  globalFilterhideColumns)r  r  r  r   )Z
columnNameZcolumnIndexZfilterLabelZ
filterTypefilterIdr>  r  r  c                 S   s   i | ]}d | t  qS Zdata_id_r=  r   r  r   r   r   r     s      z=ConfluenceAPIImport._convert_table_filter.<locals>.<dictcomp>ztable-filter-re  r>  r6  r7  rJ   &apos;r!  r  ra  r_  ztablefilter-table-wrapperc                 s   s   | ]}t |V  qd S r   rG  rD  r   r   r   r     s     z<ConfluenceAPIImport._convert_table_filter.<locals>.<genexpr>rt  r~  )r<  r  r   r   r;   r   rn  r   r   r  r   r   ri   r   r"  r  r  rh   r  r   get_random_strr   r   r  r  r   r  r  )"r   rY  r  r  data_id_countr  unknown_paramsZlist_params
int_paramsZ
params_mapseparator_mapZnumbering_mapZtable_filterr>  r!  r  r  
param_nameparam_valuer>  Zfilter_typesZfilter_typeZfilter_dataZfilter_valueZcolumn_nameZordered_filtersr  Z	old_indexZ	new_indexr  r  tablenew_htmlr
  r   r  r   r    s    *


 











	


  
z)ConfluenceAPIImport._convert_table_filterc                 C   s,  d}| d}t|D ]}|dd| dd}qdddd	d
ddg}ddg}ddddd}|jdddidD ]}	|	d}
i }ddi}|	dD ]}|dd}|jr|j nd}|||< ||krq|dk	r>| dkrd}n| d krd}t|t	rd!|kr|d!d}||kr*t
|}n|d"kr>||}|||< q|
r^|jd#|
idnd}|sx|jd$did}|rld%d& t|D }d'td( |d)< tj|dd*d+dd,|d-< tj|dd*d+dd,|d.< |jd/d0d1id}dd2d3 |jD |d4< |jf |}t|d5}||j qldS )6uW   
        Конвертирует макрос 'Сводная таблица'
        ul  
        <div        NOTE: 
            id="{macro_id}"
            data-id="{data_id}"
            class="macros-panel pivot-table"
            contenteditable="false"
            original-data-macro-parameters='{original_params}'
            data-macros-parameters='{params}'
            data-rendered="true"
            data-macros="pivottable"
        >
            <div data-layout="default" class="extension-container" contenteditable="false" data-id="{data_id}">
                <span role="img" aria-label="Макрос Сводные таблицы" data-id="{data_id}">
                    <svg xmlns="http://www.w3.org/2000/svg" id="Layer_1" data-name="Layer 1" viewbox="0 0 24 24" width="16" height="16">
                        <path d="M22,15h2v7h-7v-2h5v-5Zm2-10v6.731l-2-1.976v-.755H7v11h4.738c.033,.036,.057,.078,.092,.113l1.887,1.887H0V5c0-1.654,1.346-3,3-3H21c1.654,0,3,1.346,3,3ZM2,5v2h3v-3H3c-.551,0-1,.448-1,1Zm3,4H2v11h3V9Zm17-2v-2c0-.552-.448-1-1-1H7v3h15Zm-9.715,9.292c-.38,.391-.38,1.025,0,1.416l2.715,2.792v-2.5h2c1.654,0,3-1.346,3-3v-2.023h2.455l-2.756-2.711c-.386-.386-1.012-.386-1.398,0l-2.756,2.711h2.455v2.023c0,.552-.448,1-1,1h-2v-2.5l-2.715,2.792Z"></path>
                    </svg>
                </span>
                <span class="extension-title" data-id="{data_id}">
                    <span class="excerpt-title" data-id="{data_id}">Сводные таблицы</span>
                </span>
                <span class="macros-actions" data-id="{data_id}">
                    <span class="macros-edit" style="margin-right: 7px;" data-id="{data_id}">
                        <svg _ngcontent-aiw-c17="" viewbox="0 0 24 24" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                            <path _ngcontent-aiw-c17="" fill="var(--color-gray-222, #222)" d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                        </svg>
                    </span>
                    <span class="macros-delete" data-id="{data_id}">
                        <svg viewbox="0 0 18 18" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                            <path fill="var(--color-gray-222, #222)" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            <path fill="var(--color-gray-222, #222)" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            <path fill="var(--color-gray-222, #222)" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                        </svg>
                    </span>
                </span>
            </div>
            <div data-fabric-macro="null" data-macro-body="" class="ak-renderer-wrapper" contenteditable="true" data-id="{data_id}">
                {content}
            </div>
            <div class="macros-preview" data-id="{data_id}"></div>
        </div>
        rz  r{  r|  r}  rw   r}  r~  r  rs   ZcollapseAllZ
cumulativeZdecimalsZnumberaccuracyr2  rf   rJ   r  )r  r  zApostrophe (')z	Space ( )r  r  zpivot-tabler  r  ZshowrawdataFr  r  Nr5  Tr#  u   ‚)ZdecimalseparatorrW  r  r  c                 S   s   i | ]}d | t  qS r  r  r  r   r   r   r   -  s      z<ConfluenceAPIImport._convert_pivot_table.<locals>.<dictcomp>zpivot-table-re  r>  r6  r7  r  r!  r  ra  r_  zoriginal-tablec                 s   s   | ]}t |V  qd S r   rG  rD  r   r   r   r   ;  s     z;ConfluenceAPIImport._convert_pivot_table.<locals>.<genexpr>rt  r~  )r<  r  r   r   r;   r   rn  r"  r  r   r   r   r  r   r   ri   r  r  r   r  r  )r   rY  r  r  r  r  r  r  r  Zpivot_tabler>  r!  r  r  r  r  r  r  r  r  r
  r   r   r   r    s    *


 





  
z(ConfluenceAPIImport._convert_pivot_tablec                 C   s  dt   dt   dt   dt   dt   dt   dt   dt   d	t   d
}|jdddidD ]}|dd}tdd |dD }|d}g }t|jdddidD ]\}	}
|
dd}tdd |dD }|d}d|dddd|	dk|dkrdnddd d!
}|
d"}|r0|jd"|idnd#}|sN|jd$d|d%d}|rt|jt	j
|dd&d'd(|dd)d |jD d*d+}||j q|d"}|r|jd"|idnd#}|s|jd$ddid}|r`|r`||d  |d }|d,d# D ]}|| |}q q`d#S )-uu   
        Конвертирует макрос "Composition - deck of cards" (макрос "Вкладки")
        zr
        <div
            class="macros-panel wiki-tabs"
            contenteditable="false"
            data-id="z"
            data-macros="wikitabs"
            data-macros-parameters="{params}"
        >
            <div class="extension-container" contenteditable="false" data-id="rS  a  ">
                    <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24" width="14px" height="14px">
                        <path d="M11.25,7.99874576 L18.75,7.99874576 L18.9896379,8.00744644 L18.9896379,8.00744644 C20.6119031,8.125678 21.9036924,9.43468674 21.9948552,11.0643219 L22,11.2487458 L22,18.7487458 C22,20.4817772 20.6435452,21.8979917 18.9344239,21.993601 L18.75,21.9987458 L11.25,21.9987458 C9.51696854,21.9987458 8.10075407,20.642291 8.00514479,18.9331697 L8,18.7487458 L8,11.2487458 C8,9.5157143 9.35645477,8.09949983 11.0655761,8.00389055 L11.25,7.99874576 Z M9.5,18.7487458 L9.50455771,18.8760231 L9.50455771,18.8760231 L9.52290455,19.0326048 C9.65099554,19.8179147 10.30178,20.427623 11.1064728,20.4929446 L11.25,20.4987458 L18.75,20.4987458 C19.6681734,20.4987458 20.4211923,19.7916355 20.4941988,18.892273 L20.5,18.7487458 L20.5,11.2487458 C20.5,10.2822474 19.7164983,9.49874576 18.75,9.49874576 L11.25,9.49874576 C10.3318266,9.49874576 9.57880766,10.205856 9.5058012,11.1052186 L9.5,11.2487458 L9.5,18.7487458 Z M15.75,5 C15.8305982,5 15.9105112,5.00293389 15.9896379,5.00870069 C17.236948,5.09952529 18.2890659,5.89453789 18.7501004,6.99804043 L16.9722957,6.99760388 C16.6889259,6.72100274 16.3120424,6.5397745 15.8935272,6.5058012 L15.75,6.5 L8.25,6.5 C7.3318266,6.5 6.57880766,7.20711027 6.5058012,8.10647279 L6.5,8.25 L6.5,15.75 L6.51083386,15.9458258 C6.55524501,16.3446817 6.73371018,16.7030658 7.00015022,16.974899 L7.0000564,18.7509418 C5.87931902,18.283597 5.07631822,17.2067274 5.00514479,15.9344239 L5,15.75 L5,8.25 C5,6.51696854 6.35645477,5.10075407 8.06557609,5.00514479 L8.25,5 L15.75,5 Z M12.75,2 C14.0497736,2 15.1713376,2.76300581 15.691219,3.86554427 L15.75,4 L13.9733002,3.99858514 C13.6898169,3.72143138 13.3125371,3.53981466 12.8935272,3.5058012 L12.75,3.5 L5.25,3.5 C4.3318266,3.5 3.57880766,4.20711027 3.5058012,5.10647279 L3.5,5.25 L3.5,12.75 C3.5,13.2269035 3.69076499,13.6592514 4.00015022,13.974899 L4.0000564,15.7509418 C2.87931902,15.283597 2.07631822,14.2067274 2.00514479,12.9344239 L2,12.75 L2,5.25 C2,3.51696854 3.35645477,2.10075407 5.06557609,2.00514479 L5.25,2 L12.75,2 Z"></path>
                    </svg>
                </span>
                <span class="extension-title" data-id="rT  u   ">Макрос "Вкладки" | {tab_name}</span>
                </span>
                <span class="macros-actions" data-id="rU  a  " 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="aA  " 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="ak-renderer-wrapper" contenteditable="true" data-id="zG">
                {content}
            </div>
        </div>
        r  r  deckr  r  r  c                 s   s.   | ]&}t |d ddkr|d dV  qdS r*  r+  r  r   r   r   r   m  s   z4ConfluenceAPIImport._convert_tabs.<locals>.<genexpr>r  ZtabLocationcardc                 s   s.   | ]&}t |d ddkr|d dV  qdS r*  r+  r  r   r   r   r   w  s   r  rO  z#254dcbZDefaultFr   leftZverticalZ
horizontalZBasic)
r  ZtabsPageTitlecolorZcolorPalettesZ	hasBorderZfixedZ
primaryTab	directionZtextAlignmentZheaderStyler  Nra  )r  r  rg  r8  r9  c                 s   s   | ]}t |V  qd S r   rG  rD  r   r   r   r     s     )r  Ztab_namert  r~  r}  )r=  r   r;   r  r   r  r   r   r  r   r   r   ri   r  rh   ra  r  Zinsert_after)r   rY  rZ  r  r  Zdeck_macro_parametersZdeck_paramsZtab_locationZtabsr  r  Zcard_macro_parametersZcard_paramsZ
card_lableZ
tab_paramsZcard_macro_idZ
card_macroZ	tab_macroZdeck_macro_idZ
deck_macrorl  Ztabr   r   r   r  A  s    &




z!ConfluenceAPIImport._convert_tabsc                 C   s   d}|j dddidD ]}|d}|dd}td	d
 |dD }|dd}|d|}	t|j|	|	pnd| pxddd}
t|
}||
j	 |r|j
d|idnd}|s|j
ddid}|r||j	 qdS )uF   
        Конвертирует макрос 'Статус'
        a  
        <span
            data-macros="wiki-status"
            text="{text}"
            color="{color}"
            class="statusView-content-wrap"
            contenteditable="false"
        >
            <span>{text_span}</span>
        </span>
        r  r  rm  r  r  r  r  c                 s   s   | ]}|r| d dV  qdS r  r  r  r   r   r   r     s   z6ConfluenceAPIImport._convert_status.<locals>.<genexpr>r  Zcolourrp     Задать статусZneutral)r   	text_spanr  r~  N)r   r;   r  r   r   r  r"  r)  r  r  r   )r   rY  rZ  r  r   r>  r?  r  r  r   r
  new_tag_viewr  r   r   r   r    s0    

	
z#ConfluenceAPIImport._convert_statusc                 C   s   d}|j dddidD ]}|d}|dd}td	d
 |dD }|dd}t|j||pbddd}	t|	}
||	j |r|j	d|idnd}|s|j	ddid}|r||
j qdS )uF   
        Конвертирует макрос 'Handy Status'
        a  
        <span
            data-macros="wiki-status"
            text="{text}"
            color="neutral"
            class="statusView-content-wrap"
            contenteditable="false"
        >
            <span>{text_span}</span>
        </span>
        r  r  zstatus-handyr  r  r  r  c                 s   s   | ]}|r| d dV  qdS r  r  r  r   r   r   r     s   z<ConfluenceAPIImport._convert_status_handy.<locals>.<genexpr>r  ZStatusr  )r   r  r~  N)
r   r;   r  r   r   r  r)  r  r  r   )r   rY  rZ  r  r   r>  r?  r  r   r
  r  r  r   r   r   r    s,    

z)ConfluenceAPIImport._convert_status_handyc                 C   s  ddl m} t }t }t| d}z|D ]}|dkrt|}t|}	|dkrd|	dg}
n"|dkrdd	 |	d
dD }
t }t }|
D ]}|dddd}||ddd}z`t	j
jdddd| dgdd|gddd| dggddgd}|st	j
|d}|jdd W nB tk
r` } z"td| d|  W Y qW 5 d }~X Y nX |jj|kr||jj ||jj|jj|jjdd q|r|dd |g ||d< q.|d!kr.t|}t|}	|dkr|	dg}n$|dkrd"d	 |	d
dD }t }t }|D ]}|d#kr<|r<|}n4t	jjd$d%d&| d'gd(d%d)| dggddgd}|std*| d+ q"|jj|kr"||jj ||jj|jj|jjd,d q"|r.|d-d |g ||d-< q.W n tk
r   Y nX ||fS ).Nr   translitr  r  z\=r8  inc                 S   s   g | ]}| d qS r8  rm  )r   r  r   r   r   r<    s     z5ConfluenceAPIImport._bql_from_cql.<locals>.<listcomp>z()rf   r;  #r  ruTZlanguage_codereversedORaliasrj  rl  r}   r0   r:  r|   r   u*   Не удалось создать тег r   r  )r}   r0   rw   Z	classNamer  INru   c                 S   s   g | ]}| d qS r  rm  r   r   r   r   r<  ;  s     zcurrentSpace()r   r   rh  ri  r  rk  u.   Не удалось найти проект «   »r>  r   )transliterater  r   r  iterr   r  rn  r   r:   r  r;   r   r   r\   rR   rw   r   rh   r}   r0   r>  StopIteration)cqlr6   r   r  Zbql_listbql_dictZ	cql_partsZcql_partopr   r  Ztags_idsZ	tags_listr  Zlabel_aliasr   r  rp  Z
parent_idsZparent_listru   ru  r   r   r   _bql_from_cql
  s    






z!ConfluenceAPIImport._bql_from_cqlc                 C   sj  d}|j ddidD ]N}|d}t|d}z|d}tdd	 |D }	| |	d
d| j\}
}ddd|	dddkt|	dd|	dddk|	dddkd|
|dg d
}W n.   | jj	d| d| d|d Y qY nX t
|jt|ddddd d!d"d#d$d%}|r:|jd|idnd&}|sT|jddid}|r||j qd&S )'u`   
        Конвертирует макрос "Содержимое по меткам"
        u  
        <div
            class="macros-panel content-by-label"
            contenteditable="false"
            data-id
            data-macros="contentbylabel"
            data-macros-parameters="{parameters}"
        >
            <div class="extension-container" contenteditable="false" data-id data-layout="default">
                <span aria-label="Макрос Содержимое по тегам" data-id role="img"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24" width="14" height="14">
                    <path d="M20.457,4.555,12.486.126a1,1,0,0,0-.972,0L3.543,4.555A3,3,0,0,0,2,7.177V19a5.006,5.006,0,0,0,5,5H17a5.006,5.006,0,0,0,5-5V7.177A3,3,0,0,0,20.457,4.555ZM20,19a3,3,0,0,1-3,3H7a3,3,0,0,1-3-3V7.177A1,1,0,0,1,4.515,6.3L12,2.144,19.486,6.3A1,1,0,0,1,20,7.177Z"></path><circle cx="12" cy="7" r="1.5"></circle></svg>
                </span>
                <span class="extension-title" data-id><span class="excerpt-title" data-id>Содержимое по тегам</span></span>
                <span class="macros-actions" data-id>
                    <span class="macros-action" data-id data-macros-action="macros-edit">
                        <svg _ngcontent-aiw-c17="" viewbox="0 0 24 24" class="ng-star-inserted" style="width: 14px; height: 14px; color: #444444;">
                            <path _ngcontent-aiw-c17="" fill="#444" d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                        </svg>
                    </span>
                    <span class="macros-action macros-delete" data-id data-macros-action="macros-delete">
                        <svg viewbox="0 0 18 18" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                            <path fill="#222" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path><path fill="#222" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path><path fill="#222" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                        </svg>
                    </span>
                </span>
            </div>
            <div class="macros-preview" data-id></div>
        </div>
        r  Zcontentbylabelr  r  r  r  c                 S   s   g | ]}| d dqS rf  r}  r  r   pr   r   r   r<    s     zAConfluenceAPIImport._convert_content_by_label.<locals>.<listcomp>r  r  rO  defaultr  FTr5  Truerv  rw  
showLabelsT	showSpacer%  r  )
r  Zmodelr  r  rv  r  r  r0  bqlr  ui   Не удалось конвертировать макрос «Содержимое по меткам»     с параметрами: zERR-0034r  rJ   r9  r  z:Truez:truez:Falsez:falserb  r~  N)r   r;   r   r   r  r  r6   r   r,   rD  r   r  r   r   r  r  )r   r  rY  rZ  r  r   r>  r?  all_parametersr  r  r  rb  r
  r  r   r   r   r  [  sb    



 
    
z-ConfluenceAPIImport._convert_content_by_labelc                 C   s  dt   dt   dt   dt   dt   dt   dt   dt   d	t   d
}i }|jddidD ]}|d}t|d}	t }
z,|	r|	dkr|	d}tdd |D }
W n*   | jjd| d|	 d|d Y nX |
d|
dddkd}t  }tj	|dd
dd}d d!d |jD }t|j||r>|nd ||d rPd"nd d#d$}|d rx|jd%|j n|r|jd|idnd&}|s|jddid}|r d d'd( |jD }t|j||r|nd ||d rd"nd d#d$}||j t|tjrqbi }zt|d)d*}|s4td+|d,d% jd-d.idsd/d |d,d% jd-d0idD }d1d |d,d2 jd-d.idD }tt||}ntd3d |d,D }t|tjs|||< W qb tk
r$ } z,t|tjs| jjd| d4|  W 5 d&}~X Y qbX qb|rz`|j  |jjd&krNi |_||jd< |j  |jjd&krvi |_||jd< |j d5d6 W nJ tk
r } z*| jjd| d7| d8| d9|d5d: W 5 d&}~X Y nX d&S );u[   
        Конвертирует макрос "Свойства страницы"
        aS  
        <div
            class="macros-panel details{details_hidden}"
            contenteditable="false"
            data-macros="details"
            data-macros-parameters="{parameters}"
            data-id="{macro_data_id}"
        >
            <div class="extension-container" contenteditable="false" data-layout="default" data-id="ui   ">
                <span aria-label="Макрос Свойства страницы" role="img" data-id="  ">
                    <svg xmlns="http://www.w3.org/2000/svg" id="Layer_1" data-name="Layer 1" viewbox="0 0 24 24" width="16" height="16">
                        <path d="M22,15h2v7h-7v-2h5v-5Zm2-10v6.731l-2-1.976v-.755H7v11h4.738c.033,.036,.057,.078,.092,.113l1.887,1.887H0V5c0-1.654,1.346-3,3-3H21c1.654,0,3,1.346,3,3ZM2,5v2h3v-3H3c-.551,0-1,.448-1,1Zm3,4H2v11h3V9Zm17-2v-2c0-.552-.448-1-1-1H7v3h15Zm-9.715,9.292c-.38,.391-.38,1.025,0,1.416l2.715,2.792v-2.5h2c1.654,0,3-1.346,3-3v-2.023h2.455l-2.756-2.711c-.386-.386-1.012-.386-1.398,0l-2.756,2.711h2.455v2.023c0,.552-.448,1-1,1h-2v-2.5l-2.715,2.792Z"></path>
                    </svg>
                </span>
                <span class="extension-title" data-id="rT  uy   ">Свойства страницы</span>
                </span>
                <span class="macros-actions" data-id="U">
                    <span class="macros-edit" style="margin-right: 7px;" data-id="  ">
                        <svg _ngcontent-aiw-c17="" viewbox="0 0 24 24" class="ng-star-inserted" style="width: 14px; height: 14px; color: #444444;">
                            <path _ngcontent-aiw-c17="" fill="#444" d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                        </svg>
                    </span>
                    <span class="macros-delete" data-id="J  ">
                        <svg viewbox="0 0 18 18" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                            <path fill="#222" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            <path fill="#222" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            <path fill="#222" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                        </svg>
                    </span>
                </span>
            </div>
            <div class="ak-renderer-wrapper" contenteditable="true" data-fabric-macro="null" data-macro-body="" data-id="za">
                {content}
            </div>
            <div class="macros-preview" data-id=" "></div>
        </div>
        r  detailsr  r  r  Noner  c                 S   s   g | ]}| d dqS r  r  r  r   r   r   r<    s     z8ConfluenceAPIImport._convert_details.<locals>.<listcomp>ud   Не удалось конвертировать макрос «Свойства страницы» r  zERR-0035r  rw   hiddenFr  )rw   r  rg  r8  r9  r  c                 S   s   g | ]}t |qS r   rG  r   cr   r   r   r<    s     z details-hidden)macro_data_idrb  rt  Zdetails_hiddenr~  r   Nc                 s   s   | ]}t |V  qd S r   rG  rD  r   r   r   r     s     z7ConfluenceAPIImport._convert_details.<locals>.<genexpr>r   r  u5   Отсутствует таблица свойств.trr_  confluenceTdc                 S   s   g | ]}d |j d  qS )key_details r   )r  )r   thr   r   r   r<    s   confluenceThc                 S   s"   g | ]}d  dd |jD qS )r  c                 s   s   | ]}|d krt |V  qdS r   NrG  r  r   r   r   r     s      BConfluenceAPIImport._convert_details.<locals>.<listcomp>.<genexpr>)ri   r  )r   Ztdr   r   r   r<    s   r}  c              	   S   sJ   g | ]B}d |j ddidjd  ddd |j ddidjD fqS )	r  r_  r  r  r   r  c                 s   s   | ]}|d krt |V  qdS r  rG  r  r   r   r   r   &  s      r  r  )r   r  ri   )r   r  r   r   r   r<  #  s    r   Tr   uE   : не удалось сохранить значения macro_db «u   »: zERR-0037rN  )!r=  r   r;   r   r  r   r,   rD  r   r   r   ri   r  r   r  ro   insertr  r   r  r  r:   r>  r   zipr  rQ   rR   Z	macros_dbr   r   Zmacros_db_draftr   )r   r  rY  rZ  r  r  r  r   r>  r?  r  r  rb  r  prmZcontents_strr
  r  Z
propertiesZcontents_tableZ	first_rowZ
second_rowr  r   r   r   r    s    '

 

		.



z$ConfluenceAPIImport._convert_detailsc                 C   s  dt   dt   dt   dt   dt   dt   dt   dt   d	t   d
t   d}|jddidD ]n}|d}t|d}z|d}tdd |D }	| |	dd| j|j\}
}dd |	dddD }|	dddkdd|	dddkdd|	dddkt	|	ddd |	d!|	d"d
|||
d#}W n*   | jjd$| d%| d&|d' Y nX tj|dd(d)d*}t|j|d+d,}|r|jd|idnd }|s|jddid}|rf||j qfd S )-um   
        Конвертирует макрос "Отчёт по свойствам страницы"
        a6  
        <div
            class="macros-panel details-summary"
            contenteditable="false"
            data-macros="detailssummary"
            data-macros-parameters="{parameters}"
            style="display: inline-flex; flex-direction: column; position: relative; width: 100%;"
            data-id="zp"
        >
            <div class="extension-container" contenteditable="false" data-layout="default" data-id="u{   ">
                <span aria-label="Макрос Отчёт по свойствам страницы" role="img" data-id="r  z;>
                    <span class="excerpt-title" data-id="u   ">Отчёт по свойствам страницы</span>
                </span>
                <span class="macros-actions" data-id="r  r  r  z:"></div>
            <div class="macros-preview" data-id="r  r  Zdetailssummaryr  r  r  r  c                 S   s   g | ]}| d dqS r  r  r  r   r   r   r<  u  s     z@ConfluenceAPIImport._convert_details_summary.<locals>.<listcomp>r  r  c                 S   s   g | ]}|  qS r   rm  )r   rX  r   r   r   r<  w  s     headingsrf   showCommentsCountFr  showLikesCountreverseSortpageSize   NsortByfirstcolumn)r  ZshowCreatorZshowLastModifiedr  ZshowPageLabelsZshowUnresolvedCommentsCountr  r  rw   r  r  r  ZsettingsParamsr  uv   Не удалось конвертировать макрос «Отчёт по свойствам страницы» r  zERR-0036r  rg  r8  r9  r  r~  )r=  r   r;   r   r   r  r  r6   r   r   ri   r,   rD  r   r   r   r   r  r   r  r  )r   r  rY  rZ  r  r   r>  r?  r  r  r  r  r  rb  r  r
  r  r   r   r   r  F  s|    &


 z,ConfluenceAPIImport._convert_details_summaryc           	      C   s   dt   dt   dt   dt   dt   dt   dt   dt   d	t   d
}|jddidD ]r}|d}t|d}t|jtj|dd}|r|j	d|idnd}|s|j	ddid}|r^|
|j q^dS )uD   
        Конвертирует макрос "Якорь"
        a:  
        <span
            class="macros-panel anchor-macros"
            contenteditable="false"
            style="display: inline-flex; flex-direction: column; position: relative;"
            data-param-name="{param_name}"
            data-rendered="true"
            data-macros="anchor"
            data-id="z'"
        >
            <span data-id="rd  ur  " role="img" aria-label="Макрос Якорь">
                    <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Capa_1" x="0px" y="0px" viewbox="0 0 204.851 204.851" style="enable-background: new 0 0 204.851 204.851;" xml:space="preserve" width="16" height="16">
                        <path xmlns="http://www.w3.org/2000/svg" style="fill: #010002;" d="M139.518,128.595l16.834,16.336c0,0-20.644,29.877-42.725,30.473 c0.479,0,0.117-84.092,0.039-104.472c14.694-4.797,25.402-18.182,25.402-34.117c0-20.009-16.697-36.218-37.273-36.218 c-20.615,0-37.312,16.209-37.312,36.208c0,15.671,10.376,28.929,24.748,33.961l0.098,104.277 c-26.643-1.837-42.061-27.474-42.061-27.474l17.997-17.41L0,120.505l9.887,63.301l17.362-16.795 c15.036,12.105,32.017,37.244,72.876,37.244c51.332-1.309,63.184-28.939,76.344-39.804l18.993,18.514l9.389-63.907 L139.518,128.595z M82.558,36.208c0-10.298,8.608-18.661,19.218-18.661s19.257,8.363,19.257,18.661 c0,10.327-8.647,18.681-19.257,18.681S82.558,46.535,82.558,36.208z"></path>
                    </svg>
                </span>
                <span data-id="u^   " class="extension-title">Якорь
                    <span class="excerpt-title" data-id="z>">| {param_name}</span></span>
                <span data-id="re  u  " class="anchor-copy" role="img" title="Скопировать ссылку" area-label="Скопировать ссылку">
                        <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24" width="14" height="14">
                            <path d="M22,4.145,17.986,0H10A3,3,0,0,0,7,3V4H5A3,3,0,0,0,2,7V24H18V19h4ZM16,22H4V7A1,1,0,0,1,5,6H7V19h9ZM9,17V3a1,1,0,0,1,1-1h6V6h4V17Z"></path>
                        </svg>
                    </span>
                    <span data-id="a  " class="macros-edit" style="margin-right: 7px;">
                        <svg _ngcontent-aiw-c17="" viewbox="0 0 24 24" class="ng-star-inserted" style="width: 14px; height: 14px; color: #444444;">
                            <path _ngcontent-aiw-c17="" fill="#444" d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                        </svg>
                    </span>
                    <span data-id="a   " class="macros-delete">
                        <svg viewbox="0 0 18 18" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                            <path fill="#222" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            <path fill="#222" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            <path fill="#222" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                        </svg>
                    </span>
                </span>
            </span>
        </span>
        r  anchorr  r  rH  )r  r~  N)r=  r   r;   r   r   r  r   r   quoter   r  r  )	r   rY  rZ  r  r   r>  Zmacro_param_namer
  r  r   r   r   r    sB    )

z#ConfluenceAPIImport._convert_anchorc                 C   s  dt   dt   dt   dt   dt   dt   dt   d}|jd	d
idD ]L}|d}|d}i }td|D ]$}	|	dd\}
}| ||
 < qx|dsqN|d dd}tdd|}tdd|}||d< | |d }||d< g }|dr||d d}|D ]d}z t	
||d}|| W n< tk
rv } z| jj| d|  W 5 d}~X Y nX q|j d| }tjj|d d!gd"}|stj|| jd#d$}|jr||_|jd#d% d&d'd(d)d*d+d,d-d.d/d0g}d1|p||d2d3dddt|jd#d4}tj|d1d5d6d7d8}tj|d1d5d6d7d8}t|j||d9d:}|rp|jd|idnd}|s|jd;d	d
id}|rN||j qNdS )<u   
        Конвертиация макроса "Результаты фильтра" ("Вставить фильтр/проблему Jira")
        zw
        <div
            class="macros-panel wiki-task-list"
            contenteditable="false"
            data-id="z"
            data-macro-parameters="{params}"
            data-macro-parameters-original="{original_params}"
            data-macros="bql-task-filter"
        >
            <div class="extension-container" data-id="ui   " data-layout="default">
                <span aria-label="Результаты фильтра" data-id="uo   " role="img">Результаты фильтра</span>
                <span class="extension-title" data-id="z@"></span>
                <span class="macros-actions" data-id="z:">
                    <span class="macros-edit" data-id="a  " style="margin-right: 7px;">
                        <svg viewbox="0 0 24 24" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                            <path fill="var(--color-gray-222, #222)" d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                        </svg>
                    </span>
                    <span class="macros-delete" data-id="a  ">
                        <svg viewbox="0 0 18 18" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                            <path fill="var(--color-gray-222, #222)" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            <path fill="var(--color-gray-222, #222)" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            <path fill="var(--color-gray-222, #222)" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                        </svg>
                    </span>
                </span>
            </div>
        <!--div data-fabric-macro="null" data-macro-body class="ak-renderer-wrapper"></div-->
        </div>
        r  Zjirar  r  r  z	(?<!\\)\|rf  r}  jqlQuery\r  z\|\|?r  z&&?ZANDZserverIdrh  Z	columnIdsrf   r6   r~   Nr   r   r  rC  T)r   r,   r   r   
logic_typer0   r}   ZresponsiblerP  priorityrm  rL  rR  rU  ZdeadlineFZmaximumIssues   )ZbordercolumnsZ	itemsSizer  Z
filterNameZfilterParentNameZuserFilterIdZuseCustomFilterr6  r7  r8  r9  r`  r~  ra  )r=  r   r;   r   r   rn  r   subrc  r   Zconvert_fieldrh   r   r,   rQ   rR   r   r:   CmfBqlFilterr   r  r   r   rw   r   r   r   r  r   r  r  )r   r  rY  rZ  r  r   r>  r?  r  r  r  r   Z	jql_queryrh  r  Z
column_idsZ	column_idr  rI  Z	tf_ext_idZtfZdefault_columnsrb  r
  r  r   r   r   r    s    


.

  	z(ConfluenceAPIImport._convert_task_filterc              	   C   s(  t jjdd|gdddgddd ggdddd	gd
D ]}z|jd d d r|jd|jd d d idD ]}ddd |jD }t|jdkrt	 |j
d< t|j|j
d< dg|j
d< d|j
d< d|j
d< d|j
d< n|  ||_|jdd qfW q0   | jjd| d|j d |d! Y q0X q0d S )"Nr   r   rK  Tr  r   r   rm  html_contextr:  rt   ZinlinePropertiesZ	markerRefzdata-refr  r  c                 S   s   g | ]}t |qS r   rG  r:  r   r   r   r<  k  s     z@ConfluenceAPIImport._convert_inline_comments.<locals>.<listcomp>r   zdata-idzdata-object-idzinline-highlightr_  ZinlineCommentzdata-mark-annotation-typeZ
annotationzdata-mark-typer<  r   uO   Не удалось конвертировать inline комментарий r   zERR-0020r  )r:   rO  r   r  r   ri   rp   r   rm  r=  r   rw   unwrapr  r   r,   rD  r   )r   r   rY  r0  r   Ztag_contextr   r   r   r  X  s@    



 z,ConfluenceAPIImport._convert_inline_commentsc                 C   s   dd l }|jdddd| jj d| jj d| d| d| d	gd
d
tddtddd}| j| j d|j d| jj d| d| d|  | j	  |S )Nr   z/usr/bin/python3z	manage.pyshellzefrom modules.confluence.api_import import ConfluenceAPIImport; cmf_import = models.CmfImport.get(id='z%', fields=['*', 'plugin']); args = ('rI   z', z]); ConfluenceAPIImport(cmf_import.plugin.confluence, cmf_import).run_threaded_process(*args);Tz"/var/log/eva-import-subprocess.logr   z&/var/log/eva-import-subprocess.err.log)Z	close_fdsZstart_new_sessionstdoutstderru0    Запущен новый процесс (PID: z): project=z, item_type=z, queue_name=z, max_items=)

subprocessPopenr,   rw   ru  r   r1   r  pidr  )r   	item_type
queue_namer  r  r?  r   r   r   _start_process~  s"      *,
z"ConfluenceAPIImport._start_processc           
   
   C   s   t | dt  | jd}d}| | j d|  | jd d D ]}| j| }|dkrj|d d	krjqF|dkrzP| j	|d
}t
dd |dD }|| jkr| j}	n|}	||	7 }|	|d< W q tk
r   Y qX n|d7 }|| qFW 5 Q R X ||fS )Nz_queue.r}   Zdb_dirr   u%    Наполнение очереди r  r  rs   r8  r)   r  c                 s   s   | ]
}d V  qdS r}  Nr   r:  r   r   r   r     s     z>ConfluenceAPIImport._build_processing_queue.<locals>.<genexpr>zversion_*.jsonr  r}  )r   r   getpidrZ   r   r  r  rs  r   rb   r  globrY   r   r  )
r   r  	item_namer  
item_countr   rv  r  r  r  r   r   r   _build_processing_queue  s0    

z+ConfluenceAPIImport._build_processing_queuec                 C   s  |  }| }|dkrd}d}d}| D ]B}	|	d dkr>q,|	d }
|
r,||	d 7 }||
d 7 }||
d 7 }q,||d< ||d< || |d	< |dkr|d
 }|dkr|| }nt|}||d< || |d< t|d
 d\}}t|d\}}| jj| j d| dt	|ddt	|dd|d	 | jj| j d| d|d  d|d  d|d	  	 | jj| j d|d dd| d | jj| j d|d dd d S )Nrs   r   rm  Z	completedrk  Zduration_secr  r  r  Ztotal_execution_time_secitems_per_secondZavg_execution_time_secr   r   r  u    завершена за r   r   r   u    Обработано u&    (успешно/неуспешно): r   u    из u&    Скорость обработки: .3fr  u   /секuM    Среднее время обработки одного элемента:     сек.)
Z	get_statsZget_all_resultsr   floatr   r,   rQ   r   r  r   )r   r  r  r  r  Zall_resultsZtotal_durationZcompleted_countZfailed_countZitem_resultrk  Ztotal_execution_timer   r   r   r   r   r   r   r   _log_processing_stats  sL    
.,z)ConfluenceAPIImport._log_processing_statsc                     s  ddd}| |}| j }tj}tj}tj}d}| ||\}	}
| jj	| j
 d|
 d| d| d g }|	 }zl|rt|dkr| j rqg }|D ]\}}}| }|d kr||||f q|dkr`|d7 }| jj| j
 d|j d|  |	|j}|dkr8| jj| j
 d|  d}||kr| jjd| ddd tq| j| j
 d|j d td|d }q|}|st||k r|t| }|	 }|dkrd}nt    t! fdd|D }td|| }|dkr|| }|dkrd}t"||}|| }|| | }|dkrB|}|||  }t#|D ]t}|dkrj q|| ||| k rdnd }|| }t"|||}||8 }| $||	j%|}|||t   f qVt &d |s||	 }q|W 5 t|dkrdd l}|D ]0\}}}z|  W n tk
r.   Y nX q|D ]Z\}}}z|jd	d
 W n< |jk
r   z|  W n tk
r   Y nX Y nX q8| |	|| |	  X d S )N   документов!   версий документовr)   rs   r   r  r  u    с ограничением u,    одновременных процессаr   r  r}  u    Процесс (PID: u&   ) завершился с кодом: u<    В очередь возвращено элементов: FuX   Превышен лимит аварийных завершений процессов (u`   ). Процессы стабильно падают. Проверьте код процесса.r  r  u%   ) завершился успешноTc                 3   s$   | ]\}}} | d k r|V  qdS )Z   Nr   )r   r;  rk  
start_timeZnowr   r   r   A  s   z>ConfluenceAPIImport._run_parallel_processes.<locals>.<genexpr>r  )'r;   r,   rC   rN   IMPORT_THREADSZIMPORT_OBJ_CNTZIMPORT_PROCESS_RETRYr  rQ   r   r  r  r  r  Z	terminater   waitZTimeoutExpiredkillr  Zcleanupr  Zpollrh   rR   r  ZrecoverrD  RuntimeErrorr1   rv  Zqsizer   r  r  r  r  r}   sleep) r   r  
item_typesr  Zmax_processesZthreads_per_processZmax_items_per_processZmax_allowed_crashesZconsecutive_crashesr  r  Zactive_processesZis_queue_emptyr  r  r;  Zstill_activeZassigned_limitr	  Zreturn_codeZrestored_countZslots_to_fillZcurrent_qsizeZstarting_bufferZuncovered_itemsZneeded_processesZprocesses_to_startZ
base_limitr   r  ZshareZdynamic_limitr   r
  r   _run_parallel_processes  s    














z+ConfluenceAPIImport._run_parallel_processesc                    s`   i dd d fdd	 j jdkr4d}njd	}|rL|d
 nd} |dd S )Nc                 S   s*   | d k	r| n|}dd t dt|D S )Nc                 S   s$   g | ]}|  rt|n| qS r   )isdigitr   r"  r   partr   r   r   r<    s   zRConfluenceAPIImport._prepare_content_tree.<locals>.natural_key.<locals>.<listcomp>z(\d+))r   r   r   )rq  rp  Zsort_byr   r   r   natural_key  s    z>ConfluenceAPIImport._prepare_content_tree.<locals>.natural_key順 Fc                    s   g }|r| dfn| f}|D ]<}j |g D ](}j|  }|k|d< || q,q|jfddd |}|D ]"}	|d }
|
|	d<  |	d |
}qt|r| d	krdd
i}n j| }| k|d< ||d< ||d< || < |S )Nr{  is_selectedc                    s    | d | d S )Nrq  rp  r   )r  )r  r   r   r     r   zOConfluenceAPIImport._prepare_content_tree.<locals>.build_tree.<locals>.<lambda>r  rL   ordernorw   r|  Trp   )r  r;   rs  r)  rh   r  )ru  r  is_rootrp   parentsr   r	  
child_metaZcurrent_ordernor  Znext_ordernoparent_meta
build_treecontent_treer  selected_content_idsr   r   r   r    s,    
z=ConfluenceAPIImport._prepare_content_tree.<locals>.build_treer'   r|  r  rw   T)r  )r  F)r  r  r*  r;   )r   r   ru  r  r   r  r   _prepare_content_tree  s    z)ConfluenceAPIImport._prepare_content_treec              
   C   sl  |  D ]\\}}|d sq|d}|d }z|dksD|drL| j}nn| j|d}tt| }| j d| }	|j|	dd	gd
d}|s| jj| j	 d| d| j d|d | j}|D ]}
|
d sq|
d }| j|
d d}tt| }| j d| }|j|ddddgd
d}|sH| jj| j	 d| d| dd|d q|j
r||_|
d |_|jd
d qdd|g}|ddd
gg}tjj|dgd
d}tjj|dgd
d}t|p||_|jrd
|_n4tjj|dgd}tjj|dgd}t|p||_|jdkr|jrd
|_|jd
d t  W q tk
rd   | jj| j	 d | d!dd
d" Y qX qd S )#Nr  r8  rp   r|  rr  r'   r   tree_node_is_branchhas_children_archivedT)r   r   include_archivedu!    Не найден предок 'u>   '. Потомки будут помещены в корень zERR-0120r  r@  rw   r   rX  r   r  u#    Не найден потомок 'u   ' у предка 'rJ   zERR-0003r   rf  r  r9  )r   r   r$  r:  r>  u7    Не получилось привязать ноду zERR-0024r  )r  r;   r  r  r  r:   r6   r,   rD  r  r   rX  r  r   r'   ro  r(   rW   r#  r"  r  Zshow_archiver  r   )r   r  ru  r  Zparent_typerp   rX  Zparent_model_nameZparent_modelZtree_parent_ext_idr  r	  Zchild_model_nameZchild_modelZchild_ext_idr  Ztree_parent_filterZarchived_filterZarchived_documentsZarchived_foldersr  r  r   r   r   _process_content_tree  s    




z)ConfluenceAPIImport._process_content_treec                 C   s   ddddddddd	d
dddddg}|ddg }t jj||dD ]L}|jr>g |_|D ]}t||d qR|jjdkrvd|_| j	|_	|j
dd q>dS )u   
        Сброс настроек правил схемы прав доступа

        Args:
            perm_scheme (CmfProjectPermScheme): Схема проектных прав доступа
        Zaccess_local_userZaccess_ownerZaccess_owner_assistantaccess_authorZaccess_spectatorsZaccess_executorsZaccess_responsibleZaccess_list_ownerZaccess_project_owner_assistantZaccess_project_spectatorsZaccess_project_executorsZaccess_sdesk_clientaccess_anonymousZaccess_guestZaccess_sharelink_anonymousproject_permissionaccess_members)r   r   F)PPP-DOC-DELETEzPPP-OBJ-DELETETr   N)r:   CmfProjectPermSchemeRuler   r   r*  r  r)  r0   r'  r,   r   )r   perm_schemeZrule_bool_fieldsZrule_fieldsZruleZfieldr   r   r   _reset_rules  s4    z ConfluenceAPIImport._reset_rulesc                 C   s  dddddgdgddd	gd
gdgdgdgdgg dgd
}z0| |d d }|d krn| jjd|  W d S |D ]}tjj |dd}|s| jjd| d| d|d  W d S tjj ||ddgd}|s| jjd| d| d|d  W d S |js W d S |d D ]B}| 	|}	|	r,|j
|	 n| jjd| d| d |d q
|d! D ]}
|
d" }| jjrd#| j d#|
d$  d#}nd#| j d#|
d"  d#}tjj d%d&d'| d'gd%gd(}|stjj d"d)|gd%gd(}|r(|js||_n||jkr|j | |_|jdd* |j
| n| jjd+| d| d,|d qV|d- rZd|_|jdd* qrW n$   | jjd.| d/|d Y nX d S )0NzPPP-DOC-CREATEzPPP-DOC-EDITzPPP-DOC-PUBLISHzPPP-DOC-TREEMOVEzPPP-OBJ-ORDERr+  zPPP-COM-ADDzPPP-COM-EDIT-OWNzPPP-COM-DELETE-OWNzPPP-COM-DELETE-ALLzPPP-ATT-CREATEzPPP-ATT-DELETE-ALLzPPP-PR-BROWSEzPPP-ATT-DELETE-OWNzPPP-PR-ADMIN)
r#  r$  r%  r&  r'  r(  r)  r*  r+  r,  r3  u8   Не найдено соответствие права T)r0   rh  u    Не найдено право "u	   " для zERR-0059rs  r	   r*  )r)  r   r   u2   В схеме не найдено правило "r  u)   Не нашли пользователя u    для прав zERR-0060r4  r}   r   rw   r   r   r   r:  rj  r   u   Не нашли группу zERR-0061r5  u>   Не удалось импортировать правило zERR-0063)r;   r,   rQ   rR   r:   ZCmfProjectPermPermissionrD  r,  r   r   r*  rh   r+   r2   r6   r   r   r   r(  )r   	perm_dictr-  Zmapping_permrE  r3  rG  Zscheme_ruler   r   r   Z
group_namer   Z	group_objr   r   r   _process_permissions;  s    





z(ConfluenceAPIImport._process_permissionsc              	   C   s   | j  d| jd  }tjj|d}|s:tj|d| jd}| jd  d| jd  |_|jdd	 d }| j	d
}|
 r|d}t|}W 5 Q R X |r| | |dg D ]}| || q||_|jdd	 |S )Nr   rw   )r   T)r   r   r,   r  u?   : Схема проектных прав доступа для r}   r   r9  rK  r=  )r6   r*  r:   ZCmfProjectPermSchemer;   r,   r}   r   r   rb   r   r   r   r   r.  r0  r  )r   Zperm_scheme_ext_idr-  Z	perm_listrH  r   r/  r   r   r   _process_perm_scheme  s,    
z(ConfluenceAPIImport._process_perm_schemec           	      C   s   g }|}|}d}t jjdddgddd|gdd|gggd	d
ddgd}|D ]L}|j | krp|d7 }|d |j | krH|d7 }|d qH|rd	}| jj	dd
| d| d| dtjd	d |||fS )u8  
        Добавляет суффикс 'Wiki' к названию или коду импортируемого проекта,
        если есть существующие НЕ Wiki-проекты с аналогичными названиями или кодами

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

        Returns:
            tuple[str, str, bool]: новые названия и код проекта и флаг добавления суффикса
        Flogic_prefixr   project.wikir  r}   rj  task_code_prefixTr9  r   rh  r   z Wikiu   названиеZWIKIu   кодu   В u    и u9    проекта добавлен суффикс 'Wiki': 'rr  r  r  )r:   r>  r=  r}   r"  rh   r4  upperr,   r1   ri   r\   r!  )	r   r  r   updatedZnew_space_nameZnew_space_key
has_suffixZmatching_projectsZmatching_projectr   r   r   _add_project_suffix  s@    
z'ConfluenceAPIImport._add_project_suffixc           	      C   s  dddd| dgdddgg}t jj|dd|ggd	dd
dgd}|rd}|jrfd|jj d|j d}|d| d7 }| jjd|j d| d| dddd |}d}t jj|dd|ggdd	gdr|d7 }| | }q||kr| jjd| d| dd dd ||fS )!ue  
        Проверяет унакальность названия и кода проекта

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

        Returns:
            space_name, space_key (tuple[str, str]): новые названия и код проекта
        r  r   NOT LIKEr   rf  Nr}   rj  r9  r,   r:  r  u    (импорт z
, ext_id 'z')r  r  u   Проект с именем 'u   ' уже существуетuG   . Импортируемый проект переименован в 'rJ   zERR-0131r>  r%  r   r4  Tr5  r}  u   Проект с кодом 'ug   ' уже существует. Код импортируемого проекта изменен на 'zERR-0132)r:   r>  ro  r,   r0   r   rD  r}   )	r   r  r   r   Zext_id_filterru  Zfrom_importZoriginal_space_keyZcounterr   r   r   _check_project_uniqueness  sD    

z-ConfluenceAPIImport._check_project_uniquenessc              	   C   s2   | j d}|d}t|| _W 5 Q R X d S )Nr#   rK  )r   rb   r   r   r   r  )r   r  r   r   r   r   _load_space_meta,  s    z$ConfluenceAPIImport._load_space_metac              	   C   s2   | j d}|d}t|| _W 5 Q R X d S )Nr]  rK  )r   rb   r   r   r   r*  )r   r^  r   r   r   r   _load_space_data1  s    z$ConfluenceAPIImport._load_space_datac              	   C   s2   | j d}|d}t|| _W 5 Q R X d S )Nr  rK  )r   rb   r   r   r   rs  )r   r  r   r   r   r   _load_all_content_meta6  s    z*ConfluenceAPIImport._load_all_content_metac              	   C   s2   | j d}|d}t|| _W 5 Q R X d S )Nr  rK  )r   rb   r   r   r   r  )r   r  r   r   r   r   _load_parent_to_children;  s    z,ConfluenceAPIImport._load_parent_to_childrenc                 C   s   | j dr | j d }d|d< n| jj| j d | j d D ]`}z| |}|rZW  qW q@ tk
r } z$| jj| j d| d|  W 5 d }~X Y q@X q@tdd	|d< |S )
Nr  F	from_rootu   У пространсва не установлена домашняя страница. Сведения о создателе и дате создания пространства будут взяты из первой корневой страницы.r  uB    Не найден дамп корневой страницы [ID:z]. u>   Не найдены дампы корневых страницT)	r*  r;   r,   rQ   rR   r  r  r   r  )r   r  Zroot_page_idrI  r   r   r   _get_space_homepage@  s$    




z'ConfluenceAPIImport._get_space_homepagec                 C   s  i }| j | jd ||d< | jd }| jd dkrD|d7 }d|d< ||d< |d	 d
 }| j j| j d|  |d dkrtj|d< n| || j	 |d< |d	 
d}|r| j j| j d|  |d dkrtj|d< n| || j	 |d< n|d |d< |d	 d d }| j j| j d|  |d dkrHtj|d< n| || j	 |d< |d	 d |d< |d	 d d |d< |S )Nr  r4  r}   r8  Zpersonalu(    (Личное пространство)u%   Личное пространствоdescriptionr  r  u/    Автор домашней страницы: r5  rS  r  u5    Владелец домашней страницы: rP  r  r  u&    Последний редактор: rT  rE  rR  r  rU  )r,   Zget_correct_keyr*  rQ   r   r  r{   rQ  r   r3   r;   )r   project_ext_idr  project_datar  r  r  r  r   r   r   _prepare_project_data^  s<    
z)ConfluenceAPIImport._prepare_project_datac                 C   s   t jjddd| dgt| dddg d}|r|jdkrJd	| }n |jd
krjd| d|d  d}| jj| j d| dd |S )Nr   r   r   r2  r4  r  r:  r3  uI   Найден ранее импортированный Wiki-проект project.agileu    Найден Agile-проект u_    с импортированным в раздел 'Документы' Wiki-проектом 'r}   rJ   r  Tr5  )	r:   r>  r;   r   keysr2  r,   r1   r  )r   rC  rD  ru  log_msgr   r   r   _get_imported_project  s     


z)ConfluenceAPIImport._get_imported_projectc                 C   s  | j dkrltjjdd}tj|||| jdd}| j dkrLd|_d| d	}qd
|_d|_d|_d| d}n| j dkrtjjdddgddd|gdd|gggdddgd}|r|j	 d| |_	|j
dd t  ntdd| d| }ntd| j  | jj| j d| dd |S )N)project_wikiZwikizproject.wiki:defaultr/   T)r  r}   r   r,   r   rK  ru  u3   Создание нового Wiki-проекта 'rJ   sectionzCmfWiki:Classu,   Создание нового раздел 'u-   ' в портале 'Моя компания'r2  r   rF  r  r4  rj  r}   r   r:  r   r   u   Не найден Agile-проект для объединения. Создайте или импортируйте одноименный Agile-проект и повторите импорт проектаu"   Импорт Wiki-проекта 'u;   'в раздел 'Документы' Agile-проекта u8   Неизвестный тип опции импорта r  rG  )r   r:   ZCmfLogicTyper;   r>  r,   Zproject_typeru  tree_parent_idr   r   r  r  r1   r  )r   rC  project_keyproject_namer  ru  rI  r   r   r   _create_project  sR    


z#ConfluenceAPIImport._create_projectc                 C   s  |j dkr"|jr|d }|d }| jjjd}t|joF|jjd}|sR|rn| ||\}}}|| j	d< | 
|||\}}||d< ||d< | j	|d< |  }	|	r|	|d< |D ]}
t||
||
  q|jjr| |_|  |d s| || n"| jj| j d	| d
tjdd || _nf|j dkrtjjdd|jgdddggdgd}|sftd| |jr| j	|_|jdd || _|S )Nr3  r}   r4  
add_suffixr8  r  Zproject_perm_schemer@  u#    Настройки проекта u    были изменены пользователем. Изменения из импорта не будут примененыTr  rF  rM  r      Документыr   r:  uL   Не найден раздел 'Документы' в Agile-проекте r   )r2  r   r,   r8   r   r;   rW   r  r9  r*  r;  r1  r  r}   r   Zgen_coder0   r   r   r1   r  r\   r!  r  r:   r'   rw   r  )r   ru  rD  rC  homepage_datarO  r4  rQ  r8  r-  r  
doc_folderr   r   r   _update_project  sj    




z#ConfluenceAPIImport._update_projectc                 C   s   t jjdd|jgdddggd}|jdkr|t jj|dd}|rJ|jd	d
 t jj|dd}|rj|jd	d
 |r|jd	d
 n*|jdkrt jj|dd}|r|jd	d
 d S )NrM  r   r}   rR  r   r3  u   Документ1)rX  r}   T)ZTEXKOM_db_deleteu   Документ2rF  )r:   r'   r;   rw   r2  r.  )r   ru  rT  Zdoc1Zdoc2r   r   r   _delete_demo_data$  s$    


z%ConfluenceAPIImport._delete_demo_datac                 C   sT   |j dkrP|dg |jj}|d s<| j d|d  |_| j|_|jdd d S )Nr3  r  r@  r   rw   Tr   )r2  r;  r  r   r6   r   r,   r   )r   ru  r  r  r   r   r    _link_homepage_to_descr_document<  s    
z4ConfluenceAPIImport._link_homepage_to_descr_documentc                 C   s   d| j  d| jd  d}|  }| ||}|d }|d }| ||}|sb| |||}d}nd}| ||||}|r| | | || t	  |S )Nr   rw   r4  r}   TF)
r6   r*  rA  rE  rJ  rP  rU  rV  rW  r  )r   rC  rS  rD  rN  rO  ru  Zis_new_projectr   r   r   _get_or_create_projectE  s     
z*ConfluenceAPIImport._get_or_create_projectc              	   C   sz   | j rh| jj| j d | j dkr,d}nd| j  d}| | j d|  | d W 5 Q R X n| jjd d S )	Nu    Для настройки обработки количества версий документов, установите значение параметра IMPORT_CONFLUENCE_PROC_LAST_PAGE_VER в configr   u=   Обработка всех версий документовu&   Обработка последних u"    версий документовr  rs   u{   Обработка версий документов отключена в config: IMPORT_CONFLUENCE_PROC_LAST_PAGE_VER = 0)rY   r,   rQ   rR   r  r   r  )r   Zlog_num_verr   r   r   _run_version_processing_  s    

z+ConfluenceAPIImport._run_version_processingc                 C   s  | j d d d | _| jD ]}| j r0 q|| _|d }|d }|dpV|d }d| d| d	| _z*| jj	| j d
| d | j
|| _| jd| _|   |   |   | | j d |  | _W 5 Q R X | | j d |   W 5 Q R X | | j d | d W 5 Q R X | | j d | |d d }W 5 Q R X | | j d | | W 5 Q R X |   W q tk
r } z*| jj| j d| d| dddd W 5 d }~X Y qX qd S )Nr   r   rw   r  r  r}   r  r  r  u(    Импорт пространства 'rJ   r  u5    Создание/Обновление проектаu)    Создание тегов (меток)u(    Обработка документовr)   uM    Подготовка данных для создания структурыr  r  u9    Создание структуры документовu7    Ошибка импорта пространства 'r  zERR-0032r>  Tr  )r9   r   r  r,   r  r  r;   r  rQ   r   rc   rb   r   r   r=  r>  r?  r   rX  ru  _process_project_tagsr  r!  r&  rY  r   rD  )r   r  r  r   r  r  rI  r   r   r   _process_spacesr  sD    
z#ConfluenceAPIImport._process_spacesc                 C   s  ddl m} i }|  D ]B}| j r, d S |d d d D ]}|d |kr<|||d < q<q| D ]}| j rz d S |d }|d }z(|dd	d
d}|ddddd	d}||ddd}	d| j d| d}
tj	j
ddd|
 dgdgd}|sFddd|gddd| dgddd|	 dgg}tj	j
|dgd}|s`tj	|| jd|
d}|jsp|
|_n|
|jkr|j |
 |_||_||_|jr|jdd t  W qd tk
r  } z,| jjd | d!| d"| d#| jdd$ W 5 d }~X Y qdX qdd S )%Nr   r  rq   r  r   rw   r}   r  r;  r  r  r  z\\r   z\%z\_r  Tr  r   r   r   r	   r:  r  rj  r  r8  rl  )r}   r,   r   r   r   u+   Не удалось создать тег 'rr  z). zERR-0022rN  )r  r  r  r,   r  r   r   r6   r:   r  r;   r   r}   r  r   r   r  r   rD  ru  )r   r  r  r   r  Ztag_idZtag_namer}   Z
name_iliker  r   Ztag_objZ
tag_filterrI  r   r   r   rZ    sv    

    
z)ConfluenceAPIImport._process_project_tagsc              
   c   sJ   | j d}t|D ].}t||dd}t|V  W 5 Q R X qd S )Nr4  r]  rK  )r4   rb   r   listdirr   r   r   )r   r#  Zgroup_idr   r   r   r   _get_groups  s    zConfluenceAPIImport._get_groupsc              
   c   sF   | d}t|D ],}t| |d}t|V  W 5 Q R X qd S )Nr  rK  )rb   r   r\  r   r   r   )r   Z
group_pathZ	user_pathr  r   r   r   r   _get_group_members  s    
z&ConfluenceAPIImport._get_group_members)r  r   c              	   C   sj  |s|r| j jd|  |d}|sx| 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 d
|| j  d
}d}|d dd}	t	|	dkr|	d |d< d|d< d|d< nbt	|	dkr |	d |d< |	d |d< d|d< n2t	|	dkrR|	d |d< |	d |d< |	d |d< ddg}
tjjddd| dg|
d}|r|jjd
| j d
dkr|r| j jd| d|j  td
| j dd|jj|_|jdd d }n"| j jd| d|j d d!d"d# |sd$dd%d&| j d'gdd(d gg}tjjd)d*|d g|g|
d}|stjjdd*|d g|g|
d}t	|dkr| j jd+|d  d,t	| d!d"d# g }|sd-d*|d- g|g}tjj||
d}|sd$g}t|	t	|	D ]}t	|	dkrdd*|d g}nnt	|	dkrF|dd*|d gdd*|d gg n<t	|	dkr|dd*|d gdd*|d gdd*|d gg q||g}tjj||
d}t	|dkr| j jd.|d-  d,t	| d!d"d# |r|d }d}|s|rd}d}|d }tjjd)d*|  g|
drf| j !d/| d0t"j# |d d\}}| d1| d| }|d7 }q | j !d2|  tj||| j dd3}nd |fS |rb|j$s|j%r|D ]}t&||||  q|'ddd4g |jr||jkr|j | |_n||_tj() }tj(* }||j+kr0|j+| ||j+krH|j+| d|_,|j-rb|jdd ||fS )5Nu2   Обрабатываем пользователя r   u8   Не указан Email для пользователя r}  r!  @Z
operationsT)r}   r   Zdoes_not_workr   Fr  rO  r   	last_namer  Z
first_nameZsecond_name   r	   rg_member_ofr   r   r   r:  u    ext_id пользователя uN    содержит несколько ID из одного источника: z::.+?::r   uP   Возможно найден некорректный пользователь ud   ,так как ext_id содержит несколько ID из одного источника: 'uq   '.Необходимо повторно импортировать локальных пользователей.zERR-0004r   r%  r  r:  rh  ri  r   loginrj  u+   Пользователей с почтой z > r}   u+   Пользователей с именем uQ   Обнаружена учетная запись с дублирующим email u   , добавляем цифру+u1   Создадим пользователя ext_id=)r   rc  r,   r   
user_local).r,   rQ   r   r;   warnZcmfr   ZCmfEmailZ
max_lengthr  rN   
ORG_DOMAINr  Ztranslit_stripr  rW   r6   r3   r   r:   ry   r   r   r<  rR   r   r  r   rD  r   r   rh   r"  r1   r\   r!  r   r  r  r;  r   Zconfluence_group
user_grouprb  re  r   )r   r  r-  r   r   Zmax_lenZ	user_dictr   
is_createdZ	full_namer   r   Znot_source_hash_filterZpersonsr   Z
name_combonrc  Zprefix_emaildomainr  Z
conf_grouprh  r   r   r   _process_person  s   
"


$ 
  

z#ConfluenceAPIImport._process_personc           	   	   C   s   | j jjdds(| j jdtjd d S t }| dD ]r}| j 	dd | j 
 r\ d S | |\}}|jr||jdd |r|jjtjs||jj |d	g D ]}d
}| jjrd}d| j d||  d}tjjddd| dgdgd}|stjjd
d|d
 gdgd}|s:tj|| j |d
 d|d}n|jrL|d
 |_|js\||_n||jkrx|j | |_|jdd |j| q|jr|jdd t  q8|r| j jjddr| j jdt | d|  t!tj"j#t$|gd d S )Nr  TuA   Не грузим пользователей из-за опцийr   r  r   rB  r   r4  r}   rw   r   r   r   r   r	   r:  r   r   r,   r}   r   r  send_invitesu,   Отправляем приглашения u    пользователям: )r  )%r,   r8   r   r;   r1   r\   r!  rS  r   r  r  rl  r   r   r   rV  rN   rg  rX  r+   r2   r6   r:   r   r   r}   r   rb  rh   r  rQ   r   r  Zschedule_deferred_jobry   Zregister_personsr   )	r   rn  r  r   ri  r   r  r   r   r   r   r   _process_persons  sP    
  
z$ConfluenceAPIImport._process_personsc                 C   s@  |   D ]0}d}| jjrd}d| j d||  d}tjjddd| dgdgd}|svtjjdd	|d gdgd}|stj|| j|d d
|d}n|jr|d |_	|j
s||_
n||j
kr|j
 | |_
|jd
d t  | | jd|| D ]:}| |d\}}|sq|j| |jr|jd
d qt  qd S )Nr}   rw   r   r   r   r   r	   r:  r   Trm  r   r4  F)r]  r+   r2   r6   r:   r   r;   r,   r   r}   r   r   r  r^  r4   rb   rl  rb  rh   r   )r   r   r  r   r   r  r   r;  r   r   r   _process_groups  s:      

z#ConfluenceAPIImport._process_groupsc                 C   s  t tdd}|s"| jjd dS | jjd t }t }t	j
jdddgd	d
dgdddggddddgd}|D ]@}d|j d|j d}|jjd}|sqr|jjdpi }|dpd}	z| jd | jd|  |||	\}
}|
|_tj|dd|_|jdd | jd|  | jd|
  | jd|  |jD ]}| jj| qPW qr tk
r } z*| jjd | d!| d"| d#d$dd% W 5 d}~X Y qrX qrt | }| jjd&|d'd( dS ))u   
        Пост обработка JQL в фильтрах задач макроса "Результаты фильтра"
        ZIMPORT_CONVERT_JQLTu   Конвертация JQL в фильтрах отключена. Для включения, измените значение параметра 'IMPORT_CONVERT_JQL'Nuj   Обработка JQL в фильтрах задач макроса 'Результаты фильтра'r  r   z%"jqlQuery":"%r,   r   r   r   ubqlr  r}   r:  r8  z" (r  r  rh  r6   r   2--------------------------------------------------u   ФИЛЬТР: Frg  r   zJQL:	zUBQL:	zBQL:	u   Фильтр u0   : ошибка преобразования JQL r~   zERR-0066r  )r@  r  uC   Обработка JQL в фильтрах выполнена за r  r  )rM   rN   r,   rQ   rR   r   r   r   process_timer:   r  r   r}   r0   r  r   r;   r1   Zget_modifiedrq  r   r   r  r   r4  r   rD  )r   Zconvert_jqlZjqlt1Ztask_filtersZtask_filterZ
filter_msgrc  rh  r6   rq  r  r  rI  t2r   r   r   _process_jql_in_filters  s\    


z+ConfluenceAPIImport._process_jql_in_filtersc              	   C   sZ   t | j\}}}|| d }|d }|d }| jjd|dd|dd|dd d S )Nd   i   @u-   Свободно места на диске: r0  u	    GB из z GB (z%))r  
disk_usager4   r,   rQ   r   )r   r  usedfreeZfree_percentZfree_gbZtotal_gbr   r   r   _check_disk_space  s    z%ConfluenceAPIImport._check_disk_spacec                 C   s,   t dd | dD }| jjd|d d S )Nc                 s   s   | ]
}d V  qdS r  r   r:  r   r   r   r     s     z3ConfluenceAPIImport._count_users.<locals>.<genexpr>r  r   r   )r  r   r,   r  )r   r<  r   r   r   _count_users  s    z ConfluenceAPIImport._count_usersc           
      C   sr  | j D ]d}|d }|d }|dp,|d }d| d| d}zz| j|}| s^tdd	| j d	| d	}tjj	d
dd| dgdgd}|std| j
j| d| d W nJ tk
r }	 z*| j
j| d| d|	  W Y qW 5 d }	~	X Y nX tjsqz| j
j|| j
jd W q tk
rj }	 z"| j
j| d| d|	  W 5 d }	~	X Y qX qd S )Nrw   r  r  r}   r  r  r  us   Отсутствует каталог дампа: вероятно, ошибки при создании дампаr   r   r   r   r9  r:  u%   Проект не был созданu6    Импортировано пространство 'rJ   u=    Импорт выбранного пространства 'u   ' не выполнен. )rQ   uD    Не удалось создать отчет по проекту 'r  )r  r;   rc   rb   r   r   r6   r:   r>  ro  r,   rQ   r   r  rN   ZIMPORT_COLLECT_STATSZproject_stats)
r   ru   r  r   r  r  r   rC  ru  rI  r   r   r   _check_import_selected_spaces  s<    z1ConfluenceAPIImport._check_import_selected_spacesc              	   C   s   |    | j& |   |   |   |   W 5 Q R X |   |   |   | 	  | j
jjddrx| j
  n| j
jd t  | j
d |   dS )u-   
        Запуск импорта
        Zprocess_linksTu2   Отключена обработка ссылокrr  N)r{  r+   r(  r+  r,  r@  r|  ro  r[  rv  r,   r8   r   r;   Zprocess_cross_linksrQ   rR   r  r1   r}  r   r   r   r   process_importF  s     z"ConfluenceAPIImport.process_importc                 C   s<   |j dtdids*|jdks*| dr8||  |S )uS   
        Из документов MS создаем наши превью
        r.  Z
backgroundr  r  )r   r   compiler}   r  Zcreate_preview_tag)r   r   rd  r   r   r   _create_previewd  s    *z#ConfluenceAPIImport._create_previewc           !      C   s  t j| jj}|dd D ]}zF|jdr8W q|drT|dd	 }n|dd	 }|slW qt j|}|j
r|j
| jjkr|j|jsW q|jr|jdsW q|js|j
rW q| jjd|j d	|  d }	|j|d
}
|drX|drX|
rXt j|
ddd}|rF| jjd|  W q|j d| }	nd|kr|dd dd }| |}|s| jjd|  W q|j}	nrd|krtd|}|r|d}|st j|d}|r| |}|s| jjd|  W q|j}	|	r`|	|jd< ||jd< d|jd< | jjd| d|	 d W q|
r|
dr|
ddkr|
d|d< |
d |d < |
d|d< W q|}t j|dd dd }|}|jd!}|jd"kr>|r>||jd#d kr>t| j j!" d$ }t| j j!" d% }| j#$d&|d'|d(}| j% d#| }t&j'j|d)gd*}|rt|}|( s|r| j#$d&t|j)j!d$ d'|d(}|( s| jj*d+| d,| d-| d.| d/	d0|d1 W qt&j+j,d%d2|gd3d4| d5gd6d2dggd7d8d9gd:}|rt-|j( rt&j.j||d;}|st&j.||| jdd<}|j!r|j!d=r|j!d= }|d>|_/|d?r|d? d@ dAkr| |d? | j0 |_1nt2j3|_1|j1|_4|j5ddB t6t-|jdC,}|j7|8 ddDdE d|_9|j5ddB W 5 Q R X n*| jj*dF| dG| dH| ddI|d1 W qt&j.j|dJdKdLg|dM}|r |dr@|jd |jdN< |jj:|jd< d|jd< |dOr|jdO |jdP< |jdO= t;<|jd dd }|r|d r|d dQrdQ|_=dR|jdR< dS|jdT< dS|jdU< n,|r4|d r@|d dVs@| >|| |dr|jd |jd< |jj:|jd< d|jd< t;<|jd dd \}}|r|dQrdQ|_=dR|jdR< dS|jdT< dS|jdU< |?dW}|jd |jd< ||jd@< |@| n| >|| | jjdX|j  W qn.|jddkrN| jj*dY| dZ|d1 W q| jjd|j d[|  W q tAk
r }  z| jj*d\|  d]|d1 W 5 d } ~ X Y qX qd S )^Nc                 S   s   |  dp|  dS r   r   r   r   r   r   r   o  r   z4ConfluenceAPIImport._convert_links.<locals>.<lambda>r<  r   r  r   r   z[CODE:u#   ] Обработка ссылки: )r   r  zdata-anchoru1   Не найден якорь для ссылки z##z/people/r   r   r   r   u?   Пользователь не найден для ссылки z
/display/~r   zdata-usernamer}  Z	href_origTu   Заменили 'u   ' на 'rJ   data-linked-resource-typer1  zdata-linked-resource-idz!data-linked-resource-container-idr'   r   r  r}   r_   r  r  zparent.import_raw_jsonrC  u   Документ ID u)    с каталогом вложений 'u<   ' не найден в дампе пространства 'rr  u~   ). Возможно он находится в пространстве, которое еще не импортированоzERR-0005r  rf  r   r   ri  r  r9  r   r  r:  r  ro  rs   r  r  r8  r5  r   rp  Frq  u   Не найден файл '   ' страницы ID r1  zERR-0006r   rn  rm  )r}   r   r   Zsrc_origZsrcsetZsrcset_origZvideoZcontrolsr  r  r  Zimagesourceu   Заменили на u%   Не найдено вложение zERR-0007u*   ] Не обработана ссылка: u.   Ошибка обработки ссылки: zERR-0008)Br   r   r   r+   r   r   r   r;   r   rn  hostnamer   r   r   r,   rQ   r   r0   r   r  lstriprR   r   r   r   r   r   r   r   r  r   r   r  r  r   r4   rb   r6   r:   r'   r   r   rD  r  ro  r   ri  rR  r3   rS  r{   rQ  rP  r   r   rv  r   r   r   r  r  r}   r  r
  rh   r   )!r   r   rY  rZ  Zmake_previewr  r   r   r  Znew_urlZraw_tagZanchor_nameZ
account_idr   r  Z	user_nameZattach_parentr}   r  Zresource_container_idr   r  r^  Zresource_ext_idZdoc_with_attachZdownloaded_fileZ
attach_objrz  r   r	  r  r  rI  r   r   r   rW  l  s   








 
	

 

 





 z"ConfluenceAPIImport._convert_linksc                 C   s   i }| dD ]6}|jrd}t||j}|D ]\}}| ||< q.q|j dddidD ]F}|d }||krX|| }	d|	 }
|dd d	|
 d
|d< qXdS )ub   
        Добавляет стиль цвета для текста в Confluence Cloud
        r.  z5\[data-colorid=([^\]]+)\]\s*\{\s*color:\s*([^;\}\n]+)spanzdata-coloridTr  zcolor: r  ; ;N)r   stringr   findallrn  r;   r  )r   rY  Zcolor_rulesZ	style_tagpatternmatchesZcoloridZcolor_valuer  r  Z
text_colorr   r   r   r  [  s    
z'ConfluenceAPIImport._convert_text_colorc              8      s8  dddgddddddgddd	d	d
dgddddgddddgddddgddddddddgdddddgddddddgdddd dd!gdd"d#d#gdd$d%d%gdd&d'd'gdd(d)d)d*d+gdd,d-d-d.gdd/d0d0gdd1d2d2gdd3d4d4gdd5d6d6gdd7d8d8d9gdd:d;d;gdd<d=d=gdd>d?d?gdd@dAdAdBgddCdDdDgddEdFdGdFdHdIgddJdKdKgddLdMdNdMdOdPgddQdRdRdSgddTdUdUdVdWdXgddYdZdZd[d\d]gdd^d_d_gdd`dadagddbdcdcddgddedfdgdfgddhdidigddjdkdkdldmgddndodogddpdqdqgddrdsdtdudsgddvdwdwdxdygddzd{d{gdd|d}d}d~gddddddddddddddgddddgdddddgdddddgdddddgdddddgddddgdddddgdddddgdddddgdg5}|j dddidD ],}|d}|r,|jdd|idnd}|sF|jddid}|sPqi }| dD ]\}|d}	|jr~|j nd |	dkrt fdd|D ddi}
|
d   ||	< q^d}|d}|r|jrt|j}tdd}|j	ddd|dd id}|	d}||_|
| || qdS )uF   
        Конвертирует "Фрагмент кода"
        ZABAPZabap)r}   r   r  ZActionScriptZactionscriptZactionscript3asZAdaZadaZada95Zada2005ZAppleScriptZapplescriptZArduinoZarduinoZAutoItZautoitZBashZbashr  shZkshZzshCr  ZcppzC#Zcsharpzc#cszC++zc++ZclikeZCSSZcssZClojureZclojureZDiffZdiffZElixirZelixirexZexsZErlangZerlangZerlZFortranZfortranZGoZgoZGraphQLZgraphqlZGroovyZgroovyZHaskellZhaskellZhsZJavajavaZJSONr   ZKotlinZkotlinZ
LiveScriptZ
livescriptzlive-scriptZLuaZluazObjective-CZ
objectiveczobjective-czobj-cZobjcZOCamlZocamlZPascalZpascalZpasZobjectpascalZdelphiZPerlZperlplZPHPZphpZphp3Zphp4Zphp5Z
PowerShellZ
powershellZposhZps1Zpsm1ZPrologZprologZPuppetZpuppetPythonpythonpyZQMLZqmlZqbsRrK  ZRacketZracketZrktZlispZJSXZjsxZTSXZtsxZreSTrestZrestructuredtextZrstZRubyZrubyrp  ZdubyZRustZrustZSchemer   ZscmZSQLZsqlZ
postgresqlZpostgresZplpgsqlZpsqlzpostgresql-consolezpostgres-consoleZtsqlzt-sqlZmysqlZsqliteZTclZtclZ
TypescriptZ
typescripttsZ
JavaScriptZ
javascriptZjsZValaZvalaZvapiZVerilogZverilogr  ZVHDLZvhdlzVisual Basiczvisual-basicZvisualbasicZYAMLZyamlZymlzHTML/XMLZmarkuprM  Zxmlr  r  r0   r  r  ra  r  Nr  r  languagec                 3   s   | ]} |d  kr|V  qdS )r  Nr   )r   langr  r   r   r     s      z4ConfluenceAPIImport._convert_code.<locals>.<genexpr>r   r%  r  zac:plain-text-bodyr~  Zfeaturesprer_  z	language-)r   r;   r   r   rn  r  r  r   r   r
  rh   r  )r   rY  r  Zsupported_languagesZ
code_macror>  r  r  r  r  Zsupported_languagert  Z	cdata_tagnew_soupZpre_tagZcode_tagr   r  r   r  o  s   



    







z!ConfluenceAPIImport._convert_codec           '      C   s6  dddddd}dddd	d
dddddddddddddddddddddddddddddddddddddddddddddd}ddd}d d! }| |}|D ]v}d"}	d"}
d"}|j}|d#krB|d$}||}|d%}
|d&}i }| d'D ].}|d$}|jr0|j nd"}|||< qnb|d(krd)}i }| d*D ].}|d+}|jr||j nd"}|||< q\|d,}
|d-}nq|
r|jd.d/|
id0}	|	s|r|jd.d1|id0}	|	s|jd2|id0}	|	sqtd3d4}|jd.d5d6|d7d0}|jd.d8d6d9d0}|jd.d:d;id0}|dkr<|d<}|r|d=r|t	d=d" }|||}||}|jd>|d? d0}|jd@|dA d0}|
| |
| n,|dB}dCdD |D } dE| }|
| |dF}!|!r*dG|! }"|dHdE dI|" dJ|dH< |	jd:dKid0}#n|dLd6kr||}|jd>|d? d0}|jd@|dA d0}|
| |
| |d#kr|	jd:dMid0}#n|d(kr|	jd:dKid0}#|dN}$|$r|dO}%|dP}&t|$|&_|%
|& |
|% ||#j |
| |
| |	| qd"S )Qu9   
        Конвертирует "Панель"
        r   successrR   r  Zcustomr   ZtipnoterR   panelZ20z	0 0 24 24)r  r  viewboxzM12,24A12,12,0,1,0,0,12,12.013,12.013,0,0,0,12,24ZM12,5a1.5,1.5,0,1,1-1.5,1.5A1.5,1.5,0,0,1,12,5Zm-1,5h1a2,2,0,0,1,2,2v6a1,1,0,0,1-2,0V12H11a1,1,0,0,1,0-2Zzrgb(1,82,204))dfill)	svg_attrs
path_attrszLayer 1)r  r  r  z	data-namea  m19 3.022c0-.008 0-.014 0-.022v-2a1 1 0 0 0 -2 0v1.1a5 5 0 0 0 -1-.1h-1v-1a1 1 0 0 0 -2 0v1h-2v-1a1 1 0 0 0 -2 0v1h-1a5 5 0 0 0 -1 .1v-1.1a1 1 0 0 0 -2 0v2 .022a4.979 4.979 0 0 0 -2 3.978v12a5.006 5.006 0 0 0 5 5h8a5.006 5.006 0 0 0 5-5v-12a4.979 4.979 0 0 0 -2-3.978zm-7 13.978h-4a1 1 0 0 1 0-2h4a1 1 0 0 1 0 2zm4-4h-8a1 1 0 0 1 0-2h8a1 1 0 0 1 0 2zm0-4h-8a1 1 0 0 1 0-2h8a1 1 0 0 1 0 2zz#5243aaz0 0 1000 1000Z0pxZpreserve)r  r  r  rI  yz	xml:spacea9  M500,990c270.6,0,490-219.4,490-490S770.6,10,500,10S10,229.4,10,500S229.4,990,500,990z M483.7,678c-0.4,0.4-0.7,0.8-1.1,1.2c-19.1,19.1-50.2,19.1-69.3,0L239.9,505.9c-19.1-19.1-19.1-50.1,0-69.3c19.1-19.1,50.2-19.1,69.3,0l138.7,138.7L695,328.1c19.1-19.1,50.2-19.1,69.3,0c19.1,19.1,19.1,50.2,0,69.3L483.7,678L483.7,678zz#01875az0 0 554.2 554.199a!  M538.5,386.199L356.5,70.8c-16.4-28.4-46.7-45.9-79.501-45.9c-32.8,0-63.1,17.5-79.5,45.9L12.3,391.6   c-16.4,28.4-16.4,63.4,0,91.8C28.7,511.8,59,529.3,91.8,529.3H462.2c0.101,0,0.2,0,0.2,0c50.7,0,91.8-41.101,91.8-91.8   C554.2,418.5,548.4,400.8,538.5,386.199z M316.3,416.899c0,21.7-16.7,38.3-39.2,38.3s-39.2-16.6-39.2-38.3V416   c0-21.601,16.7-38.301,39.2-38.301S316.3,394.3,316.3,416V416.899z M317.2,158.7L297.8,328.1c-1.3,12.2-9.4,19.8-20.7,19.8   s-19.4-7.7-20.7-19.8L237,158.6c-1.3-13.1,5.801-23,18-23H299.1C311.3,135.7,318.5,145.6,317.2,158.7zzrgb(255,153,32)z0 0 208.891 208.891zM0,170l65.555-65.555L0,38.891L38.891,0l65.555,65.555L170,0l38.891,38.891l-65.555,65.555L208.891,170L170,208.891  l-65.555-65.555l-65.555,65.555L0,170zzrgb(216, 64, 64))r   r  r  rR   r  )Z
check_markZ
cross_markc                 S   s8   d}| j dkr| d|kS | j dkr4| ddkS dS )Nr  r  r  ac:adf-noder8  r  F)r}   r;   )r   Zpanel_namesr   r   r   find_panels  s    

z7ConfluenceAPIImport._convert_panel.<locals>.find_panelsNr  r  zac:local-idr  r  r  r  zac:adf-attributer  zlocal-idz
panel-typera  data-local-idr  r  r  r~  r  zak-editor-panel eva_convertedr#  )r_  contentEditablezdata-panel-typezak-editor-panel__icon)r_  r  r_  z$ak-editor-panel__content mceEditableZpanelIconIdz
atlassian-r	  r  r   r  -c                 S   s   g | ]}|rt t|d qS )   )chrr   r  r   r   r   r<  N  s      z6ConfluenceAPIImport._convert_panel.<locals>.<listcomp>r  ZbgColorzbackground-color: r.  r  r  ZpanelContenticonz!confluence-information-macro-bodyrp  r  Zstrong)r   r}   r;   r   rn  r   r   r
  r   r  rh   r   ri   r  r   r  r
  r  r  )'r   rY  r  Zpanel_typesZpanel_iconsZicon_mapr  Zpanel_macrosZpanel_macror  Zlocal_idr>  Zpanel_elementZ
panel_nameZ
panel_typer  r  r  r  attrZattr_keyZ
attr_valuer  Z	panel_tagZpanel_icon_tagZpanel_content_tagZicon_idZ	icon_typer  Zsvg_tagZpath_tagpartsZ
icon_charsZpanel_colorZbg_colorZcontent_tagZpanel_titleZp_tagZ
strong_tagr   r   r   r    s8   
			D










 








 












z"ConfluenceAPIImport._convert_panelc                 C   s  |j dkrd}nd}| jjd |jddidD ]}z|drR| |d }ntd	t|j	t
|jt
|jt
|jt
|jd
d}t|}||j |jd|d d}	|	r|	|j W q2 tk
r }
 z| jjd| d|d W 5 d}
~
X Y q2X q2dS )u]   
        Упоминания пользователей
        confluence-userlink
        rO  z
                <a cmf_converted="true" class="external" href="{person_href}" rel="noopener" target="_blank" data-macros="mentions" data-mention-type="person" data-object-id="{person_id}">@{person_name}</a>
            u	  
                <span class="macros-panel mentions-macros" contenteditable="false" data-id style="display: inline-flex; flex-direction: column; position: relative;">
                    <span class="extension-container" contenteditable="false" data-id data-layout="default">
                        <span class="extension-title" data-id>
                            @Упоминания <span class="excerpt-title" data-id>| {person_login}</span>
                        </span>
                        <span class="macros-actions" data-id>
                            <span class="macros-delete" data-id>
                                <svg viewbox="0 0 18 18" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                                    <path fill="#222" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                    <path fill="#222" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                    <path fill="#222" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                </svg>
                            </span>
                        </span>
                    </span>
                    <span class="ak-renderer-wrapper" data-id>
                        <a cmf_converted="true" class="external" data-id data-macros="mentions" data-mention-type="person" data-object-id="{person_id}" rel="noopener">
                            <span class="lds-ring" data-id>
                                <span data-id></span>
                                <span data-id></span>
                                <span data-id></span>
                                <span data-id></span>
                            </span>
                        </a>
                    </span>
                </span>
            uH   Конвертируем упоминания пользователейr  userinfor  Zuserkeyu]   Не найдены аттрибуты для определения пользователя)Z	person_idZperson_loginZperson_hrefZperson_namer~  zuser-mentionr   )class_r   uZ   Не удалось преобразовать ссылку на пользователя zERR-0009r  N)r  r,   rQ   r   r   r;   r   r   r   r  r   rw   rc  r   r}   r)  r  r  r   rD  )r   r   rY  rZ  r  r   r   r
  r  r  r  r   r   r   rV  s  s4    


 z%ConfluenceAPIImport._convert_mentionsc           
   
      s   |dkrdS z^|  | |  dd\}}|shtjr: }n ddd| jh} fdd|D }td	| W nb tk
r } zD|r n8| j}| jrd
| nd}	| jj	| d|	 d|dd W 5 d}~X Y nX |S )u  
        Возвращает пользователя по какому-либо идентификатору (id, имя, логин, email и др.).

        Args:
            user_id (str): Идентификатор пользователя для поиска.
            obj (optional): Объект в контексте которого был поиск пользователя. Defaults to None.
            raise_on_error (bool, optional): Вызвать исключение при ошибке поиска
                или вернуть резервного пользователя ('Система' или пользователь по умолчанию).
                Defaults to False.

        Raises:
            Exception: Исключение при ошибке поиска пользователя.

        Returns:
            CmfPerson: Объект пользователя.
        unknownNFr!  r  r   c                    s   i | ]}| kr| | qS r   r   )r   r  r   r   r   r     s       z3ConfluenceAPIImport._get_person.<locals>.<dictcomp>u>   Пользователь не найден в системе: u   по умолчанию u   'Система'u;   . Будет установлен пользователь zERR-0023ry   ru  )
r  rl  rN   DEBUGr3   r   rz   rx   r,   rD  )
r   r  r   rt  r   r;  Z	user_datarH  rI  Z
person_msgr   r  r   r     s.    
zConfluenceAPIImport._get_personc           
   
   C   s   zT|d d d d d }t jj||d}|s>td| d|| ||| W n tk
r } znd	|d d
  d|j d|jd  d}	t|t j	r|	d|j
 d7 }	|	d| 7 }	| jj|	d|p|d W 5 d}~X Y nX dS )u_    Конвертирует макрос Word или Excel через atlas_doc разметку r   rb  macroParamsr}   r   r  r  rJ   r  extensionKeyr  rr  rw   r  r  r~   r  r  N)r:   ri  r;   r   r  r  r}   r  r  r  r  r,   rD  )
r   r   elemr   r   r  r  rd  rI  r"  r   r   r   _convert_msoviewer_in_atlas_doc  s"    &z3ConfluenceAPIImport._convert_msoviewer_in_atlas_doc)r  r   c           0   
   C   s>  t |D ].}|d dkr|jdddddd}d	d
 |jddidD  }g }|jD ]}	|	dkrfqX||	 qXt|d D ]\\}
}|d d }|jd| ddd| ddd}|dd
 ||
 jD  || q~|| 
n.|d dk
rVd }|d 	drX|j
d|d d id}|s| jjd|d d  d|d d   qnNd|d d kr|d d d 	dr|j
d|d d d d d id}|d d d krd!}|j
d|d d id}|
rT|d d d" d# d }d$|kr|d$d%\}}n2t|tjr,|j d& }n|jj d& }|}|d d d" 	d'}|
rTt|dd#j|d t|d(d)t|d(d)d*d+}||j q|d d d,krd-}|j
d|d d id}|
rT|d d d" d# d }|
rTd$|kr|d$d%\}}n2t|tjr6|j d& }n|jj d& }|}t|dd#jt|d(d)t|d(d)d.d+}||j q|d d d/rF|d d d" d0 d }|}tjj	||d1}d2}|sX|d d d" d3 d }| j d4| }tjjd'd5|gd6d7| d8gd9d5d:ggd;d<d=gd>}|rt |j!" rtj||| jd:d?}|jr|j	d@r|jd@ }|	dA|_#|	dBr|dB d dCkr| $|dB | j% |_&nt'j(|_&|j&|_)|j*d:dD t+t |j!dE,}|j,|- d:dFdG d:|_.|j*d:dD W 5 Q R X tjjd'd7| dHgd6d7| d8gd9d5d:ggd;d'd<gd>}|rXt |j!" rX|j/}tjj	d'd5|gdIdJ|ggdK}|stj|||j#|j&|j&| jd:dL}|j*d:dD t+t |j!dE,}|j,|- d:dFdG d:|_.|j*d:dD W 5 Q R X nL| j01dMt2| j3j d& dN|dO} | jj4dP| dQ| dR|  dSdT|dU q|}tjj	dIdJ|gd'd7| dHggdVgd>}dW}dW}!|d d d" 	dr|d d d" d d }|d d d" 	dXr|d d d" dX d }!|j/j5|j6j5||!dY}"|r|j7|"dZ< nd#|"dZ< t|dd#jf |"d+}||j q|d d d[k	r\d\}#t2|j6}$t2|j/}%dF|$|$d]d#d^dFd_}&|d d d" }'|'	r|'	d`rt89|'d` d : |&da< |'	dbr6|'db d }tj;j	|j<|d1}(|(stjj	|dc}(|(rt2|(j6|&dd< t2|(j/}%n| jjde|d   |'	dfrR|'df d |&dg< |'	dhrn|'dh d |&di< |'	djr|'dj d |&dk< |'	dlrd^dddm})|)	|'dl d |&dn< |'	dord'dpdqdr}*|*	|'do d |&ds< |'	dt	rt89|'dt d : |&du< dv=dwdx |'> D }+t|#j|$|%t8j?|&dFdy|+dzdd#d+},||,j n|d d d{k
r|jdd{dd|d}-|jd}dd~id}.|.|d d d" d~ d  |-|. |jdddddd}/|/|d d d" d d  |-|/ ||- nN|d d dk
r.| j@|||d|d n&|d d dkr| j@|||d|d n|d dkr|d d dkr|d d d" 	d'r|d d d" d' d }d}|j
d|d d id}|rt|dd#j|d#=dd
 |jD dd+}||j n| jjd|  |	dr| jA||d ||d qd S )Nr8  ZlayoutSectionra  r#  r5  zmceNonEditable selected)contenteditablezdata-layout-sectionr_  r  c                 S   s,   g | ]$}d |j d krd|j d kr|qS )zfixed-widthr_  r   r  r   r   r   r   r   r<    s     z:ConfluenceAPIImport._convert_atlas_doc.<locals>.<listcomp>r_  ZcolumnLayoutr   rt  r   r  r   zflex-basis: )zdata-column-widthzdata-layout-columnr.  c                 S   s   g | ]}t  |qS r   )r)  r  r   r   r   r<    s     	extensionZlocalIdr  u&   Не удалось найти тег u    для r  ZmacroMetadatarb  ZmacroIdr  r   rG  uU  
                    <div
                        class="macros-panel macros-include-block"
                        contenteditable="false"
                        data-id
                        data-macros="include-excerpt"
                        data-param-excerpt="{excerpt_name}"
                        data-param-pageid=""
                        data-param-pagename="{page_name}"
                        data-param-projectkey="{space_key}"
                    >
                        <div class="extension-container" contenteditable="false" data-id data-layout="default">
                            <span aria-label="Макрос Include. " data-id role="img">
                                <svg xmlns="http://www.w3.org/2000/svg" id="Outline" viewbox="0 0 24 24" width="14" height="14">
                                    <path d="M19.949,5.536,16.465,2.05A6.958,6.958,0,0,0,11.515,0H7A5.006,5.006,0,0,0,2,5V19a5.006,5.006,0,0,0,5,5H17a5.006,5.006,0,0,0,5-5V10.485A6.951,6.951,0,0,0,19.949,5.536ZM18.535,6.95A4.983,4.983,0,0,1,19.316,8H15a1,1,0,0,1-1-1V2.684a5.01,5.01,0,0,1,1.051.78ZM20,19a3,3,0,0,1-3,3H7a3,3,0,0,1-3-3V5A3,3,0,0,1,7,2h4.515c.164,0,.323.032.485.047V7a3,3,0,0,0,3,3h4.953c.015.162.047.32.047.485Z"></path>
                                </svg>
                            </span>
                            <span class="extension-title" data-id>Макрос Include. "Вставить выборку" <span class="excerpt-title" data-id>| Имя = {excerpt_name}</span></span>
                            <span class="macros-actions" data-id>
                                <span class="macros-edit" data-id style="margin-right: 7px;">
                                    <svg _ngcontent-aiw-c17="" viewbox="0 0 24 24" class="ng-star-inserted" style="width: 14px; height: 14px; color: #444444;">
                                        <path _ngcontent-aiw-c17="" fill="#444" d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                                    </svg>
                                </span>
                                <span class="macros-delete" data-id>
                                    <svg viewbox="0 0 18 18" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                                        <path fill="#222" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                        <path fill="#222" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                        <path fill="#222" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                    </svg>
                                </span>
                            </span>
                        </div>
                        <div class="ak-renderer-wrapper" data-id></div>
                    </div>
                    r  r  r   r}  r  r}   rI  rJ  rK  r~  rP  u  
                    <div
                        class="macros-panel macros-include-page"
                        contenteditable="false"
                        data-macros="include-page"
                        data-param-pageid=""
                        data-param-page-label="{page_label}"
                        data-param-projectkey="{space_key}"
                        data-rendered="true"
                    >
                        <div data-layout="default" class="extension-container" contenteditable="false">
                            <span role="img" aria-label="Макрос Include. ">
                                <svg xmlns="http://www.w3.org/2000/svg" id="Outline" viewbox="0 0 24 24" width="14" height="14">
                                    <path d="M19.949,5.536,16.465,2.05A6.958,6.958,0,0,0,11.515,0H7A5.006,5.006,0,0,0,2,5V19a5.006,5.006,0,0,0,5,5H17a5.006,5.006,0,0,0,5-5V10.485A6.951,6.951,0,0,0,19.949,5.536ZM18.535,6.95A4.983,4.983,0,0,1,19.316,8H15a1,1,0,0,1-1-1V2.684a5.01,5.01,0,0,1,1.051.78ZM20,19a3,3,0,0,1-3,3H7a3,3,0,0,1-3-3V5A3,3,0,0,1,7,2h4.515c.164,0,.323.032.485.047V7a3,3,0,0,0,3,3h4.953c.015.162.047.32.047.485Z"></path>
                                </svg>
                            </span>
                            <span class="extension-title">Макрос Include. "Вставить страницу" <span class="excerpt-title">| Имя = {page_label}</span></span>
                            <span class="macros-actions">
                                <span class="macros-edit" style="margin-right: 7px;">
                                    <svg _ngcontent-aiw-c17="" viewbox="0 0 24 24" class="ng-star-inserted" style="width: 14px; height: 14px; color: #444444;">
                                        <path _ngcontent-aiw-c17="" fill="#444" d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                                    </svg>
                                </span>
                                <span class="macros-delete">
                                    <svg viewbox="0 0 18 18" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                                        <path fill="#222" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                        <path fill="#222" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                        <path fill="#222" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                    </svg>
                                </span>
                            </span>
                        </div>
                        <div class="ak-renderer-wrapper"></div>
                    </div>
                    rQ  r  ZdiagramNamer  u  
                    <div data-drawio-title="{name}" data-drawio-type="diagram" data-attach-id="{attach_id}" class="drawio-content" contenteditable="false">
                        <div class="header">Диаграмма: "{name}"</div>
                        <div class="content">
                            <img cmf_converted=True src="{img_src}" alt="" data-mce-src="{img_src}" width="{width}" height="{height}">
                        </div>
                    </div>
                    ZpageIdr   rf  r   r   ri  r  Tr9  r   r  r:  ro  rs   r  r  r5  r   rp  Frq  r  r   r   r   )r}   r   rR  rS  rP  r,   r   r_   r  r  u7   Не найден файл Draw.io диаграммы 'r  r1  rJ   zERR-0010r  r   r  r  r  r  rp   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>
                    r$  r%  )r&  r  r4  r'  r]   r(  r)  r  r&  r)   r|   r4  uE   Не удалось обработать тег оглавления r,  r'  r-  r]   r.  r/  r0  r1  r(  r  rR  rU  r2  r3  r  r)  r  c                 s   s$   | ]\}}| d |d  V  qdS )rf  r   Nr   r  r   r   r   r   c  s     z9ConfluenceAPIImport._convert_atlas_doc.<locals>.<genexpr>rg  )r:  r;  r  r!  zpaste-code-macro)r_  r<  r  rp  r  zlanguage-markupr`  )r_  r  zdata-mce-selectedZ__bodyContentr  r  r  ZbodiedExtensionrB  u  
                    <div
                        class="macros-panel macros-excerpt-block"
                        contenteditable="false"
                        data-id
                        data-macros="exceprt"
                        data-param-name="{name}"
                    >
                        <div class="extension-container" contenteditable="false" data-id data-layout="default">
                            <span aria-label="Макрос Include. 'Создать выборку'" data-id role="img">
                                <svg xmlns="http://www.w3.org/2000/svg" id="Outline" viewbox="0 0 24 24" width="14" height="14">
                                    <path d="M19.949,5.536,16.465,2.05A6.958,6.958,0,0,0,11.515,0H7A5.006,5.006,0,0,0,2,5V19a5.006,5.006,0,0,0,5,5H17a5.006,5.006,0,0,0,5-5V10.485A6.951,6.951,0,0,0,19.949,5.536ZM18.535,6.95A4.983,4.983,0,0,1,19.316,8H15a1,1,0,0,1-1-1V2.684a5.01,5.01,0,0,1,1.051.78ZM20,19a3,3,0,0,1-3,3H7a3,3,0,0,1-3-3V5A3,3,0,0,1,7,2h4.515c.164,0,.323.032.485.047V7a3,3,0,0,0,3,3h4.953c.015.162.047.32.047.485Z"></path>
                                </svg>
                            </span>
                            <span class="extension-title" data-id>Макрос Include. 'Создать выборку' <span class="excerpt-title" data-id>| name = {name}</span></span>
                            <span class="macros-actions" data-id>
                                <span class="macros-edit" data-id style="margin-right: 7px;">
                                    <svg _ngcontent-aiw-c17="" viewbox="0 0 24 24" class="ng-star-inserted" style="width: 14px; height: 14px; color: #444444;">
                                        <path _ngcontent-aiw-c17="" fill="#444" d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                                    </svg>
                                </span>
                                <span class="macros-delete" data-id>
                                    <svg viewbox="0 0 18 18" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                                        <path fill="#222" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                        <path fill="#222" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                        <path fill="#222" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                    </svg>
                                </span>
                            </span>
                        </div>
                        <div class="ak-renderer-wrapper" contenteditable="true" data-fabric-macro="null" data-id data-macro-body="">{content}</div>
                    </div>
                    c                 S   s   g | ]}t |qS r   rG  r  r   r   r   r<    s     rE  u   Не нашли тег для )Br  r
  r   popr  rh   r  r
  r  r;   r   r,   rQ   rR   r   r  r:   r>  r  r   r   r   r   r  rM  rN  r  rV  ri  r6   r  ro  r   r   r   rR  r   r3   rS  r{   rQ  rP  r   r   rv  r   r   r}   r4   rb   r   r  rD  r   rw   r   r   r   r"  r'   ru  ri   r  r   r  r  )0r   r   r  r  r  r  Ztag_layout_sectionr   r  r  r  colr  Ztag_layout_colr  Zmacro_paramsr   rL  rF  r   rR  r}   r  rd  r  Z
doc_ext_idr  rz  r   Z
drawio_imgZfile_name_imgr  r  r  r  r  ru  r;  r  r!  Zparent_pager@  rA  Zoriginal_params_strr  Z
code_blockrp  r   r   r   r   r    s   



**%
#

	'


 



*!.
z&ConfluenceAPIImport._convert_atlas_doc  c                 C   sZ  | j jrdnd| jdd| jdd}|| }|d }|d }dt  d	}	t  t  t	  | j
j|	 d
 tjj|ddddgd| _| jjdkrtjjdd|gdddggdgd| _n| j| _| jjj}
| j|
d | _| jd| _tj}| j
j|	 d| d| d t|| jd| _t  | _!t" | _#d| _$zg }t&|D ]R}tj'||j( d| d|id}|)  |*| | j
j+|	 d| d  qb| j
j|	 d!| d" |D ](}|,  | j
j+|	 d| d# qW 5 | j%  X | j
j|	 d$| d%| j$  t-.d& W 5 Q R X W 5 Q R X W 5 Q R X d S )'Nu   документов/папокr  )r}   funcr  r  r}   r  z[PID:r  u    Процесс запущенr2  r  r  z#scheme_wf.default_document_workflowr.  rF  rM  r   rR  r:  r  r  u!    Запуск обработки u    с u    потоками ...r  r   r;  r  r8  u    Поток u    запущенu%    Ожидание обработки z...u    завершенu'    Завершена обработка r   r  )/r+   r2   r  r  r   r  r  r  Zdisable_notifyZensure_recursion_limitr,   rQ   r   r:   r>  r;   ru  r2  r'   r  r  r   rc   rb   r   r   rN   r  r   rZ   r  rD   r  r  r  r  r  r  r  r  r   r   rh   ry  ri   r   r  )r   Z
project_idr  r  r  r  r  r  Z	item_funcZlog_processru   Znum_threadsr  r  r  r   r   r   run_threaded_process  s    





 
"z(ConfluenceAPIImport.run_threaded_process)N)F)N)rl  rL   )TNN)N)N)N)N)N)TT)T)NF)N)NN)r  )r   r   r   r   rW  r  r   r:   Z	CmfImportrG   r=   r>   r?   r@   rA   rB   r   r   r   r   r   r   r   staticmethodr   r  r7   r   r   r   r   r   r  r  r  rJ  r\  r_  rc  ri  ro  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r"  r$  r%  r&  r'  r(  r+  r,  r6  r@  rA  r\  r_  re  rl  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r!  r&  r.  r0  r1  r9  r;  r<  r=  r>  r?  rA  rE  rJ  rP  rU  rV  rW  rX  rY  r[  rZ  r]  r^  rl  ro  rp  rv  r{  r|  r}  r~  r  rW  r  r  r  rV  r   r  r  r  r   r   r   r   r"   3   sR  	#=

A
G #9-^0!90>-9l18(>?G
hM
4
8U"7*Y06a |>LCWn 
 S~i1/PL  T< & 2 3^$g58+<I	0= #)=
' p  6 QD.   -r"   )-r)  r  rM  r  r  r   r  rD   r   r   
contextlibr   enumr   	itertoolsr   pathlibr   typingr   r  Zbs4r   Zcmf.appr   Zcmf.includeZ%common.models.cmf_plugin_import_mixinr
   Zmodules.confluence.apir   Z%modules.confluence.utils.queue_brokerr   r   Zmodules.jira.jql.parserr   r   r   r   r   r   r:   r'   r  r=  r"   r   r   r   r   <module>   s8   	