U
    Vc                     @   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 Zdd Zdd Zdd ZedddZdd Zdd Zd0eedd d!Zedd"d#Zd1eeejejf ed$d%d&Z d2d'd(Z!d3eedd)d*d+Z"e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)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_settings6   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#   previewA   s    zConfluenceAPIImport.previewNc           	   
   C   s  z@| j  rW dS | j jd|d   | j|||d}| j jd|d   t  | || |di di dg }| j jd	|d  d
t|  t  |D ]r}| 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
r } z$| j jd| d|  d| _W 5 d}~X Y nX dS )uV   Рекурсивно загружаем документы и поддокументыFu%   **** Создаем документ titlefirst_root_docuF   **** Импортируем комментарии документа 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   E   s8    
"

z%ConfluenceAPIImport._process_documentc                 C   sD   |  | jjd }|d d D ] }|d |d kr|d   S qdS )u   
        Проверяем выбор в настройках, если обьекта нет в настройках, значит по умолчанию выбран
        import_settingsr9   r;   rL   	isCheckedT)rD   r)   json_settings)r3   objr@   Zsor"   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   Zpages   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_urls   s6    

z&ConfluenceAPIImport._get_pageid_by_urlc                 C   sH  d}zt |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 qBt|t
jrt||_|jr|jdd |  nt||_|jr|jdd t  W nD tk
rB } 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_converted   Уже обработали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=rc   ?r   u   Меняем на ссылку )Z	only_datau+   Ошибка привязки ссылок u    на документы в rN   )r   textr;   find_allrw   r.   r)   rP   rQ   rt   r   r!   
CmfProject	CmfFolderr{   r~   warningr   rl   
isinstance
text_draftZ
is_changedsave
do_approverS   rX   rY   )r3   objectlinksoupr|   Zref_docr{   r]   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 ]b}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\}
}|rLtj |g|
_|
  |tjsL|| 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@	accountIdZ
operations)r|   r7   loginr6   r+   does_not_workr+   r}   Z
filter_objre   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   rr   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 rxt|d	 dkrxd
d | j D }dt|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|D ]}zxz.| jj|d d }| jjd|  |d d krlt
d!| |d7 }|d" |d"< |d |d#< tj| jtj|d"d$|d" gd%\}	}
|
rlt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s4|d d d dkrlt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 rPW 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;}|s2qr| jjd<t| d=|  ||7 }|D ]}| #| q\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;}|sBq| jjd?t| d=|  ||7 }|D ]}| #| qlq| j S )@u   
        Запуск импорта

        :return bool: Истина в случае успешного импорта
        r^   r   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 )ra   r"   rA   ra   r"   r"   r#   r      s     d   re   r<   rL   projectzproject.agile:defaultr*   )project_type
logic_typeZproject_wikizproject.wiki:defaultrf   sectionzCmfWiki:Class)r   Z	parent_idtree_parent_idr   u   Неизвестный типz===================== %ra   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)   r`   r   rU   r,   Zget_all_spacesr   ZCmfLogicTyper.   ZCmfErrorZprogressr   rP   rQ   rS   ro   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selected_spacesZpercent_stepZproject_fieldsr   rs   r   Zproject_is_newZrm_doc_folderZrm_doc1Zrm_doc2rH   Z
doc_folderZarchive_folderrZ   r[   r]   Z_fromZ_toZ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
backgroundrv   
 Ni)ZfileNameZ	fileName2ZurlPreviewImgZ
urlPreviewrq   ru   )findrecompilemake_previewZurl_previewr   rn   formatr7   r;   Zurl_preview_imgrq   replace_with
currentTag)r3   tagattachTAG_TMPLrB   r"   r"   r#   _create_preview  s    z#ConfluenceAPIImport._create_previewc              	   C   sh   d}t |jd}| }W 5 Q R X t|ddjf |jj|jd t	j
|dd}||j d S )Nu  
        <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="549" height="382">
            </div>
        </div>
        rr   r   src)r7   Zimg_srcZencoded_xmlru   )openfull_path_filereadr   rn   r   r7   r;   rw   urllibr   Zquoter   r   )r3   r   r   r   fZxmlrB   r"   r"   r#   _make_drawio  s    
z ConfluenceAPIImport._make_drawioT)r   parentc                    sZ  t |d}|dd D ]6}|jdr:| jjd q| jjd|  d}|jD ]j}|jj	}|
dr`|tj|jd kr`|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< nN|jd drVd|dd d   fdd|jD d }
| ||
 d
} q|
drX|tj|jd krX|jd |jd< |jj	|jd< d
|jd< |r| || d
} qqX|rqd|jddkr4|jd dd dd }| j|d}|jd |jd< |j|jd< d
|jd< qd}|
drHd}|j| }z|dsr| jj | }| jjd|  | jj|dd
d f}|  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'st(|j)d,$}|j*d-d.D ]}|+| qdW 5 Q R X |j,-  |j| |j| d/< d
|jd< |jj	|j|< |dkr|r| || | jjd0| d1|  W 5 Q R  W qW 5 Q R X t.d2W q t.k
rN } z| jj/d3| d1|  W 5 d }~X Y qX qt0|S )4Nru   c                 S   s   |  dp|  dS )Nr{   r   )has_attr)r   r"   r"   r#   <lambda>      z4ConfluenceAPIImport._process_links.<locals>.<lambda>rx   ry   u&   Обрабатываем ссылку Fr   Zsrc_origTr   ZvideoZcontrolsz100%widthZheightz.drawio.png.rc   c                    s   g | ]}|j j kr|qS r"   r:   r   Zdrawio_namer"   r#   r     s      z6ConfluenceAPIImport._process_links.<locals>.<listcomp>r{   r   z/people/r   rb   r   
account_idZhttp    Пытаемся скачать ri   timeoutstreamz	text/htmlzContent-TypezContent-Dispositionzfilename\*?=([^;]+))flags"r7   r   r   r}   r7   r   wb+    Z
chunk_sizeZ_orig3   Скачали вложение документа rN   u#   Неизвестная ссылкаu0   Не удалось скачать ссылку )1r   r   rw   r.   r)   rP   rQ   attachmentsr7   r;   r   r   r   Zunquote_plusrq   	mimetypesZ
guess_type
startswithr   joinrl   r   r   _get_personr{   r,   r   raise_for_statusZheadersr   findall
IGNORECASEstripZunquoter   r   r   CmfAttachment
upload_dirfile_existsr   r   iter_contentwritedpcommitrX   r   r   )r3   r   r   r   Z	text_soupr   rx   
attach_obj	file_nameZ	mime_typeZattach_drawior   r   r   rq   resr   rr   r   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$d| _| jjd| d|  W 5 d}~X Y q X q t|S )u]   
        Упоминания пользователей
        confluence-userlink
        ru   classzconfluence-userlinkrv   zdata-account-idr   zdata-username)	user_namerz   zdata-linked-resource-id_origzdata-username_origu]   Не найдены аттрибуты для определения пользователяr{   r   Trx   uZ   Не удалось преобразовать ссылку на пользователя rN   N)r   r   r   r   rw   r.   r   rX   r{   rL   r;   r   r1   r)   rP   rp   r   )r3   r   doc_soupr   r   r]   r"   r"   r#   _process_mentionsA  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| |d d	 d
 }t|d}|r~|}|d |_n`||d  || j| jjt	|d d|d d |d d}	tj
| jtj|	dd|d gd\}}
t|d d d
 |_|| jj|d < t||d }d}d}| jj|d dD ]l}z&|d }tj
| jtj||ddd|gdd|d ggd\}}|js0| jjj|d d  }| jjd|  | jj|ddd V}|  |  t|j d!$}|j!d"d#D ]}|"| qW 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.| .t/||}| 0|}| 1||}|&d*d+g |j2d,kr||_3|4  |5  n||_6|4  |S )-u`  
        Создание документа

        :param doc_id: Идентификатор документа.
        :param parent: Родительский объект.
        :param all_docs: Все документы полученные из пространства.
        :param total_data: Данные для импорта.
        history	createdByr   r   Z	anonymoususerKeyuser_keybodyexport_viewr;   ru   rL   rF   r   )Zstatus_typecreatedDate)r   r7   	cmf_ownerZworkflowr   cmf_created_atr|   r|   r}   r   Zatlas_doc_formatN)Zpage_idr   r   r7   r   Zdownloadr   ri   Tr   r   r   r   r   rN   rq   u=   Ошибка загрузки вложения download_link=z, attachment=z
, content=r   r   r!   )7r   r=   anonymous_userprintr   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   ro   rq   rP   rQ   r   r   r   r   r   r   r   r   r   r%   Zload_fieldsr;   r&   r   r   rX   r1   rY   _convert_atlas_docr   r  r   
class_namer   r   r   r   )r3   rZ   r   rH   ownerZdoc_usercontentr  Zdoc_objZdoc_dictZ
doc_is_newr\   Zdownload_linkr   Z
attachmentr   r   r   r   r   r   r"   r"   r#   rR   [  s    



	*

z$ConfluenceAPIImport._create_documentc           
      C   s  |r| j |}n$|r&| j j|}n|r6| j |}|sBtd|d|d}|s| jj	d|  t
|d  dtj d d }tj| jtj|d |d|||d	d
ddd|gd\}}|rt| jtjddi\}}	tj |g|_|  |S )Nua   Укажите ид или передайте готовую информацию из ConfluenceZemailAddressr6   u.   У пользователя нет почты r   r   r   TZactiveF)r7   r   Z
user_localr6   r+   r   r+   r}   r   r7   r   )r,   Zget_user_inforo   Zget_user_details_by_userkeyZget_user_info_by_usernameAssertionErrorr.   r)   rP   rp   r   r   r   r   r   r   r   r   r   r   r   r   )
r3   r   r   r	  r  r6   r   r   r   rr   r"   r"   r#   r     s8    "

zConfluenceAPIImport._get_person)comment_parentr\   r5   c              
   C   s  t |jjjd}| j|d | j dD ]V}d}z| j rJW  dS |	ddkrp| jj
d|  W q*|d d	 d
 }|dd}|d }|d }	tj}
|		dr| j|	d d}
n0|		dr| j|	d d}
n| jj
d|	  t||j|
|
|
|d |d |d d}|d d dkr2d|d< |r@||d< tj| jtj|dd|d gd\}}| |jj|_| |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
r*   d| _| jj
 d%|  Y nX | !||| t"|jtj#rlt$||j_%|j  |j&  q*t$||j_|j  q*dS )&u;   
        Создание комментариев
        ru   rL   z,extensions.inlinePropertiesNr   ZdraftuD   Не импортируем черновик комментария r
  r  r;   spanpr  r  r  r  r   r   uO   Не возможно определить автора комментария r  )r   r   Z
cmf_authorr  Zcmf_modified_byr  Zcmf_modified_atr|   
extensionslocationinlineTr   r|   r}   r   FZinlinePropertiesZ	markerRefzdata-refrv   zdata-ref_origrx   u3   Ошибка импорта комментария )'r   r%   r   r;   r,   Zget_page_commentsr2   r)   rO   r.   rP   r   rn   r=   r  r   rp   r   Z
clean_textr   r   r   Z
CmfCommentr  r   r   r  r   rw   rL   rX   r1   rY   rT   r   r!   r   r   r   )r3   r  r\   r   r  ZcommentZcomment_objr  r  r  Zcomment_userkwargsnewr   r"   r"   r#   rT     sx    




	


z%ConfluenceAPIImport._process_comments)r   ra   r5   c              	   C   s   t |ddd}dd |jddidD }t|jd	 D ]}|d
 dkr:|jdddddd}| }t|d	 D ]P\}}	|	d d }
|jd|
 ddd|
 ddd}|j| j|_|	| qt|
| q:t|S )Nr   r   ru   c                 S   s   g | ]}d |j d kr|qS )zfixed-widthr  rv   r   r"   r"   r#   r     s      z:ConfluenceAPIImport._convert_atlas_doc.<locals>.<listcomp>r  ZcolumnLayoutrv   r  r   ZlayoutSectionZdivZfalsetruezmceNonEditable selected)Zcontenteditablezdata-layout-sectionr  rw   r   r   zflex-basis: )zdata-column-widthzdata-layout-columnr   )r   rn   r   reversedr  Znew_tagpop	enumeratecontentsr   r   r   )r3   r   ra   r   Zlayout_columnselemZtag_layout_sectionr   icolr   Ztag_layout_colr"   r"   r#   r    s&    


z&ConfluenceAPIImport._convert_atlas_doc)N)T)N)NNNN)N)%r   r   r   r   r   r   Z	CmfImportr4   r   r?   staticmethodr   r   rD   rE   rW   rV   rt   r   r   r   r   r   r   r   r   r   r  r   r   r!   r$   rR   r   rT   r   r  r"   r"   r"   r#   r'   '   s0   
$
!V& ([ \
Ar'   )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(   	