U
    WfJ                    @   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ed4d5d6d7d8 Zd9d: Zeeed;d<d=Z	dd?d@Z
edAdB ZdCdD ZdEdF Z fdGdHZdIdJ ZddLdMZdNdO ZdPdQ ZdRdS ZdKd>dTdUdVZ fdWdXZedYdZd[ZdKd\d]d^Zd_d` Z fdadbZdcdd Zdedf Zdgdh Zdidj Zdkdl Zdmdn Zdodp Z d>d>dKdq fdrds
Z!dtdu Z" fdvdwZ# fdxdyZ$ fdzd{Z%d|d} Z&d~d 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Z/eeedddZ0eeedddZ1eeedddZ2e3eeedddZ4eeedddZ5eeedddZ6eeedddZ7eeedddZ8eeeedddZ9eeedddZ:eee;edddZ<e3eedddZ=e3eedddZ>e3eedddZ?ee@edddZAe3eedddZBe3eedddZCe3eeedddZDdd ZEeFdd ZGeFdd ZHeIjJjKeIjJjLdd5d5dZMddĄ ZNddƄ ZOddȄ ZPeeQdɜdd˄ZReeQdɜdd̈́ZSddτ ZTddф ZUe3ddӄ ZVddՄ ZW fddׄZXe3ddل ZYe3ddۄ ZZe3dKdܜddބZ[deedKdߜddZ\e3eeQdddZ]eed5d5dddd Z^e3 fddZ_dddZ`dd Zadd Zbdd Zc fddZde3dd Ze fddZf fddZg  ZhS )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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 r:   (./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)r/   r0   r1   Zschedule_deferred_jobr<   r$   value)selfr5   r=   kwargsr:   r:   r;   import_mswordb   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mathfloorstripr   Zshort_str_encgdebug)rB   Z
rus_simbolZos_max_lengthZfile_name_lengthextr6   r7   Zslice_lengthr:   r:   r;   _get_filenamel   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fieldsrW   oldnewrB   rU   rY   
ValueErrorr$   )nodeZtree_parent_rB   Zparent_rb   parent_pathr?   r:   r;   rg      s2    



$  z.CmfDocument._get_rfile_id.<locals>.parent_pathr   z.htmlrX   rZ   r[   zdocument path for r\   )
rB   rb   rc   is_externalrU   rW   location_pathrY   rd   r$   )r?   rb   rB   filenamerW   ri   rY   r:   rf   r;   _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  i   @   r      )k)rO   rP   timetime_nsjoinrandomchoices)Z
charactersZalphabertotalijdata_idr:   r:   r;   get_data_id   s    $zCmfDocument.get_data_idc                 C   s   d S Nr:   r?   r:   r:   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 )
NrY   	cmf_ownerZcmf_owner_assistantsZactivityra   
tree_nodesr   T	only_data)rW   
is_changedrY   load_fieldsZ_node_parentr]   r>   r&   r^   r|   r~   rM   Zget_tree_nodes_recursiver$   r0   )r?   ZnlenZ	node_listre   r:   r:   r;   Z__calc_parent   s4    
zCmfDocument.__calc_parentc                    s   t   dddddg S )NrY   rW   cur_workflow_versioncur_published_version cur_workflow_version.doc_version)supersave_preload_fieldsrz   	__class__r:   r;   r      s    zCmfDocument.save_preload_fieldsc                 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 )
NrY   ==cur_workflowTfilterFOPENstatus_type)textrY   statusr   )
r&   CmfDocumentHistorylistr$   r   r0   workflowget_default_statusr/   r   )r?   Ztmp_listhstatus_opennew_cur_historyr:   r:   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 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_draftrR   rS   r   r   r   r   r   r   r_   r   r0   has_publishedr/   r   publish_by_owner_onlyZ_create_approve_taskapproved)r?   create_new_historyr   r   r   r:   r:   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   r0   )r?   Zhistr:   r:   r;   cancel_approve;  s
    
zCmfDocument.cancel_approvec                 C   s   | j jdkS )u6   Явлется ли бизнес-процесс simplezdocument.base:default)r   coderz   r:   r:   r;   wf_is_simpleB  s    zCmfDocument.wf_is_simplec                 O   s   | j ||S ry   )r1   r?   r=   r@   r:   r:   r;   public_do_publishF  s    zCmfDocument.public_do_publish)doc_versionsave_importc                O   s  |  ddddddddd	d
dddg | jr:| jjd| d |  rT| 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| _|   |   | j rt | jj!D ]"}t"|j#|j$drT|%  qTg | _| 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_versionr|   zstatus.coder   r   r   	macros_dbmacros_db_draftprojectzPPP-DOC-PUBLISHobjr   r   r   ur   Публикация этого документа доступна только после утвержденияNzOWNERS PLACE NOTIFY STARTu8   Необходимо выпустить документ   )r   personrB   msgpriorityzOWNERS PLACE NOTIFY ENDu   Владелец проекта не может Выпускать чужой документ, но Вы можете установить себя Владельцем документа и Выпуститьu}   Данный документ может выпустить только владелец документа                 u   ,                 ему отправлено уведомление об утверждении черновика. Документ сохранен как черновик.Fabortr#   Z	publishedTr   r   )depthr   ),r   r   check_project_role_accessr   r   r   r   r   	cmf_alertr   rR   Zcurrent_personr|   rS   r&   Z	CmfNotifyZplace_notifyZ	html_diffstrr   r/   Z
get_ownersrB   r   r   _pinup_attach_versionr   r   Z_delete_approve_taskmark_full_searchZperson_viewsr_   setr>   typesgetr$   deleter0   _handle_mention_taskCmfEventdo_eventr   r   )r?   r   r   r=   r@   viewr:   r:   r;   r1   I  sl          



zCmfDocument.do_publishc                    sR   | j js@| jjs@| jjs@| jjs@| jjs@| jjs@| jjs@| jjrNt	 j
||S d S ry   )text_renderr   r   r|   rY   rW   r   rB   tagsr   r   r   r   r:   r;   r     s"    zCmfDocument.mark_full_search)rC   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 STARTrh   rY   rW   ri   r}   [data-attach-id]data-attach-idurlurl_preview_imgurl_previewr$   ra   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 r:   r   .0r   r:   r:   r;   
<listcomp>  s     z5CmfDocument._pinup_attach_version.<locals>.<listcomp>z_pinup_attach_version END)r/   r>   rR   rS   r   get_all_drawio_svgr   selectattrsr(   r&   r'   r   	get_rfileZ
_file_nameZget_versionrB   r   findr   r   rq   childrenreplace)r?   r   svg_replaceprepared_textsoupattachment_nodeattachment_id
attachmentrfileZ
latest_verZattachment_linkZpreview_imgr   keyr:   r:   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   ra   u$   Не найдена DocumentHistory!Tr   r   Fr   r   )r   r   )r   r&   r   r(   r$   r   r   r   r0   r/   _update_attachments_versions)r?   r   r=   r@   Zdoc_historyr:   r:   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 )Nrh   rY   rW   ri   r}   r   r   r   r   r   r   r   )stream)r   r   r/   r>   r   r   r   r(   r&   r'   Zget_contentupload_stream_file)	r?   r   r   r   r   r   Zattachment_verr   filer:   r:   r;   r     s    z(CmfDocument._update_attachments_versionsc                    s
   t   S ry   )r   _calc_workflowrz   r   r:   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   rY   zworkflow.publish_approved_onlyzworkflow.publish_by_owner_onlyzparent.publish_approved_onlyzparent.publish_by_owner_onlyFT)
r   r   r   r   rY   r]   r>   r&   r   r^   rz   r:   r:   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   rY   r   )	r   rb   r   r   r   r0   r&   r   r/   )r?   r   Zstatus_rejectedZprev_historyhistoryr:   r:   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_approver   )r   r   rb   r   r_   r   _start_approverz   r:   r:   r;   do_status_is_changed6  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   r_   rM   r   )r?   Ztransitionsr:   r:   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   r   r&   r   Zstart_approve_processr   )r?   r=   r@   Z
wf_historyr:   r:   r;   r   N  s    

zCmfDocument._start_approvec                 O   s&   |  |   |   | j|| d S ry   )r   r   r   r0   r   r:   r:   r;   start_approveT  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_byra   r   )
r&   r   r(   rY   r$   r  r_   r   Znowr  )r?   Zofficial_historyr:   r:   r;   calc_official_datenumY  s    

z!CmfDocument.calc_official_datenum)	overwrite
no_versionr   c             	      st  |    | 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|   |   ddd| jgd	d| jgd
d| jggg}tjj| j|drtd| j ddd | jsBdrBtjjj }|  }||}	|	jr|	j}
|
r|
| jkrtjj !|
r|rft"#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*pd | jj*|	_|	+d| j, |	+d| j,  | j
jrb| j-j./ rb| 0  t1 j2||}|S )Nus   Нельзя менять текст напрямую, используйте text_draft вместе с do_approveTr   uH   Метод устарел! Используйте update_inline_comments)r   ZANDrB   r   rW   r$   r  )rB   r   u!   Документ с именем u^    уже существует на этом уровне. Выберите другое имя.FzOverwrite file for document z by ()u@   Файл с таким именем уже существует z, )is_direxist_okparents)rb   r   Zdocument_is_externalZdocument_is_internal)3_CmfDocument__calc_parentr   r   r   is_newr   Zcalc_doc_version_calc_scheme_wfr   r   r/   r   r   r   r   rB   rW   r$   r&   r   r(   Zcmf_deletedCmfRFiledpdata_driverget_rdrk   r   exists
meta_tuuidcmfra   ZCmfTUUIDZget_obj_by_tuuid_strrR   rS   rY   Z	file_pathri   ZcreaterenameZ
write_textr>   Zmeta_set_flagrh   r   trans_updatedr_   _approve_updatedr   r0   )r?   r	  r
  r   r=   r@   Zfiltrdiskrfile_idr   tuuidZrfile_parentZold_rfile_idZ	old_rfileresr   r:   r;   r0   i  sx    




"


zCmfDocument.savec                 C   s   d S ry   r:   rz   r:   r:   r;   _calc_approved  s    zCmfDocument._calc_approvedc                    s   t  j|fd| ji|S )NZmsg_url)r   create_eventr   )r?   event_personr@   r   r:   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 )
Nrh   rY   rW   ri   r}   ZTEXKOM_db_delete)descr_documentTr   )r   r&   r  r  r  r  rk   r   r  r  r$   r   r(   ZCmfComponentr   r$  r0   r   )r?   r=   r@   r  r  r   r  Z	componentr   r:   r;   r     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   r:   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   r:   r:   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$   rz   r:   r:   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tskr:   r:   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/   r   r   rb   Z
parse_textrc   
class_namer&   r   r   )r?   Zobjs_oldZobjs_newr   r:   r:   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: Идентификатор нового документа
        Tr   )Zcreate_from_templater   r0   r$   r>   )r?   paramsZnew_docr:   r:   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rY   rB   w)moder%   F)ZbackupZmake_preview)zipfileshutilpathlibr   Zos.pathr6  r   _acl_check_readCmfPermissionErrorr7  r   r   r$   rN   r&   r'   r(   tempfileZTemporaryDirectoryospathrq   ZipFilerB   writer)   r,   r   r   )r?   r=   r@   r<  r=  r   r6  zip_filenamer   rA  Ztmp_dirZzip_file_path_tmpZarcr1  r9   r:   r:   r;   download_all_attachment  s<    



 $z#CmfDocument.download_all_attachmentc                 O   s0   z|    W n tk
r"   Y d S X | j||S ry   )r?  r@  rG  r   r:   r:   r;   public_download_all_attachmentC  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   )r   Zfull_search_fieldsr   r>   r   r/   r&   ZCmfFullSearchZ
strip_htmlr   full_search_index)r?   r@   r   r   r:   r;   rI  J  s    zCmfDocument.full_search_index)r   rC   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.  rK   compile
startswithr   r   r   )r   Zold_idZnew_idr   linkZid_bodyr:   r:   r;   _convert_titleQ  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 )rJ  r+  r   z	toc-macror,  rM  zmce-tocFcontenteditableTZh2u   ОглавлениеZh4r$   ztitlelist-.*Zmcetoc_)	r   ZfindAllr   r(   r0  new_tagrK   rN  r   )r   r   tagZ	title_tagZtag_hr:   r:   r;   _convert_title_macrof  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.  rS  r   extendcontentsreplace_withr   )r   r   rT  rV  Ztag_contentr:   r:   r;   _convert_codez  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 ]2}|jddid}|r|jndg}|d||| 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   rC  r   zak-editor-panel__contenttruezak-editor-panel)r   zdata-panel-typer^  )rS  r&   r   
ICONS_DATAr0  rW  rY  )	r[  rT  Zdoc_souprX  Zpanel_tag_iconZsvg_tagZsvg_path_tagZpanel_tag_contentZ	panel_tagr:   r:   r;   _convert_macro_panel  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.+bodyr\  ZpanelZpanelContent
r   )	r   r   r.  rK   rN  r   CmfErrorr   rX  )r   ra  r   rT  r[  contentrX  r:   r:   r;   _convert_macro_panels  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,  r\  spoilerzspoiler-togglespanzspoiler-icon_zexpand-control-textzexpand-contentzspoiler-text)	r   r.  rS  r0  r   rW  rX  rY  r   )	r   r   rT  rf  Zspoiler_toggleZspoiler_iconZtag_control_textZtag_control_contentZspoiler_textr:   r:   r;   _convert_expander  s     




zCmfDocument._convert_expander)r   r   rC   c                 C   sT  |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rd|d< nd|d< |	drTt
jj|j|	d d }
|
s6t
jj|	d d!}
|
rTt|
j|d"< t|
j}|	d#rl|	d# |d$< |	d%r|	d% |d< |	d&r|	d& |d'< |	d(rdd)d)d*}||	d( |d+< |	d,rd-d.d/d0}||	d, |d1< |	d2rd|d3< t|j||tj|dd4|	d5d6dd7}||j qdd8d9 |jjD S ):u   
        Конвертируем тег Отображение дочерних из Confluence в наш
        fixme удалить когда добавят поддежку тега из Confluence
        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simplera   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)rN   )r   Zparamr:   r:   r;   	<genexpr>
  s     z2CmfDocument._convert_childpages.<locals>.<genexpr>|allro  1rr  Zpager9  )rB   rp  firstrq  r   styleZ
headerTypeZexcerptTyperd  )rn  rk  zrich contentrs  sortrB   cmf_created_atcmf_modified_at)titlecreationmodifiedZsortTypereversert  Zensure_ascii)r2   doc_namer4  original_paramsrb  r+  c                 S   s   g | ]}t |qS r:   r   r   r:   r:   r;   r   ,  s     z3CmfDocument._convert_childpages.<locals>.<listcomp>)rx   cmfutilget_obj_by_idr   rB   r   r.  r(   dictrN   r&   r   r   r^   r$   formatjsondumpsr   rY  
currentTagrq   r   r   )clsr   r   TMPLr   r  r   rT  r4  r  Zparent_pageZview_type_mapZsort_type_mapnew_soupr:   r:   r;   _convert_childpages  s    &






 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   r:   r:   r;   r   5  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-layoutrb  r\  r]  r_  zmceNonEditable selected)rR  zdata-layout-sectionr   r   r   rE   r     r  %zflex-basis: )zdata-column-widthzdata-layout-columnr{  )zdata-layout-contentrR  )r   r.  r(   r   r   rX  r0  rS  rM   rY  	enumerater   )r   r   r   rT  Zlayout_typecolrX  cZtag_layout_sectionZtag_divru   r   Ztag_layout_colZtag_layout_contentr:   r:   r;   _convert_layouts.  sn    

	




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 | d}|jddgddidD ]@}|d }||}|rp||d< qLd| d|dd |d< qLt|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#ffebe6z#eae6ffz#f4f5f7z#b3d4ffz#b3f5ffz#abf5d1z#fff0b3z#ffbdadz#c0b6f2z#b3bac5z#4c9affz#79e2f2z#57d9a3z#ffc400z#ff8f73z#998dd9r+  thZtdzdata-highlight-colourTr,  zdata-highlight-colorzbackground-color: ; r{  r   )r   r.  r(   r   )r   Z	color_map	text_souprT  Zdata_highlight_colourr   r:   r:   r;   _convert_colorsz  s8    


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(   rY  r   )r   Z	emoji_mapr  rT  Zemoticon_nameZemojir:   r:   r;   _convert_emoji  s6    


zCmfDocument._convert_emojic                 C   sB   d}t | d}|jddidD ]}t |d}||j qt|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+  rm  r7  r,  )r   r.  rY  r  r   )r   r  r  rT  rS  r:   r:   r;   _convert_macro_attachments  s    

z&CmfDocument._convert_macro_attachments)r   	object_idrC   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+  rm  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>
        rB   r}  r~  Zorderno)Znaturalr  r  ZpositionTimport_raw_jsonzparent.import_raw_jsonrj  r   Zhomepager$   Z
root_pagesFz@homer   )
rootLocalerootexpandCollapseAll
startDepthr|  r  	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;&r|  r  rb  r   )pagetree_paramsr_  rM  Zroot_page_original)Zurllib.parser  r  r   r.  r   r  r  r2  rY   r  r(   r   r   r&   r   r^   r$   r>   rB   r   Zqueryr  loadslowerr  r  r\  rY  r  )r   r  r  r  r   Zpagetree_tagsZTAG_TMPLZ	sort_dictr   Zhomepage_idZselfpage_idZpagetree_tagrM  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_soupr:   r:   r;   _convert_pagetree  s    
"






zCmfDocument._convert_pagetreec                 C   s   d}| s| 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rx|ddrx|d7 }t |j|j||ddd}||j q<d	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>
        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-successrl  rg  rm  r   r,  r   c                 S   s   |  do|  d S )Nzaui-lozenge-zaui-lozenge-subtle)rO  )r   r:   r:   r;   <lambda>      z1CmfDocument._convert_status_tag.<locals>.<lambda>r  zdata-macro-idFZ_cloudZneutral)r   r   r+  r   c                 S   s   g | ]}t |qS r:   r   r   r:   r:   r;   r     s     z3CmfDocument._convert_status_tag.<locals>.<listcomp>)r   r.  nextr   r(   r  r   rY  r  rq   r   r   )r   TMPZstatus_color_mappingr   rT  classesr  sr:   r:   r;   _convert_status_tagt  s4    


zCmfDocument._convert_status_tag)r   r   rC   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>
        rl  rg  rm  Zplantumlr,  r\  r   zsvg-replacer$   zSRC=\[([^]]+)\]r   z@startuml(.*?)@enduml
@startuml
r   
@endumlz{})r4  umlr   r+  uS   Не удалось преобразовать Plantuml, не найден код: r  u9   Не удалось преобразовать Plantuml: r   c                 S   s   g | ]}t |qS r:   r   r   r:   r:   r;   r     s     z5CmfDocument._convert_plantuml_tag.<locals>.<listcomp>)r   r   r.  r   itemsrK   rL   r&   r   convert_encuml2umlsearchDOTALLgrouprQ   r  rY  r  	Exceptionrq   r   r   )r   r   r  r   rT  Zsvg_divZsvg_keyZsvg_textr  encumlpatternresultrS  r:   r:   r;   _convert_plantuml_tag  s0    '
z!CmfDocument._convert_plantuml_tagc                 C   sH   |s|S t |d}|jdddidD ]}|ds$|  |d< q$t|S )uM   
        Добавляет атрибут "data-id" для checkbox
        r+  Zlizdata-inline-task-idTr,  data-id)r   r.  r(   rx   r   )r  r   r  rT  r:   r:   r;   _convert_checkbox  s    

zCmfDocument._convert_checkboxc                 C   sb  d|    d|    d|    d|    d|    d|    d|    d|    d	|    d
}|sh|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 ]}
|
  q"|d$d% d&D ]}|  q@|  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+  r\  rm  zui-tabsr,  zui-tabr   rE   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 r:   r   )r   r  r:   r:   r;   r   9  s     z-CmfDocument._convert_tabs.<locals>.<listcomp>)r4  tab_namerd  Zrwui_tabs_menur  c                 S   s
   t | tS ry   )r]   r   r   r:   r:   r;   r  C  r  z+CmfDocument._convert_tabs.<locals>.<lambda>r  )rx   r   r.  r  r(   r  r  r  r   rq   rX  rY  r  Z	decomposeextractZunwrapr   )r  r   r  r  Ztabs_tagru   Ztab_tagr  r4  r  Zul_tagZcommentr:   r:   r;   _convert_tabs  sf    &


zCmfDocument._convert_tabsc                 C   sj   |s|S t |d}|jdddD ]@}ddg|d< d|d	< |  |d
< |dD ]}|  |d
< qNq t|S )Nr+  r\  z
table-wrapr  ztableView-content-wrapzcmf-scrollbarr   Z
wikitableszdata-macrosr  table)r   r.  rx   r   )r  r   r  Ztable_wrap_tagZ	table_tagr:   r:   r;   _convert_table_wrapJ  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postZconfigZCONVERTER_PLANTUML_URLr   r   rd  )r  r  r  r   r:   r:   r;   convert_plantumlZ  s    
zCmfDocument.convert_plantuml)r  rC   c                 C   s   |  | d S )NZpuml)r  encodedecode)r  r  r:   r:   r;   r  d  s    zCmfDocument.convert_encuml2uml)r  rC   c                 C   sb   | d}dd |D }d|}td|s8d| }td|sN| d}| | d S )	Nrb  c                 S   s   g | ]}|  qS r:   )rstrip)r   liner:   r:   r;   r   l  s     z/CmfDocument.convert_uml2svg.<locals>.<listcomp>z
^@[a-z]+\nr  z@[a-z]+$r  r   )rN   rq   rK   r  r  r  r  )r  r  linesZcleaned_linesZ	clean_umlr:   r:   r;   convert_uml2svgh  s    



zCmfDocument.convert_uml2svgc                 C   s   |  |\}}| ||}| |}| |}| |}| |}| |}| |}| ||}| 	|}| 
||}| |}| |}| |}| |}| |}| |}|D ]}|||| }q|S )uG   
        Конвертируем модули из Confluence
        )r   r  r  rU  rQ  rZ  re  ri  r  r  r  r  r  r  r  r  r  r   )r  r   r  r   r   r:   r:   r;   confluence_convertu  s(    












zCmfDocument.confluence_convertc                 C   s.   | j jsd S | | j j| jj| _ |   d S ry   )r/   r   r  r>   r$   r   rz   r:   r:   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   rY   r   ZdeskrX   z
/Document/)r   r]   rY   r>   r&   r^   r   )r?   Z
base_placer:   r:   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>   rb   r2  r&   CmfAccessListZcheck_accessrR   Zanonymous_userZsharelink_anonymous_userZtest_guest_userr  Z
base_errorrc  rS   )r?   r  Zobj_parent_idr  Zself_idr  r2  er:   r:   r;   _is_web_public  sj    	         
zCmfDocument._is_web_publicu   Доступен из WEB)ZcaptionZvirtualreadonlyc                 C   s   |    |  S ry   )_acl_check_writelockrz   r:   r:   r;   public_lock  s    zCmfDocument.public_lockc                 C   s   |    |  S ry   )r  Zunlockrz   r:   r:   r;   public_unlock  s    zCmfDocument.public_unlockc                 C   s   |    |  S ry   )r  Z	lock_pingrz   r:   r:   r;   public_lock_ping  s    zCmfDocument.public_lock_ping)rw   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 )	Nrl  r  r,  ztox-checklist--checked checkedr   r   c                 S   s   g | ]}t |qS r:   r   r   r:   r:   r;   r     s     z5CmfDocument._text_update_checkbox.<locals>.<listcomp>)	r   r   r   r   r(   rq   r   r   r   )	r?   r   rw   r  r   Z	soup_textZtext_elementZnew_textr   r:   r:   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   r   )	r   r  r   r>   r/   r   rR   rS   r0   )r?   rw   r  r   r/   r:   r:   r;   update_checkbox  s    zCmfDocument.update_checkboxc                 O   s   | j ||S ry   )
do_approver   r:   r:   r;   public_do_approve  s    zCmfDocument.public_do_approvec                 O   s   t d | j||S )NuC   Метод do_approve deprecated! Используйте do_publish)r   r1   r   r:   r:   r;   r    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@   r8   r:   r:   r;   "public_update_text_inline_comments#  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   Zadd_inline_commentr   r:   r:   r;   public_add_inline_comment/  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   rY   r   r   r|   
cmf_authorcmf_modified_byr}  r~  r   )r  r_   rR   current_userr   r   r   r  r   r&   r   r/   r|   r  r}  r~  r0   r   r   r   r  r>   r$   r   r   r   _save_importr1   )r?   r=   r@   r   r   r   r:   r;   r  ;  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   rK   rL   r   r>   rO  r/  r/   )r  r=   ZkwragsZdocs_with_problemsZres_textr8   matchZres_text_draftr:   r:   r;   patch_20230407c  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_atr}  Zapproveszapproves.obj_statuszapproves.approver_levelzapproves.resolutionzapproves.approverzapproves.approve_groupzapprovers.cmf_approved_atzapproves.approve_typer   rY   r   r   Tr   )r&   r   r(   )r  r   r=   r@   ra   r   r:   r:   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   rH   )timeoutr  )r&   r  Zcheck_admin_moder  r  Zrequests_sessionr(   r   base64Z	b64encoderd  r  )r  r  r=   r@   r  Zresponser  r   r:   r:   r;   link_patch_20230407  s    
zCmfDocument.link_patch_20230407)r   text_verrC   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 пока что отключаем ацл для записи отрендеренного текста
        NTr   )Ztext_render_verr_   r  utilr  disable_aclr   r0   )r?   r   r  r:   r:   r;   save_render  s    

zCmfDocument.save_render)r$   rC   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$   ra   Z
for_updateFr   )r&   r  r  r  r  r   rB  rC  rq   	meta_pathZjoinpathr  r   r(   r   r0   unlink)r  r$   r  r   Z
dirty_pathr   r:   r:   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iterdirrB   endswithr   r  )r   r  Zdoc_pathZdoc_dirr2   r:   r:   r;   cron_check_dirty  s    zCmfDocument.cron_check_dirtyc                    s4   t  j||}|r0t|dd r0| |jr0d|_|S )Nr   F)r   r   getattrr  r$   r   )r  r=   r@   r   r   r:   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 )Nr   r   r,   )r   approve_groupapproverapprove_typer   obj_version)r   r  r  r  r   r	  r   )	r   r&   r   r(   rR   r  r   r   Z_approve_one)r?   r  Z
resolutionr   r@   Zapprover:   r:   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)r   r   Ztrans_approvedr   r0   rz   r:   r:   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)r   r   Ztrans_rejectedr   r0   rz   r:   r:   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)r   r   r  r   rz   r:   r:   r;   r    s    zCmfDocument._approve_updatedc                    s&   t  || | | jj||| _d S ry   )r   _replace_attachmentZ_replace_attach_urlr/   r>   )r?   r5   Z
new_attachr   r:   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@  r  r  r&   r   Zmark_viewed)r  r@   r  r   r:   r:   r;   public_mark_viewed  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_idrY   )r   Zuse_new_projectrW   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   r   valuesr2  Zproject_perm_allow_fieldsrO  r  r/  remove)r?   Zchanged_fields_to_checkZfieldr   r:   r;   r    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listsZresponsibleZ	executorszPPP-DOC-DELETEr   )r   r   r   r   check_delete_permrz   r   r:   r;   r  ,  s    
  zCmfDocument.check_delete_perm)F)N)NN)N)i__name__
__module____qualname__r`  staticmethodZcmf_deferred_jobr<   rA   r   rU   rk   rx   r{   r  r   r   r   r   r   r   r1   r   r   r   r   r   r   r   r   r   r   r  r  r0   r!  r"  r   r%  r'  r*  r   r3  r5  rG  rH  rI  rQ  rU  rZ  re  ri  classmethodr  r  r  r  r  r  r  r  r  r  r  r  bytesr  r  r  r  r   propertyr   r  r  ra   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  r  r  __classcell__r:   r:   r   r;   r      s  


    

		?


7
+
1K0
U*,cK'"" -DS	
	
<	
(
#



+r   )ZhashlibrO   rr   ro   r*   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   r:   r:   r:   r;   <module>   s   