U
    ep                    @   s   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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)*)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ed4d5d6d7d8 Zd9d: Zeeed;d<d=Z	dd?d@Z
dAdB ZdCdD Z fdEdFZ fdGdHZdIdJ ZdKdL ZddNdOZdPdQ ZdRdS ZdTdU ZdMd>dVdWdXZ fdYdZZed[d\d]ZdMd^d_d`Zdadb Z fdcddZdedf Zdgdh Zdidj Zdkdl Zdmdn Zdodp Z dqdr Z!d>d>dMds fdtdu
Z"dvdw Z# fdxdyZ$ fdzd{Z% fd|d}Z&d~d Z'dd Z(dd Z)dd Z*dd Z+dd Z,dd Z- fddZ.eeedddZ/eeedddZ0eeedddZ1eeedddZ2eeedddZ3eeeedddZ4eeedddZ5eeedddZ6eeedddZ7eeeedddZ8eeedddZ9ee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edddZAdd ZBeCdd ZDeCdd ZEeFjGjHeFjGjIdd5d5dZJdd ZKdd ZLdd ZMeeNdÜddńZOeeNdÜddǄZPddɄ ZQdd˄ ZRe>dd̈́ ZSddτ ZT fddфZUe>ddӄ ZVe>ddՄ ZWe>dMd֜dd؄ZXdeedMdٜddۄZYe>eeNdܜddބZZeed5d5dddd Z[e> fddZ\dddZ]dd Z^dd Z_dd Z` fddZae>dd Zb  ZcS )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   z	data-namea  m19 3.022c0-.008 0-.014 0-.022v-2a1 1 0 0 0 -2 0v1.1a5 5 0 0 0 -1-.1h-1v-1a1 1 0 0 0 -2 0v1h-2v-1a1 1 0 0 0 -2 0v1h-1a5 5 0 0 0 -1 .1v-1.1a1 1 0 0 0 -2 0v2 .022a4.979 4.979 0 0 0 -2 3.978v12a5.006 5.006 0 0 0 5 5h8a5.006 5.006 0 0 0 5-5v-12a4.979 4.979 0 0 0 -2-3.978zm-7 13.978h-4a1 1 0 0 1 0-2h4a1 1 0 0 1 0 2zm4-4h-8a1 1 0 0 1 0-2h8a1 1 0 0 1 0 2zm0-4h-8a1 1 0 0 1 0-2h8a1 1 0 0 1 0 2zz#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hiddenu1   Импорт документа в систему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save
do_publish)
doc_idZ	attach_id_args_kwargsattachZfile_objmimetypeencodingdocf r9   (./modules/project/models/cmf_document.pyimport_msword_taskQ   s    
 zCmfDocument.import_msword_taskc                 O   s0   d| _ |   |   t| j| jj|gd | S )r!   uP   Обработка документа, пожалуйста, подождите.)args)r.   r/   r0   Zschedule_deferred_jobr;   r#   value)selfr4   r<   kwargsr9   r9   r:   import_msword`   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 )Nu   [А-Яа-я]      r   .   -   u0   Слишком длинное название. z > u   . Меняем на )refindalllenr)   r*   splitmathZfloorstripr   Zshort_str_encgdebug)rA   Z
rus_simbolZos_max_lengthZfile_name_lengthextr5   r6   Zslice_lengthr9   r9   r:   _get_filenamej   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fieldsrU   oldnewrA   rS   rW   
ValueErrorr#   )nodeZtree_parent_rA   Zparent_r`   parent_pathr>   r9   r:   re      s2    



$  z.CmfDocument._get_rfile_id.<locals>.parent_pathr   z.htmlrV   rX   rY   zdocument path for rZ   )
rA   r`   ra   is_externalrS   rU   location_pathrW   rb   r#   )r>   r`   rA   filenamerU   rg   rW   r9   rd   r:   _get_rfile_id|   s(    
 zCmfDocument._get_rfile_idc                 C   s   d S Nr9   r>   r9   r9   r:   _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 ]*}|jj| jjkrq| j|_|jdd	 qd S )
NrW   	cmf_ownerZcmf_owner_assistantsZactivityr_   
tree_nodesr   T	only_data)rU   
is_changedrW   load_fieldsZ_node_parentr[   r=   r%   r\   rm   ro   rL   Zget_tree_nodes_recursiver#   r/   )r>   ZnlenZ	node_listrc   r9   r9   r:   Z__calc_parent   s4    
zCmfDocument.__calc_parentc                    s   t   dddddg S )NrW   rU   cur_workflow_versioncur_published_version cur_workflow_version.doc_version)supersave_preload_fieldsrk   	__class__r9   r:   rx      s    zCmfDocument.save_preload_fieldsc                    s   t   ddg S )Nr.   approved)rw   simple_perm_allow_fieldsrk   ry   r9   r:   r|      s    z$CmfDocument.simple_perm_allow_fieldsc                 C   s$   | j r| j jjdkrd S |   d S )Nr\   )rW   r=   
class_nameZ_check_simple_permrk   r9   r9   r:   check_simple_perm   s    zCmfDocument.check_simple_permc                 C   sl   t jjdd| jgdddggd}|D ]}d|_|  q$| jjdd}t j| j| |dd	}|  || _	d S )
NrW   ==cur_workflowTfilterFOPENstatus_type)textrW   statusr   )
r%   CmfDocumentHistorylistr#   r   r/   workflowget_default_statusr.   rt   )r>   Ztmp_listhstatus_opennew_cur_historyr9   r9   r:   _create_new_history   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 STARTrt   zcur_workflow_version.statusz'cur_workflow_version.status.status_typerv   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_draftrP   rQ   rs   rt   r   r   r   r   r]   r   r/   has_publishedr.   r   publish_by_owner_onlyZ_create_approve_taskr{   )r>   create_new_historyr   r   rt   r9   r9   r:   _process_draft_is_changed   s2    

 




z%CmfDocument._process_draft_is_changedc                 C   s,   t j|  | | }|r(d|_|  d S )NF)r%   
CmfApproveZcancel_approve_processget_in_approver   r/   )r>   Zhistr9   r9   r:   cancel_approve.  s
    
zCmfDocument.cancel_approvec                 C   s   | j jdkS )u6   Явлется ли бизнес-процесс simplezdocument.base:default)r   coderk   r9   r9   r:   wf_is_simple5  s    zCmfDocument.wf_is_simplec                 O   s   | j ||S rj   )r0   r>   r<   r?   r9   r9   r:   public_do_publish9  s    zCmfDocument.public_do_publish)doc_versionsave_importc                O   s  |  ddddddddd	d
ddg |  r<| jjddd| _| jrd| j| jjdddkrdtd dS | jrt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| _|   |   | j rlt| jjD ]"}t |j!|j"dr8|#  q8g | _| j$  | j%|| tj&j'| df|| | j| _(d| j(_)| j(j$|d | j$|d dd!| dS )"u   Выпуск документаr   r.   r   publish_approved_onlycmf_versionrm   zstatus.coder   rv   ru   	macros_dbmacros_db_draftr   r{   r   ur   Публикация этого документа доступна только после утвержденияNzOWNERS PLACE NOTIFY STARTu8   Необходимо выпустить документ   )objpersonrA   msgpriorityzOWNERS PLACE NOTIFY ENDu   Владелец проекта не может Выпускать чужой документ, но Вы можете установить себя Владельцем документа и Выпуститьu}   Данный документ может выпустить только владелец документа                 u   ,                 ему отправлено уведомление об утверждении черновика. Документ сохранен как черновик.Fabortr"   Z	publishedTr   r   )depthrq   )*rs   r   r   r   r   r   	cmf_alertr   rP   Zcurrent_personrm   rQ   r%   Z	CmfNotifyZplace_notifyZ	html_diffstrr   r.   Z
get_ownersrA   rt   r   _pinup_attach_versionr   r   Z_delete_approve_taskdo_full_searchZperson_viewsr]   setr=   typesgetr#   deleter/   _handle_mention_taskCmfEventdo_eventru   r   )r>   r   r   r<   r?   viewr9   r9   r:   r0   <  sf         



zCmfDocument.do_publishc                    sJ   | j js8| jjs8| jjs8| jjs8| jjs8| jjs8| jjrFt j	||S d S rj   )
text_renderrr   r   rm   rW   rU   Zroot_parentrA   rw   r   r   ry   r9   r:   r     s    zCmfDocument.do_full_search)rB   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 STARTrf   rW   rU   rg   rn   [data-attach-id]data-attach-idurlurl_preview_imgurl_previewr#   r_   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downloadZrelzapp-tinymce-img-previewhrefzdata-mce-hrefbodyc                 S   s   g | ]}t |qS r9   r   .0r   r9   r9   r:   
<listcomp>  s     z5CmfDocument._pinup_attach_version.<locals>.<listcomp>z_pinup_attach_version END)r.   r=   rP   rQ   rs   get_all_drawio_svgr   selectattrsr'   r%   r&   r   	get_rfileZ
_file_nameZget_versionrA   r   findr   r   joinchildrenreplace)r>   r   svg_replaceprepared_textsoupattachment_nodeattachment_id
attachmentrfileZ
latest_verZattachment_linkZpreview_imgr   keyr9   r9   r:   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   r_   u$   Не найдена DocumentHistory!Tr   r   Frp   r   )r   r   )rs   r%   r   r'   r#   r   r   r{   r/   r.   _update_attachments_versions)r>   r   r<   r?   Zdoc_historyr9   r9   r:   restore_version  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 )Nrf   rW   rU   rg   rn   r   r   r   r   r   r   r   )stream)rs   r   r.   r=   r   r   r   r'   r%   r&   Zget_contentupload_stream_file)	r>   r   r   r   r   r   Zattachment_verr   filer9   r9   r:   r     s    z(CmfDocument._update_attachments_versionsc                    s
   t   S rj   )rw   _calc_workflowrk   ry   r9   r:   r     s    zCmfDocument._calc_workflowc                 C   s   |  ddddddg d| _d| _| jrD| jjr6d| _| jjrDd| _| jrZt| jjtjsjt| jjtj	r| jjrxd| _| jjrd| _d S )	Nr   rW   zworkflow.publish_approved_onlyzworkflow.publish_by_owner_onlyzparent.publish_approved_onlyzparent.publish_by_owner_onlyFT)
rs   r   r   r   rW   r[   r=   r%   r   r\   rk   r9   r9   r:   _calc_publish_options  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   rW   r   )	r   r`   r   rt   r   r/   r%   r   r.   )r>   r   Zstatus_rejectedZprev_historyhistoryr9   r9   r:   _switch_to_new_version  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_approverv   )rs   r   r`   r   r]   r   _start_approverk   r9   r9   r:   do_status_is_changed$  s
    z CmfDocument.do_status_is_changedc                 C   sl   t jjdd| jjggdd| jggddgd}t|dkrRtd	| j  d
dd t|dkrh|d j	S d S )NZstatus_fromINr   r   	status_tozstatus_to.need_approver   r   u   Из статуса uf    существует больше одного перехода на следующий статус!Tr   r   )
r%   ZCmfTransr   r   r#   r   rL   r   r]   r   )r>   Ztransitionsr9   r9   r:   next_status.  s    ,
zCmfDocument.next_statusc                 O   s.   | j dkr|  | _| j}tj| |j d S )Nr   )Zcache_status_typer   r   rt   r%   r   Zstart_approve_processr   )r>   r<   r?   Z
wf_historyr9   r9   r:   r   9  s    

zCmfDocument._start_approvec                 O   s&   |  |   |   | j|| d S rj   )rs   rx   r   r/   r   r9   r9   r:   start_approve?  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_byr_   r   )
r%   r   r'   rW   r#   r   r]   r   Znowr   )r>   Zofficial_historyr9   r9   r:   calc_official_datenumD  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rf|   |   | 	  | j
jrz| j|d | jjr|   |   | jsdrtjjj }|  }||}|jrJ|j}	|	rJ|	| jkrJtjj|	rJ|rtd|	 d|  d	| j d
 n2td| d|	 d|   td| j  ddd |j!}
|j| _"|
j| _#|
j$dddd | js|js| jdd}||}|jr|%| |j$dddd |&| jj'pd | jj'|_|(d| j) |(d| j)  | j
jr| j*j+, r| -  t. j/||}|S )Nus   Нельзя менять текст напрямую, используйте text_draft вместе с do_approveTr   uH   Метод устарел! Используйте update_inline_comments)r   FzOverwrite file for document z by ()u@   Файл с таким именем уже существует z, u!   Документ с именем u^    уже существует на этом уровне. Выберите другое имя.)is_direxist_okparents)r`   r   Zdocument_is_externalZdocument_is_internal)0_CmfDocument__calc_parentr   rr   r   Zis_newr   Zcalc_doc_version_calc_scheme_wfr   r   r.   r   r   r   r   Zcmf_deletedr%   CmfRFiledpdata_driverget_rdri   r   exists
meta_tuuidr#   cmfr_   ZCmfTUUIDZget_obj_by_tuuid_strrP   rQ   rA   rW   Z	file_pathrg   ZcreaterenameZ
write_textr=   Zmeta_set_flagrf   r   trans_updatedr]   _approve_updatedrw   r/   )r>   r   r   r   r<   r?   rdiskrfile_idr   tuuidZrfile_parentZold_rfile_idZ	old_rfileresry   r9   r:   r/   T  sd    

"


zCmfDocument.savec                 C   s   d S rj   r9   rk   r9   r9   r:   _calc_approved  s    zCmfDocument._calc_approvedc                    s   t  j|fd| ji|S )NZmsg_url)rw   create_eventr   )r>   event_personr?   ry   r9   r:   r    s    zCmfDocument.create_eventc                    s   | j ddddgd tjjj }|  }||}|jrV|j	}|rN|| j
krV|  |drtjj| dD ]}d |_|jdd	 qnt j||S )
Nrf   rW   rU   rg   rn   ZTEXKOM_db_delete)descr_documentTrp   )rs   r%   r  r  r  r  ri   r   r  r  r#   r   r'   ZCmfComponentr   r  r/   rw   )r>   r<   r?   r  r  r   r  Z	componentry   r9   r:   r     s    

zCmfDocument.deletec                    s.   t t| j|| | jjsd S | jr*d| _d S )NT)rw   r   _process_publicZ	is_publicrr   r   r   ry   r9   r:   r    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   r   r#   r   r9   r9   r:   get_approved_version  s    z CmfDocument.get_approved_versionc                 C   s   t tjjdd| jgdS )NZtree_parent_idr   r   )boolr%   r   countr#   rk   r9   r9   r:   has_tree_nodes_hook  s    zCmfDocument.has_tree_nodes_hookc                 O   s|   ddl m} || jjpdd}t }|jdddidD ]}||d	  q6g | _|D ]"}tj	j
|d
}|rT| j| qTdS )un   
        Парсит документ, вытаскивает упомнинания на таски
        r   r   r   html.parserr   zdata-mention-typeZtaskr   zdata-object-idr"   N)bs4r   r   r=   r   find_alladdZmention_tasksr%   ZCmfTaskr'   append)r>   r<   r?   r   Zbs_textZnew_taskitemZtskr9   r9   r:   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CmfPersonGroupr^   Zmention)r  )
r.   rr   r   r`   Z
parse_textra   r}   r%   r   r   )r>   Zobjs_oldZobjs_newr   r9   r9   r:   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: Идентификатор нового документа
        Trp   )Zcreate_from_templater   r/   r#   r=   )r>   paramsZnew_docr9   r9   r:   create_doc_from_template  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   )basenameattachmentsuP   Отсутствуют вложенные файлы для скачиванияTr   :r   z.ziprW   rA   w)moder$   F)ZbackupZmake_preview)zipfileshutilpathlibr   Zos.pathr%  rs   _acl_check_readCmfPermissionErrorr&  r   r   r#   rM   r%   r&   r'   tempfileZTemporaryDirectoryospathr   ZipFilerA   writer(   r+   r   r   )r>   r<   r?   r+  r,  r   r%  zip_filenamer   r0  Ztmp_dirZzip_file_path_tmpZarcr!  r8   r9   r9   r:   download_all_attachment  s<    



 $z#CmfDocument.download_all_attachmentc                 O   s0   z|    W n tk
r"   Y d S X | j||S rj   )r.  r/  r6  r   r9   r9   r:   public_download_all_attachment$  s
    z*CmfDocument.public_download_all_attachmentc                    sF   |  | j | jjp"| jjp"| jj}tj|p0d|d< t	 j
f |S )Nr   r   )rs   Zfull_search_fieldsr   r=   r   r.   r%   ZCmfFullSearchZ
strip_htmlrw   full_search_index)r>   r?   r   ry   r9   r:   r8  +  s    zCmfDocument.full_search_index)r   rB   c                 C   s   d}d}t | d}|jtd| ddD ]b}|d dr@q,|j|d dd	 d
}|d |||d< d|d< |szq,|d dd	 |d< q,t|S )=   
        Конверитуем оглавление
        #z#mcetoc_r  ^z.+)r   r   r   Nr"   Tcmf_convertedr#   )r   r  rJ   compile
startswithr   r   r   )r   Zold_idZnew_idr   linkZid_bodyr9   r9   r:   _convert_title2  s    
zCmfDocument._convert_titlec                 C   s   t | d}|jddidD ]}|jdr,q|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< qqt|S )r9  r  r   z	toc-macror  r<  zmce-tocFcontenteditableTZh2u   ОглавлениеZh4r#   ztitlelist-.*Zmcetoc_)	r   ZfindAllr   r'   r   new_tagrJ   r=  r   )r   r   tagZ	title_tagZtag_hr9   r9   r:   _convert_title_macroG  s    




z CmfDocument._convert_title_macroc                 C   sl   t | d}|jddidD ]H}|jdddid}|d}|rL||j n||j || qt|S )uU   
        Конвертиуем тэги экранирования кода
        r  r   r   r  prezlanguage-markup)r   r  rB  r   extendcontentsreplace_withr   )r   r   rC  rE  Ztag_contentr9   r9   r:   _convert_code[  s    

zCmfDocument._convert_codec                 C   s  t ddd}t| d}|jdtdidD ]}d|jd krFd	}nJd
|jd krZd}n6d|jd krnd}n"d|jd krd}ntd| |jdtdid}|||||j q.tt |d}|jdddidD ]$}|jddid}|d|||j qt |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divzak-editor-panel__iconfalse)r   contentEditabler  r   r2  r   zak-editor-panel__contenttruezak-editor-panel)r   zdata-panel-typerM  )rB  r%   r   
ICONS_DATAr   rF  rH  )	rJ  rC  Zdoc_souprG  Zpanel_tag_iconZsvg_tagZsvg_path_tagZpanel_tag_contentZ	panel_tagr9   r9   r:   _convert_macro_panelm  s0    
  






z?CmfDocument._convert_macro_panels.<locals>._convert_macro_panelr  r   z^confluence-information-macro$r  z!confluence-information-macro-noter   z(confluence-information-macro-informationr   z confluence-information-macro-tipr   z$confluence-information-macro-warningr   uO   Неизвестный тег для преобразования панели z.+bodyrK  ZpanelZpanelContentr   )	r   r   r  rJ   r=  r   CmfErrorr   rG  )r   rP  r   rC  rJ  contentr9   r9   r:   _convert_macro_panelsk  s&    
z!CmfDocument._convert_macro_panelsc           	      C   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 || || qt|S )Nr  r   zexpand-containerr  rK  spoilerzspoiler-togglespanzspoiler-icon_zexpand-control-textzexpand-contentzspoiler-text)	r   r  rB  r   r   rF  rG  rH  r   )	r   r   rC  rT  Zspoiler_toggleZspoiler_iconZtag_control_textZtag_control_contentZspoiler_textr9   r9   r:   _convert_expander  s     




zCmfDocument._convert_expander)r   r   rB   c              	   C   s  | s| S d}t j|ddgd}t|j}t| d}|jddidD ]}d	||d
ddd	d}|d}|rtdd |dD }|drd|d< nd|d< |drt	j
j|j|d d}	|	st	jj|d d}	|	rt|	j|d< t|	j}|dr
|d |d< |dr"|d |d< |dr:|d |d< |drddd d d!}
|
|d |d"< |d#rd$d%d&d'}||d# |d(< |d)rd|d*< t|j||tj|d	d+|d,d-dd.}||j qBdd/d0 |jjD S )1u   
        Конвертируем тег Отображение дочерних из Confluence в наш
        fixme удалить когда добавят поддежку тега из Confluence
        u  
            <div
                class="macros-panel"
                contenteditable="false"
                data-children-docs="{doc_id}"
                data-id
                data-macro-parameters='{params}'
                data-macros="children-docs"
                original-data-macro-parameters="{original_params}"
            >
                <div class="extension-container" data-id data-layout="default">
                    <span aria-label="Макрос " data-id role="img">
                        <svg xmlns="http://www.w3.org/2000/svg" id="Outline" viewbox="0 0 24 24" width="20" height="20">
                            <path d="M22.485,10.975,12,17.267,1.515,10.975A1,1,0,1,0,.486,12.69l11,6.6a1,1,0,0,0,1.03,0l11-6.6a1,1,0,1,0-1.029-1.715Z"></path>
                            <path d="M22.485,15.543,12,21.834,1.515,15.543A1,1,0,1,0,.486,17.258l11,6.6a1,1,0,0,0,1.03,0l11-6.6a1,1,0,1,0-1.029-1.715Z"></path>
                            <path d="M12,14.773a2.976,2.976,0,0,1-1.531-.425L.485,8.357a1,1,0,0,1,0-1.714L10.469.652a2.973,2.973,0,0,1,3.062,0l9.984,5.991a1,1,0,0,1,0,1.714l-9.984,5.991A2.976,2.976,0,0,1,12,14.773ZM2.944,7.5,11.5,12.633a.974.974,0,0,0,1,0L21.056,7.5,12.5,2.367a.974.974,0,0,0-1,0h0Z"></path>
                        </svg>
                    </span>
                    <span class="extension-title" data-id>Макрос "Отображение дочерних"</span>
                    <span class="extension-object-name" data-id>| {doc_name}</span>
                    <span class="macros-actions" data-id>
                        <span class="macros-edit" data-id style="margin-right: 7px;">
                            <svg _ngcontent-aiw-c17="" viewbox="0 0 24 24" class="ng-star-inserted" style="width: 14px; height: 14px; color: #444444;">
                                <path _ngcontent-aiw-c17="" fill="#444" d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                            </svg>
                        </span>
                        <span class="macros-delete" data-id>
                            <svg viewbox="0 0 18 18" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                                <path fill="#222" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                <path fill="#222" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                <path fill="#222" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                            </svg>
                        </span>
                    </span>
                </div>
                <div class="ak-renderer-wrapper" data-fabric-macro="null" data-id data-macro-body=""></div>
            </div>
        Tzname, parentsimpler_   lxmldata-macro-namer   r  FZ50r   none)isShowChildrenZparentId
documentIdchildrenAmountlevelincludeViewTypeisOrderByDeskzoriginal-data-macro-parametersc                 s   s   | ]}| d V  qdS )=N)rM   )r   Zparamr9   r9   r:   	<genexpr>  s     z2CmfDocument._convert_childpages.<locals>.<genexpr>|allr]  1r`  Zpager(  )rA   r^  firstr_  r   styleZ
headerTypeZexcerptTyperR  )r\  rY  zrich contentra  sortrA   cmf_created_atcmf_modified_at)titlecreationmodifiedZsortTypereverserb  )Zensure_ascii)r1   doc_namer#  original_params
r  c                 S   s   g | ]}t |qS r9   r   r   r9   r9   r:   r     s     z3CmfDocument._convert_childpages.<locals>.<listcomp>)cmfutilget_obj_by_idr   rA   r   r  r'   dictrM   r%   r   r   r\   r#   formatjsondumpsr   rH  
currentTagr   r   r   )r   r   ZTMPLr   rq  r   rC  r#  rr  Zparent_pageZview_type_mapZsort_type_mapZnew_soupr9   r9   r:   _convert_childpages  sl    &







 zCmfDocument._convert_childpagesc              	   C   s  t | d}dd |jddidD }|D ]r}ddgdd	gd	dgd	d	d	gd
dd
gd}||jd}|snq(g }t|jD ]}|dkrq||| q||sq(|jdddddd}t|t|kr&t|dkr|d}	|d j|	_|	|	 q(n2t|dkr|d}nt|dkr&|d}t
|D ]b\}
}|jd| ddd| ddd}|jddddd}||
 j|_|| || q.|	| q(t|S )u   
        Конвертирует "Разметка страницы"(коробочная) или "Макеты"(облачная)
        r  c                 S   s,   g | ]$}d |j d krd|j d kr|qS )zfixed-widthr   Zsingler  )r   r   r9   r9   r:   r     s     z0CmfDocument._convert_layouts.<locals>.<listcomp>r   ZcolumnLayoutr  z50.0z66.66z33.33z25.0)	two-equalztwo-right-sidebarztwo-left-sidebarthree-equalzthree-with-sidebarszdata-layoutrs  rK  rL  rN  zmceNonEditable selected)rA  zdata-layout-sectionr   r   r   rD   r|     r}  %zflex-basis: )zdata-column-widthzdata-layout-columnri  )zdata-layout-contentrA  )r   r  r'   r   r   rG  r   rB  rL   rH  	enumerater   )r   r   ZtagsrC  Zlayout_typecolrG  cZtag_layout_sectionZtag_divir   Ztag_layout_colZtag_layout_contentr9   r9   r:   _convert_layouts  sn    

	




zCmfDocument._convert_layoutsc                 C   sr   ddddddddd	d
ddddddddd}t | d}|jdddidD ]"}|d }||}|rF||d< qFt|S )u%    Конвертирует цвета z
Light tealzLight greenzLight yellowz	Light redzLight purpleZGrayZBlueZTealZGreenZYellowZRedZPurplez	Dark Bluez	Dark tealz
Dark greenzDark yellowzDark redzDark purple)z#e6fcffz#e3fcefz#fffae6z#ffebe6z#eae6ffz#f4f5f7z#b3d4ffz#b3f5ffz#abf5d1z#fff0b3z#ffbdadz#c0b6f2z#4c9affz#79e2f2z#57d9a3z#ffc400z#ff8f73z#998dd9r  Ztdzdata-highlight-colourTr  zdata-highlight-color)r   r  r'   r   )r   Z	color_map	text_souprC  Zdata_highlight_colourr   r9   r9   r:   _convert_colorsZ  s4    


zCmfDocument._convert_colorsc                 C   st   ddddddddd	d
dddddddddd}t | d}|jdddD ]&}|d}||}|rD|| qDt|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-starr  r   Zemoticonclass_zdata-emoticon-name)r   r  r'   rH  r   )r   Z	emoji_mapr  rC  Zemoticon_nameZemojir9   r9   r:   _convert_emoji  s6    


zCmfDocument._convert_emoji)r   	object_idrB   c              	   C   s  ddl m}m} t| d}|jddid}|s6t|S d}dd	d
dd}tj|dddgd}|jdkr|j	j
dr|j	j
d d }	n|j	j
d d }	|j
d }
n.|j
dr|j
d d }	n|j
d d }	|	}
|D ]}d}dddddddd}|jddid}|r|jdnd}|r||
kr>d|d< d|d< d}nv||	krVd|d< d}n^tjjdd d!| gd"}|stjjdd d#| d$gd"}|r|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|d(< |jd)d*rd|d+< |jdd,id }r|jd}||d-d.}||j}|d/r|||d/ d d|d/< |d0rt|d0 d  |d0< t|d1d2jt|d3d}|rd4|jd5< n
||jd6< ||j qt|S )7uQ   
        Конвертирует плагин Page Tree из Confluence
        r   )parse_qsurlparser  r[  Zpagetreer  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>
        rA   rk  rl  Zorderno)Znaturalrn  ro  ZpositionTimport_raw_jsonzparent.import_raw_jsonrX  r   Zhomepager#   Z
root_pagesFz@homer   )
rootLocalerootexpandCollapseAll
startDepthrj  rp  	searchBoxZ
rootPageIdr=   Nz@selfr  r  Zext_idLIKEz%::r   z%"homepage":{"id":"z"%r  Zpagetreesearchr"   r  Zplugin_pagetree_expandcollapser  r  ZtreeRequestIdz&amp;&rj  rp  rs  r   )pagetree_paramsrN  r<  Zroot_page_original)Zurllib.parser  r  r   r  r   rt  ru  r}   rW   r  r'   r   r   r%   r   r\   r#   r=   rA   r   Zqueryrx  loadslowerrw  ry  rK  rH  rz  )r   r  r  r  r   Zpagetree_tagsZTAG_TMPLZ	sort_dictr   Zhomepage_idZselfpage_idZ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_soupr9   r9   r:   _convert_pagetree  s    
"






zCmfDocument._convert_pagetreec                 C   sj   d}| s| S t | d}t|jdddidD ]$}t |j|jdd}||j q,d	d
d |jj	D S )Nz
        <span class="statusView-content-wrap"
        color="purple" contenteditable="false"
        text="{text}" data-mce-contenteditable="false">
        <span>{text}</span></span>
        rZ  rU  r   zstatus-macror  )r   r  r   c                 S   s   g | ]}t |qS r9   r   r   r9   r9   r:   r   >  s     z3CmfDocument._convert_status_tag.<locals>.<listcomp>)
r   r   r  rw  r   rH  rz  r   r   r   )r   TMPr   rC  sr9   r9   r:   _convert_status_tag/  s    
zCmfDocument._convert_status_tag)r   r   rB   c              
   C   s0  d}| s| S t | d}t|jdddidD ]}|jddd	id}| D ]\}}|d
 |krJzd }td|}	|	rtj	|	d }n.d}
t
|
|tj}|rd|d  d}|rt |jd||dd}||j ntd| d| W qJ   td| d| Y qJX qJq,d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>
        rZ  rU  r[  Zplantumlr  rK  r   zsvg-replacer#   zSRC=\[([^]]+)\]r   z@startuml(.*?)@enduml
@startuml
r   
@endumlz{})r#  umlr   r  uS   Не удалось преобразовать Plantuml, не найден код: z; u9   Не удалось преобразовать Plantuml: r   c                 S   s   g | ]}t |qS r9   r   r   r9   r9   r:   r     s     z5CmfDocument._convert_plantuml_tag.<locals>.<listcomp>)r   r   r  r   itemsrJ   rK   r%   r   convert_encuml2umlsearchDOTALLgrouprO   rw  rH  rz  	Exceptionr   r   r   )r   r   r  r   rC  Zsvg_divZsvg_keyZsvg_textr  encumlpatternresultrB  r9   r9   r:   _convert_plantuml_tag@  s0    '
z!CmfDocument._convert_plantuml_tag)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   rw  )filesr     u4   Не удалось конвертировать в z: r   )requestsZpostZconfigZCONVERTER_PLANTUML_URLr   r   rR  )r  r  r  r  r9   r9   r:   convert_plantuml  s    
zCmfDocument.convert_plantuml)r  rB   c                 C   s   |  | d S )NZpuml)r  encodedecode)clsr  r9   r9   r:   r    s    zCmfDocument.convert_encuml2uml)r  rB   c                 C   sb   | d}dd |D }d|}td|s8d| }td|sN| d}| | d S )	Nrs  c                 S   s   g | ]}|  qS r9   )rstrip)r   liner9   r9   r:   r     s     z/CmfDocument.convert_uml2svg.<locals>.<listcomp>z
^@[a-z]+\nr  z@[a-z]+$r  r   )rM   r   rJ   r  r  r  r  )r  r  linesZcleaned_linesZ	clean_umlr9   r9   r:   convert_uml2svg  s    



zCmfDocument.convert_uml2svgc                 C   s   |  |\}}| ||}| |}| |}| |}| |}| |}| |}| ||}| 	|}| 
||}| |}| |}|D ]}|||| }q|S )uG   
        Конвертируем модули из Confluence
        )r   r  r  rD  r@  rI  rS  rW  r{  r  r  r  r  r   )r  r   r  r   r   r9   r9   r:   confluence_convert  s     








zCmfDocument.confluence_convertc                 C   s.   | j jsd S | | j j| jj| _ |   d S rj   )r.   rr   r  r=   r#   r   rk   r9   r9   r:   r     s    zCmfDocument._process_text_draftc                 C   s8   |  ddg d}t| jjtjs&d}d| d| j S )Nr   rW   projectZdeskrV   z
/Document/)rs   r[   rW   r=   r%   r\   r   )r>   Z
base_placer9   r9   r:   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
        r,   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_cacher=   r`   r}   r%   CmfAccessListZcheck_accessrP   Zanonymous_userZsharelink_anonymous_userZtest_guest_userr	  Z
base_errorrQ  rQ   )r>   r  Zobj_parent_idr  Zself_idr  r}   er9   r9   r:   _is_web_public  sj    	         
zCmfDocument._is_web_publicu   Доступен из WEB)ZcaptionZvirtualreadonlyc                 C   s   |    |  S rj   )_acl_check_writelockrk   r9   r9   r:   public_lock  s    zCmfDocument.public_lockc                 C   s   |    |  S rj   )r  Zunlockrk   r9   r9   r:   public_unlock  s    zCmfDocument.public_unlockc                 C   s   |    |  S rj   )r  Z	lock_pingrk   r9   r9   r:   public_lock_ping  s    zCmfDocument.public_lock_ping)data_id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 )	NrZ  zdata-idr  ztox-checklist--checked checkedr   r   c                 S   s   g | ]}t |qS r9   r   r   r9   r9   r:   r   )  s     z5CmfDocument._text_update_checkbox.<locals>.<listcomp>)	r   r   r   r   r'   r   r   r   r   )	r>   r   r  r  r   Z	soup_textZtext_elementZnew_textr   r9   r9   r:   _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   r.   uD   DEV: в документе не найден элемент data-id=Tr   rp   )	rs   r  r   r=   r.   r   rP   rQ   r/   )r>   r  r  r   r.   r9   r9   r:   update_checkbox/  s    zCmfDocument.update_checkboxc                 O   s   | j ||S rj   )
do_approver   r9   r9   r:   public_do_approveB  s    zCmfDocument.public_do_approvec                 O   s   t d | j||S )NuC   Метод do_approve deprecated! Используйте do_publish)r   r0   r   r9   r9   r:   r  E  s    zCmfDocument.do_approvec                 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)r  )r   r%   r   r'   r  r/  Zupdate_text_inline_comments)r  r<   r?   r7   r9   r9   r:   "public_update_text_inline_commentsJ  s    z.CmfDocument.public_update_text_inline_commentsc                 O   sn   z|    W n tk
r"   Y d S X | dg | jrb| jjdrbt| j }rb|jd| d | j	||S )Nroot_parent_idzCmfProject:zPPP-COM-ADD)r   )
r.  r/  rs   r  r=   r>  rt  ru  Zcheck_project_role_accessZadd_inline_comment)r>   r<   r?   r  r9   r9   r:   public_add_inline_commentV  s    z%CmfDocument.public_add_inline_commentc                    s  | j  stj| _ | jjdd}| jsr|   |   t	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   rW   r   r   rm   
cmf_authorcmf_modified_byrk  rl  r   )r  r]   rP   current_userr   r   rt   r  r   r%   r   r.   rm   r  rk  rl  r/   r   r   r   r  r=   r#   rr   r   rw   _save_importr0   )r>   r<   r?   r   r   ry   r9   r:   r  c  s@    
	




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Cmfr.   )	r   r   rJ   rK   r   r=   r>  r  r.   )r  r<   ZkwragsZdocs_with_problemsZres_textr7   matchZres_text_draftr9   r9   r:   patch_20230407  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   r  Zapproved_atrk  Zapproveszapproves.obj_statuszapproves.approver_levelzapproves.resolutionzapproves.approverzapproves.approve_groupzapprovers.cmf_approved_atzapproves.approve_typer   rW   r   r   Tr   )r%   r   r'   )r  r   r<   r?   r_   r   r9   r9   r:   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   rG   )timeoutr  )r%   r  Zcheck_admin_moder  rt  Zrequests_sessionr'   r   base64Z	b64encoderR  r  )r  r  r<   r?   r  Zresponser  r  r9   r9   r:   link_patch_20230407  s    
zCmfDocument.link_patch_20230407)r   text_verrB   c              	   C   sL   | j   || j krdS tjj  || _|| _ | jdd W 5 Q R X dS )u   
        TODO: 16.05.2023 пока что отключаем ацл для записи отрендеренного текста
        NTrp   )Ztext_render_verr]   r	  utilrt  disable_aclr   r/   )r>   r   r  r9   r9   r:   save_render  s    

zCmfDocument.save_render)r#   rB   c                 C   s|   t jjj }|tjdd|}|j	
d}| rxt jj|dgdd}|jrdd|_|jdd | rt|  dS dS )	Nr   r   Zdirtyr{   T)r#   r_   Z
for_updateFrp   )r%   r  r  r  r  r   r1  r2  r   	meta_pathZjoinpathr  r   r'   r{   r/   unlink)r  r#   r  r   Z
dirty_pathr   r9   r9   r:   check_dirty  s    zCmfDocument.check_dirtyz	@minutely)Z	only_onceZ
system_jobZschedulec                  C   sj   ddl m}  tjjj }| |jdd}| rf|	 D ],}|	 D ]}|j
drVqDt|j
 qDq8d S )Nr   r   r   r   z.meta)r-  r   r%   r  r  r  r  	base_pathr  ZiterdirrA   endswithr   r  )r   r  Zdoc_pathZdoc_dirr1   r9   r9   r:   cron_check_dirty  s    zCmfDocument.cron_check_dirtyc                    s4   t  j||}|r0t|dd r0| |jr0d|_|S )Nr{   F)rw   r   getattrr  r#   r{   )r  r<   r?   r   ry   r9   r:   r     s    zCmfDocument.sgetc                 K   sh   |  dg tjj| |tjdd| jjd}|sJtjj| d|d d| jjd}|rd|j|fd|i| d S )Nrv   r   r+   )r   approve_groupapproverapprove_typer   obj_version)r   r  r  r  r   r  r   )	rs   r%   r   r'   rP   r  rt   r   Z_approve_one)r>   r  Z
resolutionr   r?   Zapprover9   r9   r:   approve_one  s       zCmfDocument.approve_onec                 C   s&   |  ddg | jjj| _|   d S )Nzstatus.trans_approvedzstatus.trans_approved.status_to)rs   r   Ztrans_approvedr   r/   rk   r9   r9   r:   _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)rs   r   Ztrans_rejectedr   r/   rk   r9   r9   r:   _approve_rejected  s    zCmfDocument._approve_rejectedc                 C   s   |  ddg | jjj| _d S )Nzstatus.trans_updatedzstatus.trans_updated.status_to)rs   r   r  r   rk   r9   r9   r:   r    s    zCmfDocument._approve_updatedc                    s&   t  || | | jj||| _d S rj   )rw   _replace_attachmentZ_replace_attach_urlr.   r=   )r>   r4   Z
new_attachry   r9   r:   r    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)	keysr'   r.  r/  rt  r  r%   r   Zmark_viewed)r  r?   r  r  r9   r9   r:   public_mark_viewed  s    
zCmfDocument.public_mark_viewed)F)N)NN)N)d__name__
__module____qualname__rO  staticmethodZcmf_deferred_jobr;   r@   r   rS   ri   rl   r  rx   r|   r~   r   r   r   r   r   r0   r   r   r   r   r   r   r   r   r   r   r   r   r/   r  r  r   r  r  r  r   r"  r$  r6  r7  r8  r@  rD  rI  rS  rW  r{  r  r  r  r  r  rv  r  bytesr  classmethodr  r  r  r   propertyr   r  r	  r_   ZFieldZCmfBoolZis_web_publicr  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r   r  r  r  r  r  r  __classcell__r9   r9   ry   r:   r      sn  


    

		?


7+
1G0
K*+cK%" D	
	
<	
(
#


r   )ZhashlibrN   r)   r-  r   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   r9   r9   r9   r:   <module>   s   