U
    3c                    @   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coder   zhistory,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   sz  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 nL tk
rt } z,| j jd| d|  |  jd7  _W 5 d}~X Y nX dS )uV   Рекурсивно загружаем документы и поддокументыFu%   **** Создаем документ titlefirst_root_docchildrenpageresultsuE   **** Импортируем дочерние документы от u    в количестве: uh   **** Пропускаем документ так как он не помечен для импорта idr2   u'   **** Успешно загрузили u1   Ошибка миграции документа :    N)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#   rX   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.   rW   )r3   objpagesZsoresr"   r"   r#   rW   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      rO   wiki   Zspaces   rb      Zdisplay+ uC   Ошибка получения документа по pretty url rN   uo   Не смогли получить документ по pretty url (возможно не тот домен): rL   )splitr   pathrV   replacer,   connZget_page_by_titlerY   r)   rQ   warningrR   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  |j jrdS d}z.t|j jd}|jddidD ]
}|jdrT| jj	d q2|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< q2| jjd| d|jd  d q2|jdddD ]\}| jj	t| |jdr| jj	d qN|d }|sqNd|kr| jj	d |dd }n
| 
|}|sԐqN|dd }tjjdd|gdgd}|stjjdd|gdgd}|s6t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 qN|jdd idD ]$}tjj|jd! d"jj|jd!< qt|tjrt||_|jr8|jdd# |  nt||_ |jr8|jdd# t  W nD tk
r } 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=re   ?r   u   Меняем на ссылку classzmacros-include-blockzdata-localidr@   )Z	only_datau+   Ошибка привязки ссылок u    на документы в rN   )textZis_nullr   r:   find_allrx   r.   r)   rQ   rR   ru   r   r!   
CmfProject	CmfFolderr{   r~   rq   r   rm   rL   
isinstance
text_draft
is_changedsave
do_approverT   rY   rZ   )	r3   objectlinksoupr|   Zref_docr{   tagr^   r"   r"   r#   _convert_links   s    

$


&"



z"ConfluenceAPIImport._convert_linksc                 C   sH  | j jd t| j tjddi\}}g }t  d}| j	 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 ||t|d  d}	d|d  d}
d}tjjdd|	d	 gdgd}|stjjddd|
 dgdgd}|stjjdd|	d gd}t|dkr|  jd7  _| j jd|	d  dt|  |r|d }|sd}tj|
|	d	 | j d }|	D ]}t|||	|  q|jr|jr|  |dd!g |jr>|
|jkrD|j |d  d|_n|
|_tj }tj  }|j!"| |j!"| |  |r|#tjs|"| t  |d7 }W q@ t$k
r } z.t%| |  jd7  _| j j&d"|  W 5 d }~X Y q@X q@| j jd#| d$ |rD| 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@
operations)r7   r6   r+   does_not_workz::	accountIdFloginr}   r
   r   r|   LIKE%r   rO   u+   Пользователей с именем z > T)r|   r   r)   rg_member_ofu5   Ошибка импорта пользователя u   Импортировали u    пользователяu,   Отправляем приглашения u    пользователям: )args))r)   rQ   rR   r   process_any_table_fieldsr   CmfPersonGrouprT   r,   Zget_all_usersconfluence_requestjsonr.   warnrV   config
ORG_DOMAINcmfutiltranslit_stripr   boolr   listr1   errorsetattrr   import_originalr   load_fieldsr|   Zconfluence_group
user_groupr   appendendswithrY   r	   rZ   Zcmf_deferred_taskZregister_persons)r3   r   rs   Zsend_invitesZimportedr   Z	user_infor6   Zmax_lenZ	user_dictr|   Z
is_createdpersonZpersonskeyZ
conf_groupr^   r"   r"   r#   _process_users   sx    "
" "


(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 ]}zz@| jj|d d }| jjd|  |d d krttd!| |d7 }|d" |d"< |d |d#< t|d |d$< tjj
d"d%|d" gd&d$gd'}d(}	|rj|jj|d& jks|jrP|j|d$ krP|d"  d)|d$  d*|d"< | jjd+|j d,|j d-|d&  d.|j d/|d"  
 n|jsj|d$ |_|  tjj
|d$ | d0}|sd}	tj| j|d$ |d" d1}|D ]}
t||
||
  q|  |	rtjj
d2d3d%|jgd"d%d4ggd5}|d d d dkr"tjj
|d6d7}|  nd|d d d dksN|d d d dkrtjj
|d6d7}tjj
|d8d7}|  |  |  |d d d dkr|}tjj
d2d3d%|jgd"d%d4ggd5}n|}|}tjj
d2d3d%|jgd9d%d:ggd5}t  | jj|d | j d;D ]F}| !|sq
|}|d< d=kr4|}| j"|||d> d?}t  q
| j# rjW W X d(S W nJ t$k
r } z*|  j%d7  _%| jj&d@|d   W 5 d?}~X Y nX W 5 | j j|7  _| j  | jjd| jj d t  X q | jjdA d}d}tjj'dBdCd?gd5}tjj(dBdCd?gdDdEg||| gdF}|sTq| jjdGt| dH|  ||7 }|D ]}| )| q~q&d}d}tjj'dBdCd?gd5}tjj(dBdCd?gdDg||| gdF}|sܐq| jjdIt| dH|  ||7 }|D ]}| )| qqd}d}tjj'dBdCd?gd5}tjj(dBdCd?gdDg||| gdF}|sdq| jjdJt| dH|  ||7 }|D ]}| )| qq8| jjdK| j%  | j% S )Lu   
        Запуск импорта

        :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  dqS )rL   )ra   rL   r"   rA   ra   r"   r"   r#   r   A  s     d   rO   r;   rL   projectzproject.agile:defaultr*   )project_type
logic_typeZproject_wikizproject.wiki:defaultrg   sectionzCmfWiki:Class)r   	parent_idtree_parent_idr   u   Неизвестный типz===================== r   ra   r   u0   Импортируем пространство typeZpersonaluY   Миграция персональных пространств в разработке r7   Ztask_code_prefixr|   r}   r   r   Fz ()u   Проект с именем u    уже существует! z != z id=u   Переименуем в )r|   r8   )r)   r|   r7   ZANDr   u   Документыr   u   Документ1)tree_parentr7   u   Документ2Zsys_typearchiverM   statusZarchivedrG   Nu$   Ошибка миграции space u   Импортировали все пространства, теперь преобразуем ссылки на загруженные объектыr)   z!=r   r   )r   r8   sliceu   Документы     из u   Проекты u   Директории u#   Ошибок обнаружено: )*rD   r)   Zjson_settingsr   r`   rV   r,   Zget_all_spacesr   ZCmfLogicTyper.   ZCmfErrorZprogressr   rQ   rR   rT   rp   Z	get_spacer   r   r   rL   r|   rq   r7   keysr   r   r!   deleteZget_root_pages_from_spacer2   rW   rX   rP   rY   r1   rZ   countr   r   )r3   r?   nrootZpercent_stepZproject_fieldsr   rt   r   Zproject_is_newr   Zrm_doc_folderZrm_doc1Zrm_doc2rH   Z
doc_folderZarchive_folderr[   r\   r^   Z_fromZ_tocntZimported_docsr%   Zimported_projectsZimported_foldersZfolderr"   r"   r#   process_import1  s"   <





 
.



z"ConfluenceAPIImport.process_importc              	   C   s   d}|j dtdids$|jdkr|jrzt|ddjf |jj|jjdd	 |j	j|jj|j
jd
d}||j nFt|ddjf |jj|jjdd	 dd|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   Zimg
 Ni)ZfileNameZ	fileName2ZurlPreviewImgZ
urlPreviewrr   rv   z/static/file-outline.png)findrecompiler7   Zurl_previewr   ro   formatr:   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   sN  | j jd t|d}|dd D ]}|jdrN| j jd|  q&|dr~|jd dr~| j jd	|  q&| j jd
|  d}|j	D ]}|j
j}|dr|tj|jd kr|jd |jd< |jj|jd< d|jd< |dr|jj|jd< t|jd dd }	|	rz|	d rz|	d drzd|_
d|jd< d|jd< d|jd< d|jd< n,|	r|	d r|	d ds| || d} q|dr|tj|jd kr|jd |jd< |jj|jd< t|jd dd }	|	rd|	d rd|	d drdd|_
d|jd< d|jd< d|jd< |jj|jd< d|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 s8| jj | }| j jd!|  | jj|d"dd#}|  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'd0d1D ]}|(| q*W 5 Q R X |j)*  t!j+j)j,- }|.|j/}|0  |j| |j| d2< d|jd< |1d3g |jj|j|< |dkr|r| || | j jd4| d5|  W 5 Q R  W q&W 5 Q R X t2d6W q& t2k
rB } z| j j3d7| d5|  W 5 d }~X Y q&X q&t4|S )8Nu%   Конвертируем ссылкиrv   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_origTZsrcsetr   r   ZvideoZcontrols100%widthheightZnoneZpreloadZimager   z/people/r   rd   re   
account_idZhttp    Пытаемся скачать rj   timeoutstreamz	text/htmlzContent-TypezContent-Dispositionzfilename\*?=([^;]+))flags"r7   r   r   r}   r7   Z
filter_objwb+    Z
chunk_sizeZ_origrr   3   Скачали вложение документа rN   u#   Неизвестная ссылкаu0   Не удалось скачать ссылку )5r)   rQ   rR   r   r   rx   r.   r   
startswithattachmentsr7   r:   urllibr   Zunquote_plusrr   	mimetypesZ
guess_typerm   r   _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CmfRFiledata_driverget_rd	get_rfile
_file_namemake_previewr   rY   rq   r   )r3   r   r   r	  Z	text_soupr   ry   
attach_obj	file_nameZ	mime_typer   r   r   rr   rc   r   rs   fchunkrdiskrfiler^   r"   r"   r#   _process_links  s    
$
 


   






 



.z"ConfluenceAPIImport._process_linksc                 C   s*  | j jd t|d}|jdtdidD ]}z|jdrT| 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
        uH   Конвертируем упоминания пользователей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)   rQ   rR   r   r   r   r   rx   r.   r   rY   r{   rL   r:   r   r   r   )r3   r   doc_soupr   r   r^   r"   r"   r#   _process_mentions~  s&    

.z%ConfluenceAPIImport._process_mentions)r[   r   r5   c                 C   s&  |d d }| j jd|  d|kr8| |d }n,|d dkrLtj}n| j|d d}t| | j jd	|  | jjj	r| |d d
 d d }n| j|d d
 d d d}|d d d }|r|}n||d  ||| j
| j
jt|d d|d d |d d
 d |d |d
}	| j jd tj| j tj|	dd|d gd\}}
| jjj	rz*| j jd t|d d d |_W n6 tk
r   | j jd|d d d   Y nX n
d|i|_|| jj|d < t||d }d}d}|dd g | j jd! d"}| jj|d d#D ]}zh|d$7 }| j jd%|d   |d }tj| j tj||d&d'd|gd(d|d ggd\}}|jsj| jjj|d) d*  }| j jd+|  | jj|d,d-d.x}|  |   t!|j"d/$}|j#d0d1D ]}|$| qW 5 Q R X |j%&  tj'j%j() }|*|j+}|,  W 5 Q R X | j jd2|j- d3|  |d4g |jj.|j/|d < |j01| W nD tk
r   |  j2d$7  _2| j j3d5| d6| d7|  Y nX q&| j jd8|  |j4r"| j jd9 t5|d:}| 6t7||}| 8|}| 9||}|d;d g |j:d<kr~||_;|<d=rld-|_=|>  |?  n||_@|>  d>|d  }tjAjB|d?}|stjA|| j d@}||_C|d) BdAr| jj |d) dA  }n| j jDjDjE}|jF dB| dC| dD|_@dE|_G|>  |S )Fu`  
        Создание документа

        :param doc_id: Идентификатор документа.
        :param parent: Родительский объект.
        :param all_docs: Все документы полученные из пространства.
        :param total_data: Данные для импорта.
        history	createdByu(   Определяем владельца r   r   Z	anonymoususerKeyuser_keyu=   Определяем последнего редактора ZlastUpdatedZbybodyviewr:   rF   r   )Zstatus_typecreatedDateZwhenrL   )
r   r7   	cmf_owner
cmf_authorZworkflowr   cmf_created_atcmf_modified_atr|   cmf_modified_byu+   Создаем документ в базеr|   r}   r   u'   Грузим atlassian разметкуZatlas_doc_formatu2   Ошибка получение raw данных: contentNzattachments.urlr   u:   Запрашиваем вложения документаr   )Zpage_idrO   u=   Обрабатываем вложение документа r   r   r7   r   Zdownloadr   rj   Tr   r   r   r   r   rN   rr   u=   Ошибка загрузки вложения download_link=z, attachment=z
, content=u   Загрузили u2   Обработка текста документаrv   r   r!   tablezcomment:)r|   )r|   r)   Zwebuiu4    импортирован из Confluence: <a href="z" target="_blank">z</a>rh   )Hr)   rQ   rR   r   r<   anonymous_userprintr,   rp   cloudr0   Zget_default_statusr   Zget_status_typer   r   r!   r   loadsimport_raw_jsonrY   rq   r-   r   r$   r   Zget_all_attachmentr   r   rr   r   r   r   r   r   r   r  r  r  r  r  r  r  r  r	  r%   r:   r&   r   r   r1   rZ   r   r   _convert_atlas_docr   r  r  
class_namer   r   Zfull_screenr   r   r   
CmfCommentr.   r   ZpluginZext_urlZverbose_nameZ	log_level)r3   r[   r   rH   ownerZdoc_userr   r!  Zdoc_objZdoc_dictZ
doc_is_newr]   Zdownload_linkrc   iZ
attachmentr  r
  is_newr  r  r  r  r  r   Zcomment_ext_idcommentr{   r"   r"   r#   rS     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)   rQ   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   sP  |s| j jd|jj  d}zt|jjjd}| j d}| j	
|d |D ]}d}|d7 }z| j  r|W  W dS |dd	kr| j jd
|  W qR|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r^d|d< |rl||d< tj| j tj|dd|d gd \}}|jr|d d! d d"krd#|_| |	|_| |jj|jd$|_||_|  |jr`|d d% d& r`|jd'|d d% d& id(D ]D}|jd' |jd)< |j j|jd'< |jd* !t"|j d|jd+< qW n8 t#k
r   |  j$d7  _$| j j%d,|  Y nX || &|||7 }t'|jtj(rt"||j_)|j  |j*  qRt"||j_|j  qR|dkr| j jd-|  W n2   | j j%d.|d   |  j$d7  _$Y nX |S )/u;   
        Создание комментариев
        uK   **** Импортируем комментарии по документу r   rv   z2,extensions.inlineProperties,extensions.resolutionrL   NrO   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   Z
resolutionZresolvedclosedFZinlinePropertiesZ	markerRefzdata-refrw   zdata-ref_origr   ry   u3   Ошибка импорта комментария u    **** Импортировано u@   Ошибка импорта комментариев: parent_id=)+r)   rQ   rR   r%   r7   r   r   r:   r2   r,   Zget_page_commentsrP   r.   r   ro   r<   r#  r   r   r   r   r   r*  r   r   r  r  r'  r   r5  r   rx   rL   r   r   rY   r1   rZ   rU   r   r!   r   r   )r3   r0  r]   r   r   r  r2   r.  Zcomment_objr!  r  r+  Zcomment_userkwargsnewr   r"   r"   r#   rU   @  s    


	



z%ConfluenceAPIImport._process_comments)r   ra   r5   c              
   C   s  | j jjs|S | jjd t|d}|s<|jr<|jd }n|S t|}d}t	|D ]$}| j
 rj q|| jj| d|  |d7 }|d dkrh|jdd	d
ddd}dd |jddidD  }	g }
|	jD ]}|dkrq|
| qt|d D ]N\}}|d d }|jd| dd
d| ddd}|
| j|_|| q|	| tt|d}n|d dkrd }	|d dr|jd|d d id}	|	s$| jjd|d d  d|d d   qTnNd|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}	|	r|d d d% d& d" }|d d d% d'}|rt|dd&j|d" |d(}|	|j tt|d}qT|d d d)krdd*}|jd|d d id}	|	r|d d d% d& d" }|rt|dd&jd&d+d |	jD |d,}|	|j tt|d}qT|d d d-r|d d d% d. d" }tjj||d/}d0}|s|  jd7  _| jjd1|  qTt|j d2}|! }W 5 Q R X tjjd3d4|gd'd5| d6ggd7gd8}d9}d9}|d d d% drN|d d d% d d" }|d d d% d:r~|d d d% d: d" }t|dd&jf |j"j#|j$t%j&'|||d;d}|	|j tt|d}n|d d d<krT|j(j#}|d d d% d=rttj)j|d d d% d= d" d>}|sJtj*j|d d d% d= d" d>}|rZ|j(j#}n| jjd?|d   qT|jd|d	d@dAd}|dB}|| |	| tt|d}n|d dCkrT|d d dDkrT|d d d% d' d" }dE}|jd|d d id}	t|dd&j|d&dFd |	jD dGd}|	|j tt|d}|drTt| +t|||d d}qTt|S )HNuC   Конвертация текста из atlassian разметкиrv   r!  rO   r   r   ZlayoutSectionZdivZfalsetruezmceNonEditable selected)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columnLayoutr   rx   r   r   zflex-basis: )zdata-column-widthzdata-layout-columnr   	extensionZlocalIdzdata-local-idu&   Не удалось найти тег u    для ZextensionKeyZmacroMetadataZ
parametersZmacroIdzdata-macro-idr:   z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macroParamsr   r7   )r7   	page_nameZincludeu  
                    <div class="macros-panel macros-include-page" contenteditable="false" data-macros="include-page"
                         data-param-pageid="{page_name}" data-mce-contenteditable="false"
                         data-rendered="true">
                        <div class="extension-container" contenteditable="false" data-layout="default" data-mce-contenteditable="false">
                            <span aria-label="Макрос Include. " role="img"> <svg xmlns="http://www.w3.org/2000/svg" id="Outline"
                                                                                 viewBox="0 0 24 24" width="14" height="14"><path
                                d="M19.949,5.536,16.465,2.05A6.958,6.958,0,0,0,11.515,0H7A5.006,5.006,0,0,0,2,5V19a5.006,5.006,0,0,0,5,5H17a5.006,5.006,0,0,0,5-5V10.485A6.951,6.951,0,0,0,19.949,5.536ZM18.535,6.95A4.983,4.983,0,0,1,19.316,8H15a1,1,0,0,1-1-1V2.684a5.01,5.01,0,0,1,1.051.78ZM20,19a3,3,0,0,1-3,3H7a3,3,0,0,1-3-3V5A3,3,0,0,1,7,2h4.515c.164,0,.323.032.485.047V7a3,3,0,0,0,3,3h4.953c.015.162.047.32.047.485Z"></path></svg> </span>
                            <span class="extension-title">Макрос Include. "Вставить страницу"</span> <span class="macros-actions"> <span
                            class="macros-edit" style="margin-right: 7px;" data-mce-style="margin-right: 7px;"> <svg _ngcontent-aiw-c17=""
                                                                                                                     viewBox="0 0 24 24"
                                                                                                                     class="ng-star-inserted"
                                                                                                                     style="width: 14px; height: 14px; color: #444444;"
                                                                                                                     data-mce-style="width: 14px; height: 14px; color: #444444;"><path
                            _ngcontent-aiw-c17="" fill="#444"
                            d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path></svg> </span> <span
                            class="macros-delete"> <svg viewBox="0 0 18 18" class="ng-star-inserted"
                                                        style="width: 14px; height: 14px; color: #222222;"
                                                        data-mce-style="width: 14px; height: 14px; color: #222222;"><path fill="#222"
                                                                                                                          d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z"
                                                                                                                          stroke="none"
                                                                                                                          stroke-width="1"
                                                                                                                          class="ng-star-inserted"></path><path
                            fill="#222" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path><path
                            fill="#222" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path></svg> </span> </span>
                        </div>
                        <div class="ak-renderer-wrapper">{content}</div>
                    </div>
                    c                 S   s   g | ]}t |qS r"   r   )rA   valr"   r"   r#   r     s     )r!  r<  ZdrawioZ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>
                    u#   Не найден файл с xml: rr   r}   r   z%.pngrr   r   r   r   )r7   Zimg_srcZencoded_xmlr   r   rI   rJ   r@   uE   Не удалось обработать тег оглавления T)zdata-children-docsr:  ry   ulZ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)   rQ   rR   r   r'  rV   reversedrP   Znew_tagr   popcontentsr   	enumerater   r   r.   r   rq   ro   r   r   joinr   r   r   r1   r   r   r   readr7   r:   rr   r   r   ZquoterL   r!   r   r(  )r3   r   ra   Z	atlas_rawr   r   r,  elemZtag_layout_sectionr   rC  ccolr   Ztag_layout_colr   r<  Zexcerpt_namerB   r7   r   r  ZxmlZ
attach_imgr   r   r   Zdata_children_docsr@  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   rX   rW   ru   r   r   r   r   r   r   r   r  r  r   r   r!   r$   rS   r   intrU   r   r(  r"   r"   r"   r#   r'   '   s0   
#
!Z> 2/m  
Qr'   )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(   	