U
    艭d\                     @   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ejej 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d4d5 Zeeed6d7d8Zdd:d;Zd<d= Z	d>d? Z
 fd@dAZ fdBdCZdDdE ZddGdHZdFdIdJdKZedLdMdNZdFdOdPdQZdRdS Zd9d9dFdT fdUdV
ZdWdX Z fdYdZZ fd[d\Z fd]d^Z fd_d`Zdadb Zdcdd Zdedf ZddgdhZdidj Zdkdl Zdmdn ZeeedodpdqZ eeedodrdsZ!eeedodtduZ"eeedodvdwZ#eeedodxdyZ$eeeedzd{d|Z%eeedod}d~Z&eeeedddZ'e(eeedddZ)dd Z*e+dd Z,dddZ-e+dd Z.e/j0j1e/j0j2ddddZ3d fdd	Z4dd Z5dd Z6dd Z7ee8dddZ9ee8dddZ:dd Z;e(dd Z<dd Z= fddZ>e(dd Z?e(dFdddZ@deedFdddZAe(ee8dddZBe(dd ZCe( fddZD fddZE  ZFS )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hiddenc              	   O   st   t |tjstj|}t|j}t|j\}}t|jd}| 	|
 |j|| _W 5 Q R X |   |   | S )uX   
        Импортирование Word документа в систему
        rb)
isinstancemodelsCmfAttachmentgetr   full_path_file	mimetypes
guess_typeopenZobj_to_htmlreadsuffix
text_draftsave
do_approve)selfattachargskwargsZfile_objmimetypeencodingf r5   (./modules/project/models/cmf_document.pyimport_mswordP   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)r8   Z
rus_simbolZos_max_lengthZfile_name_lengthextr2   r3   Zslice_lengthr5   r5   r6   _get_filename^   s    .zCmfDocument._get_filenameFc                    s    fdd rj jnj j}|d kr0dn|}jsB|d }|} rXjjnjj}|rv| d| S  rjjnjj}|r| d| S  rjjnjj}|rƈ| d| S td rdnd dj	 d	 d S )
Nc                    s>  t | tjr|  S t | tjr6| j dkr6|  S t | tjrX| j	 rXd| j
 S d| jkr| j   rx| jjn| jj}|r r| jjn| jj}|}| d| S d| jkr
| j   r| jjn| jj}|r
 r| jjn| jj}| d| S td rdnd d	| j d
j d | d S )Nhomez/Users/tree_parent/parentCan not calc old r   zdocument path for parent z of -: empty tree_parent, location_path and parent)r!   r"   
CmfProjectZproject_dirZ	CmfFolderZsys_typeloadZhome_dir	CmfPersonZ
user_localZloginfieldsrL   oldnewr8   rJ   rN   
ValueErrorid)nodeZtree_parent_r8   Zparent_rV   parent_pathr.   r5   r6   r\   s   s2    



$  z.CmfDocument._get_rfile_id.<locals>.parent_pathr   z.htmlrM   rO   rP   zdocument path for rQ   )
r8   rV   rW   is_externalrJ   rL   location_pathrN   rX   rY   )r.   rV   r8   filenamerL   r^   rN   r5   r[   r6   _get_rfile_idp   s(    
 zCmfDocument._get_rfile_idc                 C   s   d S Nr5   r.   r5   r5   r6   _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 )
NrN   	cmf_ownerZcmf_owner_assistantsZactivityrU   
tree_nodesr   T	only_data)rL   
is_changedrN   load_fieldsZ_node_parentr!   valuer"   rR   rd   rf   rC   Zget_tree_nodes_recursiverY   r,   )r.   ZnlenZ	node_listrZ   r5   r5   r6   Z__calc_parent   s4    
zCmfDocument.__calc_parentc                    s   t   ddg S )NrN   rL   )supersave_preload_fieldsrb   	__class__r5   r6   rm      s    zCmfDocument.save_preload_fieldsc                    s   t   ddg S )Nr+   approved)rl   simple_perm_allow_fieldsrb   rn   r5   r6   rq      s    z$CmfDocument.simple_perm_allow_fieldsc                 C   s$   | j r| j jjdkrd S |   d S )NrR   )rN   rk   
class_nameZ_check_simple_permrb   r5   r5   r6   check_simple_perm   s    zCmfDocument.check_simple_permNc                 C   s   ddl m }m} |   td tjjd| dgdgd}|rr|j|j	d|j
j  d	 d
k rr|sr|}| j|_ntj| jd| d}|  td | jrtd |   td d| _dS )uG   
        Сохраняем черновик в историю
        r   )datetimetimezonezHISTORY STARTF-cmf_modified_atcmf_modified_at)rp   rN   order_byrU   )Ztz<      )textrp   rN   zHISTORY ENDzCREATE APPROVE TASK STARTzCREATE APPROVE TASK ENDN)rt   ru   _process_text_draftrG   rH   r"   CmfDocumentHistoryr$   ZnowZutcrw   rk   Ztotal_secondsr+   r{   r,   need_approveZ_create_approve_taskrp   )r.   create_new_historyrt   ru   Zprev_historyhistoryr5   r5   r6   _process_draft_is_changed   s    
*



z%CmfDocument._process_draft_is_changed)doc_versionc             	   O   s  |  dddddg | jrtj| jkr| jrptd tjj| | 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 tjjdd| gddgdgd}|s| jsd S d|_|  |j| _| jj
}|   | j| _tjr|   d| _|   t| j D ]}|  | j| q(| j || | ! D ],}tjj| |j	j
d| || jj
dd qX| j|ddd| d S )Nr{   r+   r~   cmf_versionrd   zOWNERS PLACE NOTIFY STARTu8   Необходимо утвердить документ   obj	person_idr8   msgpriorityzOWNERS PLACE NOTIFY ENDu   Руководитель проекта не может Выпускать чужой документ, но Вы можете установить себя Владельцем и Выпуститьuj   Данный документ может выпустить только владелец                 u   ,                 ему отправлено уведомление об утверждении черновика. Документ сохранен как черновик.FabortrN   ==rp   z-cmf_version)filterrU   rx   Tu9   Выпущены изменения в документеZobj_edit)r   r   r8   r   Znotify_typer   )depthrh   )"rj   r~   rG   Zcurrent_personrd   rH   r"   	CmfNotifyplace_notifyrY   rk   Z	html_diffstrr{   r+   Z
get_owners	cmf_alertr8   r}   r$   rp   r,   r   _pinup_attach_versionZis_local_usersignZ_delete_approve_tasklistZperson_viewsrS   deleteremove_handle_mention_taskZget_all_followers)r.   r   r0   r1   r   text_oldviewpersonr5   r5   r6   r-      sd    

  

	zCmfDocument.do_approve)r9   c                 C   s  | j j}td | jddddgd | |\}}tjjj	
 }t|}|dD ]p}|jd}tjj|d	d
dgd}||j}	|	 }
t|
jdkr|
jd jnd }|sqT||jd< |jdks|jdks|jdkr|jd|  |jd< |jd |jd< qTd|jddkr|dddi}|jd|  |jd< |jd|  |jd< |dddi}|snqT|jd|  |jd< |jd |jd< qT|jdkrT|jd|  |jd< |jd |jd< qT|d  }rdd!d" |jD }|D ]}|||| }qtd# || _ d S )$Nz_pinup_attach_version STARTr]   rN   rL   r^   re   [data-attach-id]data-attach-idurlurl_preview_imgurl_previewrY   rU   r   r=   data-attach-versionZ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 r5   r   .0r   r5   r5   r6   
<listcomp>m  s     z5CmfDocument._pinup_attach_version.<locals>.<listcomp>z_pinup_attach_version END)r+   rk   rG   rH   rj   get_all_drawio_svgr"   CmfRFiledpdata_driverget_rdr   selectattrsr$   r#   	get_rfileZ
_file_nameZfile_versionsrC   Zversionsversionr8   r   findr   r   joinchildrenreplace)r.   r{   svg_replaceprepared_textrdisksoupattachment_nodeattachment_id
attachmentrfileZversion_managerZ
latest_verZattachment_linkZpreview_imgr   keyr5   r5   r6   r   G  sH    

 

z!CmfDocument._pinup_attach_version)history_versionc                O   s   |  ddg tjjdd| jgdd|ggdgd}|sBtdd	d
 d| _d| _| jd	d |j| _	| 
  | j|dd	d|S )u   
        Восстанавливаем документ из DocumentHistory
        Принимаем cmf_version CmfDocumentHistory, который является версией draft или approved документа
        r~   rp   	parent_idr   r   r{   )r   rU   u$   Не найдена DocumentHistory!Tr   r   Frg   r   )r   r   )rj   r"   r}   r$   rY   r   r{   rp   r,   r+   _update_attachments_versions)r.   r   r0   r1   Zdoc_historyr5   r5   r6   restore_versiont  s    zCmfDocument.restore_versionc           	      C   s   | j ddddgd | | jj\}}t|}|dD ]F}|jd}|jd}tj	j|d	d
dgd}|
|}|| q8d S )Nr]   rN   rL   r^   re   r   r   r   r   r   r   r   )rj   r   r+   rk   r   r   r   r$   r"   r#   Zget_contentZupload_file)	r.   r   r   r   r   r   Zattachment_verr   Z
file_bytesr5   r5   r6   r     s    
z(CmfDocument._update_attachments_versions)	overwrite
no_versionr   c             	      s  |    | jjrtddd | jjr0tddd |rDtddd d S | jjrX| j|d | jstj	j
j }|  }||}|jr|j}	|	r|	| jkrtjj|	r|rtd|	 d|  d	| j d
 n2td| d|	 d|   td| j ddd |j}
|j| _|
j| _|
jdddd | jsf|jsf| jdd}||}|jrf|| |jdddd || jj pd | jj |_|!d| j" |!d| j"  t# j$||S )NuV   Нельзя менять approved напрямую, используйте do_approveTr   us   Нельзя менять текст напрямую, используйте text_draft вместе с do_approveuH   Метод устарел! Используйте update_inline_comments)r   zOverwrite file for document z by ()u@   Файл с таким именем уже существует z, u!   Документ с именем u^    уже существует на этом уровне. Выберите другое имя.)is_direxist_okparents)rV   Fr   Zdocument_is_externalZdocument_is_internal)%_CmfDocument__calc_parentrp   ri   r   r{   r+   r   Zcmf_deletedr"   r   r   r   r   r`   r   exists
meta_tuuidrY   cmfrU   ZCmfTUUIDZget_obj_by_tuuid_strrG   rH   r8   rN   Z	file_pathr^   ZcreateZis_newrenameZ
write_textrk   Zmeta_set_flagr]   rl   r,   )r.   r   r   r   r0   r1   r   rfile_idr   tuuidZrfile_parentZold_rfile_idZ	old_rfilern   r5   r6   r,     sP    
"


zCmfDocument.savec                 C   s   d S ra   r5   rb   r5   r5   r6   _calc_approved  s    zCmfDocument._calc_approvedc                    s   t  j|fd| ji|S )NZmsg_url)rl   create_eventr   )r.   Zevent_personr1   rn   r5   r6   r     s    zCmfDocument.create_eventc                    sd   | j ddddgd tjjj }|  }||}|jrV|j	}|rN|| j
krV|  t j||S )Nr]   rN   rL   r^   re   )rj   r"   r   r   r   r   r`   r   r   r   rY   r   rl   )r.   r0   r1   r   r   r   r   rn   r5   r6   r     s    
zCmfDocument.deletec                    s    |dkrdS t  j|f||S )N)r{   r+   rp   )rl   _get_field_log_level)r.   Z
field_namer0   r1   rn   r5   r6   r     s    z CmfDocument._get_field_log_levelc                    s.   t t| j|| | jjsd S | jr*d| _d S )NT)rl   r   _process_publicZ	is_publicri   r~   r.   r0   r1   rn   r5   r6   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   rp   TZapproved_versionz!=z-approved_versionr{   r   rx   rU   )r"   r}   sgetrY   r   r5   r5   r6   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   countrY   rb   r5   r5   r6   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-idrY   N)bs4r   r{   rk   setfind_alladdZmention_tasksr"   ZCmfTaskr$   append)r.   r0   r1   r   Zbs_textZnew_taskitemZtskr5   r5   r6   r     s    z CmfDocument._handle_mention_taskc              	   C   s   d}d}|r.|j jr|j j}|j jrZ|j j}n,| jjs:d S | jjrJ| jj}| jjrZ| jj}t| |}t| |}|| D ]f}|jdkr|j	 
 D ] }tjj| |jj| jddd qq~|jdkr~tjj| |jj| jddd q~d S )Nr   ZCmfPersonGroupu/   Вас упомянули в документеr   r   rT   )r{   rV   rW   r+   ri   r   Z
parse_textrr   Z
rg_membersrS   
all_nestedr"   r   r   rY   rk   r8   )r.   Zcommentr   Ztext_newZobjs_oldZobjs_newr   r   r5   r5   r6   handle_mention_persons  sB    



z"CmfDocument.handle_mention_personsc                 C   s   | j f |}|  |jjS )u   Создание документа из шаблона
        :param self: Шаблон документа
        :param params: Параметры для шаблона
        :return: Идентификатор нового документа
        )Zcreate_from_templater   rY   rk   )r.   paramsZnew_docr5   r5   r6   create_doc_from_template=  s    z$CmfDocument.create_doc_from_templatec              	   O   s0  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 | 	 }|t
j| }t| jdd  d}	tj||	}
|
 d}tjd	||	}| jstd
dd |j|dd}| jD ]@}z|  W n tk
r    Y qY nX ||j||j q|  |||
 |S )Nr   r   )basenameattachments:r   z.zipZ_tmpfilesuP   Отсутствуют вложенные файлы для скачиванияTr   w)mode)zipfileshutilpathlibr   Zos.pathr   rj   _acl_check_readCmfPermissionErrorZget_files_dirZconfigZ
UPLOAD_DIRr   rY   rD   ospathr   r   r   ZipFilewriter%   closemove)r.   r0   r1   r   r   r   r   Zfile_dirZobj_dirzip_filenameZzip_file_pathZzip_file_path_tmpZreturn_pathZarcr   r5   r5   r6   download_all_attachmentH  s6    


z#CmfDocument.download_all_attachmentc                 O   s0   z|    W n tk
r"   Y d S X | j||S ra   )r   r   r   r   r5   r5   r6   public_download_all_attachmentk  s
    z*CmfDocument.public_download_all_attachment)r{   r9   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_convertedrY   )r   r   rA   compile
startswithr   r   r   )r{   Zold_idZnew_idr   linkZid_bodyr5   r5   r6   _convert_titler  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 )r  r   r   z	toc-macror   r  zmce-tocFcontenteditableTZh2u   ОглавлениеZh4rY   ztitlelist-.*Zmcetoc_)	r   ZfindAllr   r$   r   new_tagrA   r  r   )r{   r   tagZ	title_tagZtag_hr5   r5   r6   _convert_title_macro  s    




z CmfDocument._convert_title_macroc                 C   s   t | d}|jddidD ]\}|jdddid}|d}|rV|jD ]}|| qDn|jD ]}|| q\|| qt|S )uU   
        Конвертиуем тэги экранирования кода
        r   r   coder   prezlanguage-markup)r   r   r  r   contentsr   replace_withr   )r{   r   r  r  Ztag_contentr   r5   r5   r6   _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   r   r   zak-editor-panel__contenttruezak-editor-panel)r   zdata-panel-typer  )r  r"   r   
ICONS_DATAr   extendr  )	r  r  Zdoc_soupr  Zpanel_tag_iconZsvg_tagZsvg_path_tagZpanel_tag_contentZ	panel_tagr5   r5   r6   _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panelContentr   )	r   r   r   rA   r  r   CmfErrorr   r  )r{   r  r   r  r  contentr5   r5   r6   _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D ]}|| q|jddid}|jdddid}	|jD ]}|	| q||	 || 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   r  r   r   r  r  r   )
r{   r   r  r  Zspoiler_toggleZspoiler_iconZtag_control_textr   Ztag_control_contentZspoiler_textr5   r5   r6   _convert_expander  s$    






zCmfDocument._convert_expander)r{   r   r9   c                 C   sZ   t | d}|jddidD ]6}|jd|ddd}|d}|| || qt|S )	u   
        Конвертируем тег Отображение дочерних из Confluence в наш
        fixme удалить когда добавят поддежку тега из Confluence
        r   r   zchildpages-macror   r  r  )zdata-children-docsr
  ul)r   r   r  r   r  r   )r{   r   r   r  Zdata_children_docsr"  r5   r5   r6   _convert_childpages  s    



zCmfDocument._convert_childpagesc              	   C   s  t | d}dd |jddidD }|D ]h}ddgdd	gd	dgd	d	d	gd
dd
gd}||jd}|snq(g }|jD ]}|dkrqx|| qx|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   r5   r5   r6   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-layout
r  r  r  zmceNonEditable selected)r
  zdata-layout-sectionr   r   r   r;   r$     r%  %zflex-basis: )zdata-column-widthzdata-layout-columnZstyle)zdata-layout-contentr
  )r   r   r$   r   r  r   r  rC   r  	enumerater   )r{   r   Ztagsr  Zlayout_typecolr  cZtag_layout_sectionZtag_divir   Ztag_layout_colZtag_layout_contentr5   r5   r6   _convert_layouts  sj    


	




zCmfDocument._convert_layouts)r{   	object_idr9   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   zdata-macro-nameZ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>
        r8   Zcmf_created_atrw   Zorderno)ZnaturalZcreationZmodifiedZpositionTimport_raw_jsonzparent.import_raw_json)ZsimplerU   r   ZhomepagerY   Z
root_pagesFz@homer   )
rootLocalerootexpandCollapseAll
startDepthsortreverse	searchBoxZ
rootPageIdrk   Nz@selfr3  r2  Zext_idLIKEz%::r   z%"homepage":{"id":"z"%r5  Zpagetreesearchr   r8  Zplugin_pagetree_expandcollapse)class_r4  ZtreeRequestIdz&amp;&r6  r7  r&  r   )pagetree_paramsr  r  Zroot_page_original)Zurllib.parser/  r0  r   r   r   cmfutilget_obj_by_idrr   rN   r1  r$   r   r   r"   r   rR   rY   rk   r8   r   ZqueryZjsonloadslowerformatdumpsr  r  Z
currentTag)r{   r.  r/  r0  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_soupr5   r5   r6   _convert_pagetreeJ  s    
"






zCmfDocument._convert_pagetreec                 C   s   |  |\}}| |}| |}| |}| |}| |}| ||}| |}| ||}|D ]}|	||| }qf|S )uG   
        Конвертируем модули из Confluence
        )
r   r  r	  r  r  r!  r#  r-  rC  r   )clsr{   r.  r   r   r5   r5   r6   confluence_convert  s    





zCmfDocument.confluence_convertc                 C   s.   | j jsd S | | j j| jj| _ |   d S ra   )r+   ri   rE  rk   rY   r   rb   r5   r5   r6   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  rN   projectZdeskrM   z
/Document/)rj   r!   rN   rk   r"   rR   r  )r.   Z
base_placer5   r5   r6   r     s
    zCmfDocument.href   Уведомлениеc                 O   s   d S ra   r5   )r.   r{   Znotify_namer0   r1   r5   r5   r6   all_place_notify  s    zCmfDocument.all_place_notifyc              
   C   s   | j r | j}| j}| j}| j}n | jj}| jj}| jj}| jj}| j}zptjj	|||||ddt
jdrlW 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_personTz$DEV: _is_web_public ACL load Error: N)Zsimple_objectZperm_effective_acl_idr   cmf_owner_idrY   rk   rr   r"   CmfAccessListZcheck_accessrG   Zanonymous_userZsharelink_anonymous_userZtest_guest_userr   Z
base_errorr  rH   )r.   rI  Zobj_parent_idrJ  Zself_idrr   er5   r5   r6   _is_web_public  s`    	         
zCmfDocument._is_web_publicu   Доступен из WEBT)ZcaptionZvirtualreadonlyc              
      s   |  ddddddddg tt jf d	|i|}| jrF|| j t| jjt	rj| jjrj|| jj | j
j|d
}|st| jjt	r| jj
j|d
}|| | jj|d
}|st| jjt	r| jjj|d
}|| t|S )N	executors
spectatorsrd   cmf_owner_assistantzparent.executorszparent.spectatorszparent.cmf_ownerzparent.cmf_owner_assistantrU   re   )rj   r   rl   all_relation_personsrQ  r   r!   rN   rk   r
   rO  r   updaterP  r   )r.   rU   r1   resrO  rP  rn   r5   r6   rR  >  s0          

z CmfDocument.all_relation_personsc                 C   s   |    |  S ra   )_acl_check_writelockrb   r5   r5   r6   public_lockU  s    zCmfDocument.public_lockc                 C   s   |    |  S ra   )rU  Zunlockrb   r5   r5   r6   public_unlockZ  s    zCmfDocument.public_unlockc                 C   s   |    |  S ra   )rU  Z	lock_pingrb   r5   r5   r6   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 )	NZlxmlzdata-idr   ztox-checklist--checked checkedr   r   c                 S   s   g | ]}t |qS r5   r   r   r5   r5   r6   r   q  s     z5CmfDocument._text_update_checkbox.<locals>.<listcomp>)	r   r   r   r   r$   r   r   r   r   )	r.   r{   rZ  r[  r   Z	soup_textZtext_elementZnew_textr   r5   r5   r6   _text_update_checkboxd  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   rg   )	rj   r\  r{   rk   r+   r   rG   rH   r,   )r.   rZ  r[  r{   r+   r5   r5   r6   update_checkboxw  s    zCmfDocument.update_checkboxc                 O   s   | j ||S ra   )r-   r   r5   r5   r6   public_do_approve  s    zCmfDocument.public_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$   rU  r   Zupdate_text_inline_comments)rD  r0   r1   docr5   r5   r6   "public_update_text_inline_comments  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   rj   rb  rk   r  r=  r>  Zcheck_project_role_accessZadd_inline_comment)r.   r0   r1   rF  r5   r5   r6   public_add_inline_comment  s    z%CmfDocument.public_add_inline_commentc                    s~   | j jr.| | j j| jj| _ | j | _|   | jjrLd| j_	| jj
dd | j s^tj| _t j|| | jsz|   d S )NT)Zsave_import)r{   ri   rE  rk   rY   r+   r   rL   Zis_not_nullZtree_node_is_branchr,   Z
cmf_authorrS   rG   Zcurrent_userrl   _save_importrp   r-   r   rn   r5   r6   rd    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{   r9  z
%img%src=%rv   r   zimg[^>]*src=[\'"]([^\'"]*)z
data:imageZCmfr+   )	r   r   rA   rB   r{   rk   r  r   r+   )rD  r0   ZkwragsZdocs_with_problemsZres_textr`  matchZres_text_draftr5   r5   r6   patch_20230407  s4    	



zCmfDocument.patch_20230407)
source_urlc                O   sb   t jd dsd S |d krd S dd l}t j|dd}|jdkrFd S dd l}|	|j
}| S )NFr   )r   r>   )timeout   )r"   rK  Zcheck_admin_moderequestsr=  Zrequests_sessionr$   Zstatus_codebase64Z	b64encoder  decode)rD  rg  r0   r1   rj  Zresponserk  rT  r5   r5   r6   link_patch_20230407  s    
zCmfDocument.link_patch_20230407)text_rendertext_verr9   c              	   C   s4   t jj  || _|| _| jdd W 5 Q R X dS )u   
        TODO: 16.05.2023 пока что отключаем ацл для записи отрендеренного текста
        Trg   N)r   utilr=  Zdisable_aclrn  Ztext_render_verr,   )r.   rn  ro  r5   r5   r6   save_render  s
    zCmfDocument.save_render)rY   r9   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dirtyrp   T)rY   rU   Z
for_updateFrg   )r"   r   r   r   r   r   r   r   r   	meta_pathZjoinpathr   r   r$   rp   r,   unlink)rD  rY   r   r   Z
dirty_pathr   r5   r5   r6   check_dirty  s    zCmfDocument.check_dirtyc                 C   sF   t jjj }ttj|j	ddD ]}|
dr6q&| | q&d S )Nr   r   z.meta)r"   r   r   r   r   r   listdirr   r   	base_pathendswithrt  )rD  r   Zdoc_idr5   r5   r6   cron_check_dirty  s
    
zCmfDocument.cron_check_dirtyc                    s2   t  j||}|r.| |jr.t|dr.d|_|S )Nrp   F)rl   r   rt  rY   hasattrrp   )rD  r0   r1   r   rn   r5   r6   r   	  s
    zCmfDocument.sgetc                    s&   t  || | | jj||| _d S ra   )rl   _replace_attachmentZ_replace_attach_urlr+   rk   )r.   r/   Z
new_attachrn   r5   r6   rz    s    zCmfDocument._replace_attachment)F)N)N)rG  )N)NN)G__name__
__module____qualname__r  r7   staticmethodr   rJ   r`   rc   r   rm   rq   rs   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-  rC  classmethodrE  r|   propertyr   rH  rM  r   rU   ZFieldZCmfBoolZis_web_publicrR  rW  rX  rY  r   r\  r]  r^  ra  rc  rd  rf  rm  rq  rt  rx  r   rz  __classcell__r5   r5   rn   r6   r      s"  


    

		>
7&
N-:
$#+H 


7	

$

r   )ZhashlibrE   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   ZAPPZHOOK_CRON_MINUTELYr   rx  r5   r5   r5   r6   <module>   s,             