U
    cc                     @   s   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	m
Z
mZmZ d dlZd dlmZ d dlT d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ ejG dd dZejG dd dZG dd dZdS )    N)parse)urlparse)datetime)DictUnionListOptional)commit_all_ds)*)CmfActiveEntity)ConfluenceApi)CmfPluginImportMixin)BeautifulSoup)ApiNotFoundErrorc                   @   sv   e Zd ZU dZejedZee	e
jf ed< ejedZee	eee	e	f  f ed< ejedZee	e
jf ed< dS )	TotalDatauJ    Данные используемые в процессе импорта default_factoryuserslink_documentsresult_documentsN)__name__
__module____qualname____doc__dataclassesfielddictr   r   strmodels	CmfPerson__annotations__r   r   r   CmfDocument r"   r"   "./modules/confluence/api_import.pyr      s   
(r   c                   @   s@   e Zd ZU dZejed< eed< ej	e
dZeeef ed< dS )DocDatauR    Данные используемые при создании документа documentZdoc_idr   link_attachmentsN)r   r   r   r   r   r!   r    r   r   r   r   r&   r   r"   r"   r"   r#   r$      s   

r$   c                   @   s  e Zd ZdZeejdddZedddZ	e
eedd	d
ZedddZd-ddZd.ddZdd Zdd Zdd ZedddZdd Zd/eedddZedd d!Zd0eeejejf ed"d#d$Zd1d%d&Z d2eee!d'd(d)Z"d3ee#ed*d+d,Z$dS )4ConfluenceAPIImportu;   Класс загрузки объектов через API)
confluence
cmf_importc                 C   s>   || _ || _t | _tjjdd}|j | _	d| _
d| _d S )Nzsystem:defaultcodeFzhistory,body.export_view.webresource,body.storage,body.editor,body.view,body.editor2,body.styled_view,body.atlas_doc_format,body.dynamic,children.page,ancestors,body.plain,body.anonymous_export_view,body.wiki,history.ownedBy,history.lastUpdated)confluence_apir)   r   
total_datar   ZCmfSchemeWfgetZdefault_document_workflowloaddoc_workflow
has_errorsexpand)selfr(   r)   Z	scheme_wfr"   r"   r#   __init__*   s    zConfluenceAPIImport.__init__)returnc                 C   s2   dt tjjt tjjdddg ddd dgS )NZcurrent_user)emailname)r7   fieldsselectedObjects)r7   valueimport_type)r   gZcurrent_personr6   r7   r3   r"   r"   r#   calc_import_settings7   s    
z(ConfluenceAPIImport.calc_import_settings)settingsr5   c                 C   s   dd | D S )uO   Преобразуем список с настройками в словарьc                 S   s   i | ]}|d  |qS r7   r"   ).0sr"   r"   r#   
<dictcomp>@   s      z;ConfluenceAPIImport._normalize_settings.<locals>.<dictcomp>r"   )r?   r"   r"   r#   _normalize_settings=   s    z'ConfluenceAPIImport._normalize_settingsc                 C   s   g S )uo    Для импорта из Confluence предварительный просмотр не требуется r"   r=   r"   r"   r#   previewB   s    zConfluenceAPIImport.previewNc           	   
   C   sr  z&| j  rW dS | j jd|d   | j|||d}t  | || |di di dg }| j jd|d  d	t|  t  |D ]p}| j  r W dS | 	|s| j jd
|d   q| j
j|d | jd}|r| || q| ||j qt  | j jd|d   W nD tk
rl } z$| j jd| d|  d| _W 5 d}~X Y nX dS )uV   Рекурсивно загружаем документы и поддокументыFu%   **** Создаем документ titlefirst_root_docchildrenpageresultsuE   **** Импортируем дочерние документы от u    в количестве: uh   **** Пропускаем документ так как он не помечен для импорта idr2   u'   **** Успешно загрузили u1   Ошибка миграции документа : TN)r)   	is_cancelloggerinfo_create_documentcommit_with_event_process_commentsr.   len	_is_checkr,   Zget_page_by_idr2   _process_documentr%   	Exception	exceptionr1   )	r3   docparent_folderrH   doc_dataZnested_docsZnested_doc_infoZnested_doc_info_extender"   r"   r#   rW   F   s6    
"

z%ConfluenceAPIImport._process_documentc                 C   sZ   |s
| j }|D ]F}|d |d kr.|d   S |dr| ||d }|s|  S qdS )u   
        Проверяем выбор в настройках, если обьекта нет в настройках, значит по умолчанию выбран
        rL   	isCheckedrI   T)selected_spacesr.   rV   )r3   objpagesZsoresr"   r"   r#   rV   i   s    

zConfluenceAPIImport._is_checkc           	      C   s<  | ddd  d }t|j d}t|dkrb|d dkrb|d dkrb|d	 d
krb|d }|S t|d	kr8|d dkr8|\}}}}z |dd}| jj||}W nN tk
r } z0| j	j
d| d| d| d|  W Y d S d }~X Y nX |s| j	j
d| d|  d S | j	j
t| |d }|S )N/r         wiki   Zspaces   ra      Zdisplay+ uC   Ошибка получения документа по pretty url rN   uo   Не смогли получить документ по pretty url (возможно не тот домен): rL   )splitr   pathrU   replacer,   connZget_page_by_titlerX   r)   rP   rY   errorrQ   r   )	r3   urlr+   Zsplitted_url_spacerF   Zfind_confl_docr]   r"   r"   r#   _get_pageid_by_urlx   s6    

z&ConfluenceAPIImport._get_pageid_by_urlc           	      C   s~  d}z.t |jjd}|jddidD ]
}|jdrH| jjd q&|jd }|d	kr| jjd
|jd   | 	|jd }t
jjdd|gdgd}|st
jjdd|gdgd}|st
jjdd|gdgd}|r|jd |jd< |j|jd< d|jd< |jj|jd< q&| jjd| d|jd  d q&|jdddD ]\}| jjt| |jdrz| jjd qB|d }|sqBd|kr| jjd |dd }n
| 	|}|sȐqB|dd }t
jjdd|gdgd}|st
jjdd|gdgd}|s*t
jjdd|gdgd}|r|| jjd|j  |jd |jd< |j|jd< d|jd< |jj|jd< n"| jjd| d|jd  d qB|jdd idD ]$}t
jj|jd! d"jj|jd!< qt|t
jrt||_|jr,|jdd# |  nt||_|jr,|jdd# t  W nD tk
rx } z$| jjd$| d%| d&|  W 5 d}~X Y nX dS )'u   
        Проходимся по всем ссылкам документа и пытаемся преобразовать в наши ссылки на импортированные документы
        Nhtml.parserzdata-linked-resource-typerJ   attrscmf_convertedu   Уже обработалиdata-linked-resource-idZnulluM   В ссылке не указан ид, пытаемся найти по url=hrefext_id==cmf_versionfilterr8   	href_origTzdata-linked-resource-versionu-   Не найден документ с ext_id z (url: uC   ),возможно он не участвовал в импортеa)r{   ZpageIdu   Ищем по pageIdzpageId=rd   ?r   u   Меняем на ссылку classzmacros-include-blockzdata-localidr@   )Z	only_datau+   Ошибка привязки ссылок u    на документы в rN   )r   textr:   find_allrx   r.   r)   rP   rQ   ru   r   r!   
CmfProject	CmfFolderr{   r~   warningr   rm   rL   
isinstance
text_draftZ
is_changedsave
do_approverS   rX   rY   )	r3   objectlinksoupr|   Zref_docr{   tagr]   r"   r"   r#   _convert_links   s    

$


&"



z"ConfluenceAPIImport._convert_linksc                 C   s  | j jd t| j tjddi\}}g }t  d}| j	 D ]d}z| j
|d d d  d }|d	}| j jd
|  |s| j jd|  dttj }t|d d |  dtj }t|d |d |||t|d  d}	tj| j tj|	dd|gd\}
}|rNtj |g|
_|
  |tjsN|| t  |d7 }W q@ tk
r } z&t| d| _| j jd|  W 5 d }~X Y q@X q@| j jd| d |r| j jdt| d|  ttjj |gd d S )Nu'   Грузим пользователейr7   Confluence Usersr   user_linksr3   z&expand=operationsr6   u0   Импортируем пользователя u8   Не указан Email для пользователя @   displayName@	accountId
operations)r|   r7   loginr6   r+   does_not_workr+   r}   Z
filter_objrf   Tu5   Ошибка импорта пользователя u   Импортировали u    пользователяu,   Отправляем приглашения u    пользователям: )args)!r)   rP   rQ   r   process_any_table_fieldsr   CmfPersonGrouprS   r,   Zget_all_usersconfluence_requestjsonr.   warnrU   config
ORG_DOMAINcmfutiltranslit_stripr   boolr   
user_grouprg_member_ofr   endswithappendrX   r	   r1   rY   Zcmf_deferred_taskZregister_persons)r3   r   rs   Zsend_invitesZimportedr   Z	user_infor6   Zmax_lenZ	user_dictpersonis_newr]   r"   r"   r#   _process_users   sT    "
"   

(z"ConfluenceAPIImport._process_usersc                 C   s  |  | jjd }d}|d d d }|d s2dS |   dd |d	 D | _|d r|t|d	 dkr|d
d | j D | _dt| jd  }|d d d dkrdtj	j
ddd}nb|d d d dkrdtj	j
ddd}n8|d d d dkrdddtj	j
ddd}ntd| jD ]}zxz.| jj|d d }| jjd|  |d d krttd!| |d7 }|d" |d"< |d |d#< tj| jtj|d"d$|d" gd%\}}	|	rttjj
d&d'd$|jgd"d$d(ggd)}
|d d d dkrtjj
|
d*d+}|  nd|d d d dks<|d d d dkrttjj
|d*d+}tjj
|
d,d+}|  |  |
  |d d d dkr|}tjj
d&d'd$|jgd"d$d(ggd)}n|}|}tjj
d&d'd$|jgd-d$d.ggd)}t  | jj|d | jd/D ]F}| |sq|}|d0 d1kr"|}| j|||d2 d3}t  q| j rXW W P d4S W nB tk
r } z"d| _ | jj!d5|d   W 5 d3}~X Y nX W 5 | j j|7  _| j  | jjd| jj d t  X q | jjd6 d}d}tjj"d7d8d3gd)}tjj#d7d8d3gd9d:g||| gd;}|s:qz| jjd<t| d=|  ||7 }|D ]}| $| qdqd}d}tjj"d7d8d3gd)}tjj#d7d8d3gd9g||| gd;}|sq| jjd>t| d=|  ||7 }|D ]}| $| qqd}d}tjj"d7d8d3gd)}tjj#d7d8d3gd9g||| gd;}|sJq| jjd?t| d=|  ||7 }|D ]}| $| qtq| j  S )@u   
        Запуск импорта

        :return bool: Истина в случае успешного импорта
        Zimport_settingsr   r9   r:   r^   Tc                 S   s   g | ]}|d  r|qS )r^   r"   )rA   setting_objr"   r"   r#   
<listcomp>$  s      z6ConfluenceAPIImport.process_import.<locals>.<listcomp>rI   c                 S   s   g | ]}d |iqS )r`   r"   rA   r`   r"   r"   r#   r   '  s     d   rf   r;   rL   projectzproject.agile:defaultr*   )project_type
logic_typeZproject_wikizproject.wiki:defaultrg   sectionzCmfWiki:Class)r   Z	parent_idtree_parent_idr   u   Неизвестный типz===================== %r`   keyu0   Импортируем пространство typeZpersonaluY   Миграция персональных пространств в разработке r7   Ztask_code_prefixr}   r   ZANDr   u   Документы)r   u   Документ1)tree_parentr7   u   Документ2Zsys_typearchiverM   statusZarchivedrG   NFu$   Ошибка миграции space u   Импортировали все пространства, теперь преобразуем ссылки на загруженные объектыr)   z!=r   r   )r   r8   sliceu   Документы u    из u   Проекты u   Директории )%rD   r)   Zjson_settingsr   r_   rU   r,   Zget_all_spacesr   ZCmfLogicTyper.   ZCmfErrorZprogressr   rP   rQ   rS   rp   Z	get_spacer   r   r   r   rL   r!   deleteZget_root_pages_from_spacer2   rV   rW   rO   rX   r1   rY   countlistr   )r3   r?   nrootZpercent_stepZproject_fieldsr   rt   r   Zproject_is_newZrm_doc_folderZrm_doc1Zrm_doc2rH   Z
doc_folderZarchive_folderrZ   r[   r]   Z_fromZ_tocntZimported_docsr%   Zimported_projectsZimported_foldersZfolderr"   r"   r#   process_import  s    





 
.



z"ConfluenceAPIImport.process_importc              	   C   sz   d}|j dtdidrv|  |jrvt|ddjf |jj	|jj	dd |j
j	|jj	|jj	d	d
}||j |S )uS   
        Из документов MS создаем наши превью
        au  
        <div contenteditable="false" class="app-tinymce-card-preview app-tinymce-is-preview">
              <a class="app-tinymce-href-preview app-tinymce-is-preview" title="{fileName}"
                rel="{urlPreview}"
                download="{url}" cmf_converted=True>
                <span class="app-tinymce-img-preview-block app-tinymce-is-preview">
                <span class="app-tinymce-img-preview-size app-tinymce-is-preview">
                  <img class="app-tinymce-img-preview app-tinymce-is-preview"
                  src="{urlPreviewImg}" alt="attachment" cmf_converted=True>
                </span>
                </span>
                <span class="app-tinymce-file-preview-block app-tinymce-is-preview">
                      <span class="app-tinymce-file-name-block app-tinymce-is-preview">
                        <span class="app-tinymce-file-name-view app-tinymce-is-preview">{fileName}</span>
                        <span class="app-tinymce-file-name-view app-tinymce-is-preview">{fileName2}</span>
                      </span>
                      <span class="app-tinymce-file-create-view app-tinymce-is-preview display-contents"></span>
                      <svg class="remove-file-icon" style="width:24px;height:24px" viewBox="0 0 24 24">
                          <path style="pointer-events: none;" fill="#e8e8e8" d="M19,3H5A2,2 0 0,0 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5A2,2 0 0,0 19,3M19,19H5V5H19V19M17,8.4L13.4,12L17,15.6L15.6,17L12,13.4L8.4,17L7,15.6L10.6,12L7,8.4L8.4,7L12,10.6L15.6,7L17,8.4Z" />
                      </svg>
                </span>
              </a>
            </div>
            styleZ
backgroundrw   
 Ni)ZfileNameZ	fileName2ZurlPreviewImgZ
urlPreviewrr   rv   )findrecompilemake_previewZurl_previewr   ro   formatr7   r:   Zurl_preview_imgrr   replace_with
currentTag)r3   r   attachTAG_TMPLrB   r"   r"   r#   _create_preview  s    z#ConfluenceAPIImport._create_previewT)r   parentc                 C   sL  t |d}|dd D ](}|jdr@| jjd|  q|drp|jd drp| jjd|  q| jjd	|  d
}|j	D ]}|j
j}|drF|tj|jd krF|jd |jd< |jj|jd< d|jd< t|jd }	|	r<|	d r<|	d dr<d|_
d|jd< d|jd< d|jd< d} q|dr|tj|jd kr|jd |jd< |jj|jd< d|jd< |r| || d} qq|rqd|jddkr|jd dd dd }
| j|
d}|jd |jd< |j|jd< d|jd< qd}|dr.d}|j| }z|dsX| jj | }| jjd|  | jj|dddr}|  d|jd  kr|jd!rtjd"|jd! tjd#d  d$}n tj|dd dd }tj | jt!j"||d%d&d'|gd(d'|ggd)\}}|#  |j$sft%|j&d*$}|j'd+d,D ]}|(| qJW 5 Q R X |j)*  |j| |j| d-< d|jd< |+d.g |jj|j|< |dkr|r| || | jjd/| d0|  W 5 Q R  W qW 5 Q R X t,d1W q t,k
r@ } z| jj-d2| d0|  W 5 d }~X Y qX qt.|S )3Nrv   c                 S   s   |  dp|  dS )Nr{   src)has_attr)r   r"   r"   r#   <lambda>      z4ConfluenceAPIImport._process_links.<locals>.<lambda>ry   u   Уже обработали r{   #u   Это якорь u&   Обрабатываем ссылку Fr   Zsrc_origTr   ZvideoZcontrols100%widthheightr   z/people/r   rc   rd   r   
account_idZhttp    Пытаемся скачать rj   timeoutstreamz	text/htmlzContent-TypezContent-Dispositionzfilename\*?=([^;]+))flags"r7   r   r   r}   r7   r   wb+    Z
chunk_sizeZ_origrr   3   Скачали вложение документа rN   u#   Неизвестная ссылкаu0   Не удалось скачать ссылку )/r   r   rx   r.   r)   rP   rQ   r   
startswithattachmentsr7   r:   urllibr   Zunquote_plusrr   	mimetypesZ
guess_typer   rm   _get_personr{   r,   r   raise_for_statusZheadersr   findall
IGNORECASEstripZunquoter   r   r   CmfAttachment
upload_dirfile_existsopenfull_path_fileiter_contentwritedpcommitload_fieldsrX   r   r   )r3   r   r   r   Z	text_soupr   ry   
attach_obj	file_nameZ	mime_typer   r   r   rr   rb   r   rs   fchunkr]   r"   r"   r#   _process_links  s    
$
 


 


 



.z"ConfluenceAPIImport._process_linksc                 C   s  t |d}|jdtdidD ]}z|jdrF| j|jd d}nH|jdr| j|jd d}|jd	 |jd
< |jd |jd< ntd|jd |jd< |j|jd< d|jd< |j	j
|jd	< |jj
|jd< W q  tk
r } z| jjd| d|  W 5 d}~X Y q X q t|S )u]   
        Упоминания пользователей
        confluence-userlink
        rv   r   zconfluence-userlinkrw   zdata-account-idr   zdata-username)	user_namerz   zdata-linked-resource-id_origzdata-username_origu]   Не найдены аттрибуты для определения пользователяr{   r   Try   uZ   Не удалось преобразовать ссылку на пользователя rN   N)r   r   r   r   rx   r.   r   rX   r{   rL   r:   r   r)   rP   rq   r   )r3   r   doc_soupr   r   r]   r"   r"   r#   _process_mentions8  s$    

.z%ConfluenceAPIImport._process_mentions)rZ   r   r5   c                 C   s  |d d }d|kr$|  |d }n,|d dkr8tj}n| j |d d}t| | jjjrv|  |d d d	 d }n| j |d d d	 d d}|d
 d d }t|d}|r|}	|d |	_nr||d  ||| j	| j	j
t|d d|d d |d d d |d |d
}
tj| jtj|
dd|d gd\}	}| jjjrXt|d
 d d |	_n
d|i|	_|	| jj|d < t|	|d }d}d}|	ddg | jj|d dD ]l}z&|d }tj| jtj||	ddd|	gd d|d ggd\}}|js| jjj|d! d"  }| jjd#|  | jj|d$d%d&V}|  |   t!|j"d'$}|j#d(d)D ]}|$| q^W 5 Q R X |j%&  W 5 Q R X | jjd*|j' d+|  |d,g |jj(|j)|d < |	j*+| W n< t,k
r   d%| _-| jj.d-| d.| d/|  Y nX q|	j/r| 0t1||	}| 2|}| 3||	}|	d0dg |	j4d1krx||	_5|	6  |	7  n||	_8|	6  |S )2u`  
        Создание документа

        :param doc_id: Идентификатор документа.
        :param parent: Родительский объект.
        :param all_docs: Все документы полученные из пространства.
        :param total_data: Данные для импорта.
        history	createdByr   r   Z	anonymoususerKeyuser_keyZlastUpdatedZbybodyviewr:   rv   rL   rF   r   )Zstatus_typecreatedDateZwhen)
r   r7   	cmf_owner
cmf_authorZworkflowr   cmf_created_atcmf_modified_atr|   cmf_modified_byr|   r}   r   Zatlas_doc_formatcontentNzattachments.urlr   )Zpage_idr   r   r7   r   Zdownloadr   rj   Tr   r   r   r   r   rN   rr   u=   Ошибка загрузки вложения download_link=z, attachment=z
, content=r   r!   )9r   r<   anonymous_userprintr,   rp   cloudr   r|   r0   Zget_default_statusr   Zget_status_typer   r)   r   r!   r   loadsimport_raw_jsonr-   r   r$   r   Zget_all_attachmentr   r   rr   rP   rQ   r   r   r   r   r   r   r   r   r   r%   r:   r&   r   r   rX   r1   rY   import_original_convert_atlas_docr   r  r  
class_namer   r   r   r   )r3   rZ   r   rH   ownerZdoc_userr  r  r  Zdoc_objZdoc_dictZ
doc_is_newr\   Zdownload_linkrb   Z
attachmentr   r   r   r   r   r   r"   r"   r#   rR   Q  s    





	*

z$ConfluenceAPIImport._create_documentc              
   C   s"  |r| j |}n(|r*| j jj|dd}n|r:| j |}|sFtd|d|d}|s| jj	d|  t
|d  dtj d d	 }|d
}| j jjrt|d  }tj| jtj|d |d|||ddd|gd\}}|rt| jtjddi\}	}
tj |	g|_|  |S )Nr   rM   ua   Укажите ид или передайте готовую информацию из ConfluenceZemailAddressr6   u.   У пользователя нет почты r   r   r   Zactiver   T)r7   r   Z
user_localr6   r+   r   r+   r}   r   r7   r   )r,   Zget_user_inforp   Zget_user_details_by_userkeyZget_user_info_by_usernameAssertionErrorr.   r)   rP   rq   r   r   r   r   r  r   r   r   r   r   r   r   r   r   )r3   r   r   r	  r  r6   r   r   r   r   rs   r"   r"   r#   r     s>    "


zConfluenceAPIImport._get_person)comment_parentr\   r5   c              	   C   s  |s| j jd|jj  t|jjjd}d}| j	|d | j
 dD ]f}d}|d7 }z| j  rrW  dS |dd	kr| j jd
|  W qJ|d d d }|dd}|d }	|	d }
tj}|
dr| j|
d d}n2|
dr| j|
d d}n| j jd|
  |j||||	d |	d |d d}|d d dkrTd|d< |rb||d< tj| j tj|dd|d gd \}}|jr| ||_| |jj|jd!|_||_|  |jr$|d d" d# r$|jd$|d d" d# id%D ].}|jd$ |jd&< |jj|jd$< d|jd'< qW n0 t k
rV   d| _!| j j"d(|  Y nX || #|||7 }t$|jtj%rt&||j_'|j  |j(  qJt&||j_|j  qJ|dkr| j jd)|  |S )*u;   
        Создание комментариев
        uK   **** Импортируем комментарии по документу rv   r   rL   z,extensions.inlinePropertiesNrf   r   ZdraftuD   Не импортируем черновик комментария r
  Zexport_viewr:   spanpr  r  r  r  r   r   uO   Не возможно определить автора комментария r  )r   r  r  r  r  r  r|   
extensionslocationinlineTr   r|   r}   r   FZinlinePropertiesZ	markerRefzdata-refrw   zdata-ref_origry   u3   Ошибка импорта комментария u    **** Импортировано ))r)   rP   rQ   r%   r7   r   r   r:   r,   Zget_page_commentsr2   rO   r.   r   ro   r<   r  r   rq   r   r   r   Z
CmfCommentr  r  r  r  r   r"  r   rx   rL   rX   r1   rY   rT   r   r!   r   r   r   )r3   r  r\   r   r  r   ZcommentZcomment_objr  r  r  Zcomment_userkwargsnewr   r"   r"   r#   rT     s    



	



z%ConfluenceAPIImport._process_comments)r   r`   r5   c              
   C   s  | j jjs|S t|ddd}|s.|jd }t|D ]}|d dkr|jddd	d
dd}dd |jddidD 	 }t
|d D ]P\}}	|	d d }
|jd|
 dd	d|
 ddd}|j| j|_|| q|| tt|d}n|d dkr2|d d dkrd}|jd|d d id}|r0|d d d d d }|d d d d}|r0t|ddj|d |d }||j tt|d}q|d d d!r|d dr|jd|d d id}n$|jd"|d d d# d$ d id}|d d d d% d }tjj||d&}d'}t|jd(}| }W 5 Q R X tjjd)d*|gdd+| d,ggd-gd.}d/}
d/}|d d d d r|d d d d d }
|d d d d0 r|d d d d0 d }t|ddjf |jj|jtj||
|d1d}||j tt|d}n|d d2kr|d d d3kr|d d d d d }d4}|jd|d d id}t|ddj|dd5d |jD d6d}||j tt|d}|dr6t|  t|||d d}q6t|S )7Nr   r   rv   r  r   ZlayoutSectionZdivZfalsetruezmceNonEditable selected)Zcontenteditablezdata-layout-sectionr   rw   c                 S   s,   g | ]$}d |j d krd|j d kr|qS )zfixed-widthr   Zsinglerw   r   r"   r"   r#   r   /  s     z:ConfluenceAPIImport._convert_atlas_doc.<locals>.<listcomp>r   ZcolumnLayoutrx   r   r   zflex-basis: )zdata-column-widthzdata-layout-columnr   	extensionZextensionKeyzexcerpt-includeuG  
                    <div class="macros-panel macros-include-block" contenteditable="false" data-include-block-name="{name}" data-localid="{page_name}" data-mce-contenteditable="false">
                    <div class="extension-container" contenteditable="false" data-layout="default" data-mce-contenteditable="false">
                    <span aria-label="Макрос Include. " role="img"> <svg height="14" id="Outline" viewBox="0 0 24 24" width="14" xmlns="http://www.w3.org/2000/svg"><path d="M19.949,5.536,16.465,2.05A6.958,6.958,0,0,0,11.515,0H7A5.006,5.006,0,0,0,2,5V19a5.006,5.006,0,0,0,5,5H17a5.006,5.006,0,0,0,5-5V10.485A6.951,6.951,0,0,0,19.949,5.536ZM18.535,6.95A4.983,4.983,0,0,1,19.316,8H15a1,1,0,0,1-1-1V2.684a5.01,5.01,0,0,1,1.051.78ZM20,19a3,3,0,0,1-3,3H7a3,3,0,0,1-3-3V5A3,3,0,0,1,7,2h4.515c.164,0,.323.032.485.047V7a3,3,0,0,0,3,3h4.953c.015.162.047.32.047.485Z"></path></svg> </span> <span class="extension-title">Макрос Include. "Вставить выборку"</span> <span class="macros-actions"> <span class="macros-edit" style="margin-right: 7px;" data-mce-style="margin-right: 7px;"> <svg _ngcontent-aiw-c17="" class="ng-star-inserted" style="width: 14px; height: 14px; color: #444444;" viewBox="0 0 24 24" data-mce-style="width: 14px; height: 14px; color: #444444;"><path _ngcontent-aiw-c17="" d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z" fill="#444"></path></svg> </span> <span class="macros-delete"> <svg class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;" viewBox="0 0 18 18" data-mce-style="width: 14px; height: 14px; color: #222222;"><path class="ng-star-inserted" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" fill="#222" stroke="none" stroke-width="1"></path><path class="ng-star-inserted" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" fill="#222" stroke="none" stroke-width="1"></path><path class="ng-star-inserted" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" fill="#222" stroke="none" stroke-width="1"></path></svg> </span> </span>
                    </div>
                    <div class="ak-renderer-wrapper" data-fabric-macro="null" data-macro-body="" data-macro-parameters="[object Object]">
                    </div>
                    </div>
                    </div>zdata-local-idZlocalIdZ
parametersZmacroParamsr:   r7   )r7   	page_nameZdrawiozdata-macro-idZmacroMetadataZmacroIdZdiagramName)r   r7   u  
                    <div data-drawio-title="{name}" data-drawio-type="diagram" data-drawio-xml="{encoded_xml}" 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>
                    rr   r}   ZLIKEz%.pngrr   r   r   r   )r7   Zimg_srcZencoded_xmlr   r   ZbodiedExtensionZexcerptu  
                    <div class="macros-panel macros-excerpt-block" contenteditable="false" data-excerpt-name="{name}" data-mce-contenteditable="false">
                    <div class="extension-container" contenteditable="false" data-layout="default" data-mce-contenteditable="false"><span aria-label="Макрос Include. 'Создать выборку'" role="img"> <svg height="14" id="Outline" viewBox="0 0 24 24" width="14" xmlns="http://www.w3.org/2000/svg"><path d="M19.949,5.536,16.465,2.05A6.958,6.958,0,0,0,11.515,0H7A5.006,5.006,0,0,0,2,5V19a5.006,5.006,0,0,0,5,5H17a5.006,5.006,0,0,0,5-5V10.485A6.951,6.951,0,0,0,19.949,5.536ZM18.535,6.95A4.983,4.983,0,0,1,19.316,8H15a1,1,0,0,1-1-1V2.684a5.01,5.01,0,0,1,1.051.78ZM20,19a3,3,0,0,1-3,3H7a3,3,0,0,1-3-3V5A3,3,0,0,1,7,2h4.515c.164,0,.323.032.485.047V7a3,3,0,0,0,3,3h4.953c.015.162.047.32.047.485Z"></path></svg> </span> <span class="extension-title">Макрос Include. 'Создать выборку' <span class="excerpt-title">| name = {name}</span></span> <span class="macros-actions"> <span class="macros-edit" style="margin-right: 7px;" data-mce-style="margin-right: 7px;"> <svg _ngcontent-aiw-c17="" class="ng-star-inserted" style="width: 14px; height: 14px; color: #444444;" viewBox="0 0 24 24" data-mce-style="width: 14px; height: 14px; color: #444444;"><path _ngcontent-aiw-c17="" d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z" fill="#444"></path></svg> </span> <span class="macros-delete"> <svg class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;" viewBox="0 0 18 18" data-mce-style="width: 14px; height: 14px; color: #222222;"><path class="ng-star-inserted" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" fill="#222" stroke="none" stroke-width="1"></path><path class="ng-star-inserted" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" fill="#222" stroke="none" stroke-width="1"></path><path class="ng-star-inserted" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" fill="#222" stroke="none" stroke-width="1"></path></svg> </span> </span></div>
                    <div class="ak-renderer-wrapper" contenteditable="false" data-fabric-macro="null" data-macro-body="" data-macro-parameters="{name}" data-mce-contenteditable="true">
                    {content}
                    </div>
                    </div>
                    c                 S   s   g | ]}t |qS r"   )r   r   r"   r"   r#   r   }  s     )r7   r  )!r,   rp   r  r   ro   r  reversedZnew_tagr   pop	enumeratecontentsr   r   r   r   r.   r   r   r   r   r   r   r   readr7   r:   rr   r   r   Zquotejoinr  )r3   r   r`   Z	atlas_rawr   elemZtag_layout_sectionr   icolr   Ztag_layout_colr   r'  Zexcerpt_namerB   r7   r   r   ZxmlZ
attach_imgr   r"   r"   r#   r  "  s    






$
.
z&ConfluenceAPIImport._convert_atlas_doc)N)N)T)N)NNNN)N)N)%r   r   r   r   r   r   Z	CmfImportr4   r   r>   staticmethodr   r   rD   rE   rW   rV   ru   r   r   r   r   r   r   r   r  r  r   r   r!   r$   rR   r   intrT   r   r  r"   r"   r"   r#   r'   '   s.   
#
!X& )[ i
Jr'   )r   r   r   Zrequestsr   Zurllib.parser   r   typingr   r   r   r   r   Zcmf.data_providers.baser	   Zcmf.includeZcommon.models.cmf_active_entityr   Zmodules.confluence.apir   Z%common.models.cmf_plugin_import_mixinr   Zbs4r   Zatlassian.errorsr   Z	dataclassr   r$   r'   r"   r"   r"   r#   <module>   s(   	