U
    rtdC                    @   s   d dl mZ d dlT d dlmZ d dlmZ d dlm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Zd dlZG d	d
 d
ejZdS )    abort)*)fields)cmf_documenthtmldiffN)BeautifulSoup)floorc                       s:  e Zd Z fddZeedddZdd Zdd	 Zd
d Z	dd Z
dd Zed=ddZeeeedddZeeeedddZeeeeedddZ fddZdddd Zed!d" Zed#d$ Zd%d& Zd'd( Zd)d* Zd>d,d-Zed.d/ Zd?d1d2Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Z  Z S )@CmfDocumentc                    s   | j rt  S d S N)Zis_newsuper_increment_versionself	__class__ ./models/cmf_document.pyr      s    
zCmfDocument._increment_version)textc                 C   sh   dd l }i }ttjdtjd| D ]:}|| }| }d| d}| ||} |||< q$|| fS )Nr   z(<svg\b[^<>]*>[\s\S]*?<\/svg>))flagsz	<div id="z"></div>)	hashlibrefindallcompileDOTALLmd5encodeZ	hexdigestreplace)r   r   svg_replaceZsvgr   Zmd5sumkeyr   r   r   get_all_drawio_svg   s    
zCmfDocument.get_all_drawio_svgc              	   O   s   |  dddg | js$tdd dS |  }|  D ]}|j| jjkrHq4tjj	dd|jgd	d| jgd
ddgdddggd}|stj
j	dd}tj||| d|dd}|j  |  q4tj||d  q4dS )u   
        У всех участников родителя документа запрашиваем необходимость ознакомится
        parent	cmf_ownerr   u-   У документа нет родителяTNresponsible_id==	parent_idlogic_prefixztask.doc_need_watchcache_status_type!=CLOSEDfiltercodeuE   Необходимо ознакомиться с документомZresponsible
logic_typer"   namer   approvedr"   r   )load_fieldsr"   	cmf_alert_get_history_diffall_relation_personsidr#   modelsCmfTaskgetCmfLogicType
alarm_dateset_nowsave
CmfComment)r   argskwargsr   Zpersontaskr0   r   r   r   request_watch'   s0    

  

zCmfDocument.request_watchc                 C   sh   | j j}tjjdd| jgdddggdgddgdd	gd
}|rP| |d j j|}d| d| j d}|S )Nr&   r%   r2   T-cmf_versioncmf_versionr         )r,   order_byr   slicer      Изменения: , <a href="   ">посмотреть</a>)r   valuer9   CmfDocumentHistorylistr8   	html_diffhref)r   r   Zdoc_historyr   r   r   r6   A   s     zCmfDocument._get_history_diffc              	   C   s   t   | | jj| jj}d| d| j d}tjj	dd| j
jgdd| jgdddgd	d
dggd}|stjj	dd}tj| j
|| d|dd}|j  |  |j  |  ntj||djdd W 5 Q R X d S )NrK   rL   rM   r$   r%   r&   r'   task.doc_need_approver(   r)   r*   r+   r-   u8   Необходимо утвердить документTr/   r3   F)notify)cmfutildisable_aclrQ   r   rN   
text_draftrR   r9   r:   r;   r#   r8   r<   r=   r>   r?   r@   )r   Ztext_diff_contentZ	text_diffrC   r0   r   r   r   _create_approve_taskN   s(    

  


z CmfDocument._create_approve_taskc              	   C   sj   t  X tjjdd| jjgdd| jgdddgdddggd	gd
}|r\|jd|_	|
  W 5 Q R X d S )Nr$   r%   r&   r'   rS   r(   r)   r*   workflow)r,   r   )rU   rV   r9   r:   r;   r#   r8   rY   Zget_default_statusstatusr?   )r   rC   r   r   r   _delete_approve_taskf   s    

z CmfDocument._delete_approve_taskc                 K   sJ   |  ddg t }| jr&|| j | jrB| jjrB|| jj t|S )Nr#   zparent.cmf_owner)r4   setr#   addr"   rP   )r   rB   resr   r   r   r7   p   s    z CmfDocument.all_relation_persons   c                 C   s   |pd}|pd}t |||S )uz   
        Используем единую тулзу для анализа изменений документа
         r   )clsablimitr   r   r   rQ   }   s    zCmfDocument.html_diff)r   rW   returnc           
      C   s   t | d}t |d}i }i }|dddiD ]0}|dddiD ]}|dr@|||d < q@q,|dddiD ]0}|dddiD ]}|dr|||d < qqn|}| |  D ]}	t||	 | }q|S )	u1  
        Получаем черновик с инлайн-задачами

        :param text: Оригинальный текст документа с инлайн-задачами
        :param text_draft: Черновик
        :return: Черновик с инлайн-задачами
        lxmlspanzdata-mentions-taskTrb   zdata-mention-typerC   data-object-id)r	   find_allZhas_keykeysstr)
r   rW   	soup_textsoup_text_draftZtasks_in_textZtasks_in_draftrg   rb   result_textZ	task_spanr   r   r   handle_inline_task   s     	



zCmfDocument.handle_inline_taskc           +   	   C   s  d}t | d}i }|dddiD ]}|||d< q"tj|\}}t |d}|dddiD ]4}||dr||dd q`d}|  q`i }|rd	d
d |j	j
D }|D ]}	||	||	 }q|}
n|}
| D ]\}}| |}| |j d|}| dd|}| d|td }| d| dtd }|| |d d }td| || ddd }|r||  n|}| || }td| || }|r||  n|}| || }| |d | dk}| ||d  dk}|rtdd|}|r$tdd|}||j | }||g dg\}}|sptt||
}t|}||g||< |sxq|t|k r|| }n|d }|
d|  dtd }| |
| d d }d} tdd| || }!tdd|
||  }"|! }#|#r|#d nd	}$tdd	|$}$|"|d }%|%rN|%d nd	}&|$|&krj|$|krjd} | rrqt|}'t||' t|j  }(||d g||< | |' })| |( }*|
d|) t| |
|*d  }
q|
S )ua  
        Получаем черновик с комментариями-пометками

        :param text: Оригинальный текст документа с комментариями-пометками
        :param text_draft: Черновик
        :return: Черновик с комментариями-пометками
        Frf   rg   data-mark-annotation-typeZinlineCommentr8   NTr`   c                 S   s   g | ]}t |qS r   rk   .0xr   r   r   
<listcomp>   s     z5CmfDocument.handle_inline_comment.<locals>.<listcomp>r   z<span</span>z<p>z</p>z\s|>z\s|<   z&nbsp;z\&nbsp; z<br />z<br/>rG   )r	   ri   r;   r9   r   r!   popZunwrapjoinbodychildrenr   itemsfindcountr   striprfindlenr   searchstartsubrP   finditerendsplitrk   )+r   rW   Zis_remove_commentZsoup_text_commentZid_commentsrg   svg_tagsrm   Z	dict_textr    rn   Z
id_commentZposition_commentZidx_position_textZstart_commentZend_commentZ	start_rowZend_rowZmatch_start_wordZposition_start_wordZword_beforeZmatch_end_wordZposition_end_wordZ
word_afterZhave_nbsp_beforeZhave_nbsp_afterZwordZ	text_listZnumbermatchZstart_row_draftZend_row_draftZis_near_not_matchZtext_to_splitZtext_draft_to_splitZ	near_wordZlast_near_wordZnear_word_draftZlast_near_word_draftZshift_startZ	shift_endZresult_startZ
result_endr   r   r   handle_inline_comment   s    	




"z!CmfDocument.handle_inline_comment)r   	macros_idmacros_parametersre   c                 C   s\   t j| \}} t| d}|j|d}|r2||d< t|} |D ]}| ||| } q>t|S )Nzhtml.parser)r8   zdata-macros-parameters)r9   r   r!   r	   r   rk   r   )r   r   r   r   rl   Ztable_filtersr    r   r   r   handle_macros_parameters  s    
z$CmfDocument.handle_macros_parametersc                    s   t   dddddddg S )NZperson_signsZperson_viewsZneed_approver2   r"   r   rW   )r   save_preload_fieldsr   r   r   r   r     s     zCmfDocument.save_preload_fieldsN)doc_versionc                O   sZ   t jjdd| ggddgdgd}|s0tddd	 t jj| |jd
}|j| |	  |S )Nr"   r%   rF   signsrE   )r,   r   rI   u4   Документ не найден в историиTr   )version)
r9   rO   r;   r5   ZCmfSignZsign_objectrF   r   appendr?   )r   r   rA   rB   historysignr   r   r   r      s     zCmfDocument.signc                 C   s  t | d}t|}| D ]}|r|js,q|jdd |jdd |jdd |jdd |jdd |jdd |jd	d t|jD ]}|d
r|j|d qd|jdg ksd|jkr|  q| D ]}|r|jsq|jdd |jdd |jdd |jdd |jdd |jdd |jd	d t|jD ] }|d
r`|j|d q`d|jdg ksd|jkr|  q|jdd |jdd |jdd |jdd |jdd |jdd |jd	d t|jD ] }|d
r|j|d q|jdd t|j	} | dd } | dd } t|}| 
dd
dd
dd} |
dd
dd
dd}| |krtddd d}tdt|d D ]R}| d| |d| kr q(| |d  dkr|}| |d  dkrd}q|d8 }|r>|d }|dkr`| |d } ||d }d}tdt|d D ]R}| | d || d kr q| |  dkr|}| |  dkrvd}qv|d8 }|r|d }|dkr| d|  } |d|  }d| d}t | d}t |d}	t|j	jdkrNtd|j	j dd |j	jj|	j	jjkrtd|j	jj d |	j	jj dd |j	jj}
t|
 tdd!d"d#d$d%g rtd&|
 dd |
d%dS )'u   
        Проверяем, что в текст добавлен только inline-кмментарий.
        Дополнительно здесь мы находим id спана добавленного комментария
        rf   classNzdata-renderedZstyleZrelzdata-mce-srczdata-mce-stylezdata-mce-hrefz	data-mce-zmacros-panelzdata-macrosrR   rx       ry   
r`   u+   Не передан комментарий!Tr   rG   <>r   z<span>rv   uO   DEV: переданы неверные данные в комментарий: uV   DEV: обрамленный комментарием текст отличается: z != r8   rp   zdata-mark-typedata-idrh   u^   DEV: у inline-комментария передан неизвестный аттрибут: )r	   copyri   attrsrz   rP   
startswithZ	decomposerk   r|   r   r5   ranger   contentsrg   r\   rj   r;   )new_texttext_elementsoup_text_with_inlineelemZ	attr_nameZexisted_textZinside_tag_posiZspan_with_commented_dataZcommented_dataZ
span_attrsr   r   r   _verify_inline_comment0  s    













"
z"CmfDocument._verify_inline_commentc                 C   s  t j|\}}t|d}|jd| id}t|d}	|	jd|id}
t|d}|jd| id}|st||}||kr~td |S ||kr||	jj	d  d
dd	 |jjD }|D ]}|||| }q|S td
t|
d }|dd}t|dd}t|dd}||}||}|dkrt|jd|
jdd d }||}|d | }||7 }||||t|  7 }|d7 }|||t| d  7 }|| d
dd	 |jjD }|D ]}|||| }q|S |dkrN||krNd}d}d}||| }dkrr|t| }||d  dkrf||t| |t| d  dkrf|}qr|d7 }qt|jd|
jdd d }d}td|d D ]}|||}|t| }q|d | }||7 }||||t|  7 }|d7 }|||t| d  7 }|| d
dd	 |jjD }|D ]}|||| }q2|S |dkrZn |jd|
jd}d|_|| d
dd	 |jjD }|D ]}|||| }q|S )Nrf   r   r   rh   u   В новой версии документа данный абзац отсутствует, в будущем добавленный комментарий Вы сможете посмотерть в истории комментариев.r   r`   c                 S   s   g | ]}t |qS r   rq   rr   r   r   r   ru     s     z5CmfDocument._merge_inline_comment.<locals>.<listcomp>z^[^>]*>(.*)</span>$r   ry   rG   rg   r   rv   c                 S   s   g | ]}t |qS r   rq   rr   r   r   r   ru     s     r      c                 S   s   g | ]}t |qS r   rq   rr   r   r   r   ru     s     #c                 S   s   g | ]}t |qS r   rq   rr   r   r   r   ru     s     )r9   r   r!   r	   r   r   r5   replace_withr|   r   r{   r}   r   r   r   rk   r   Znew_tagr   r   r   stringr   )data_idcomment_span_idr   Zhtml_node_textZorig_text_element	text_mainr   rl   r   r   Zcomment_span_elementZsoup_text_mainZtext_main_elementr^   r    Zinline_comment_contentZtext_element_strZtext_main_element_strZcontent_countZcontent_main_countZinserted_span_tagZins_posZtext_element_str_newZ	find_skipZ	_find_posZ
_find_skip_pos_Zorphan_commentr   r   r   _merge_inline_comment  s    







"


z!CmfDocument._merge_inline_commentc                 C   s  |dkr| j j}n$|dkr$| jj}ntd| dd | |\}}t|d}|jd|id}|sttd	| dd | ||}t|d}	||	j	j
d
  ddd |j	jD }
|D ]}|
||| }
q|dkr|
| _ n|dkr|
| _|dkr| j||| jj||| j jd}|| _|S )Nr   rW   /   DEV: не поддерживается version=Tr   rf   r   r   uD   DEV: в документе не найден элемент data-id=r   r`   c                 S   s   g | ]}t |qS r   rq   rr   r   r   r   ru   3  s     z3CmfDocument._add_inline_comment.<locals>.<listcomp>)r   )r   rN   rW   r5   r!   r	   r   r   r   r|   r   r{   r}   r   r   )r   r   r   	data_htmlr   r   rl   r   r   r   r   r    Zdraft_new_textr   r   r   _add_inline_comment  s8    




  zCmfDocument._add_inline_commentc                 C   s  |  dddg | jr6| jjjdr6| jjd| d z| |||}W nj tk
r } zLt	d| j d| d	| d
|  t	| t	t
  tddd W 5 d}~X Y nX |rtjj|dgd}|r|jr|j d| |_n
t||_|jdd | jdd dS )u  
        html_node_text - всегда один html-элемент, близжайший верхний parent-элемент с data-id для комментария
        Этот метод может вызываться несколько раз для одного и того же comment_id, если выбрали несколько нод
        comment_id (CmfComment равен id элемента span с комментарием)
        r   rW   root_parentzCmfProject:zPPP-COM-ADD)objzAdd inline comment bug: id=z
, version=z
, data_id=z, data_html=u   Ошибка при добавлении комментария. Пожалуйста, обратитесь в Техническую поддержку!Tr   Nhtml_contextr8   r   r   	only_data)r4   r   r8   rN   r   Zcheck_project_role_accessr   	Exceptiongdebug	traceback
format_excr5   r9   r@   r;   r   rk   r?   )r   r   r   r   r   ecommentr   r   r   add_inline_commentA  s$    $

zCmfDocument.add_inline_commentc                 C   s  |  dddg tjj|ddgd}|s:td| dd d	|_|  | | jj	\}}| | jj	\}}t
|d
}t
|d
}dddg}	d}
|	D ]:}|j||idD ]$}|ddd |jD  d}
qq|
rddd |jjD }|D ]}|||| }q|| _d}
|	D ]>}|j||idD ]&}|ddd |jD  d}
q(q|
rddd |jjD }|D ]}|||| }qv|| _| jdd d S )Nr   rW   r   r"   r   u)   Не найден комментарий Tr   closedrf   rh   zdata-refr8   Fr   r`   c                 S   s   g | ]}t |qS r   rq   rr   r   r   r   ru     s     z5CmfDocument.delete_inline_comment.<locals>.<listcomp>c                 S   s   g | ]}t |qS r   rq   rr   r   r   r   ru     s     c                 S   s   g | ]}t |qS r   rq   rr   r   r   r   ru     s     c                 S   s   g | ]}t |qS r   rq   rr   r   r   r   ru     s     r   )r4   r9   r@   r;   r5   rZ   r?   r!   r   rN   r	   ri   r   r{   r}   r|   r   rW   )r   Zdata_comment_idr   Zsvg_tags_textr   Zsvg_tags_text_draftrW   rl   rm   Zcomment_id_attr_listZchangedZcomment_id_attrr   r    Ztext_element_draftr   r   r   delete_inline_comment`  s@    


z!CmfDocument.delete_inline_commentFc                 C   s   |  ddg | j| jkrT| d | j| _tj| jd| d}|  | jdd n>|dkrt| d | jdd n|dkr| d | jdd d S )Nr   rW   F)r   r2   r"   Tr   )r4   r   rW   _set_data_idsr9   rO   r?   )r   r   Zfix_dublicater   r   r   r   patch_inline_comment_data_ids  s    


z)CmfDocument.patch_inline_comment_data_idsc               "   C   s   dddddddddddd	d
dddd	dddddddddddddddd
dddddddddddddddddddddddddddddddddddddd d!d!d"ddddddddd#d$d%d&d'dd(d)d*d+dd(d)d,d-dd$d.d/d0dd1d2d3d4ddd5d5d6d6ddd5d5d7d7ddd8d8d9d9ddd:d:d;d;dddd d<d<d=dddd>d<d<d?ddd@dAdBdBdCddDdEdFdGdHdIdg} | D ]}|dJ }| dK|}|dL }| dMdN}|dO }| dPdQ}| dRdQ}| dS|}	tjj dTdJdKdUgdV}
||
_||
_|rdQt_|rg t_z|
	dJ|| W n` t
k
r } z@|r^g t_dt_tdW W Y  qtdX|  W Y qW 5 d }~X Y nX |rdt_tdY|  q|
jj|krtdZ|
jj d[|  |
jj|	krtd\|
jj d[|	  |rtjg krtd] qtdW qd S )^NZTfgs41gCqEYvnRz#<p data-id="Tfgs41gCqEYvnR">qwe</p>z<p data-id="Tfgs41gCqEYvnR">qw<span class="inline-highlight inline-highlight-active" data-mark-annotation-type="inlineComment" data-mark-type="annotation" id="CmfComment:a5b02aac-da09-11ed-9a90-0242ac110002">e</span></p>)r   r   r   resultz)qwe<p data-id="Tfgs41gCqEYvnR">qwe</p>qwez0<p data-id="Tfgs41gCqEYvnR">q<span>w</span>e</p>z=<p>qwe</p><p data-id="Tfgs41gCqEYvnR">q<span>w</span>e</p>qwe2zB<p data-id="1">qwe</p><p data-id="2">qwe</p><p data-id="3">qwe</p>z#<p data-id="2">q<span>w</span>e</p>zO<p data-id="1">qwe</p><p data-id="2">q<span>w</span>e</p><p data-id="3">qwe</p>z#<p data-id="2"><span>qwe</span></p>zO<p data-id="1">qwe</p><p data-id="2"><span>qwe</span></p><p data-id="3">qwe</p>ze<p data-id="1">qwe</p><p data-id="2">qw<b>e</b><a href="/qwe">h<i>i</i></a></p><p data-id="3">qwe</p>zF<p data-id="2"><span>qw<b>e</b><a href="/qwe">h<i>i</i></a></span></p>zr<p data-id="1">qwe</p><p data-id="2"><span>qw<b>e</b><a href="/qwe">h<i>i</i></a></span></p><p data-id="3">qwe</p>z<p data-id="2">qwe</p>T)r   r   r   error3z$<p data-id="2">q<span>ww</span>e</p>z5<p data-id="2">q<span onclick="alert()">w</span>e</p>z&<p data-id="2">q<span>w</span>e</p>rtyz&<p data-id="2">q<span>w</span>erty</p>1z<p data-id="1">qwe</p>z#<p data-id="1">q<span>w</span>e</p>)r   r   rW   r   r   z<p data-id="1">qwe</p>HI!z&<p data-id="1">q<span>w</span>e</p>HI!)r   r   rW   r   r   result_draftz<p data-id="1">qwe2</p>z-<p data-id="1">q<span id="com1">w</span>e</p>z.<p data-id="1">q<span id="com1">w</span>e2</p>)r   r   rW   r   r   alertr   ZBnnahcxvEX3XKdu%  <p data-id="BnnahcxvEX3XKd">Токен подписывается очень надежным алгоритмом хеширования SHA-256 (например, используется в подписях https-сертификатов у сайтов, подписях почтовых сообщений, защищенных каналах связи, Bitcoin) и явно удостоверяет права пользователя. подписанного jwt токена производится на отдельном строго защищенном account сервере, ваш пароль не хранится в открытом виде и не передается в открытом виде даже через ssl, а хешируется сразу в браузере.</p>u  <p data-id="BnnahcxvEX3XKd"><span class="inline-highlight inline-highlight-active" id="CmfComment:7a950418-ddc0-11ed-9a90-0242ac110002" data-mark-type="annotation" data-mark-annotation-type="inlineComment">Токен</span>&nbsp;подписывается очень надежным алгоритмом хеширования SHA-256 (например, используется в подписях https-сертификатов у сайтов, подписях почтовых сообщений, защищенных каналах связи, Bitcoin) и явно удостоверяет права пользователя. подписанного jwt токена производится на отдельном строго защищенном account сервере, ваш пароль не хранится в открытом виде и не передается в открытом виде даже через ssl, а хешируется сразу в браузере.</p>u  <p data-id="BnnahcxvEX3XKd"><span class="inline-highlight inline-highlight-active" data-mark-annotation-type="inlineComment" data-mark-type="annotation" id="CmfComment:7a950418-ddc0-11ed-9a90-0242ac110002">Токен</span> подписывается очень надежным алгоритмом хеширования SHA-256 (например, используется в подписях https-сертификатов у сайтов, подписях почтовых сообщений, защищенных каналах связи, Bitcoin) и явно удостоверяет права пользователя. подписанного jwt токена производится на отдельном строго защищенном account сервере, ваш пароль не хранится в открытом виде и не передается в открытом виде даже через ssl, а хешируется сразу в браузере.</p>ZRoHr5PpeuMz9qxuM  <p data-id="BnnahcxvEX3XKd"><span class="inline-highlight" data-id="RjECb1pICX1QMq" data-mark-annotation-type="inlineComment" data-mark-type="annotation" id="CmfComment:7a950418-ddc0-11ed-9a90-0242ac110002">Токен</span> подписывается очень надежным</p><p data-id="RoHr5PpeuMz9qx">Параграф 2</p>u   <p data-id="RoHr5PpeuMz9qx">Параграф&nbsp;<span class="inline-highlight inline-highlight-active" id="CmfComment:dd365430-ddc2-11ed-9a90-0242ac110002" data-mark-type="annotation" data-mark-annotation-type="inlineComment">2</span></p>u  <p data-id="BnnahcxvEX3XKd"><span class="inline-highlight" data-id="RjECb1pICX1QMq" data-mark-annotation-type="inlineComment" data-mark-type="annotation" id="CmfComment:7a950418-ddc0-11ed-9a90-0242ac110002">Токен</span> подписывается очень надежным</p><p data-id="RoHr5PpeuMz9qx">Параграф <span class="inline-highlight inline-highlight-active" data-mark-annotation-type="inlineComment" data-mark-type="annotation" id="CmfComment:dd365430-ddc2-11ed-9a90-0242ac110002">2</span></p>u   <p data-id="RoHr5PpeuMz9qx"><span class="inline-highlight inline-highlight-active" id="CmfComment:624f4ece-ddc3-11ed-9a90-0242ac110002" data-mark-type="annotation" data-mark-annotation-type="inlineComment">Параграф&nbsp;2</span></p>u  <p data-id="BnnahcxvEX3XKd"><span class="inline-highlight" data-id="RjECb1pICX1QMq" data-mark-annotation-type="inlineComment" data-mark-type="annotation" id="CmfComment:7a950418-ddc0-11ed-9a90-0242ac110002">Токен</span> подписывается очень надежным</p><p data-id="RoHr5PpeuMz9qx"><span class="inline-highlight inline-highlight-active" data-mark-annotation-type="inlineComment" data-mark-type="annotation" id="CmfComment:624f4ece-ddc3-11ed-9a90-0242ac110002">Параграф 2</span></p>ua   <p data-id="BnnahcxvEX3XKd">Токен подписывается очень надежным</p>u  <p data-id="BnnahcxvEX3XKd">Токен<span class="inline-highlight inline-highlight-active" id="CmfComment:b32f901a-ddc3-11ed-9a90-0242ac110002" data-mark-type="annotation" data-mark-annotation-type="inlineComment"> подписывается очень </span>надежным</p>u  <p data-id="BnnahcxvEX3XKd">Токен<span class="inline-highlight inline-highlight-active" data-mark-annotation-type="inlineComment" data-mark-type="annotation" id="CmfComment:b32f901a-ddc3-11ed-9a90-0242ac110002"> подписывается очень </span>надежным</p>ZTfla06iMmYtsnou  <p data-id="Tfgs41gCqEYvnR"><span class="inline-highlight inline-highlight-active" data-id="JGS0snIzoehAHE" data-mark-annotation-type="inlineComment" data-mark-type="annotation" id="CmfComment:d5ef19ec-de89-11ed-bae7-0242ac110002">2. Каждая клиентская установка находится в изолированном виртуальной машине (аналоге физического компьютера).  Никто кроме клиента туда не может получить доступ. </span></p><p data-id="Tfla06iMmYtsno">2. Для контроля доступа в сервисы <span class="inline-highlight inline-highlight-active" data-id="I8sHTtp5rEd1Vq" data-mark-annotation-type="inlineComment" data-mark-type="annotation" id="CmfComment:c438b2d0-de89-11ed-bae7-0242ac110002">Eva используется jwt-токен</span>, который получает пользователь после вводе пароля, без него доступ получить невозможно. Jwt-токен для доступа может получить только тот, кого Вы пригласили. </p><span class="macros-panel mentions-macros" contenteditable="false" data-mentions-task="" data-rendered="true" style="display: inline-flex; flex-direction: column; position: relative;"> <span class="extension-container" contenteditable="false" data-layout="default"> <span class="extension-title">@Упоминания <span class="excerpt-title">| TEM-1625012435</span></span> <span class="macros-actions"> <span class="macros-delete"> <svg class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;" viewbox="0 0 18 18"><path class="ng-star-inserted" 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" fill="#222" stroke="none" stroke-width="1"></path><path class="ng-star-inserted" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" fill="#222" stroke="none" stroke-width="1"></path><path class="ng-star-inserted" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" fill="#222" stroke="none" stroke-width="1"></path></svg> </span> </span> </span> <span class="ak-renderer-wrapper"> <a class="external" data-internal-link="1" data-link-type="link" data-macros="mentions" data-mention-type="task" data-object-id="CmfTask:25c3a1a6-dcfd-11ed-9a90-0242ac110002" data-params='{"code":"TEM-1625012435","ui_name":"Task"}' href="/project/Document/DOC-001679?popup=CmfTask:25c3a1a6-dcfd-11ed-9a90-0242ac110002#auzere" rel="noopener" style="font: var(--wiki-text-font);"><svg style="width: 20px; height: 20px; margin-bottom: -4px; margin-left: -7px;" viewbox="0 0 24 24"><path d="M19,3H14.82C14.4,1.84 13.3,1 12,1C10.7,1 9.6,1.84 9.18,3H5A2,2 0 0,0 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5A2,2 0 0,0 19,3M12,3A1,1 0 0,1 13,4A1,1 0 0,1 12,5A1,1 0 0,1 11,4A1,1 0 0,1 12,3M7,7H17V5H19V19H5V5H7V7M7.5,13.5L9,12L11,14L15.5,9.5L17,11L11,17L7.5,13.5Z" fill="#0053a0"></path></svg> TEM-1625012435  TO DO аузере #Не назначено </a> </span> </span>u?  <p data-id="Tfla06iMmYtsno">2.&nbsp;Для контроля доступа в сервисы&nbsp;<span data-id="I8sHTtp5rEd1Vq" class="inline-highlight" id="CmfComment:c438b2d0-de89-11ed-bae7-0242ac110002" data-mark-type="annotation" data-mark-annotation-type="inlineComment">Eva используется jwt-токен</span>, который получает пользователь после вводе пароля, без него доступ получить невозможно. Jwt-токен для доступа может получить только тот, кого Вы пригласили<span data-id="JMAUxDPbnbMqUw" class="inline-highlight inline-highlight-active" id="CmfComment:d9e7d4f8-de89-11ed-bae7-0242ac110002" data-mark-type="annotation" data-mark-annotation-type="inlineComment">.&nbsp;</span></p>u  <p data-id="Tfgs41gCqEYvnR"><span class="inline-highlight inline-highlight-active" data-id="JGS0snIzoehAHE" data-mark-annotation-type="inlineComment" data-mark-type="annotation" id="CmfComment:d5ef19ec-de89-11ed-bae7-0242ac110002">2. Каждая клиентская установка находится в изолированном виртуальной машине (аналоге физического компьютера).  Никто кроме клиента туда не может получить доступ. </span></p><p data-id="Tfla06iMmYtsno">2. Для контроля доступа в сервисы <span class="inline-highlight" data-id="I8sHTtp5rEd1Vq" data-mark-annotation-type="inlineComment" data-mark-type="annotation" id="CmfComment:c438b2d0-de89-11ed-bae7-0242ac110002">Eva используется jwt-токен</span>, который получает пользователь после вводе пароля, без него доступ получить невозможно. Jwt-токен для доступа может получить только тот, кого Вы пригласили<span class="inline-highlight inline-highlight-active" data-id="JMAUxDPbnbMqUw" data-mark-annotation-type="inlineComment" data-mark-type="annotation" id="CmfComment:d9e7d4f8-de89-11ed-bae7-0242ac110002">. </span></p><span class="macros-panel mentions-macros" contenteditable="false" data-mentions-task="" data-rendered="true" style="display: inline-flex; flex-direction: column; position: relative;"> <span class="extension-container" contenteditable="false" data-layout="default"> <span class="extension-title">@Упоминания <span class="excerpt-title">| TEM-1625012435</span></span> <span class="macros-actions"> <span class="macros-delete"> <svg class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;" viewbox="0 0 18 18"><path class="ng-star-inserted" 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" fill="#222" stroke="none" stroke-width="1"></path><path class="ng-star-inserted" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" fill="#222" stroke="none" stroke-width="1"></path><path class="ng-star-inserted" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" fill="#222" stroke="none" stroke-width="1"></path></svg> </span> </span> </span> <span class="ak-renderer-wrapper"> <a class="external" data-internal-link="1" data-link-type="link" data-macros="mentions" data-mention-type="task" data-object-id="CmfTask:25c3a1a6-dcfd-11ed-9a90-0242ac110002" data-params='{"code":"TEM-1625012435","ui_name":"Task"}' href="/project/Document/DOC-001679?popup=CmfTask:25c3a1a6-dcfd-11ed-9a90-0242ac110002#auzere" rel="noopener" style="font: var(--wiki-text-font);"><svg style="width: 20px; height: 20px; margin-bottom: -4px; margin-left: -7px;" viewbox="0 0 24 24"><path d="M19,3H14.82C14.4,1.84 13.3,1 12,1C10.7,1 9.6,1.84 9.18,3H5A2,2 0 0,0 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5A2,2 0 0,0 19,3M12,3A1,1 0 0,1 13,4A1,1 0 0,1 12,5A1,1 0 0,1 11,4A1,1 0 0,1 12,3M7,7H17V5H19V19H5V5H7V7M7.5,13.5L9,12L11,14L15.5,9.5L17,11L11,17L7.5,13.5Z" fill="#0053a0"></path></svg> TEM-1625012435  TO DO аузере #Не назначено </a> </span> </span>z'<p data-id="1">q<strong>w</strong>e</p>z4<p data-id="1">q<span><strong>w</strong></span>e</p>z4<p data-id="1">q<strong><span>w</span></strong>e</p>z1<p data-id="1">q<span data-id="qwe">w</span>e</p>z><p data-id="1">q<span><span data-id="qwe">w</span></span>e</p>z2<p data-id="1">q<span data-id="qwe2">w</span>e</p>z?<p data-id="1">q<span data-id="qwe2"><span>w</span></span>e</p>z7<p data-id="1">q<span id="CmfComment:123">w</span>e</p>z8<p data-id="1">q<span id="CmfComment:123">w</span>e2</p>z<p data-id="1">22q2we2</p>z;<p data-id="1">22q2<span id="CmfComment:123">w</span>e2</p>z<p data-id="1">qqq</p>z<p data-id="1">2qqq2</p>z7<p data-id="1">q<span id="CmfComment:123">q</span>q</p>z9<p data-id="1">2q<span id="CmfComment:123">q</span>q2</p>ZOKMwlzdbVdo67ou   <p data-id="OKMwlzdbVdo67o">1. Провайдим на уровне компонента и вызываем только в нём</p>u   <p data-id="OKMwlzdbVdo67o">1. Провайдим на уровне компонента и вызы2ваем только в нём##</p>um  <p data-id="OKMwlzdbVdo67o">1.&nbsp;<span data-id="1HKljVrmlZFaDi" class="inline-highlight inline-highlight-active" id="CmfComment:9f614c7e-e050-11ed-845f-0242ac110002" data-mark-type="annotation" data-mark-annotation-type="inlineComment">Провайдим&nbsp;на</span>&nbsp;уровне&nbsp;компонента и вызываем только в нём</p>u]  <p data-id="OKMwlzdbVdo67o">1. <span class="inline-highlight inline-highlight-active" data-id="1HKljVrmlZFaDi" data-mark-annotation-type="inlineComment" data-mark-type="annotation" id="CmfComment:9f614c7e-e050-11ed-845f-0242ac110002">Провайдим на</span> уровне компонента и вызываем только в нём</p>u\  <p data-id="OKMwlzdbVdo67o">1. <span class="inline-highlight inline-highlight-active" data-id="1HKljVrmlZFaDi" data-mark-annotation-type="inlineComment" data-mark-type="annotation" id="CmfComment:9f614c7e-e050-11ed-845f-0242ac110002">Провайдим на</span> уровне компонента и вызы2ваем только в нём##</p>r   rW   r   r   r`   r   r   Fr   r   z
DOC-001679r   )r.   r   ZOKuA   ERROR! Ошибка добавления комментария: u+   ERROR! Должна быть ошибка! u(   ERROR! Отличается текст!
r   u@   ERROR! Отличается текст новой версии!
u   ERROR! Нет alert)r;   r9   r   r   rW   ZconfigDEBUGr   r   r   r   printrN   )Z	test_datadatar   rW   r   r   r   r   r   r   docr   r   r   r   _test_add_inline_comment  s   					  @

z$CmfDocument._test_add_inline_commentr   c                 C   s`  dd }|  ddg |dkr8| js(d S t| jjd}n4|dkrZ| jsJd S t| jjd}ntd| dd | D ]}d	|jkrt| |jd	< qti }| D ]0}|jd	}||krd
||< ||  d7  < q|	 D ]:\}}|dkr| D ] }|jd	|kr| |jd	< qq|dkr8d
dd |jjD | _n$|dkr\d
dd |jjD | _d S )Nc                     s\   d t t d } t | d }| d } |  |  }|d fddtdD  }|S )Nz@ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/i   @   r`   c                 3   s   | ]}t  V  qd S r   )randomchoice)rs   r   Zalphabetr   r   	<genexpr>  s     zCCmfDocument._set_data_ids.<locals>.gen_random_id.<locals>.<genexpr>   )r
   timer{   r   )totalr   jprefixZ_idr   r   r   gen_random_id  s     z0CmfDocument._set_data_ids.<locals>.gen_random_idr   rW   rf   r   Tr   r   r   rG   r`   c                 S   s   g | ]}t |qS r   rq   rr   r   r   r   ru     s     z-CmfDocument._set_data_ids.<locals>.<listcomp>c                 S   s   g | ]}t |qS r   rq   rr   r   r   r   ru     s     )r4   r   r	   rN   rW   r5   ri   r   r;   r~   r{   r|   r}   )r   r   r   rl   r   Zidsr   r   r   r   r   r     s:    	


zCmfDocument._set_data_idsc                 O   sL   t ddd | ddg || _t| jj| jj| _| j|ddd|S )NDEV: depricatedTr   rW   r   r   r   depth)r5   r4   r   r   r   rN   rW   r?   r   Zin_textrA   rB   r   r   r   update_text_inline_comments  s
    z'CmfDocument.update_text_inline_commentsc                 O   s(   t ddd || _| j|ddd|S )Nr   Tr   r   r   )r5   rW   r?   r   r   r   r   !update_text_draft_inline_comments  s    z-CmfDocument.update_text_draft_inline_commentsc                 O   s@   |  ddg || _t| jj| jj| _| j|ddd|S )NrW   r   Tr   r   )r4   r   r   ro   rN   rW   r?   r   r   r   r   update_text_task_link  s    z!CmfDocument.update_text_task_linkc                 O   s   || _ | j|ddd|S )NTr   r   )rW   r?   r   r   r   r   update_text_draft_task_link  s    z'CmfDocument.update_text_draft_task_linkc                 O   sL   |  ddg t| jj||| _t| jj||| _| j|ddd|S )Nr   rW   Tr   r   )r4   r   r   r   rN   rW   r?   )r   r   r   rA   rB   r   r   r   update_text_macros_parameters  s    z)CmfDocument.update_text_macros_parameters)r_   )F)r   )!__name__
__module____qualname__r   staticmethodrk   r!   rD   r6   rX   r[   r7   classmethodrQ   ro   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__r   r   r   r   r      sF   
i
|
l':

 i
-r   )osr   Zcmf.includeZcmfr   Z
cmf.fieldsr   Zcmf.utilr   r   r   Zbs4r	   Zmathr
   r   r   r   r   r   r   r   r   <module>   s   