U
    Td6                     @   sb   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
mZ G dd	 d	ejZdS )
    abort)*)fields)cmf_documenthtmldiffN)BeautifulSoupc                       s   e Zd Z f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 fddZddddZdd Zdd Zdd 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_versionc              	   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_ownertextu-   У документа нет родителя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taskr"   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   r$   T-cmf_versioncmf_versionr         )r   order_byr   slicer      Изменения: , <a href="   ">посмотреть</a>)r   valuer+   CmfDocumentHistorylistr*   	html_diffhref)r   r   Zdoc_historyr   r   r   r(   0   s     zCmfDocument._get_history_diffc                 C   s   |  | 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 d S )Nr=   r>   r?   r   r   r   r   task.doc_need_approver   r   r   r   r   u8   Необходимо утвердить документTr!   r%   F)notify)rC   r   r@   
text_draftrD   r+   r,   r-   r   r*   r.   r/   r0   r1   r2   )r   Ztext_diff_contentZ	text_diffr5   r"   r   r   r   _create_approve_task=   s&    
  


z CmfDocument._create_approve_taskc                 C   sV   t jjdd| jjgdd| jgdddgdddggd	gd
}|rR|jd|_|  d S )Nr   r   r   r   rE   r   r   r   workflow)r   r   )	r+   r,   r-   r   r*   rI   Zget_default_statusstatusr1   )r   r5   r   r   r   _delete_approve_taskT   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)r&   setr   addr   rB   )r   r4   resr   r   r   r)   ]   s    z CmfDocument.all_relation_persons   c                 C   s   |pd}|pd}t |||S )uz   
        Используем единую тулзу для анализа изменений документа
         r   )clsablimitr   r   r   rC   j   s    zCmfDocument.html_diff)r   rG   returnc           )   	   C   s  d}t | d}i }|dddiD ]}|||d< q"t |d}|dddiD ]4}||drx||dd qPd}|  qPi }|rt|}n|}| D ]\}	}| |	}
| |j	
 d	|
}| d
d	|
}| d|
td }| d| dtd }|| |d d }td| || ddd }|rP||  n|}| || }td| || }|r||  n|}| || }| |d | dk}| ||d  dk}|rtdd|}|rtdd|}||j	 | }||g d	g\}}|s2tt||}t|}||g||< |s:q|t|k rR|| }n|d }|d|  dtd }| || d d }d}tdd| || }tdd|||  } | }!|!r|!d nd}"tdd|"}"| |d }#|#r|#d nd}$|"|$kr,|"|kr,d}|r4qt|}%t||% t|j	
  }&||d g||< | |% }'| |& }(|d|' t| ||(d  }q|S )ua  
        Получаем черновик с комментариями-пометками

        :param text: Оригинальный текст документа с комментариями-пометками
        :param text_draft: Черновик
        :return: Черновик с комментариями-пометками
        FZlxmlspanzdata-mark-annotation-typeZinlineCommentr*   NTr   z<spanz</span>z<p>z</p>z\s|>z\s|<   z&nbsp;z\&nbsp; z<br />z<br/>rP   r9   )r	   Zfind_allr-   popZunwrapstritemsfindcountr   striprfindlenresearchstartsubrB   finditerendsplitreplace))r   rG   Zis_remove_commentZsoup_text_commentZid_commentsrV   Zsoup_text_draftZ	dict_textZresult_textZ
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_comments   s    	




"z!CmfDocument.handle_inline_commentc                    s   t   dddddddg S )NZperson_signsZperson_viewsZneed_approver$   r   r   rG   )r   save_preload_fieldsr   r   r   r   rl      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   r8   signsr7   )r   r   r;   u4   Документ не найден в историиTr   )version)
r+   rA   r-   r'   ZCmfSignZsign_objectr8   rn   appendr1   )r   rm   r3   r4   historysignr   r   r   rr      s     zCmfDocument.signc                 O   s@   |  ddg || _t| jj| jj| _| j|ddd|S NrG   r   Tr   Z	only_datadepthr&   r   r
   rk   r@   rG   r1   r   Zin_textr3   r4   r   r   r   update_text_inline_comments   s    z'CmfDocument.update_text_inline_commentsc                 O   s   || _ | j|ddd|S NTr   rt   rG   r1   rw   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 rs   rv   rw   r   r   r   update_text_task_link   s    z!CmfDocument.update_text_task_linkc                 O   s   || _ | j|ddd|S ry   rz   rw   r   r   r   update_text_draft_task_link   s    z'CmfDocument.update_text_draft_task_link)rO   )__name__
__module____qualname__r   r6   r(   rH   rK   r)   classmethodrC   staticmethodr[   rk   rl   rr   rx   r{   r|   r}   __classcell__r   r   r   r   r
   
   s    	er
   )osr   Zcmf.includeZcmfr   Z
cmf.fieldsr   Zcmf.utilr   rb   Zbs4r	   r
   r   r   r   r   <module>   s   