U
    t6d=                     @   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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   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 )Nr=   r>   r?   r   r   r   r   task.doc_need_approver   r   r   r   r   u8   Необходимо утвердить документTr!   r%   F)notify)cmfutildisable_aclrC   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   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   rE   r   r   r   workflow)r   r   )rG   rH   r+   r,   r-   r   r*   rK   Zget_default_statusstatusr1   )r   r5   r   r   r   _delete_approve_taskU   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   l   s    zCmfDocument.html_diff)r   rI   returnc                 C   s   d}t | d}t |d}i }i }|dddiD ]0}|dddiD ]}|d	rD|||d	 < qDq0|dddiD ]0}|dddiD ]}|d	r|||d	 < qqr|}	| |  D ]}
t||
 |	 }	q|	S )
u1  
        Получаем черновик с инлайн-задачами

        :param text: Оригинальный текст документа с инлайн-задачами
        :param text_draft: Черновик
        :return: Черновик с инлайн-задачами
        Flxmlspanzdata-mentions-taskTrT   zdata-mention-typer5   zdata-object-id)r	   find_allZhas_keykeysstr)r   rI   Zis_remove_taskZ	soup_textsoup_text_draftZtasks_in_textZtasks_in_draftrY   rT   result_textZ	task_spanr   r   r   handle_inline_tasku   s"    	



zCmfDocument.handle_inline_taskc           )   	   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: Черновик с комментариями-пометками
        FrX   rY   z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/>rR   r9   )r	   rZ   r-   popZunwrapr\   itemsfindcountr   striprfindlenresearchstartsubrB   finditerendsplitreplace))r   rI   Zis_remove_commentZsoup_text_commentZid_commentsrY   r]   Z	dict_textr^   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_commentc                    s   t   dddddddg S )NZperson_signsZperson_viewsZneed_approver$   r   r   rI   )r   save_preload_fieldsr   r   r   r   rt      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   rv   appendr1   )r   ru   r3   r4   historysignr   r   r   rz      s     zCmfDocument.signc                 O   s@   |  ddg || _t| jj| jj| _| j|ddd|S NrI   r   Tr   Z	only_datadepth)r&   r   r
   rs   r@   rI   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   r|   rI   r1   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 r{   )r&   r   r
   r_   r@   rI   r1   r~   r   r   r   update_text_task_link  s    z!CmfDocument.update_text_task_linkc                 O   s   || _ | j|ddd|S r   r   r~   r   r   r   update_text_draft_task_link   s    z'CmfDocument.update_text_draft_task_link)rQ   )__name__
__module____qualname__r   r6   r(   rJ   rM   r)   classmethodrC   staticmethodr\   r_   rs   rt   rz   r   r   r   r   __classcell__r   r   r   r   r
   
   s$   
 er
   )osr   Zcmf.includeZcmfr   Z
cmf.fieldsr   Zcmf.utilr   rj   Zbs4r	   r
   r   r   r   r   <module>   s   