U
    Lfd                     @   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eeedmdndoZeeedmdpdqZ eeedmdrdsZ!eeedmdtduZ"eeedmdvdwZ#eeeedxdydzZ$eeedmd{d|Z%e&eeed}d~dZ'dd Z(e)dd Z*dddZ+e)dd Z,e-j.j/e-j.j0ddddZ1d fdd	Z2dd Z3dd Z4dd Z5dd Z6e&dd Z7 fddZ8e&dd Z9e&dFdddZ:e&dddZ;e&de<dddZ=deedFdddZ>e&ee?dddZ@e&dd ZAe& fddZB  ZCS )CmfDocumentu
   ВажноZ0pxz0 0 512 512ZpreserveZ20)xyviewBox	xml:spacewidthheightzrgb(216, 64, 64)a  M256,512c141.385,0,256-114.615,256-256S397.385,0,256,0S0,114.615,0,256C0.153,397.322,114.678,511.847,256,512z    M234.667,128c0-11.782,9.551-21.333,21.333-21.333c11.782,0,21.333,9.551,21.333,21.333v170.667   c0,11.782-9.551,21.333-21.333,21.333c-11.782,0-21.333-9.551-21.333-21.333V128z M256,384c11.782,0,21.333,9.551,21.333,21.333   s-9.551,21.333-21.333,21.333c-11.782,0-21.333-9.551-21.333-21.333S244.218,384,256,384z)filldzpanel-alarmzrgb(255, 235, 230))tooltipsvgsvg_path	classNamecoloru   Ошибкаz0 0 208.891 208.891)r   r   r   r   r   r   zM0,170l65.555-65.555L0,38.891L38.891,0l65.555,65.555L170,0l38.891,38.891l-65.555,65.555L208.891,170L170,208.891  l-65.555-65.555l-65.555,65.555L0,170zzpanel-erroru   Предупреждениеz0 0 554.2 554.199)r   r   r   r   r   r   zrgb(255, 153, 32)a!  M538.5,386.199L356.5,70.8c-16.4-28.4-46.7-45.9-79.501-45.9c-32.8,0-63.1,17.5-79.5,45.9L12.3,391.6   c-16.4,28.4-16.4,63.4,0,91.8C28.7,511.8,59,529.3,91.8,529.3H462.2c0.101,0,0.2,0,0.2,0c50.7,0,91.8-41.101,91.8-91.8   C554.2,418.5,548.4,400.8,538.5,386.199z M316.3,416.899c0,21.7-16.7,38.3-39.2,38.3s-39.2-16.6-39.2-38.3V416   c0-21.601,16.7-38.301,39.2-38.301S316.3,394.3,316.3,416V416.899z M317.2,158.7L297.8,328.1c-1.3,12.2-9.4,19.8-20.7,19.8   s-19.4-7.7-20.7-19.8L237,158.6c-1.3-13.1,5.801-23,18-23H299.1C311.3,135.7,318.5,145.6,317.2,158.7zzpanel-warningz#FFFAE6u   Заметкаz	0 0 24 24zLayer 1)r   r   r   z	data-namea  m19 3.022c0-.008 0-.014 0-.022v-2a1 1 0 0 0 -2 0v1.1a5 5 0 0 0 -1-.1h-1v-1a1 1 0 0 0 -2 0v1h-2v-1a1 1 0 0 0 -2 0v1h-1a5 5 0 0 0 -1 .1v-1.1a1 1 0 0 0 -2 0v2 .022a4.979 4.979 0 0 0 -2 3.978v12a5.006 5.006 0 0 0 5 5h8a5.006 5.006 0 0 0 5-5v-12a4.979 4.979 0 0 0 -2-3.978zm-7 13.978h-4a1 1 0 0 1 0-2h4a1 1 0 0 1 0 2zm4-4h-8a1 1 0 0 1 0-2h8a1 1 0 0 1 0 2zm0-4h-8a1 1 0 0 1 0-2h8a1 1 0 0 1 0 2zz#5243aa)r   r   z
panel-notezrgb(234, 230, 255)u   Информация)r   r   r   zrgb(1,82,204)zM12,24A12,12,0,1,0,0,12,12.013,12.013,0,0,0,12,24ZM12,5a1.5,1.5,0,1,1-1.5,1.5A1.5,1.5,0,0,1,12,5Zm-1,5h1a2,2,0,0,1,2,2v6a1,1,0,0,1-2,0V12H11a1,1,0,0,1,0-2Zz
panel-infozrgb(222, 235, 255)u   Готовоz0 0 1000 1000)r   r   r   r   r   r   z#01875aa9  M500,990c270.6,0,490-219.4,490-490S770.6,10,500,10S10,229.4,10,500S229.4,990,500,990z M483.7,678c-0.4,0.4-0.7,0.8-1.1,1.2c-19.1,19.1-50.2,19.1-69.3,0L239.9,505.9c-19.1-19.1-19.1-50.1,0-69.3c19.1-19.1,50.2-19.1,69.3,0l138.7,138.7L695,328.1c19.1-19.1,50.2-19.1,69.3,0c19.1,19.1,19.1,50.2,0,69.3L483.7,678L483.7,678zzpanel-successzrgb(227, 252, 239)u   Без иконки zpanel-hidden)r   r   r   r   )alarmerrorwarningnoteinfosuccessZ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)selfZattachargskwargsZfile_objmimetypeencodingf r4   (./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)r7   Z
rus_simbolZos_max_lengthZfile_name_lengthextr1   r2   Zslice_lengthr4   r4   r5   _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_dir	CmfFoldersys_typeloadZhome_dir	CmfPersonZ
user_localZloginfieldsrK   oldnewr7   rI   rM   
ValueErrorid)nodeZtree_parent_r7   Zparent_rW   parent_pathr.   r4   r5   r]   s   s2    



$  z.CmfDocument._get_rfile_id.<locals>.parent_pathr   z.htmlrL   rN   rO   zdocument path for rP   )
r7   rW   rX   is_externalrI   rK   location_pathrM   rY   rZ   )r.   rW   r7   filenamerK   r_   rM   r4   r\   r5   _get_rfile_idp   s(    
 zCmfDocument._get_rfile_idc                 C   s   d S Nr4   r.   r4   r4   r5   _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 )
NrM   	cmf_ownerZcmf_owner_assistantsZactivityrV   
tree_nodesr   T	only_data)rK   
is_changedrM   load_fieldsZ_node_parentr!   valuer"   rQ   re   rg   rB   Zget_tree_nodes_recursiverZ   r,   )r.   Znlen	node_listr[   r4   r4   r5   Z__calc_parent   s4    
zCmfDocument.__calc_parentc                    s   t   ddg S )NrM   rK   )supersave_preload_fieldsrc   	__class__r4   r5   ro      s    zCmfDocument.save_preload_fieldsc                    s   t   ddg S )Nr+   approved)rn   simple_perm_allow_fieldsrc   rp   r4   r5   rs      s    z$CmfDocument.simple_perm_allow_fieldsc                 C   s$   | j r| j jjdkrd S |   d S )NrQ   )rM   rl   
class_nameZ_check_simple_permrc   r4   r4   r5   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)rr   rM   order_byrV   )Ztz<      )textrr   rM   zHISTORY ENDzCREATE APPROVE TASK STARTzCREATE APPROVE TASK ENDN)rv   rw   _process_text_draftrF   rG   r"   CmfDocumentHistoryr$   ZnowZutcry   rl   Ztotal_secondsr+   r}   r,   need_approveZ_create_approve_taskrr   )r.   create_new_historyrv   rw   Zprev_historyhistoryr4   r4   r5   _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_versionre   zOWNERS PLACE NOTIFY STARTu8   Необходимо утвердить документ   obj	person_idr7   msgpriorityzOWNERS PLACE NOTIFY ENDu   Руководитель проекта не может Выпускать чужой документ, но Вы можете установить себя Владельцем и Выпуститьuj   Данный документ может выпустить только владелец                 u   ,                 ему отправлено уведомление об утверждении черновика. Документ сохранен как черновик.FabortrM   ==rr   z-cmf_version)filterrV   rz   Tu9   Выпущены изменения в документеZobj_edit)r   r   r7   r   Znotify_typer   )depthri   )"rk   r   rF   Zcurrent_personre   rG   r"   	CmfNotifyplace_notifyrZ   rl   Z	html_diffstrr}   r+   Z
get_owners	cmf_alertr7   r   r$   rr   r,   r   _pinup_attach_versionZis_local_usersignZ_delete_approve_tasklistZperson_viewsrT   deleteremove_handle_mention_taskZget_all_followers)r.   r   r/   r0   r   text_oldviewpersonr4   r4   r5   r-      sd    

  

	zCmfDocument.do_approve)r8   c                 C   s  | j j}td | jddddgd | |\}}tjjj	
 }t|}|dD ]\}|jd}tjj|d	d
dgd}||j}	|	 }
|
jd j}|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}|sZqT|jd|  |jd< |jd |jd< qT|jdkrT|jd|  |jd< |jd |jd< qTddd  |jjD }|D ]}|||| }qtd! || _ d S )"Nz_pinup_attach_version STARTr^   rM   rK   r_   rf   [data-attach-id]data-attach-idurlurl_preview_imgurl_previewrZ   rV   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-hrefc                 S   s   g | ]}t |qS r4   )r   ).0r   r4   r4   r5   
<listcomp>l  s     z5CmfDocument._pinup_attach_version.<locals>.<listcomp>z_pinup_attach_version END)r+   rl   rF   rG   rk   get_all_drawio_svgr"   CmfRFiledpdata_driverget_rdr   selectattrsr$   r#   	get_rfileZ
_file_nameZfile_versionsZversionsversionr7   r   findr   r   joinZbodyZchildrenreplace)r.   r}   svg_replaceprepared_textrdisksoupattachment_nodeattachment_id
attachmentrfileZversion_managerZ
latest_verZattachment_linkZpreview_imgkeyr4   r4   r5   r   G  sF    



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   rr   	parent_idr   r   r}   )r   rV   u$   Не найдена DocumentHistory!Tr   r   Frh   r   )r   r   )rk   r"   r   r$   rZ   r   r}   rr   r,   r+   _update_attachments_versions)r.   r   r/   r0   Zdoc_historyr4   r4   r5   restore_versionr  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^   rM   rK   r_   rf   r   r   r   r   r   r   r   )rk   r   r+   rl   r   r   r   r$   r"   r#   Zget_contentZupload_file)	r.   r   r   r   r   r   Zattachment_verr   Z
file_bytesr4   r4   r5   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)rW   Fr   Zdocument_is_externalZdocument_is_internal)%_CmfDocument__calc_parentrr   rj   r   r}   r+   r   Zcmf_deletedr"   r   r   r   r   ra   r   exists
meta_tuuidrZ   cmfrV   ZCmfTUUIDZget_obj_by_tuuid_strrF   rG   r7   rM   Z	file_pathr_   ZcreateZis_newrenameZ
write_textrl   Zmeta_set_flagr^   rn   r,   )r.   r   r   r   r/   r0   r   rfile_idr   tuuidZrfile_parentZold_rfile_idZ	old_rfilerp   r4   r5   r,     sP    
"


zCmfDocument.savec                 C   s   d S rb   r4   rc   r4   r4   r5   _calc_approved  s    zCmfDocument._calc_approvedc                    s   t  j|fd| ji|S )NZmsg_url)rn   create_eventr   )r.   Zevent_personr0   rp   r4   r5   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^   rM   rK   r_   rf   )rk   r"   r   r   r   r   ra   r   r   r   rZ   r   rn   )r.   r/   r0   r   r   r   r   rp   r4   r5   r     s    
zCmfDocument.deletec                    s    |dkrdS t  j|f||S )N)r}   r+   rr   )rn   _get_field_log_level)r.   Z
field_namer/   r0   rp   r4   r5   r     s    z CmfDocument._get_field_log_levelc                    s.   t t| j|| | jjsd S | jr*d| _d S )NT)rn   r   _process_publicZ	is_publicrj   r   r.   r/   r0   rp   r4   r5   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   rr   TZapproved_versionz!=z-approved_versionr}   r   rz   rV   )r"   r   sgetrZ   r   r4   r4   r5   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   countrZ   rc   r4   r4   r5   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rZ   N)bs4r   r}   rl   setfind_alladdZmention_tasksr"   ZCmfTaskr$   append)r.   r/   r0   r   Zbs_textZnew_taskitemZtskr4   r4   r5   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   rU   u,   Вас упомянули документе)r}   rW   rX   r+   rj   r   Z
parse_textrt   Z
rg_membersrT   
all_nestedr"   r   r   rZ   rl   r7   )r.   Zcommentr   Ztext_newZobjs_oldZobjs_newr   r   r4   r4   r5   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   rZ   rl   )r.   paramsZnew_docr4   r4   r5   create_doc_from_template;  s    z$CmfDocument.create_doc_from_templatec                 O   s   dd l }dd l}ddlm} ddlm} | dg |  }|tj	| }t
| jdd  d}	tj||	}
|
 d}tjd	||	}| jstd
dd |j|dd}| jD ]}||j||j q|  |||
 |S )Nr   r   )basenameattachments:r   z.zipZ_tmpfilesuP   Отсутствуют вложенные файлы для скачиванияTr   w)mode)zipfileshutilpathlibr   Zos.pathr   rk   Zget_files_dirZconfigZ
UPLOAD_DIRr   rZ   rC   ospathr   r   r   ZipFilewriter%   closemove)r.   r/   r0   r   r   r   r   Zfile_dirZobj_dirzip_filenameZzip_file_pathZzip_file_path_tmpZreturn_pathZarcr   r4   r4   r5   download_all_attachmentF  s&    

z#CmfDocument.download_all_attachment)r}   r8   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_convertedrZ   )r   r   r@   compile
startswithr   r   r   )r}   Zold_idZnew_idr   linkZid_bodyr4   r4   r5   _convert_title`  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h4rZ   ztitlelist-.*Zmcetoc_)	r   ZfindAllr   r$   r   new_tagr@   r   r   )r}   r   tagZ	title_tagZtag_hr4   r4   r5   _convert_title_macrou  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   r4   r4   r5   _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_tagr4   r4   r5   _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   r@   r   r   CmfErrorr   r
  )r}   r  r   r  r  contentr4   r4   r5   _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_textr4   r4   r5   _convert_expander  s$    






zCmfDocument._convert_expander)r}   r   r8   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  r4   r4   r5   _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   r4   r4   r5   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  rB   r  	enumerater   )r}   r   Ztagsr  Zlayout_typecolr
  cZtag_layout_sectionZtag_divir   Ztag_layout_colZtag_layout_contentr4   r4   r5   _convert_layouts  sj    


	




zCmfDocument._convert_layouts)r}   	object_idr8   c                 C   st   |  |\}}| |}| |}| |}| |}| |}| ||}| |}|D ]}|||| }qZ|S )uG   
        Конвертируем модули из Confluence
        )	r   r  r  r  r  r  r  r'  r   )clsr}   r(  r   r   r4   r4   r5   confluence_convert8  s    





zCmfDocument.confluence_convertc                 C   s.   | j jsd S | | j j| jj| _ |   d S rb   )r+   rj   r*  rl   rZ   r   rc   r4   r4   r5   r~   J  s    zCmfDocument._process_text_draftc                 C   s8   |  ddg d}t| jjtjs&d}d| d| j S )Nr  rM   ZprojectZdeskrL   z
/Document/)rk   r!   rM   rl   r"   rQ   r  )r.   Z
base_placer4   r4   r5   r   P  s
    zCmfDocument.href   Уведомлениеc                 O   s   d S rb   r4   )r.   r}   Znotify_namer/   r0   r4   r4   r5   all_place_notifyY  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_idrZ   rl   rt   r"   CmfAccessListZcheck_accessrF   Zanonymous_userZsharelink_anonymous_userZtest_guest_userr   Z
base_errorr  rG   )r.   r-  Zobj_parent_idr.  Zself_idrt   er4   r4   r5   _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
spectatorsre   cmf_owner_assistantzparent.executorszparent.spectatorszparent.cmf_ownerzparent.cmf_owner_assistantrV   rf   )rk   r   rn   all_relation_personsr5  r   r!   rM   rl   r
   r3  r   updater4  r   )r.   rV   r0   resr3  r4  rp   r4   r5   r6    s0          

z CmfDocument.all_relation_personsc                 C   s   |    |  S rb   )_acl_check_writelockrc   r4   r4   r5   public_lock  s    zCmfDocument.public_lockc                 C   s   |    |  S rb   )r9  Zunlockrc   r4   r4   r5   public_unlock  s    zCmfDocument.public_unlockc                 C   s   |    |  S rb   )r9  Z	lock_pingrc   r4   r4   r5   public_lock_ping  s    zCmfDocument.public_lock_pingc                 O   s   | j ||S rb   )r-   r   r4   r4   r5   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$   r9  ZCmfPermissionErrorZupdate_text_inline_comments)r)  r/   r0   docr4   r4   r5   "public_update_text_inline_comments  s    z.CmfDocument.public_update_text_inline_commentsc                    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}   rj   r*  rl   rZ   r+   r   rK   Zis_not_nulltree_node_is_branchr,   Z
cmf_authorrT   rF   Zcurrent_userrn   _save_importrr   r-   r   rp   r4   r5   rC    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}   ZLIKEz
%img%src=%rx   r   zimg[^>]*src=[\'"]([^\'"]*)z
data:imageZCmfr+   )	r   r   r@   rA   r}   rl   r  r   r+   )r)  r/   ZkwragsZdocs_with_problemsZres_textr@  matchZres_text_draftr4   r4   r5   patch_20230407  s4    	



zCmfDocument.patch_20230407)
source_urlc                O   s^   t jd dsd S |d krd S dd l}|j|dd}|jdkrBd S dd l}||j}|	 S )NFr   )r   r=   )timeout   )
r"   r/  Zcheck_admin_moderequestsr$   Zstatus_codebase64Z	b64encoder  decode)r)  rF  r/   r0   rI  ZresponserJ  r8  r4   r4   r5   link_patch_20230407  s    
zCmfDocument.link_patch_20230407c              	   C   s   ddl m} g }tj|ddddddd	gd
}|d kr8|S |jD ].}t|drX|jd k	rXq>|jdkr>|| q>|j	||pzd|d |S )Nr   )
attrgetterTrg   ztree_nodes.tree_node_is_branchztree_nodes.ordernoztree_nodes.cmf_created_atztree_nodes.cmf_modified_atztree_nodes.sys_type)ZsimplerV   rS   )r   rR   Zorderno)r   reverse)
operatorrM  cmfutilZget_obj_by_idrg   hasattrrS   rt   r   sort)r)  node_idrN  sort_byrM  rm   r   r[   r4   r4   r5   _macros_page_tree_node_list  s&      

z'CmfDocument._macros_page_tree_node_listr   )r   c                 C   sJ   | j |||d}|d8 }|dkrF|D ] }|jr$| j|j|||d|_q$|S )N)rN  rT  r   r   )rS  r   rN  rT  )rU  rB  macros_page_tree_getrZ   rg   )r)  rS  r   rN  rT  rm   r[   r4   r4   r5   rV  -  s    
 
z CmfDocument.macros_page_tree_get)text_rendertext_verr8   c              	   C   s4   t jj  || _|| _| jdd W 5 Q R X dS )u   
        TODO: 16.05.2023 пока что отключаем ацл для записи отрендеренного текста
        Trh   N)r   utilrP  Zdisable_aclrW  Ztext_render_verr,   )r.   rW  rX  r4   r4   r5   save_render:  s
    zCmfDocument.save_render)rZ   r8   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dirtyrr   T)rZ   rV   Z
for_updateFrh   )r"   r   r   r   r   r   r   r   r   	meta_pathZjoinpathr   r   r$   rr   r,   unlink)r)  rZ   r   r   Z
dirty_pathr   r4   r4   r5   check_dirtyD  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endswithr]  )r)  r   Zdoc_idr4   r4   r5   cron_check_dirtyS  s
    
zCmfDocument.cron_check_dirtyc                    s2   t  j||}|r.| |jr.t|dr.d|_|S )Nrr   F)rn   r   r]  rZ   rQ  rr   )r)  r/   r0   r   rp   r4   r5   r   [  s
    zCmfDocument.sget)F)N)N)r+  )N)FN)Nr   FN)NN)D__name__
__module____qualname__r  r6   staticmethodr   rI   ra   rd   r   ro   rs   ru   r   r-   r   r   r   r,   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r'  classmethodr*  r~   propertyr   r,  r1  r   rV   ZFieldZCmfBoolZis_web_publicr6  r;  r<  r=  r>  rA  rC  rE  rL  rU  intrV  rZ  r   r]  ra  r   __classcell__r4   r4   rp   r5   r      s  


    

		>
7&
N+:
$+H


7	

$

r   )ZhashlibrD   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   ra  r4   r4   r4   r5   <module>   s(           Z