U
    I(i:                     @   s2   d dl T d dlmZ d dlZG dd dejZdS )    )*)cmf_project_perm_schemeNc                       s   e Zd ZdZddd fdd
Z fddZ fd	d
Zedd Zedd Z	e
edddd ZededddZededddZ  ZS )CmfProjectPermSchemeNTsystem.open:default)hide_warningsdefault_scheme_codec          
         s   t j  | jrt jj|d}dddddddd	d
ddddg}t jj||dD ]:}t  }| |_|D ]}	t||	t	||	 qb|j
|d qLt j
||S )Ncodeproject_permissionaccess_project_roleaccess_membersaccess_local_useraccess_owneraccess_owner_assistantaccess_authoraccess_project_owneraccess_responsibleaccess_sdesk_clientaccess_anonymousaccess_guestaccess_sharelink_anonymousparentfields)r   )modelsr   trigger_reloadis_newgetCmfProjectPermSchemeRulelistr   setattrgetattrsavesuper)
selfr   r   argskwargsdefault_schemerule_fieldsdefault_rulerulefield	__class__ 3./modules/project/models/cmf_project_perm_scheme.pyr"       s*    
      zCmfProjectPermScheme.savec           
         s   | j }t j||}|rtjjdd}ddddddd	d
dddddg}tjj||dD ]:}t }| |_|D ]}	t	||	t
||	 qj|jdd qT|S )Nr   r   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   T)Zsave_import)r   r#   _save_importr   r   r   r   r   r   r    r!   r"   )
r$   r%   r&   r   resr'   r(   r)   r*   r+   r,   r.   r/   r0   3   s,          z!CmfProjectPermScheme._save_importc                    s   | dd}| dsTtjj| dgd}|r~ddd |D }td| d	d
 n*tjj| ||dD ]}d |_|jd	d qftjj| ||dD ]}|j	|| qt
 j	||S )NZTEXKOM_db_deleteFname)project_perm_schemer   z, c                 S   s   g | ]}d |j  d qS )")r2   .0pr.   r.   r/   
<listcomp>L   s     z/CmfProjectPermScheme.delete.<locals>.<listcomp>u   Невозможно удалить Схему проектных прав, она используется в проектах: T)abort)r3   include_deletedinclude_system)Z	only_data)r   r:   r;   )r   r   
CmfProjectr   join	cmf_alertr3   r"   r   deleter#   )r$   r%   r&   r:   Zused_projectsZused_projects_strprojectr*   r,   r.   r/   r?   G   s    
zCmfProjectPermScheme.deletec                 C   s  t   }i i i i i i i i i i i i d}tj }tjjdd}i }i }t   }i }tjjdddgdD ]}	|	jrf|	j	sxqf|	j
|kri ||	j
< t }
|	jD ]f}|jdr|j|krtjj|jd	}d
d |D ||j< ||j D ]}|
| qq|
|j q|
sqf|	j	||	j
 kr,t ||	j
 |	j	< ||	j
 |	j	 |
 qft   | dkrntdt   |   t   }tjjdddddddgd}t   | dkrtdt   |   t   }|D ]}t t i t t t t t t t t t d}i }i }|j|kr ||j }|j|krjtjj|jddddddddddd d!d"d#d$d%d&d'd(gd)||j< |jD ].}|j|krt ||j< ||j d* qp||j D ]}|jr|d |jj |jr|d |jj |jr|d |jj |jr|d |jj |jr2|d |jj |jrL|d |jj |jrf|d$ |jj |j r|d& |jj |j!r|j"r|d+ |jj nR|jj|d, krt |d, |jj< ||jj#g D ]}|d, |jj | q|j$r|d" |jj |j%rJ|jj#|kr4t ||jj#< ||jj# |jj |j&rd|d% |jj |j'r|j(|krt ||j(< ||j( |jj |j)r|j*D ]2}|j|krt ||j< ||j |jj q|j+r|j,D ]2}|j|krt ||j< ||j |jj q|j-r^|j.D ]2}|j|krFt ||j< ||j |jj q*|j/r|j/D ]n}|jd-r|j|krt ||j< ||j |jj n,|j|krt ||j< ||j |jj ql|j0r|j0D ]N}|j|krq||j D ],}||kr t ||< || |jj qqq|1 D ]*\}}||kr`i ||< ||| |j< qF|1 D ]\}}||| |j< qzqt   | d.krtd/t   |  d0t2|  |t3_4td1t   |  d2 t   | d3krtd4t   |   d S )5N)r   access_sdesk_publicaccess_sdesk_privater   r   r   r   access_executorsaccess_spectatorsr   r   access_list_ownerzsdesk-client:defaultr   	parent_idz
members.idproject_role_idr   zCmfCompany:)Zcompanyc                 S   s   g | ]
}|j qS r.   idr5   r.   r.   r/   r8      s     zECmfProjectPermScheme.load_project_permission_data.<locals>.<listcomp>g{Gz?zXPROF CmfProjectPermScheme.load_project_permission_data() CmfProjectRoleAssign.slist got project_perm_scheme_idcmf_owner_idzcmf_owner_assistants.idservicedesk_publiczspectators.idzexecutors.idzcmf_project_admins.idzNPROF CmfProjectPermScheme.load_project_permission_data() CmfProject.slist got zaccess_project_role.idzaccess_members.coder   r   r   r   r   access_project_owner_assistantr   rC   project_permission.coder   r   r   rD   r   rE   access_project_spectatorsaccess_project_executorsr   zPPP-PR-BROWSErA   rB   zvar:g?zNPROF CmfProjectPermScheme.load_project_permission_data() process projects got z count=zLoad time _PROJECT_PERM_DATA: Zsecg333333?z=PROF CmfProjectPermScheme.load_project_permission_data() got )5timer   ZCmfPersonGroupZguest_groupZCmfProjectRoler   CmfProjectRoleAssignZslistmembersrG   rF   setrJ   
startswithZ	CmfPersonaddupdategdebugr<   rK   r   Zcmf_project_adminsr   r
   r	   r   r   r   r   rC   rD   rE   r   rM   valuer   r   r   r   rL   rN   cmf_owner_assistantsrP   
spectatorsrQ   	executorsr   r   itemslenr   _PROJECT_PERM_DATA)clsZ
start_timeZ	perm_dataZguest_person_groupZsdesk_client_roleZcompany_persons_cacheZloaded_scheme_rulesZprof_stZproject_role_membersrZ_membersmZp_listr7   Zproject_listr@   Zproject_permsZproject_user_permsZproject_role_member_idsZpr_adminr*   Z	member_idmemberZroleZuser_idpermZperm_funr.   r.   r/   load_project_permission_dataW   s^   




  

          








"z1CmfProjectPermScheme.load_project_permission_datac                 C   s   t d tdd  d S )Nz"project_permission::reload triggerCmfProjectPermScheme:changed)printZcmf_emit_server_event)rb   r.   r.   r/   r   E  s    z#CmfProjectPermScheme.trigger_reloadrh   )Zchannelc                  K   s"   dd }t d dat| d S )Nc                	   S   s~   t d td trrt d datj > tj	  t
jjdtt dddrftd	 t  W 5 Q R X nt d
 d S )Nz*project_permission::reload handler spawned   z,project_permission::reload handler do reloadFz&project_permission::clear_jscache:lockTi  )ZnxZpxz?project_permission::reload handler do CMF_CACHE.flush_jscache()z'project_permission::reload handler skip)ri   rR   sleep_project_permission_changedcmfZappZcmf_contextr   r   rg   ZREDIS_DBZredisrU   strosgetpidrY   rZ   Z	CMF_CACHEZflush_jscacher.   r.   r.   r/   handlerO  s    


zBCmfProjectPermScheme.on_project_permission_change.<locals>.handlerz(project_permission::reload spawn handlerT)ri   rl   ZgeventZspawn)_kwargsrq   r.   r.   r/   on_project_permission_changeJ  s    z1CmfProjectPermScheme.on_project_permission_change)r
   c           
   
   C   s  |d krt j}|j  tjjdd|jgdd|ggdddddd	d
dgd}|sRdS |jrb|jrbdS |j	rv|t j
krvdS |jr||jkrdS |js|js|js|jr|std| d |r|jr||jkrdS |jr||jkrdS |jr||jkrdS |jr||jkrdS |jr,||j kr,dS |jrztjjdd|gdd|jggdgd}|D ]}||j kr\ dS q\|sdS tjj|dgd}	td|	j d|j d| d S )Nr   =rO   r   r   r   r   r   r   r   r   )filterr   Tu*   DEV: check_project_role_access Право u_    разрешено для объектного поля, но объект не переданZproject_roleINrT   Fr2   r	   r   N   У пользователя нет Проектного разрешения "   " в проекте     для объекта )rY   current_userr3   loadr   r   r   r   
user_localr   anonymous_userr   	cmf_ownerr   r   r   r   r>   Zcmf_owner_assistant
cmf_authorresponsibler   Z
all_nestedr   rS   r   rT   CmfProjectPermPermissionCmfPermissionErrorr2   )
rb   r@   r
   userobjraise_errorrf   Zrole_assignsZrole_assign	perm_infor.   r.   r/   check_project_role_access_oldc  sn    
   





z2CmfProjectPermScheme.check_project_role_access_oldFc
                 C   sB  t jst jrdS |d kr&t j}t j}
ntjj|dd}
|sN|rNtj	|dgd}t
|tjjrb|j}|r|st
|tjjr~|j}|}|}n|jdkrt|j}nz|jjr|jjs|ddg |jjr|jjr|jjr|s|jj}n|jj}n,|jjr|jjr|s|jj}n|jj}|| jd krBt d	| d
|  dS |jrb|| jd | krbdS |jj| jkr|| j|jj kr|| j|jj | krdS |
D ]<}|| jkr|| j| kr|| j| | kr dS q|t jkr|| jd | krdS |rt
|ts:|t jkrJ|| jd | krJt j|krJdS || jd | kr|jjr|js||jjkrdS n||jkrdS || jd | kr|j !  |j jr|js||j jkrdS n||j krdS || jd | kr@t"|dr@|j#!  |j#jr0||j#jkr@dS n||j#kr@dS || jd | krt"|dr|j$!  |j$jr|j$jr||j$jkrdS n||j$krdS || jd | kr`t"|dr`|j%!  |j%jr|j%jr||j%jkrdS n||j%krdS |j%jr>|j%jr`t&|
t&dd |j%jD @ r`dS n"t&|
t&dd |j%D @ r`dS || jd | krt"|dr|j'}|j'jr|j'j}|D ]\}||jks||j$kr dS |
D ]2}||jjks|dd |j$D kr  dS qq|| jd | krt"|dr|j(!  |j(jrL|j(jr\||j(jkr\dS n||j(kr\dS |j(jr|j(jrt&|
t&dd |j(jD @ rdS n"t&|
t&dd |j(D @ rdS dD ]x}|| jkr|| j| kr|| j| | kr|)|}||kr
 dS |
D ]"}|d d |D kr  dS qqn|rFt& }|| jd | krl|*|+d!d  || jd | kr|*|+d"d  || jd | kr|*|+d#d  || jd | kr|+dg D ]}|*|d$  q|| jd | kr$|+dg D ]}|*|d$  q|j|kr4dS t&|
|@ rFdS || jd% | krr|j,rrt j-d&krrdS || jd' | kr|jj| jd' | | krt j-d&krdS |
D ]0}|| jd' | | krt j-d&kr dS q|	sd(S d)}|rtj.j+|d*gd+j/}tj0j+|d*gd,}t1d-|j/ d.| d/| d S )0NT)Zid_onlyr   rH   r<   
project_idrF   r   uX   Пропустили проверку Проектных прав для объекта u3   , т.к. проект еще не загружен r   r   r   r   r   r   r   r\   rC   r^   c                 S   s   g | ]}|j jqS r.   rJ   r[   r6   er.   r.   r/   r8   3  s     zBCmfProjectPermScheme.check_project_role_access.<locals>.<listcomp>c                 S   s   g | ]}|j jqS r.   r   r   r.   r.   r/   r8   6  s     rE   listsc                 S   s   g | ]
}|j qS r.   rI   r6   xr.   r.   r/   r8   C  s     rD   r]   c                 S   s   g | ]}|j jqS r.   r   r   r.   r.   r/   r8   Q  s     c                 S   s   g | ]}|j jqS r.   r   r   r.   r.   r/   r8   T  s     )zvar:responsiblezvar:executorszvar:spectatorsz	var:ownerzvar:owner_assistantszvar:project_ownerzvar:project_owner_assistantsz
var:authorzvar:waiting_forzvar:component_ownerzvar:current_userzvar:all_related_userszvar:followersu   var:Подпискиzvar:project_userszvar:approversc                 S   s   g | ]
}|j qS r.   rI   r   r.   r.   r/   r8   g  s     rL   Zcmf_author_idZresponsible_idrJ   rA   Zsd_apirB   F r2   )rJ   r   rw   rx   ry   rz   )2rY   Zdisable_permissionsZacl_admin_moder{   current_person__member_ofr   ZCmfAccessListZsubject_full_group_listZcmfutilZget_obj_by_id
isinstancerm   r   ZCmfTyper[   
class_namern   rJ   r   Z
is_definedrF   Zload_fieldsZ
is_changedoldra   rZ   r}   r~   Zsharelink_anonymous_userZsharelink_access_objr   r   r   r|   hasattrr   r\   r^   rU   r   r]   Zextract_var_objrW   r   Zservicedesk_allowZ	api_scoper<   r2   r   r   )rb   r@   r
   r   r   Zobj_idZproject_id_simplecheckZobj_dict_simplecheckZuse_new_projectr   r   Zobj_parent_idZcontainer_idr   lZvar_user_codeZ	var_usersZsimple_check_allowed_idiZtmp_project_namer   r.   r.   r/   check_project_role_access  s>   	




 
 

 

 


* 
$ 


*


z.CmfProjectPermScheme.check_project_role_access)NNT)NNNNNFT)__name__
__module____qualname__ra   r"   r0   r?   classmethodrg   r   staticmethodZon_server_eventrs   rn   r   r   __classcell__r.   r.   r,   r/   r      s*   
 n
H       r   )Zcmf.includeZmodules.project.fieldsr   rR   r   r.   r.   r.   r/   <module>   s   