U
    Įwh9                    @   s   d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlmZm	Z	 d dl
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 G d	d
 d
ejeZdS )    NPath)BeautifulSoupComment)*)cmf_hashlib)CmfPluginConvertMixin)cmf_document)CmfActiveEntityc                       s  e Zd Zddddddddddd	d
ddddddddddddd	dddddddddddddd	ddddddddddddd d!dd"dddd#d$d%d	d&d'dd(ddd)dddd*d+d,d	d-d.dd/d0d1d0d2d3Zejjej d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOg Zee	dPdQdRdSdT Z
dUdV ZeeedWdXdYZd3d[d\Zed]d^ Zd_d` Zdadb Z fdcddZdedf Zd4dhdiZdjdk Zdldm Zdndo ZdgdZdQdpdqdrZ fdsdtZedudvdwZdgdxdydzZd{d| Zd}d~ Zdd Zdd Zdd Z dd Z!dd Z"dd Z#dZdZdgd fdd
Z$ fddZ% fddZ& fddZ'dd Z(dd Z)dd Z*dd Z+ fddZ,dZd fdd
Z- fddZ.dd Z/dd Z0dd Z1dd Z2dd Z3dd Z4dd Z5 fddZ6e7eedddZ8eeedddZ9eeedddZ:eeedddZ;eeedddZ<eeedddZ=eeedddZ>e7eeedddĄZ?eeedddƄZ@eeedddȄZAeeedddʄZBeeeddd̄ZCeeeed͜ddτZDeeedddфZEeeeFedҜddԄZGe7eedddքZHe7eeddd؄ZIe7eedddڄZJe7eeddd܄ZKe7eedddބZLeeMedߜddZNe7eedddZOe7eedddZPe7eeed͜ddZQdd ZReSdd ZTeSdd ZUeVjWjXeVjWjYddQdQdZZdd Z[dd Z\dd Z]ee^dddZ_ee^dddZ`dd Zadd  Zbdd Zcdd Zde7dd Zedd Zf fd	d
Zge7dd Zhe7dd Zie7dgdddZjd5eedgdddZke7ee^dddZlee	dQdQdddd Zmd6ddZndd Zod d! Zpd"d# Zq fd$d%Zre7d&d' Zs fd(d)Zt fd*d+ZudZd, fd-d.
Zv fd/d0Zw fd1d2Zx  ZyS (7  CmfDocumentu
   ВажноZ0pxz0 0 512 512ZpreserveZ20)xyviewBox	xml:spacewidthheightzrgb(216, 64, 64)a  M256,512c141.385,0,256-114.615,256-256S397.385,0,256,0S0,114.615,0,256C0.153,397.322,114.678,511.847,256,512z    M234.667,128c0-11.782,9.551-21.333,21.333-21.333c11.782,0,21.333,9.551,21.333,21.333v170.667   c0,11.782-9.551,21.333-21.333,21.333c-11.782,0-21.333-9.551-21.333-21.333V128z M256,384c11.782,0,21.333,9.551,21.333,21.333   s-9.551,21.333-21.333,21.333c-11.782,0-21.333-9.551-21.333-21.333S244.218,384,256,384z)filldzpanel-alarmzrgb(255, 235, 230))tooltipsvgsvg_path	classNamecoloru   Ошибкаz0 0 208.891 208.891)r   r   r   r   r   r   zM0,170l65.555-65.555L0,38.891L38.891,0l65.555,65.555L170,0l38.891,38.891l-65.555,65.555L208.891,170L170,208.891  l-65.555-65.555l-65.555,65.555L0,170zzpanel-erroru   Предупреждениеz0 0 554.2 554.199)r   r   r   r   r   r   zrgb(255, 153, 32)a!  M538.5,386.199L356.5,70.8c-16.4-28.4-46.7-45.9-79.501-45.9c-32.8,0-63.1,17.5-79.5,45.9L12.3,391.6   c-16.4,28.4-16.4,63.4,0,91.8C28.7,511.8,59,529.3,91.8,529.3H462.2c0.101,0,0.2,0,0.2,0c50.7,0,91.8-41.101,91.8-91.8   C554.2,418.5,548.4,400.8,538.5,386.199z M316.3,416.899c0,21.7-16.7,38.3-39.2,38.3s-39.2-16.6-39.2-38.3V416   c0-21.601,16.7-38.301,39.2-38.301S316.3,394.3,316.3,416V416.899z M317.2,158.7L297.8,328.1c-1.3,12.2-9.4,19.8-20.7,19.8   s-19.4-7.7-20.7-19.8L237,158.6c-1.3-13.1,5.801-23,18-23H299.1C311.3,135.7,318.5,145.6,317.2,158.7zzpanel-warningz#FFFAE6u   Заметкаz	0 0 24 24zLayer 1)r   r   r   	data-namea  m19 3.022c0-.008 0-.014 0-.022v-2a1 1 0 0 0 -2 0v1.1a5 5 0 0 0 -1-.1h-1v-1a1 1 0 0 0 -2 0v1h-2v-1a1 1 0 0 0 -2 0v1h-1a5 5 0 0 0 -1 .1v-1.1a1 1 0 0 0 -2 0v2 .022a4.979 4.979 0 0 0 -2 3.978v12a5.006 5.006 0 0 0 5 5h8a5.006 5.006 0 0 0 5-5v-12a4.979 4.979 0 0 0 -2-3.978zm-7 13.978h-4a1 1 0 0 1 0-2h4a1 1 0 0 1 0 2zm4-4h-8a1 1 0 0 1 0-2h8a1 1 0 0 1 0 2zm0-4h-8a1 1 0 0 1 0-2h8a1 1 0 0 1 0 2zz#5243aa)r   r   z
panel-notezrgb(234, 230, 255)u   Информация)r   r   r   zrgb(1,82,204)zM12,24A12,12,0,1,0,0,12,12.013,12.013,0,0,0,12,24ZM12,5a1.5,1.5,0,1,1-1.5,1.5A1.5,1.5,0,0,1,12,5Zm-1,5h1a2,2,0,0,1,2,2v6a1,1,0,0,1-2,0V12H11a1,1,0,0,1,0-2Zz
panel-infozrgb(222, 235, 255)u   Готовоz0 0 1000 1000)r   r   r   r   r   r   z#01875aa9  M500,990c270.6,0,490-219.4,490-490S770.6,10,500,10S10,229.4,10,500S229.4,990,500,990z M483.7,678c-0.4,0.4-0.7,0.8-1.1,1.2c-19.1,19.1-50.2,19.1-69.3,0L239.9,505.9c-19.1-19.1-19.1-50.1,0-69.3c19.1-19.1,50.2-19.1,69.3,0l138.7,138.7L695,328.1c19.1-19.1,50.2-19.1,69.3,0c19.1,19.1,19.1,50.2,0,69.3L483.7,678L483.7,678zzpanel-successzrgb(227, 252, 239)u   Без иконки zpanel-hidden)r   r   r   r   )alarmerrorwarningnoteinfosuccessZhiddenadd_inline_commentapprove_oneconvert_uml2svgcreate_doc_from_templateZdelete_inline_comment
do_approve
do_publishclean_after_encryptdownload_all_attachmentget_in_approve	html_diffimport_mswordpatch_20230407restore_versionsave_renderstart_approveupdate_checkboxZ
public_getpublic_lockpublic_unlockpublic_lock_pingpublic_do_approvepublic_do_publish"public_update_text_inline_commentspublic_add_inline_commentpublic_download_all_attachmentpublic_mark_viewedZpublic_parent_ui_getu1   Импорт документа в системуT)descriptionZshow_bg_progressbarc           
   	   O   sx   t jj|d}t|j}t|j\}}t jj| d}t|jd}	|	|	
 |j||_W 5 Q R X |  |  dS )X   
        Импортирование Word документа в систему
        idrbN)modelsCmfAttachmentgetr   full_path_file	mimetypes
guess_typer   openZobj_to_htmlreadsuffix
text_draftsaver&   )
doc_idZ	attach_id_args_kwargsattachZfile_objmimetypeencodingdocf rR   (./modules/project/models/cmf_document.pyimport_msword_tasks   s    
 zCmfDocument.import_msword_taskc                 O   s0   d| _ |   |   t| j| jj|gd | S )r;   uP   Обработка документа, пожалуйста, подождите.)args)rH   rI   r&   Zschedule_deferred_jobrT   r=   value)selfrM   rU   kwargsrR   rR   rS   r+      s
    zCmfDocument.import_msword)namereturnc                 C   s   t d| }d}t| t| t|d  }||krd}t| \}}|rX| dd }t|d }| d|dt|     d	t	
| d
 } |r|  d| } td| d| d|   | S )u   Метод для генерации имени для хранения документа на диске

        Args:
            name (str): _description_

        Returns:
            str: _description_
        u   [А-Яа-я]      r   .N   -   u0   Слишком длинное название. z > u   . Меняем на )refindalllenrC   rD   splitmathfloorstripr   Zshort_str_encgdebug)rY   Z
rus_simbolZos_max_lengthZfile_name_lengthextrN   rO   Zslice_lengthrR   rR   rS   _get_filename   s    .zCmfDocument._get_filenameFc                    s    fdd rj jnj j}|d kr0dn|}jsB|d }|} rXjjnjj}|rv| d| S  rjjnjj}|r| d| S  rjjnjj}|rƈ| d| S td rdnd dj	 d	 d S )
Nc                    s>  t | tjr|  S t | tjr6| j dkr6|  S t | tjrX| j	 rXd| j
 S d| jkr| j   rx| jjn| jj}|r r| jjn| jj}|}| d| S d| jkr
| j   r| jjn| jj}|r
 r| jjn| jj}| d| S td rdnd d	| j d
j d | d S )Nhomez/Users/tree_parent/parentCan not calc old r   zdocument path for parent z of -: empty tree_parent, location_path and parent)
isinstancer?   
CmfProjectZproject_dirZ	CmfFolderZsys_typeloadZhome_dir	CmfPersonZ
user_localZloginfieldsrn   oldnewrY   rl   rp   
ValueErrorr=   )nodeZtree_parent_rY   Zparent_ry   parent_pathrW   rR   rS   r~      s2    



$  z.CmfDocument._get_rfile_id.<locals>.parent_pathr   z.htmlro   rq   rr   zdocument path for rs   )
rY   ry   rz   is_externalrl   rn   location_pathrp   r{   r=   )rW   ry   rY   filenamern   r   rp   rR   r}   rS   _get_rfile_id   s(    
 zCmfDocument._get_rfile_idc                  C   s`   d} | d }t t d d }t |d }|d }|| ||  dtj| dd }|S )	u   
        Перенесенный аналог функции из фронтенда.
        Генерирует случайную строку для атрибута "data-id" тега
        Z>ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789z+/  i   @   r      )k)rf   rg   timetime_nsjoinrandomchoices)Z
charactersZalphabertotalijdata_idrR   rR   rS   get_data_id   s    $zCmfDocument.get_data_idc                 C   s   d S NrR   rW   rR   rR   rS   _calc_parent   s    zCmfDocument._calc_parentc                 C   s   | j js| jr| jjsd S | j js(| jsr| j rH| j dg |  | _n*| jrdt| jjtjrdd | _| jsr| j	| _| jjr| jjdddgd | dg | j
rt| j
}|dkr|  }|D ]2}|jj| jjkrq| j|_| j|_|jdd	 qd S )
Nrp   	cmf_ownerZcmf_owner_assistantsactivityrx   
tree_nodesr   T	only_data)rn   
is_changedrp   load_fieldsZ_node_parentrt   rV   r?   ru   r   r   rd   Zget_tree_nodes_recursiver=   projectrI   )rW   ZnlenZ	node_listr|   rR   rR   rS   Z__calc_parent   s6    
zCmfDocument.__calc_parentc                    s   t   ddddddg S )Nrp   rn   z!tree_parent.show_approvers_alwayscur_workflow_versioncur_published_version cur_workflow_version.doc_version)supersave_preload_fieldsr   	__class__rR   rS   r   "  s    zCmfDocument.save_preload_fieldsc                 C   sp   t jjdd| jgdddggd}|D ]}d|_|  q$| jjdd}t j| j| |d| j	d	}|  || _
d S )
Nrp   ==cur_workflowTfilterFOPENstatus_type)textrp   statusr   perm_encrypt)r?   CmfDocumentHistorylistr=   r   rI   workflowget_default_statusrH   r   r   )rW   Ztmp_listhstatus_opennew_cur_historyrR   rR   rS   _create_new_history0  s     
zCmfDocument._create_new_historyNc                 C   s   ddl m }m} |   td | dddddg | jsD|   | j}|jj	d	kr|jj	d
kr| j
 jddd|_|  |   n |jr|   n| j|_|  td | jrtd |   td d| _dS )uG   
        Сохраняем черновик в историю
        r   )datetimetimezonezHISTORY STARTr   zcur_workflow_version.statusz'cur_workflow_version.status.status_typer   z"cur_workflow_version.has_published)r   )CLOSEDr   rejectedr   status_codezHISTORY ENDzCREATE APPROVE TASK STARTzCREATE APPROVE TASK ENDFN)r   r   _process_text_draftri   rj   r   r   r   r   r   r   rv   r   rI   has_publishedrH   r   publish_by_owner_onlyZ_create_publish_taskapproved)rW   create_new_historyr   r   r   rR   rR   rS   _process_draft_is_changed<  s2    

 




z%CmfDocument._process_draft_is_changedc                 C   s,   t j|  | | }|r(d|_|  d S )NF)r?   
CmfApproveZcancel_approve_processr)   r   rI   )rW   ZhistrR   rR   rS   cancel_approvem  s
    
zCmfDocument.cancel_approvec                 C   s   | j jdkS )u6   Явлется ли бизнес-процесс simplezdocument.base:default)r   coder   rR   rR   rS   wf_is_simplet  s    zCmfDocument.wf_is_simplec                 O   s   | j ||S r   )r&   rW   rU   rX   rR   rR   rS   r5   x  s    zCmfDocument.public_do_publish)doc_versionsave_importnotify_personsc                O   s  |  ddddddddd	d
ddddg | jr<| jjd| d |  rV| jjddd| _| jr~| j| jjdddkr~td dS | j	rt
j| jkr| jrt
d tjj| | jd| t| jt| jdd t
d t
j|  krtd td| jj ddd dS | jj| _|   | j| _| j| _|   |   tjj| dD ]}|   qL| j!|| tj"j#| d f|| | j| _$d!| j$_%| j$j&|d" | j'D ]}|(  q| j&d#d!|d$ dS )%u   Выпуск документаr   rH   r   publish_approved_onlycmf_versionr   zstatus.coder   r   r   	macros_dbmacros_db_draftr   attachmentszPPP-DOC-PUBLISHobjr   r   r   ur   Публикация этого документа доступна только после утвержденияNzOWNERS PLACE NOTIFY STARTu8   Необходимо выпустить документ   )r   personrY   msgpriorityzOWNERS PLACE NOTIFY ENDu   Владелец проекта не может Выпускать чужой документ, но Вы можете установить себя Владельцем документа и Выпуститьu}   Данный документ может выпустить только владелец документа                 u   ,                 ему отправлено уведомление об утверждении черновика. Документ сохранен как черновик.FabortZ	publishedTr   r   )depthr   notify))r   r   check_project_role_accessr   r   r   r   r   	cmf_alertr   ri   Zcurrent_personr   rj   r?   Z	CmfNotifyZplace_notifyr*   strr   rH   Z
get_ownersrY   r   r   _pinup_attach_versionr   r   Z_delete_publish_taskmark_full_searchZCmfPersonViewr   delete_handle_mention_taskCmfEventdo_eventr   r   rI   r   r&   )rW   r   r   r   rU   rX   viewrM   rR   rR   rS   r&   {  sj           



zCmfDocument.do_publishc                    s   | j jsH| jjsH| jjsH| jjsH| jjsH| jjsH| jjsH| jjsH| j	jrVt
 j||S dd | j D D ]"}t| |jrjt
 j||  S qjd S )Nc                 s   s   | ]\}}|j r|V  qd S r   )Zfullsearch_index).0r   vrR   rR   rS   	<genexpr>  s      z/CmfDocument.mark_full_search.<locals>.<genexpr>)text_renderr   r   r   rp   rn   r   rY   tagsZuser_ratingr   r   rx   itemsgetattr)rW   rU   rX   Zcf_namer   rR   rS   r     s*    	zCmfDocument.mark_full_search)rZ   c                 C   s*  | j j}td | jddddgd | |\}}t|}|dD ]}|j	d}t
jj	|d	d
dgd}|std| dd qF| }|std|j ddd qF| sqF| d }	|	|jd< |jdks|jdks|jdkr|jd|	  |jd< |jd |jd< qFd|j	ddkr|dddi}
|jd|	  |
jd< |jd|	  |
jd < |ddd!i}|szqF|jd|	  |jd< |jd |jd< qF|jdkrF|jd|	  |jd"< |jd" |jd#< qF|d$ }rdd%d& |jD }|D ]}|||| }qtd' || _ d S )(Nz_pinup_attach_version STARTr   rp   rn   r   r   [data-attach-id]data-attach-idurlurl_preview_imgurl_previewr=   rx   uV   В документе ссылка не несуществующее вложение Fr   uQ   Не удалось получить доступ к файлу вложения u`   , возможно, он был перемещен, переименован или удаленversiondata-attach-versionimgZvideoZsoundz	?version=srczdata-mce-srczapp-tinymce-card-previewclassr   azapp-tinymce-href-previewZdownloadrelzapp-tinymce-img-previewhrefzdata-mce-hrefbodyc                 S   s   g | ]}t |qS rR   r   r   r   rR   rR   rS   
<listcomp>  s     z5CmfDocument._pinup_attach_version.<locals>.<listcomp>z_pinup_attach_version END)rH   rV   ri   rj   r   get_all_drawio_svgr   selectattrsrA   r?   r@   r   	get_rfileZ
_file_nameZget_versionrY   r   findr   r   r   childrenreplace)rW   r   svg_replaceprepared_textsoupattachment_nodeattachment_id
attachmentrfileZ
latest_verZattachment_linkZpreview_imgr   keyrR   rR   rS   r     sT    

 

z!CmfDocument._pinup_attach_version)history_versionc                O   s   |  dg |  ddg tjjdd| jgdd|ggdgd}|sNtd	d
d d| _d| _| jd
d |j| _	| 
  | j|dd
d|S )u   
        Восстанавливаем документ из DocumentHistory
        Принимаем cmf_version CmfDocumentHistory, который является версией draft или approved документа
        r   need_approver   	parent_idr   r   r   r   rx   u$   Не найдена DocumentHistory!Tr   r   Fr   r   )r   r   )r   r?   r   rA   r=   r   r   r   rI   rH   _update_attachments_versions)rW   r  rU   rX   Zdoc_historyrR   rR   rS   r-     s    zCmfDocument.restore_versionc           	      C   s   | j ddddgd | | jj\}}t|}|dD ]N}|jd}|jd}tj	j|d	d
dgd}|
|D ]}|j|d qtq8d S )Nr   rp   rn   r   r   r   r   r   r   r   r   r   )stream)r   r   rH   rV   r   r   r   rA   r?   r@   Zget_contentupload_stream_file)	rW   r  r  r  r  r  Zattachment_verr	  filerR   rR   rS   r  *  s    z(CmfDocument._update_attachments_versionsc                 C   s   | j rF| jrFt| jjtjkrF| ddg | jj| _| jj	| _	d S | ddddddg d	| _d	| _	| j
r| j
jr|d
| _| j
j	rd
| _	| jrt| jjtjst| jjtjr| jjrd
| _| jj	rd
| _	d S )Nz!tree_parent.publish_approved_onlyz!tree_parent.publish_by_owner_onlyr   rp   zworkflow.publish_approved_onlyzworkflow.publish_by_owner_onlyzparent.publish_approved_onlyzparent.publish_by_owner_onlyFT)is_newrn   cmfutilget_model_by_idr=   r?   r   r   r   r   r   rp   rt   rV   ru   r   rR   rR   rS   _calc_publish_options5  s.     

  &z!CmfDocument._calc_publish_optionsc                 C   s   d}d}| j jr8z| j jjddd}W n   d}Y nX | j rbz| j jdd}W n   d}Y nX |r| j}||_|  |rtj| j| |d}|  n|r| j}||_|  || _dS )u   Если переключаемся на новый БП, надо создать новую версию истории, а старую зареджектитьNr   r   r   r   r   )r   rp   r   )	r   ry   r   r   r   rI   r?   r   rH   )rW   r   Zstatus_rejectedZprev_historyhistoryrR   rR   rS   _switch_to_new_versionN  s0    


z"CmfDocument._switch_to_new_versionc                 C   sL   |  ddddg | jjr8| jjj r8| jjs8|   | jjrH|   d S )Nr   z
status.oldzstatus.need_approver   )r   r   ry   r  rv   r   _start_approver   rR   rR   rS   do_status_is_changedm  s
    z CmfDocument.do_status_is_changedc                 C   s   t jjdd| jjggdd| jggdddgd}|sLtd	| j  d
dd t|dkrrtd	| j  ddd t|dkr|d j	S d S )NZstatus_fromINr   r   	status_tozstatus_to.need_approvezstatus_to.workflowr  u   Из статуса uO    нет ниодного перехода на следующий статус!Tr   r   uf    существует больше одного перехода на следующий статус!r   )
r?   ZCmfTransr   r   r=   r   r   rv   rd   r  )rW   ZtransitionsrR   rR   rS   next_statusw  s     
zCmfDocument.next_statusc                 O   s.   | j dkr|  | _| j}tj| |j d S )Nr   )Zcache_status_typer  r   r   r?   r   Zstart_approve_processr   )rW   rU   rX   Z
wf_historyrR   rR   rS   r    s    

zCmfDocument._start_approvec                 O   s&   |  |   |   | j|| d S r   )r   r   r  rI   r   rR   rR   rS   r/     s    zCmfDocument.start_approvec                 C   sn   t jjdd| jjgdd| jgdddggdd	gdd
gd}|rN|jrN|jd | _| j s^d| _tj | _	d S )Nr  r   r=   !=official_number>0z-official_datez-official_numberofficial_dater   Zorder_byrx   r   )
r?   r   rA   rp   r=   r   rv   r   nowr#  )rW   Zofficial_historyrR   rR   rS   calc_official_datenum  s    

z!CmfDocument.calc_official_datenum)	overwrite
no_versionr   c             	      s&  |    | jjrtddd |r0tddd d S | jrH| jjsH|  | _| jr~|   |   | 	  | 
  |   |   | jjr| j|d | jjr|   |   ddd| jgd	d| jgd
d| jgdd| jggg}tjj| j|dr8| jr"tjjtjjdd}| j d| | _ntd| j ddd | jsdrtj j!j"# }| $ }	|%|	}
|
j&r|
j'}|r|| jkrt(j)j*+|r|rt,-d| d|  d| j d n2t,-d|	 d| d|   td| j ddd |
j}|
j| _.|j| _/|j0dddd | jsN|
j&sN| j$dd}|%|}|j&rN|1|	 |
j0dddd |
2| jj3pnd | jj3|
_'|
4d| j5 |
4d| j5  | jjr| j6j78 r| 9  | jr| j:dkr| j;j3j<}| j;j3j=}t>j?| }tj@jd	d | jAgd!d d"ggd#}tjBjd
d |gdd tC|ggd#}|sbtjB| jA||d$D }tjB| jA||d$D }n:tjBjd
d |gdd |ggd#}|stjB| jA||d$D }|| _tjEjd%d&}|| _| js| jFjrtjGjHd'd( tI| d)d*d+}| jFrtjJf |D  ntjJjf |}|K  tL jD||}|S ),Nus   Нельзя менять текст напрямую, используйте text_draft вместе с do_approveTr   uH   Метод устарел! Используйте update_inline_comments)r   ZANDrY   r   rp   rn   r=   r  )rY   r   )Ztzz%d-%m-%Y %H.%M.%S u!   Документ с именем u^    уже существует на этом уровне. Выберите другое имя.FzOverwrite file for document z by ()u@   Файл с таким именем уже существует z, )is_direxist_okparents)ry   r   Zdocument_is_externalZdocument_is_internalzdocument.blog=typezCmfDocument-blogr   )rp   rn   rY   zdocument.blog:default)r   up   Изменение опции "Это шаблон" доступно только администраторам)messageu   Без группыZ
add_button)r   Z
group_nameZ	menu_type)M_CmfDocument__calc_parentr   r   r   r  r   Zcalc_doc_version_calc_scheme_wf_calc_workflow_calc_executors_calc_spectators_calc_show_approvers_alwaysr   rH   r   r   r  r  rY   rp   rn   r=   r?   r   rA   Zcloned_fromr   r%  r   Zutcstrftimecmf_deletedCmfRFiledpdata_driverget_rdr   r   exists
meta_tuuidcmfrx   ZCmfTUUIDZget_obj_by_tuuid_strri   rj   Z	file_pathr   Zcreaterename
write_textrV   Zmeta_set_flagr   r   trans_updatedrv   _approve_updatedZlogic_prefixcmf_created_atyearmonthr  Z	RU_MONTHSZCmfRegistryr   ZCmfBlogFolderr   rI   ZCmfWorkflowZis_templateCmfAccessListcheck_admin_modedictZCmfMenuItemr   r   )rW   r'  r(  r   rU   rX   ZfiltZdtrdiskrfile_idr
  tuuidZrfile_parentZold_rfile_idZ	old_rfilerF  rG  ZblogZyear_bfZmonth_bfZwfparamsZ	menu_itemresr   rR   rS   rI     s    





"





 "zCmfDocument.savec                    sF   t  jf |}dddddg}| | |D ]}t||t| | q*|S )Nr   r   r   	executors
spectators)r   create_from_templater   setattrr   )rW   rX   new_docrx   attrr   rR   rS   rR  $  s    
z CmfDocument.create_from_templatec                    sR   | j rH| jjrH| jrHt| jtjkrH| 	dg | jjrH| jj| _d S t
  S )Nztree_parent.logic_type)r  
logic_typeis_nullrn   r  r  tree_parent_idr?   r   r   r   _calc_logic_typer   r   rR   rS   rY  4  s    
zCmfDocument._calc_logic_typec                    sR   | j rH| jjrH| jrHt| jtjkrH| 	dg | jjrH| jj| _d S t
  S )Nztree_parent.activity)r  r   rW  rn   r  r  rX  r?   r   r   r   _calc_activityr   r   rR   rS   rZ  B  s    
zCmfDocument._calc_activityc                 C   sH   | j rD| ddg | jsD| jrDt| jtjkrD| jjrD| jj| _d S )NrP  ztree_parent.executors)	r  r   rP  rn   r  r  rX  r?   r   r   rR   rR   rS   r5  P  s    zCmfDocument._calc_executorsc                 C   sH   | j rD| ddg | jsD| jrDt| jtjkrD| jjrD| jj| _d S )NrQ  ztree_parent.spectators)	r  r   rQ  rn   r  r  rX  r?   r   r   rR   rR   rS   r6  [  s    zCmfDocument._calc_spectatorsc                 C   s*   | j r&| jr&t| jjtjr&| jj| _d S r   )r  rn   rt   rV   r?   r   Zshow_approvers_alwaysr   rR   rR   rS   r7  f  s    z'CmfDocument._calc_show_approvers_alwaysc                 C   s   d S r   rR   r   rR   rR   rS   _calc_approvedj  s    zCmfDocument._calc_approvedc                    s   t  j|fd| ji|S )NZmsg_url)r   create_eventr   )rW   event_personrX   r   rR   rS   r\  n  s    zCmfDocument.create_event)TEXKOM_db_deletec                   s   | j ddddg|d tjjj }|  }||}|jrX|j	}|rP|| j
krX|  |rtjj| ddD ]}d |_|jdd qltjj| dd	D ]}	|	j|| qtjj| dd}
|
rd |
_|
jdd t j|d
|i|S )Nr   rp   rn   r   )rx   include_deletedT)descr_documentr_  r   )rp   r_  r^  )r   r?   r:  r;  r<  r=  r   r   r>  r?  r=   r   ZCmfComponentr   r`  rI   r   ru   rA   r   )rW   r^  rU   rX   rK  rL  r
  rM  Z	componentr  r   r   rR   rS   r   t  s,    

zCmfDocument.deletec                    s.   t t| j|| | jjsd S | jr*d| _d S )NT)r   r   _process_publicZ	is_publicr   r   r   r   rR   rS   ra    s
    zCmfDocument._process_publicc                 O   s0   t jjdd| jgdddgddd ggdgdgd	S )
Nr  r   r   Tapproved_versionr  z-approved_versionr   r$  )r?   r   sgetr=   r   rR   rR   rS   get_approved_version  s    z CmfDocument.get_approved_versionc                 C   s   t tjjdd| jgdS )NrX  r   r   )boolr?   r   countr=   r   rR   rR   rS   has_tree_nodes_hook  s    zCmfDocument.has_tree_nodes_hookc           	      O   s   t jdt jd}|| jjr(g | _dS ddlm} || jjp@dd}t	 }|j
ddd	id
D ]}||d  q^g | _|D ]"}tjj|d}|r|| j| q|dS )un   
        Парсит документ, вытаскивает упомнинания на таски
        zdata-mention-typeflagsNr   )r   r   html.parserr   Ztaskr   zdata-object-idr<   )rb   compileIsearchr   rV   Zmention_tasksbs4r   setfind_alladdr?   ZCmfTaskrA   append)	rW   rU   rX   re1r   Zbs_textZnew_taskitemZtskrR   rR   rS   r     s    z CmfDocument._handle_mention_taskc                 C   sz   | j jsd S t }t }| j jr2t| | j j}| j jrLt| | j j}|| D ] }|jdkrTtjj	| d|d qTd S )N)ZCmfPersonGrouprw   Zmention)r]  )
rH   r   rp  ry   Z
parse_textrz   
class_namer?   r   r   )rW   Zobjs_oldZobjs_newr   rR   rR   rS   handle_mention_persons  s    
z"CmfDocument.handle_mention_personsc                 C   s    | j f |}|jdd |jjS )u   Создание документа из шаблона
        :param self: Шаблон документа
        :param params: Параметры для шаблона
        :return: Идентификатор нового документа
        Tr   )rR  rI   r=   rV   )rW   rN  rT  rR   rR   rS   r$     s    z$CmfDocument.create_doc_from_templatec                 O   sj  dd l }dd l}ddlm} ddlm} | dg z|   W n tk
rV   Y d S X | j	sjt
ddd t| jdd	  d
}tjj| |d}|stj| |d}dd l}	|	 }
tj|
|}|j|ddZ}| j	D ]L}|j|krqz|  W n tk
r   Y qY nX ||j||j qW 5 Q R X t|d}|j|ddd W 5 Q R X W 5 Q R X |jS )Nr   r   )basenamer   uP   Отсутствуют вложенные файлы для скачиванияTr   :r   z.ziprp   rY   w)moder>   F)ZbackupZmake_preview)zipfileshutilpathlibr   Zos.pathrx  r   _acl_check_readCmfPermissionErrorr   r   r   r=   re   r?   r@   rA   tempfileZTemporaryDirectoryospathr   ZipFilerY   writerB   rE   r  r   )rW   rU   rX   r}  r~  r   rx  zip_filenamer	  r  Ztmp_dirZzip_file_path_tmpZarcru  rQ   rR   rR   rS   r(     s<    



 $z#CmfDocument.download_all_attachmentc                 O   s0   z|    W n tk
r"   Y d S X | j||S r   )r  r  r(   r   rR   rR   rS   r8     s
    z*CmfDocument.public_download_all_attachmentc                    sh   |  | j | jjp"| jjp"| jj}tj|p0d|d< d|krZd	dd | j
D |d< t jf |S )Nr   r   Zobj_key_phrases
c                 S   s   g | ]}t |jpd qS )r   )r   rY   )r   trR   rR   rS   r     s     z1CmfDocument.full_search_index.<locals>.<listcomp>)r   Zfull_search_fieldsr   rV   r   rH   r?   ZCmfFullSearchZ
strip_htmlr   Zkey_phrasesr   full_search_index)rW   rX   r   r   rR   rS   r    s    zCmfDocument.full_search_index)r   rZ   c                 C   sh   |s|S t d|t js|S t|d}|jt dddidD ]}|  |d< q>ddd	 |jj	D S )
u   
        Добавляет тегам H1-H7 атрибут 'data-id'
        для ссылок в оглавлении
        z <h[1-7](?![^>]*\s+data-id)[^>]*>lxmlz^h[1-7]data-idFrk  r   c                 S   s   g | ]}t |qS rR   r   r   rR   rR   rS   r     s     z.CmfDocument._convert_h_tag.<locals>.<listcomp>)
rb   rn  
IGNORECASEr   rq  rl  r   r   r   r  )clsr   r  Zh_tagrR   rR   rS   _convert_h_tag  s    
zCmfDocument._convert_h_tagc                 C   s   d}d}t d| s| S t| d}dd |jddD }|jt d	| d
dD ]b}|d drfqR|d dd }||}|d |||d< d|d< |rR|d dd |d< qRddd |j	j
D S )u?   
        Конвертируем оглавление
        #z#mcetoc_z+<a[^>]*href=["\']#(?!mcetoc_).*?["\'][^>]*>r  c                 S   s   i | ]}|d  |qS r<   rR   )r   elementrR   rR   rS   
<dictcomp>/  s      z.CmfDocument._convert_title.<locals>.<dictcomp>Tr<   ^z.+)r   r   r   Ncmf_convertedr=   r   c                 S   s   g | ]}t |qS rR   r   r   rR   rR   rS   r   A  s     z.CmfDocument._convert_title.<locals>.<listcomp>)rb   rn  r   rq  rl  
startswithrA   r  r   r   r  )r   Zold_idZnew_idr  ZidslinkZid_nameZid_bodyrR   rR   rS   _convert_title   s     

zCmfDocument._convert_titlec                 C   s   t jdt jd}|| s| S t| d}|jddidD ]}|jdrJq8|jd d d|jd	< d
|jd< |j	dd	d
id}|d || |jddt didD ] }d
|d< d|jd  |d< qq8t
|S )u=   
        Конверитуем оглавление
        z	toc-macrorh  rj  r   rk  r  zmce-tocFcontenteditableTZh2u   ОглавлениеZh4r=   ztitlelist-.*Zmcetoc_)rb   rl  rm  rn  r   ZfindAllr   rA   rs  new_tagr   )r   rt  r  tagZ	title_tagZtag_hrR   rR   rS   _convert_title_macroC  s"    





z CmfDocument._convert_title_macroc                 C   s   t d| s| S t| d}|jddidD ]H}|jdddid}|d}|r\||j n||j || q*d	d	d
 |j
jD S )uW   
        Конвертируем тэги экранирования кода
        zA<\s*(code|div)[^>]*\sclass=["\'][^"\']*\bcode\b[^"\']*["\'][^>]*>r  r   r   rk  prezlanguage-markupr   c                 S   s   g | ]}t |qS rR   r   r   rR   rR   rS   r   x  s     z-CmfDocument._convert_code.<locals>.<listcomp>)rb   rn  r   rq  r  r  extendcontentsreplace_withr   r   r  )r   r  r  r  Ztag_contentrR   rR   rS   _convert_code[  s    

zCmfDocument._convert_codec                 C   s  t ddd}d }td| tjrt| d}|jdtdidD ]}d	|jdg krZqBd
|jd krnd}nJd|jd krd}n6d|jd krd}n"d|jd krd}nt	d| |j
dtdid}|||||j qBt |} td| rbt| d}|jdddidD ]N}d	|jdg kr.q|j
ddid}|rJ|jndg}|d||| q|rddd |jjD S | S d S )N)
panel_typec           	      S   s   |j ddddd}|j dtjj|  d d}|j dtjj|  d d}|| || |j dd	d
dd}|| |j dd| ddd}|| || || d S )Ndivak-editor-panel__iconfalser   contentEditablerk  r   r  r   ak-editor-panel__contenttruezak-editor-panel eva_convertedr   zdata-panel-typer  )r  r?   r   
ICONS_DATArs  r  r  )	r  r  Zdoc_soupr  panel_tag_iconsvg_tagsvg_path_tagpanel_tag_content	panel_tagrR   rR   rS   _convert_macro_panel|  s0    
  






z?CmfDocument._convert_macro_panels.<locals>._convert_macro_panelzconfluence-information-macror  r   z^confluence-information-macro$rk  Zeva_convertedz!confluence-information-macro-noter   z(confluence-information-macro-informationr   z confluence-information-macro-tipr    z$confluence-information-macro-warningr   uO   Неизвестный тег для преобразования панели z.+bodyzc<div[^>]*\bclass=["\'][^"\']*(?!\s*eva_converted)[^"\']*\bpanel\b(?!\s*[^"\']*)([^"\']*["\'][^>]*>)r  ZpanelZpanelContentr  r   r   c                 S   s   g | ]}t |qS rR   r   r   rR   rR   rS   r     s     z5CmfDocument._convert_macro_panels.<locals>.<listcomp>)r   rb   rn  rm  r   rq  rl  r   rA   CmfErrorr  r  r   r   r  )r   r  r  r  r  contentr  rR   rR   rS   _convert_macro_panelsz  s<    

z!CmfDocument._convert_macro_panelsc              
   C   sh  t jdt jd}t jdt jd}|| r4|| s8| S t| d}|jdddidD ]}dddd	d
dddd}|d}||d}dddd	d
dd}|d}	||	d}
|jddddd}|jdtj	j
|
 d d}|jdtj	j
|
 d d}|| || |jddddd}||j |jdd|ddd}|| || || qTt|S )uc   
        Конвертирует макрос "UI Text Box RefinedToolkit for Confluence"
        data-macro-namerh  zui-text-boxrj  r  rk  r   r   r    r   r   r   )z
light-cyanz
light-bluezlight-purplezlight-greenzlight-magentaz	light-redzlight-yellowzlight-orangez
data-color)r   r   defaultr    r   r   z	data-iconr  r  r  r   r  r   r  r  zak-editor-panelr  )rb   rl  rm  rn  r   rq  rA   r  r?   r   r  rs  r  r  r  r   )r   rt  re2r  r  Zpanel_type_mappingZ
data_colorr  Zpanel_icon_mappingZ	data_iconZ
panel_iconr  r  r  r  r  rR   rR   rS   _convert_ui_text_box  sl    







z CmfDocument._convert_ui_text_boxc           
      C   s   t jdt jd}|| s| S t| d}|jddidD ]}|jdddid}|jdddid}|jd	dd
id}|d || || |jddid}|	|j
 |jddid}|jdddid}	|		|j
 ||	 || q8t|S )Nzexpand-containerrh  rj  r   rk  r  zspoiler collapsedzspoiler-togglespanzspoiler-icon_zexpand-control-textzexpand-contentzspoiler-text)rb   rl  rm  rn  r   rq  r  rs  r  r  r  r  r   )
r   rt  r  r  ZspoilerZspoiler_toggleZspoiler_iconZtag_control_textZtag_control_contentZspoiler_textrR   rR   rS   _convert_expander  s&    





zCmfDocument._convert_expander)r   r  rZ   c                 C   s  |s|S t jdt jd}t jdt jd}||r<||s@|S d|   d|   d|   d|   d|   d	|   d
|   d|   d|   d}tj|ddgd}t|j}t	|d}|j
ddidD ]}	d||ddddd}
|	d}|r>tdd |dD }|dr.d|
d< nd|
d< |d rtjj|j|d  d!}|sptjj|d  d"}|rt|j|
d#< t|j}|d$r|d$ |
d%< |d&r|d& |
d< |d'r|d' |
d(< |d)r dd*d*d+}||d) |
d,< |d-r*d.d/d0d1}||d- |
d2< |d3r>d|
d4< t	|j||tj|
dd5|d6d7dd8}|	|j qdd9d: |jjD S );u   
        Конвертируем тег Отображение дочерних из Confluence в наш
        fixme удалить когда добавят поддежку тега из Confluence
        r  rh  r  z
            <div
                class="macros-panel"
                contenteditable="false"
                data-children-docs="{doc_id}"
                data-id="z"
                data-macro-parameters='{params}'
                data-macros="children-docs"
                original-data-macro-parameters="{original_params}"
            >
                <div class="extension-container" data-id="uW   " data-layout="default">
                    <span aria-label="Макрос " data-id="aq  " role="img">
                        <svg xmlns="http://www.w3.org/2000/svg" id="Outline" viewbox="0 0 24 24" width="20" height="20">
                            <path d="M22.485,10.975,12,17.267,1.515,10.975A1,1,0,1,0,.486,12.69l11,6.6a1,1,0,0,0,1.03,0l11-6.6a1,1,0,1,0-1.029-1.715Z"></path>
                            <path d="M22.485,15.543,12,21.834,1.515,15.543A1,1,0,1,0,.486,17.258l11,6.6a1,1,0,0,0,1.03,0l11-6.6a1,1,0,1,0-1.029-1.715Z"></path>
                            <path d="M12,14.773a2.976,2.976,0,0,1-1.531-.425L.485,8.357a1,1,0,0,1,0-1.714L10.469.652a2.973,2.973,0,0,1,3.062,0l9.984,5.991a1,1,0,0,1,0,1.714l-9.984,5.991A2.976,2.976,0,0,1,12,14.773ZM2.944,7.5,11.5,12.633a.974.974,0,0,0,1,0L21.056,7.5,12.5,2.367a.974.974,0,0,0-1,0h0Z"></path>
                        </svg>
                    </span>
                    <span class="extension-title" data-id="u   ">Макрос "Отображение дочерних"</span>
                    <span class="extension-object-name" data-id="zP">| {doc_name}</span>
                    <span class="macros-actions" data-id="z>">
                        <span class="macros-edit" data-id="a  " style="margin-right: 7px;">
                            <svg _ngcontent-aiw-c17="" viewbox="0 0 24 24" class="ng-star-inserted" style="width: 14px; height: 14px; color: #444444;">
                                <path _ngcontent-aiw-c17="" fill="#444" d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                            </svg>
                        </span>
                        <span class="macros-delete" data-id="aD  ">
                            <svg viewbox="0 0 18 18" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                                <path fill="#222" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                <path fill="#222" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                <path fill="#222" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            </svg>
                        </span>
                    </span>
                </div>
                <div class="ak-renderer-wrapper" data-fabric-macro="null" data-id="z7" data-macro-body=""></div>
            </div>
        Tzname, parentsimplerx   r  rk  FZ50r   none)isShowChildrenZparentId
documentIdchildrenAmountlevelincludeViewTypeisOrderByDeskzoriginal-data-macro-parametersc                 s   s   | ]}| d V  qdS )r/  N)re   )r   ZparamrR   rR   rS   r   _  s     z2CmfDocument._convert_childpages.<locals>.<genexpr>|allr  1r  Zpagerz  )rY   r  firstr  r   styleZ
headerTypeZexcerptTyper  )r  r  zrich contentr  sortrY   rE  cmf_modified_at)titlecreationmodifiedZsortTypereverser  Zensure_ascii)rJ   doc_namerN  original_paramsr  rj  c                 S   s   g | ]}t |qS rR   r   r   rR   rR   rS   r     s     z3CmfDocument._convert_childpages.<locals>.<listcomp>)rb   rl  rm  rn  r   r  get_obj_by_idr   rY   r   rq  rA   rJ  re   r?   r   r  ru   r=   formatjsondumpsr  r  
currentTagr   r   r  )r  r   r  rt  r  TMPLr   r  r  r  rN  r  Zparent_pageZview_type_mapZsort_type_mapnew_souprR   rR   rS   _convert_childpages  s    &





 zCmfDocument._convert_childpagesc              	   C   s  t jdt jd}|| s| S t| d}dd |jddidD }|D ]t}ddgd	d
gd
d	gd
d
d
gdddgd}||jd}|sqFg }t|j	D ]}|dkrq|
| q|sqF|jdddddd}	t|t|krFt|dkr|d}
|d j	|
_	||
 qFn2t|dkr.|d}nt|dkrF|d}t|D ]b\}}|jd| ddd| ddd}|jddddd}|| j	|_	|
| |	
| qN||	 qFt|S )u   
        Конвертирует "Разметка страницы"(коробочная) или "Макеты"(облачная)
        ZcolumnLayoutrh  rj  c                 S   s,   g | ]$}d |j d krd|j d kr|qS )zfixed-widthr   Zsinglerk  )r   r   rR   rR   rS   r     s     z0CmfDocument._convert_layouts.<locals>.<listcomp>r   rk  z50.0z66.66z33.33z25.0)	two-equalztwo-right-sidebarztwo-left-sidebarthree-equalzthree-with-sidebarszdata-layoutr  r  r  r  zmceNonEditable selected)r  zdata-layout-sectionr   r   r   r\   r     r  %zflex-basis: )zdata-column-widthzdata-layout-columnr  )zdata-layout-contentr  )rb   rl  rm  rn  r   rq  rA   r   r   r  rs  r  rd   r  	enumerater   )r   rt  r  r   r  Zlayout_typecolr  cZtag_layout_sectionZtag_divr   r   Ztag_layout_colZtag_layout_contentrR   rR   rS   _convert_layouts  st    


	




zCmfDocument._convert_layoutsc                 C   s   ddddddddd	d
dddddddddd}t jdt jd}|| sJ| S t| d}|jddgddidD ]@}|d }||}|r||d< qjd| d|dd  |d< qjt|S )!u%    Конвертирует цвета z
Light tealzLight greenzLight yellowz	Light redzLight purplez
Light grayZBlueZTealZGreenZYellowZRedZPurpleZGrayz	Dark Bluez	Dark tealz
Dark greenzDark yellowzDark redzDark purple)z#e6fcffz#e3fcefz#fffae6z#feece5z#eae6ffz#f4f5f7z#b3d4ffz#b3f5ffz#abf5d1z#fff0b3z#ffbdadz#c0b6f2z#b3bac5z#4c9affz#79e2f2z#57d9a3z#ffc400z#ff8f73z#998dd9zdata-highlight-colourrh  rj  thZtdTrk  zdata-highlight-colorzbackground-color: ; r  r   )rb   rl  rm  rn  r   rq  rA   r   )r   Z	color_maprt  	text_soupr  Zdata_highlight_colourr   rR   rR   rS   _convert_colors  s>    



zCmfDocument._convert_colorsc                 C   s   ddddddddd	d
dddddddddd}t jdt jd}|| sJ| S t| d}|jdddD ]&}|d}||}|rb|| qbt|S )u    Конвертирует Emojiu   🙂u   😛u   😃u   😉u   👍u   👎u   ℹu   ✅u   ❌u   ⚠️u   ➕u   ⛔u   ❓u   💡u   ⭐)ZsmileZcheekyZlaughZwinkz	thumbs-upzthumbs-downZinformationZtickZcrossr   ZplusZminusZquestionzlight-onz	light-offzyellow-starzred-starz
green-starz	blue-starZemoticonrh  rj  r   class_zdata-emoticon-name)	rb   rl  rm  rn  r   rq  rA   r  r   )r   Z	emoji_maprt  r  r  Zemoticon_nameZemojirR   rR   rS   _convert_emoji  s<    



zCmfDocument._convert_emojic                 C   sz   d}t jdt jd}t jdt jd}|| r8|| s<| S t| d}|jddidD ]}t|d}||j qVt|S )uJ   
        Конвертирует макрос "Вложения"
        uu  
        <div data-id class="plugin_attachments_table_container" data-attachments-table="true" contenteditable="false">
            <table class="attachments temporary-element">
                <tbody class=" temporary-element">
                    <tr class="header-row  temporary-element">
                        <th class="filename-column temporary-element">Файл</th>
                        <th class="modified-column temporary-element">Изменено</th>
                        <th class="actions-column temporary-element">Действия</th>
                    </tr>
                </tbody>
                <tbody class=" temporary-element"></tbody>
            </table>
            <div class="plugin-attachments-upload-container temporary-element">
                <div class="attachments-table-drop-zone dropzone temporary-element"></div>
                <div class="attachments-table-text temporary-element">
                    <svg style="width: 30px; height: 30px; margin-bottom: -5px;" viewbox="0 0 24 24">
                        <path fill="#AAA" d="m18.746 20.334a1 1 0 0 1 -.081 1.413l-1.586 1.414a2.9 2.9 0 0 1 -2.064.839 3.013 3.013 0 0 1 -2.136-.882l-1.544-1.374a1 1 0 0 1 1.33-1.494l1.335 1.194v-7.444a1 1 0 0 1 2 0v7.445l1.335-1.192a1 1 0 0 1 1.411.081zm-.39-12.973a1.088 1.088 0 0 1 -.722-.735 8 8 0 0 0 -15.489.842 7.657 7.657 0 0 0 .8 5.18 5.448 5.448 0 0 0 -2.888 5.652 5.843 5.843 0 0 0 5.626 4.7h2.317a1 1 0 0 0 0-2h-2.317a3.81 3.81 0 0 1 -3.646-2.982 3.469 3.469 0 0 1 1.834-3.6 1.993 1.993 0 0 0 .793-2.685 6 6 0 1 1 11.06-4.513 3.1 3.1 0 0 0 2.045 2.052 5.971 5.971 0 0 1 4.212 6.21 5.377 5.377 0 0 1 -1.111 2.909 1 1 0 0 0 1.586 1.219 7.466 7.466 0 0 0 1.52-3.972 7.96 7.96 0 0 0 -5.62-8.277z"></path>
                    </svg>&nbsp;Перенесите или <label for="input-file" class=" temporary-element"> <span id="file-upload" class="pseudo-link temporary-element" aria-hidden="true">загрузите файлы</span> <input id="input-file" class="input-file temporary-element" accept=".jpg, .jpeg, .png, .txt, .pdf" type="file" /> </label>
                </div>
            </div>
        </div>
        r  rh  r   rj  rk  )	rb   rl  rm  rn  r   rq  r  r  r   )r   r  rt  r  r  r  r  rR   rR   rS   _convert_macro_attachments&  s    

z&CmfDocument._convert_macro_attachments)r   	object_idrZ   c              	   C   s  ddl m}m} tjdtjd}tjdtjd}|| rD|| sH| S t| d}|jddid}|snt	|S d}d	d
ddd}	t
j|ddddgd}
|
js| S d}d}|
jdkrX|
jjjdkrtjjdd|
jjgd	ddggdgd}n|
j}|
jr|
jd }|jr|jdr:|jd d }|
j|jkrV|}n|jdr|jd d }nF|
jr|
jdr~|
jd d }n|
jdr|
jd d }|}|D ]Z}d}dddddddd }|jd	d!id}|r|jd"nd}|r||krd}n||krd#|d$< d#|d%< d}ntjjd&d'd(| gd)gd}|s\tjjdd'd*| d+gd,}|r|jdkr~||jjkr~nD|jdkr|j|
jkrd#|d$< d#|d%< n|jj|d$< |jj|d%< d}nd#|d$< d#|d%< d}|jd	d-id }r|jd"|d-< |jd.d/rd|d0< |jd1d2r.d|d3< |jd	d4id }r|jd"}||d5d6}||j}|d7r|	|d7 d d|d7< |d8rt|d8 d   |d8< t|d9d:j!t"|d;d}|rd<|j#d=< n
||j#d>< |$|j% qt	|S )?uQ   
        Конвертирует плагин Page Tree из Confluence
        r   )parse_qsurlparser  rh  Zpagetreerj  rk  u  
        <div class="macros-panel page-tree-macros" contenteditable="false" data-macros="page-tree"
        data-macro-parameters='{pagetree_params}'>
            <div class="extension-container" contenteditable="false" data-layout="default">
                <span role="img" aria-label="Макрос Дерево страниц">
                    <svg xmlns="http://www.w3.org/2000/svg" id="Outline" viewbox="0 0 24 24" width="20" height="20">
                        <path d="M22.485,10.975,12,17.267,1.515,10.975A1,1,0,1,0,.486,12.69l11,6.6a1,1,0,0,0,1.03,0l11-6.6a1,1,0,1,0-1.029-1.715Z"></path>
                        <path d="M22.485,15.543,12,21.834,1.515,15.543A1,1,0,1,0,.486,17.258l11,6.6a1,1,0,0,0,1.03,0l11-6.6a1,1,0,1,0-1.029-1.715Z"></path>
                        <path d="M12,14.773a2.976,2.976,0,0,1-1.531-.425L.485,8.357a1,1,0,0,1,0-1.714L10.469.652a2.973,2.973,0,0,1,3.062,0l9.984,5.991a1,1,0,0,1,0,1.714l-9.984,5.991A2.976,2.976,0,0,1,12,14.773ZM2.944,7.5,11.5,12.633a.974.974,0,0,0,1,0L21.056,7.5,12.5,2.367a.974.974,0,0,0-1,0h0Z"></path>
                    </svg>
                </span>
                <span class="extension-title">
                    <span class="excerpt-title">| Дерево страниц</span>
                </span>
                <span class="macros-actions">
                    <span class="macros-edit" style="margin-right: 7px;">
                        <svg _ngcontent-aiw-c17="" viewbox="0 0 24 24" class="ng-star-inserted" style="width: 14px; height: 14px; color: #444444;">
                            <path _ngcontent-aiw-c17="" fill="#444" d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                        </svg>
                    </span>
                    <span class="macros-delete">
                        <svg viewbox="0 0 18 18" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                            <path fill="#222" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            <path fill="#222" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            <path fill="#222" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                        </svg>
                    </span>
                </span>
            </div>
            <div class="ak-renderer-wrapper" contenteditable="true" data-fabric-macro="null" data-macro-body=""></div>
        </div>
        rY   rE  r  orderno)Znaturalr  r  ZpositionTimport_raw_jsonzparent.import_raw_jsonzparent.logic_typer  Nr   zproject.agile:defaultrn   r   u   Документыr  r=   ZhomepageZ
root_pagesFz@homer   )
rootLocalerootexpandCollapseAll
startDepthr  r  	searchBoxZ
rootPageIdrV   z@selfr  r  Zext_idLIKEz%::zparent.descr_documentz%"homepage":{"id":"z"%r   r  Zpagetreesearchr<   r  Zplugin_pagetree_expandcollapser  r  ZtreeRequestIdz&amp;&r  r  r  r   )pagetree_paramsr  r  Zroot_page_original)&urllib.parser  r  rb   rl  rm  rn  r   rq  r   r  r  r  rv  rp   rV  r   r?   r   rc  r=   rA   r  r   ru   r`  rV   rY   r  queryr  loadslowerr  r  r  r  r  )r   r  r  r  rt  r  r  Zpagetree_tagsZTAG_TMPLZ	sort_dictr   Zhomepage_idZselfpage_idZroot_parentZpagetree_tagr  r  Zroot_page_tagZroot_page_idZpagetree_rootZstart_depth_tagZtree_request_id_tagZtree_request_idZparsed_requestZrequest_paramsZmacros_souprR   rR   rS   _convert_pagetreeO  s    
"	









zCmfDocument._convert_pagetreec           
      C   s   d}| s| S t jdt jd}t jdt jd}|| r@|| sD| S ddddddd	d
}t| d}|jdddidD ]f}|d }ttdd |d }|dkr|ddr|d7 }t|j	|j
||ddd}	||	j qtddd |jjD S )Nz
        <span
            data-macros="wiki-status"
            text="{text}"
            color="{color}"
            class="statusView-content-wrap"
            contenteditable="false"
        >
            <span>{text}</span>
        </span>
        r  rh  r   ZpurpleZredZblueZyellowZgreen)zaui-lozenge-progresszaui-lozenge-errorzaui-lozenge-completeaui-lozenge-currentzaui-lozenge-current_cloudzaui-lozenge-movedzaui-lozenge-successr  r  rk  r   c                 S   s   |  do|  d S )Nzaui-lozenge-zaui-lozenge-subtle)r  )r   rR   rR   rS   <lambda>.      z1CmfDocument._convert_status_tag.<locals>.<lambda>r  zdata-macro-idFZ_cloudZneutral)r   r   rj  r   c                 S   s   g | ]}t |qS rR   r   r   rR   rR   rS   r   =  s     z3CmfDocument._convert_status_tag.<locals>.<listcomp>)rb   rl  rm  rn  r   rq  nextr   rA   r  r   r  r  r   r   r  )
r   TMPrt  r  Zstatus_color_mappingr  r  classesr  srR   rR   rS   _convert_status_tag  s<    


zCmfDocument._convert_status_tag)r   r  rZ   c              
   C   sj  d}| s| S t jdt jd}t jdt jd}|| r@|| sD| S t| d}t|jdddidD ]}|jd	d
did}| D ]\}}	|d |krzd }
t 	d|	}|rt
j|d }
n.d}t ||	t j}|rd|d  d}
|
rt|jd|
|dd}||j ntd| d|	 W q   td| d|	 Y qX qqdddd |jjD S )Nu  
        <div class="macros-panel plantuml" contenteditable="false" data-macros-parameters="{params}"
            style="display: inline-flex; flex-direction: column; position: relative; width: 100%;"
            data-rendered="true" data-macros="plantuml">
            <div data-layout="default" class="extension-container" contenteditable="false">
                <span role="img" aria-label="Макрос PlantUML">
                    <svg xmlns="http://www.w3.org/2000/svg" id="Layer_1" data-name="Layer 1" viewBox="0 0 24 24" width="16" height="16">
                        <path d="M22,15h2v7h-7v-2h5v-5Zm2-10v6.731l-2-1.976v-.755H7v11h4.738c.033,.036,.057,.078,.092,.113l1.887,1.887H0V5c0-1.654,1.346-3,3-3H21c1.654,0,3,1.346,3,3ZM2,5v2h3v-3H3c-.551,0-1,.448-1,1Zm3,4H2v11h3V9Zm17-2v-2c0-.552-.448-1-1-1H7v3h15Zm-9.715,9.292c-.38,.391-.38,1.025,0,1.416l2.715,2.792v-2.5h2c1.654,0,3-1.346,3-3v-2.023h2.455l-2.756-2.711c-.386-.386-1.012-.386-1.398,0l-2.756,2.711h2.455v2.023c0,.552-.448,1-1,1h-2v-2.5l-2.715,2.792Z"></path>
                    </svg>
                </span>
                <span class="extension-title">
                    <span class="excerpt-title">PlantUML</span>
                </span>
                <span class="macros-actions">
                    <span class="macros-refresh">
                        <svg viewBox="0 0 24 24" style="width: 14px; height: 14px; color: rgb(32, 32, 32);"><path fill="#202020" d="M12,2a10.032,10.032,0,0,1,7.122,3H16a1,1,0,0,0-1,1h0a1,1,0,0,0,1,1h4.143A1.858,1.858,0,0,0,22,5.143V1a1,1,0,0,0-1-1h0a1,1,0,0,0-1,1V3.078A11.981,11.981,0,0,0,.05,10.9a1.007,1.007,0,0,0,1,1.1h0a.982.982,0,0,0,.989-.878A10.014,10.014,0,0,1,12,2Z"></path><path fill="#202020" d="M22.951,12a.982.982,0,0,0-.989.878A9.986,9.986,0,0,1,4.878,19H8a1,1,0,0,0,1-1H9a1,1,0,0,0-1-1H3.857A1.856,1.856,0,0,0,2,18.857V23a1,1,0,0,0,1,1H3a1,1,0,0,0,1-1V20.922A11.981,11.981,0,0,0,23.95,13.1a1.007,1.007,0,0,0-1-1.1Z"></path></svg>
                    </span>
                    <span class="macros-edit" style="margin-right: 7px;">
                        <svg _ngcontent-aiw-c17="" viewbox="0 0 24 24" class="ng-star-inserted" style="width: 14px; height: 14px; color: #444444;">
                            <path _ngcontent-aiw-c17="" fill="#444" d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                        </svg>
                    </span>
                    <span class="macros-delete">
                        <svg viewbox="0 0 18 18" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                            <path fill="#222" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            <path fill="#222" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            <path fill="#222" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                        </svg>
                    </span>
                </span>
            </div>
            <div data-fabric-macro="null" data-macro-body="" class="ak-renderer-wrapper" contenteditable="true">
                <textarea class="puml-code">{uml}</textarea>
            </div>
            <div class="macros-preview" contenteditable="true">
                {svg}
            </div>
        </div>
        Zplantumlrh  zsvg-replacer  r  r  rk  r  r   r=   zSRC=\[([^]]+)\]r   z@startuml(.*?)@enduml
@startuml
r   
@endumlz{})rN  umlr   rj  uS   Не удалось преобразовать Plantuml, не найден код: r  u9   Не удалось преобразовать Plantuml: r   c                 S   s   g | ]}t |qS rR   r   r   rR   rR   rS   r     s     z5CmfDocument._convert_plantuml_tag.<locals>.<listcomp>)rb   rl  rm  rn  r   r   rq  r  r   rc   r?   r   convert_encuml2umlDOTALLgrouprh   r  r  r  	Exceptionr   r   r  )r   r  r   rt  r  r  r  Zsvg_divZsvg_keyZsvg_textr  encumlpatternresultr  rR   rR   rS   _convert_plantuml_tag?  s8    '
z!CmfDocument._convert_plantuml_tagc                 C   sp   |s|S t jdt jd}||s&|S t|d}|jdddD ]}d|d< |  |d< q>d	d
d |jj	D S )u^   
        Заменяет класс у тега 'ul' списка чекбоксов
        zinline-task-listrh  r  Zulr  ztox-checklistr   r  r   c                 S   s   g | ]}t |qS rR   r   r   rR   rR   rS   r     s     z2CmfDocument._convert_task_list.<locals>.<listcomp>)
rb   rl  rm  rn  r   rq  r   r   r   r  )r  r   r  r  r  rR   rR   rS   _convert_task_list  s    

zCmfDocument._convert_task_listc                 C   s   |s|S t jdt jd}||s&|S t|d}|jdddidD ]D}|ds\|  |d< |dg }d	|krBd
|krB|d d
 qBt	|S )uM   
        Добавляет атрибут "data-id" для checkbox
        zdata-inline-task-idrh  rj  ZliTrk  r  r   checkedztox-checklist--checked)
rb   rl  rm  rn  r   rq  rA   r   rs  r   )r  r   rt  r  r  Z	tag_classrR   rR   rS   _convert_checkbox  s     


zCmfDocument._convert_checkboxc                 C   s  d|    d|    d|    d|    d|    d|    d|    d|    d	|    d
}|sh|S tjdtjd}tjdtjd}||r||s|S t|d}|jdddidD ]}t|jdddidD ]v\}}|d}	d|	dddd|dkdddd
}
t|j	t
j|
dddd|	dd d! |jD d"d}||j q|jd#d$D ]}|  qZ|d%d& d'D ]}|  qx|  qt|S )(u   
        Конвертирует макрос "UI Tabs RefinedToolkit for Confluence" (макрос "Вкладки")
        zr
        <div
            class="macros-panel wiki-tabs"
            contenteditable="false"
            data-id="z"
            data-macros="wikitabs"
            data-macros-parameters="{params}"
        >
            <div class="extension-container" contenteditable="false" data-id="uR   " data-layout="default">
                <span aria-label="Макрос" data-id="a  ">
                    <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24" width="14px" height="14px">
                        <path d="M11.25,7.99874576 L18.75,7.99874576 L18.9896379,8.00744644 L18.9896379,8.00744644 C20.6119031,8.125678 21.9036924,9.43468674 21.9948552,11.0643219 L22,11.2487458 L22,18.7487458 C22,20.4817772 20.6435452,21.8979917 18.9344239,21.993601 L18.75,21.9987458 L11.25,21.9987458 C9.51696854,21.9987458 8.10075407,20.642291 8.00514479,18.9331697 L8,18.7487458 L8,11.2487458 C8,9.5157143 9.35645477,8.09949983 11.0655761,8.00389055 L11.25,7.99874576 Z M9.5,18.7487458 L9.50455771,18.8760231 L9.50455771,18.8760231 L9.52290455,19.0326048 C9.65099554,19.8179147 10.30178,20.427623 11.1064728,20.4929446 L11.25,20.4987458 L18.75,20.4987458 C19.6681734,20.4987458 20.4211923,19.7916355 20.4941988,18.892273 L20.5,18.7487458 L20.5,11.2487458 C20.5,10.2822474 19.7164983,9.49874576 18.75,9.49874576 L11.25,9.49874576 C10.3318266,9.49874576 9.57880766,10.205856 9.5058012,11.1052186 L9.5,11.2487458 L9.5,18.7487458 Z M15.75,5 C15.8305982,5 15.9105112,5.00293389 15.9896379,5.00870069 C17.236948,5.09952529 18.2890659,5.89453789 18.7501004,6.99804043 L16.9722957,6.99760388 C16.6889259,6.72100274 16.3120424,6.5397745 15.8935272,6.5058012 L15.75,6.5 L8.25,6.5 C7.3318266,6.5 6.57880766,7.20711027 6.5058012,8.10647279 L6.5,8.25 L6.5,15.75 L6.51083386,15.9458258 C6.55524501,16.3446817 6.73371018,16.7030658 7.00015022,16.974899 L7.0000564,18.7509418 C5.87931902,18.283597 5.07631822,17.2067274 5.00514479,15.9344239 L5,15.75 L5,8.25 C5,6.51696854 6.35645477,5.10075407 8.06557609,5.00514479 L8.25,5 L15.75,5 Z M12.75,2 C14.0497736,2 15.1713376,2.76300581 15.691219,3.86554427 L15.75,4 L13.9733002,3.99858514 C13.6898169,3.72143138 13.3125371,3.53981466 12.8935272,3.5058012 L12.75,3.5 L5.25,3.5 C4.3318266,3.5 3.57880766,4.20711027 3.5058012,5.10647279 L3.5,5.25 L3.5,12.75 C3.5,13.2269035 3.69076499,13.6592514 4.00015022,13.974899 L4.0000564,15.7509418 C2.87931902,15.283597 2.07631822,14.2067274 2.00514479,12.9344239 L2,12.75 L2,5.25 C2,3.51696854 3.35645477,2.10075407 5.06557609,2.00514479 L5.25,2 L12.75,2 Z"></path>
                    </svg>
                </span>
                <span class="extension-title" data-id="z<">
                    <span class="excerpt-title" data-id="u   ">Макрос "Вкладки" | {tab_name}</span>
                </span>
                <span class="macros-actions" data-id="z<">
                    <span class="macros-action" data-id="a  " data-macros-action="macros-edit">
                        <svg _ngcontent-aiw-c17="" viewbox="0 0 24 24" class="ng-star-inserted" style="width: 14px; height: 14px; color: #444444;">
                            <path _ngcontent-aiw-c17="" fill="#444" d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                        </svg>
                    </span>
                    <span class="macros-action macros-delete" data-id="aA  " data-macros-action="macros-delete">
                        <svg viewbox="0 0 18 18" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                            <path fill="#222" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            <path fill="#222" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            <path fill="#222" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                        </svg>
                    </span>
                </span>
            </div>
            <div class="ak-renderer-wrapper" contenteditable="true" data-id="zG">
                {content}
            </div>
        </div>
        r  rh  zui-tabsrj  r  rk  zui-tabr   r\   z#254dcbZDefaultFr   Z
horizontalleftZBasic)
ZverZtabsPageTitler   ZcolorPalettesZ	hasBorderZfixedZ
primaryTab	directionZtextAlignmentZheaderStyler  "z&quot;r   c                 S   s   g | ]}t |qS rR   r   r   r  rR   rR   rS   r     s     z-CmfDocument._convert_tabs.<locals>.<listcomp>)rN  tab_namer  Zrwui_tabs_menur  c                 S   s
   t | tS r   )rt   r   r   rR   rR   rS   r    r  z+CmfDocument._convert_tabs.<locals>.<lambda>r  )r   rb   rl  rm  rn  r   rq  r  rA   r  r  r  r  r   r  r  r  Z	decomposeextractunwrapr   )r  r   r  rt  r  r  Ztabs_tagr   Ztab_tagr  rN  r  Zul_tagcommentrR   rR   rS   _convert_tabs  sn    &


zCmfDocument._convert_tabsc                 C   s   ddl m} |s|S tjdtjd}||s2|S d|   d}t|d}|jdd	d
idD ]^}|	d	}|srq^t
j
|d}t| d }	||dd}
t|j|	|
dd}||j q^ddd |jjD S )uB   
        Конвертирует макрос "Дата"
        r   )format_datez<time .+?</time>rh  z
        <span data-id="z" contenteditable="false" timestamp="{timestamp}" class="dateView-content-wrap">
            <span>{date_str}</span>
        </span>
        r  r   r   Trk  z%Y-%m-%dr   ru)locale)	timestampdate_strrj  r   c                 S   s   g | ]}t |qS rR   r   r   rR   rR   rS   r   7  s     z-CmfDocument._convert_date.<locals>.<listcomp>)Zbabel.datesr  rb   rl  rm  rn  r   r   rq  rA   r   strptimeintr  r  r  r  r   r   r  )r  r   r  r  r  r  r  Zdatetime_strZdatetime_objr  r   r  rR   rR   rS   _convert_date  s4    


zCmfDocument._convert_datec                 C   s   |s|S t jdt jd}||s&|S t|d}|jdddD ]@}ddg|d< d	|d
< |  |d< |dD ]}|  |d< qlq>t|S )Nz
table-wraprh  rj  r  r  ztableView-content-wrapzcmf-scrollbarr   Z
wikitableszdata-macrosr  table)rb   rl  rm  rn  r   rq  r   r   )r  r   rt  r  Ztable_wrap_tagZ	table_tagrR   rR   rS   _convert_table_wrap9  s    

zCmfDocument._convert_table_wrap)data	to_formatc                 C   sP   dd l }|jtjd| id|id}|jdkrFtd| d|j  dS |jS d S )	Nr   r  r  )filesr&     u4   Не удалось конвертировать в z: r   )requestsZpostconfigZCONVERTER_PLANTUML_URLr   r   r  )r&  r'  r*  rO  rR   rR   rS   convert_plantumlL  s    
zCmfDocument.convert_plantuml)r  rZ   c                 C   s   |  | d S )NZpuml)r,  encodedecode)r  r  rR   rR   rS   r  V  s    zCmfDocument.convert_encuml2uml)r  rZ   c                 C   sb   | d}dd |D }d|}td|s8d| }td|sN| d}| | d S )	Nr  c                 S   s   g | ]}|  qS rR   )rstrip)r   linerR   rR   rS   r   ^  s     z/CmfDocument.convert_uml2svg.<locals>.<listcomp>z
^@[a-z]+\nr  z@[a-z]+$r  r   )re   r   rb   rn  r,  r-  r.  )r  r  linesZcleaned_linesZ	clean_umlrR   rR   rS   r#   Z  s    



zCmfDocument.convert_uml2svgc                 C   s  t d | |\}}t d | ||}t d | |}t d | |}t d | |}t d | |}t d | |}t d | 	|}t d	 | 
|}t d
 | |}t d | ||}t d | |}t d | ||}t d | |}t d | |}t d | |}t d | |}| |}t d | |}t d | |}t d |D ]}|||| }q|S )u   
        Конвертируем модули из Confluence
        TODO это надо все вынести на сторону клиента в фронтенд
        confluence_convertz%confluence_convert get_all_drawio_svgz(confluence_convert _convert_plantuml_tagz&confluence_convert _convert_status_tagz!confluence_convert _convert_h_tagz'confluence_convert _convert_title_macroz!confluence_convert _convert_titlez confluence_convert _convert_codez(confluence_convert _convert_macro_panelsz'confluence_convert _convert_ui_text_boxz$confluence_convert _convert_expanderz&confluence_convert _convert_childpagesz#confluence_convert _convert_layoutsz$confluence_convert _convert_pagetreez confluence_convert _convert_datez!confluence_convert _convert_emojiz-confluence_convert _convert_macro_attachmentsz$confluence_convert _convert_checkboxz confluence_convert _convert_tabs)ri   rj   r   r  r  r  r  r  r  r  r  r  r  r  r  r#  r  r  r  r  r  r  )r  r   r  r  r  rR   rR   rS   r2  g  sV    



































zCmfDocument.confluence_convertc                 C   s4   | j jr| jrd S | | j j| jj| _ |   d S r   )rH   r   r   r2  rV   r=   r   r   rR   rR   rS   r     s    zCmfDocument._process_text_draftc                 C   s6   |  ddg d}t| jjtjs&d}| d| j S )Nr   rp   r   Zdeskz
/Document/)r   rt   rp   rV   r?   ru   r   )rW   Z
base_placerR   rR   rS   r     s
    zCmfDocument.hrefc                 C   s  | j r&| j}| j}| j}| j}| j}n(| jj}| jj}| jj}| jj}| jj}| j}zvt	j
j|||||ddtj|d	r|W dS t	j
j|||||ddtj|d	rW dS t	j
j|||||ddtj|d	rW dS W n> tjjk
r } ztd|  W Y dS d}~X Y nX dS )u   
        Если любой из WEB-доступов открыт - возвращаем True
        Хак для быстрого отображения, что документ доступен из WEB
        rF   F)	initial_acl_keyZobject_modelZobject_owner_idr  Zobject_parent_idZaccess_levelZraise_errorZchecking_personZperm_security_level_allowed_idsTz$DEV: _is_web_public ACL load Error: N)Zsimple_objectZperm_effective_acl_idr  cmf_owner_idr=   %perm_security_level_allowed_ids_cacherV   ry   rv  r?   rH  Zcheck_accessri   Zanonymous_userZsharelink_anonymous_userZtest_guest_userr@  Z
base_errorr  rj   )rW   r3  Zobj_parent_idr4  Zself_idr5  rv  erR   rR   rS   _is_web_public  sj    	         
zCmfDocument._is_web_publicu   Доступен из WEB)ZcaptionZvirtualreadonlyc                 C   s   |    |  S r   )_acl_check_writelockr   rR   rR   rS   r1     s    zCmfDocument.public_lockc                 C   s   |    |  S r   )r9  Zunlockr   rR   rR   rS   r2   	  s    zCmfDocument.public_unlockc                 C   s   |    |  S r   )r9  Z	lock_pingr   rR   rR   rS   r3   	  s    zCmfDocument.public_lock_ping)r   checkbox_valuec           	      C   s   |  |\}}t|d}|jd|id}|s0d S |r@d|jd< n|jdrT|jd= ddd |jjD }|D ]}|||| }qp|S )	Nr  r  rk  ztox-checklist--checked checkedr   r   c                 S   s   g | ]}t |qS rR   r   r   rR   rR   rS   r   	  s     z5CmfDocument._text_update_checkbox.<locals>.<listcomp>)	r   r   r  r   rA   r   r   r  r  )	rW   r   r   r;  r  Z	soup_textZtext_elementZnew_textr  rR   rR   rS   _text_update_checkbox	  s    
z!CmfDocument._text_update_checkboxc                 C   s   |  ddg | | jj||}| | jj||}|sN|sNtd| dd n|rV|sftd|  |rp|| _|rz|| _| jdd d S )Nr   rH   uD   DEV: в документе не найден элемент data-id=Tr   r   )	r   r<  r   rV   rH   r   ri   rj   rI   )rW   r   r;  r   rH   rR   rR   rS   r0   	  s    zCmfDocument.update_checkboxc                 O   s   | j ||S r   )r%   r   rR   rR   rS   r4   1	  s    zCmfDocument.public_do_approvec                 O   s   t d | j||S )NuC   Метод do_approve deprecated! Используйте do_publish)r   r&   r   rR   rR   rS   r%   4	  s    zCmfDocument.do_approvec           	      O   s   t jj| d}|D ]}|  qt jjdd| jgdddggd}|D ]}|  qDt jjdd| jfd	d
 |D gdddggd}|D ]}|  qd S )N)rp   r  r   r   r  Tr   r  c                 S   s   g | ]
}|j qS rR   r<   r  rR   rR   rS   r   E	  s     z3CmfDocument.clean_after_encrypt.<locals>.<listcomp>)r?   r   r   r   Z
CmfCommentr=   r@   )	rW   rU   rX   Zhistory_listr  Zcommentsr  r   r	  rR   rR   rS   r'   9	  s    
 
0zCmfDocument.clean_after_encryptc                 C   s   |  dddg tj|| j| j||| d}|  | jD ]4}t|j	tj
kr^|||| q8|||| q8| jD ]}tj|| j|||d  qtd S )Nr   
docs_linksr  )responsiblerY   r  rp   rn   document)r>  rY   rp   rn   r?  )r   r?   ZCmfCourseDocumentResultrY   r  rI   r   r  r  r=   r   _lms_create_progressr=  )rW   r   rn   Zcourse_progressZcourse_doc_resultr|   rP   rR   rR   rS   r@  I	  s,    

z CmfDocument._lms_create_progressc                 O   sP   t ddd tj|d }z|  W n tk
r>   Y d S X |j|d dS )NzDEV: depricated!Tr   r   in_text)rA  )r   r?   r   rA   r9  r  Zupdate_text_inline_comments)r  rU   rX   rP   rR   rR   rS   r6   i	  s    z.CmfDocument.public_update_text_inline_commentsc                 O   sR   z|    W n tk
r"   Y d S X | dg | jrF| jjd| d | j||S )Nr   zPPP-COM-ADDr   )r  r  r   r   r   r!   r   rR   rR   rS   r7   u	  s    z%CmfDocument.public_add_inline_commentc                    s  | j  stj| _ | js(|   |   | jjdd}| jsxt	j
| j| |d| j| j | j| j| jd	}|jdd || _nP| j| j_|| j_d| j_| j| j_| j | j_ | j| j_| j| j_| jjdd | | jj| jj| _| jjr| j| _|   t j|| | jdd d S )Nr   r   T)	r   rp   r   r   r   
cmf_authorcmf_modified_byrE  r  r   )rB  rv   ri   current_userr   r3  r4  r   r   r?   r   rH   r   rC  rE  r  rI   r   r   r   r2  rV   r=   r   r   r   _save_importr&   )rW   rU   rX   r   r   r   rR   rS   rE  	  sB    
	




zCmfDocument._save_importc                 O   s   t  }| jdddgdgdgd}|D ]D}td|jjD ].}|drHq8d|kr8||kr8||  q$q8q$| jd	ddgdgd	gd}|D ]D}td|jjD ].}|drqd|kr||kr||  qqqt|S )
Nr   r  z
%img%src=%z-cmf_modified_atr$  zimg[^>]*src=[\'"]([^\'"]*)z
data:imageZCmfrH   )	rp  r   rb   rc   r   rV   r  rr  rH   )r  rU   ZkwragsZdocs_with_problemsZres_textrP   matchZres_text_draftrR   rR   rS   r,   	  s4    	



zCmfDocument.patch_20230407c                 O   sF   ddddddddd	d
dddddg}t jjdd|gdddgg|d}|S )u_    Возвращает версию документа CmfDocumentHistory в текущем БПr   r#  r   rb  Zapproved_atrE  Zapproveszapproves.obj_statuszapproves.approver_levelzapproves.resolutionzapproves.approverzapproves.approve_groupzapprovers.cmf_approved_atzapproves.approve_typer   rp   r   r   Tr  )r?   r   rA   )r  r   rU   rX   rx   r  rR   rR   rS   r)   	  s           zCmfDocument.get_in_approve)
source_urlc                O   sb   t jd dsd S |d krd S dd l}t j|dd}|jdkrFd S dd l}|	|j
}| S )NFr   )r   r_   )timeoutr)  )r?   rH  rI  r*  r  Zrequests_sessionrA   r   base64Z	b64encoder  r.  )r  rG  rU   rX   r*  ZresponserI  rO  rR   rR   rS   link_patch_20230407	  s    
zCmfDocument.link_patch_20230407)r   text_verrZ   c              	   C   s\   ddl m} | j  || jkr$dS tjj " ||| _|| _| j	dd W 5 Q R X dS )u   
        TODO: 16.05.2023 пока что отключаем ацл для записи отрендеренного текста
        r   )markup_html_cleanNTr   )
Zcmf.util.cmf_clean_textrL  Ztext_render_verrv   r@  utilr  disable_aclr   rI   )rW   r   rK  rL  rR   rR   rS   r.   	  s    


zCmfDocument.save_render)r=   rZ   c                 C   s   t dd S )Nu   Устарело)DeprecationWarning)r  r=   rR   rR   rS   check_dirty	  s    zCmfDocument.check_dirtyz	@minutely)Z	only_onceZ
system_jobZschedulec               
   C   s   t jjj } | jtjs0| jj	tjddd | j
tjD ]Z}|dd }t jj|ddddd	d
dgd}d|j_|  |  | j| t  q>d S )NT)r.  r-  ro   r^   r   rH   r   r   r   r   r   r   )r?   r:  r;  r<  r=  ioZ	io_existsr+  Z
DIRTY_PATHZio_mkdirZ
io_iterdirre   r   rA   rH   r   r   rI   Z	io_unlinkZ
cmf_commit)rK  Z
dirty_filerJ   rP   rR   rR   rS   cron_check_dirty	  s"        zCmfDocument.cron_check_dirtyc                 K   s   |  dg g }|dkr"dddg}|dkr4dddg}t| |tjd| jjd	}|rX||d
< tjjf |}|sd |d< tjjf |}|r|j	|fd|i| d S )Nr   r   Zapprover_levelr/  ZmasterZacceptedr  r   )r   approve_groupapproverZapprove_typeZobj_versionr   rT  r   )
r   rJ  ri   rD  r   r   r?   r   rA   Z_approve_one)rW   rS  Z
resolutionr   rX   Zmaster_filterrN  ZapproverR   rR   rS   r"   
  s*    

zCmfDocument.approve_onec                 C   s&   |  ddg | jjj| _|   d S )Nzstatus.trans_approvedzstatus.trans_approved.status_to)r   r   Ztrans_approvedr  rI   r   rR   rR   rS   _approve_approved-
  s    zCmfDocument._approve_approvedc                 C   s&   |  ddg | jjj| _|   d S )Nzstatus.trans_rejectedzstatus.trans_rejected.status_to)r   r   Ztrans_rejectedr  rI   r   rR   rR   rS   _approve_rejected2
  s    zCmfDocument._approve_rejectedc                 C   s   |  ddg | jjj| _d S )Nzstatus.trans_updatedzstatus.trans_updated.status_to)r   r   rC  r  r   rR   rR   rS   rD  7
  s    zCmfDocument._approve_updatedc                    s&   t  || | | jj||| _d S r   )r   _replace_attachmentZ_replace_attach_urlrH   rV   )rW   rM   Z
new_attachr   rR   rS   rW  ;
  s    zCmfDocument._replace_attachmentc              	   K   s   zLd|  kr2|d D ]}| j|d}|  qn| j|d d}|  W n tk
rb   Y d S X t  tjjf | W 5 Q R X d S )NZobj_id_listr<   obj_id)	keysrA   r  r  r  rN  r?   r   Zmark_viewed)r  rX   rX  rO  rR   rR   rS   r9   ?
  s    
zCmfDocument.public_mark_viewedc                    s4  | j st  S | jr&| j jd| d t }| jddD ]6}|j|  kr8|j	ds8|j
ds8||j q8d|kr| j jd| dd |d d	|kr| j jd
| d |d	 d|ksd|ksd|kr| j jd| d d|kr|d d|kr|d d|kr|d |r0| j jd| d d S )NzPPP-DOC-CREATEr   T)r   Zcache_Z_idrp   )r   Zuse_new_projectrn   zPPP-DOC-TREEMOVEZperm_policy_anonymousZperm_policy_guestZperm_policy_sharelinkzPPP-DOC-SHAREzPPP-DOC-EDIT)r   r   check_edit_permr  r   rp  valuesrv  Zproject_perm_allow_fieldsr  endswithrr  remove)rW   Zchanged_fields_to_checkZfieldr   rR   rS   rZ  P
  sB    









zCmfDocument.check_edit_permc                    s<   |  ddddddg | jr.| jjd| d n
t   d S )	Nr   r   r   Zlistsr>  rP  zPPP-DOC-DELETEr   )r   r   r   r   check_delete_permr   r   rR   rS   r^  {
  s    
  zCmfDocument.check_delete_perm	recursivec                   sB   t  j||}|r>tjj| ddgdD ]}|jr&|j|d q&|S )NTr9  )rn   r_  rx   r_  )r   restorer?   r   r   r9  )rW   r`  rU   rX   rO  childr   rR   rS   ra  
  s    zCmfDocument.restorec                    s,   | j  r| j jd| d t j|| d S NzPPP-DOC-ARCHIVEr   )r   rv   r   r   archiver   r   rR   rS   rd  
  s    
zCmfDocument.archivec                    s,   | j  r| j jd| d t j|| d S rc  )r   rv   r   r   archive_restorer   r   rR   rS   re  
  s    
zCmfDocument.archive_restore)F)N)NN)N)z__name__
__module____qualname__r  r	   r   Zapi_methodsr   staticmethodZcmf_deferred_jobrT   r+   r   rl   r   r   r   r2  r   r   r   r   r   r5   r&   r   r   r-   r  r  r  r  r  r  r/   r&  rI   rR  rY  rZ  r5  r6  r7  r[  r\  r   ra  rd  rg  r   rw  r$   r(   r8   r  classmethodr  r  r  r  r  r  r  r  r  r  r  r  r  r  rJ  r  r  r  r  r#  r%  bytesr,  r  r#   r2  r   propertyr   r7  r@  rx   ZFieldZCmfBoolZis_web_publicr1   r2   r3   re  r<  r0   r4   r%   r'   r@  r6   r7   rE  r,   r)   rJ  r.   rP  rR  r"   rU  rV  rD  rW  r9   rZ  r^  ra  rd  re  __classcell__rR   rR   r   rS   r      s  


    

		>!

7
.1K0
 *
"@GiO+&( >1HX*	>
	
<	
 )#+	r   )r   rf   r   r   rC   r  r   ro  r   r   Z
cmf.fieldsr@  Zcmf.includeZcmf.utilr   Z&common.models.cmf_plugin_convert_mixinr   Zmodules.project.fieldsr	   Zcommon.models.cmf_active_entityr
   r   rR   rR   rR   rS   <module>   s   