U
    eo                     @   sZ   d dl Z d dlZd dlZd dlT d dlmZ d dlmZ d dlm	Z	 G dd dej
Z
dS )    N)*)cmf_comment)Path)CmfActiveEntityc                       sP   e Zd Zdd fdd
Z fddZdd Zedd
dZ fddZ  Z	S )
CmfCommentF)forcec                   s   |  dddg | jr| jjdrt| j }rtj| jkr|z|j	d| j
d W q tk
rx   |j	d| j
d Y qX n|j	d| j
d | j
rtd| j
j d	| jji| j
 d
 t j|d|i|S )Nroot_parent_idparent	cmf_ownerCmfProject:zPPP-COM-DELETE-ALLobjzPPP-COM-DELETE-OWNzcomment-delete-id)Zevent_personsr   )load_fieldsr   value
startswithcmfutilget_obj_by_idgcurrent_userr
   check_project_role_accessr	   CmfPermissionErrorZcmf_emit_eventr   Zall_relation_personssuperdelete)selfr   argskwargsproject	__class__ ./common/models/cmf_comment.pyr      s"    
 zCmfComment.deletec                    s\   | j s| jr| jj  | _ | jr4| jjr4| jr4d| _| jjrN| jdkrNtj	| _
t jf |S )NTclosed)r	   Ztree_parentloadis_new
spectators
is_changedprivatestatusr   r   Z	closed_byr   save)r   r   r   r    r!   r)   %   s    zCmfComment.savec                 C   s   | j dkrd S | jr| jjdrt| j }r| jrJ|jd| jd n`| j	j
rtj| jkrz|jd| jd W q tk
r   |jd| jd Y qX n|jd| jd d S )Nr   r   zPPP-COM-ADDr   zPPP-COM-EDIT-ALLzPPP-COM-EDIT-OWN)Z	log_levelr   r   r   r   r   r$   r   r	   textr&   r   r   r
   r   )r   r   r    r    r!   _check_project_perm/   s    
zCmfComment._check_project_permNc                 C   s   |r|t jkr@t jst jrdS |r2t jj|kr2dS t j}t j}nd}tj|dddddgd}|j	sfdS |j|j
krvdS |jD ]d}|jdkr|jjr||jj|  S |j|jkr dS |dkrtjj|dd	}|j|kr| dS q|d
S )uy  
        Проверяем видимость комментария для g.current_person (или check_for_person)
        При использовании check_for_user метод можт выполняться долго! Обязательно перед вызовом
        проверяйте, что комментарий имеет флаг private
        T.r%   cmf_owner_idr'   zroot_parent.parent_id)ZsimpleZfieldsZCmfProjectRole)Zid_onlyN)r   r   Zdisable_permissionsZacl_admin_modeZcurrent_personr   Zcurrent_person__member_ofr   r   r'   r,   r%   
class_nameZroot_parentZ	parent_idZin_project_roleZmodelsZCmfAccessListZsubject_full_group_list)clsZ
comment_idZowner_idZcheck_for_userZcheck_for_user__member_ofZcommentZsubjectr    r    r!   check_visibilityE   s,    

zCmfComment.check_visibilityc                    sB   t t  }| dg | jr:| j D ]}|| q*t|S )Nr	   )setr   
get_ownersr   r	   addlist)r   r   r   ZownersZparent_ownerr   r    r!   r1   h   s    zCmfComment.get_owners)NN)
__name__
__module____qualname__r   r)   r+   classmethodr/   r1   __classcell__r    r    r   r!   r      s   
"r   )base64ZdatetimeZ	mimetypesZcmf.includeZ
cmf.modelsr   pathlibr   Zcommon.models.cmf_active_entityr   r   r    r    r    r!   <module>   s   