
    `i                     d    d dl  d dlmZ d dlZd dlmZ d dlmZ  G d dej                        Zy)    )*)cmf_project_perm_schemeN)make_prof_point)Optionalc                   (    e Zd ZdZej
                  j                  dgz   ZdZg dZddZ	ddd	e
dd f fd
Zddee
   dd f fdZ fdZ fdZed        Zed        Ze ed      d               Zedde
fd       Ze	 	 	 dde
fd       Z xZS )CmfProjectPermSchemeug  
    Класс схемы проектных прав

    Содержит атрибут _PROJECT_PERM_DATA - кэш прав по проектам

    Структура _PROJECT_PERM_DATA:
        {
            access_local_user = {
            - project_id 1 = set('PERM1', 'PERM2', ...)
            - project_id 2 = set(...)
            - ...
        }
            access_owner = {
            - project_id 1 = set(...)
            - project_id 2 = set(...)
            - ...
        }
            access_...
            user_id = {
            - project_id 1 = set(...)
            - project_id 2 = set(...)
            - ...
        }
            person_group/role/orgunit = { # Не раскрываем all_nested для экономии памяти
            - project_id 1 = set(...)
            - project_id 2 = set(...)
            - ...
        }
    copyN)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access_spectatorsaccess_executorsaccess_list_owneraccess_project_owner_assistantaccess_project_spectatorsaccess_project_executorsreturnc                 v    t         j                  j                  |dg      D ]  }|j                  |         y)uU    Копирование правил из схемы source_scheme в текущую z***parentfieldsr    N)modelsCmfProjectPermSchemeRulelistr	   )selfsource_schemesource_rules      3./modules/project/models/cmf_project_perm_scheme.py_copy_rules_from_schemez,CmfProjectPermScheme._copy_rules_from_scheme3   s>     "::??}^c]d?e 	*KD)	*    system.open:default)default_scheme_coder-   c                    t         j                  j                          | j                  r2t         j                  j	                  |      }| j                  |       t        |   |i |S )u   
        Сохранение схемы проектных прав
        При создании новой схемы (is_new=True) копируются правила из дефолтной схемы
        coder'   )r#   r   trigger_reloadis_newgetr*   supersave)r&   r-   argskwargsdefault_scheme	__class__s        r)   r6   zCmfProjectPermScheme.save9   s_     	##224;; $88<<BU<VN((~(Fw|T,V,,r+   namec                 p    |sd| j                    }t        |   |d|i|}|j                  |        |S )u?    Копирование схемы проектных прав u   Копия r;   r1   )r;   r5   r	   r*   )r&   r;   r7   r8   perm_schemer:   s        r)   r	   zCmfProjectPermScheme.copyG   sE     ,Dglt>>v>++$+?r+   c           
         | j                   }t        	|   |i |}|rt        j                  j                  d      }t        j                  j                  || j                        D ]R  }t        j                  |       }| j                  D ]  }t        ||t        ||              |j                  d       T |S )u   
        Сохранение схемы при импорте данных
        При создании новой схемы (is_new=True) копируются правила из дефолтной схемы с save_import=True
        r,   r/   r   r"   T)save_import)r3   r5   _save_importr#   r   r4   r$   r%   _COPY_RULE_FIELDSsetattrgetattrr6   )
r&   r7   r8   r3   resultr9   default_rulerulefieldr:   s
            r)   r@   z!CmfProjectPermScheme._save_importO   s     %t6v6 $88<<BW<XN & ? ? D D%d.D.D !E ! , 66d6C!33 GED%u)EFG		d	+, r+   c                 (   |j                  dd      }|j                  d      sbt        j                  j                  | dg      }|r~dj	                  |D cg c]  }d|j
                   d c}      }t        d| d	       n@t        j                  j                  | ||
      D ]  }d |_        |j                  d        t        j                  j                  | ||      D ]  } |j                  |i |  t        	| (  |i |S c c}w )NTEXKOM_db_deleteFr;   )project_perm_schemer!   z, "u   Невозможно удалить Схему проектных прав, она используется в проектах: T)abort)rJ   include_deletedinclude_system)	only_data)r    rM   rN   )r4   r#   
CmfProjectr%   joinr;   	cmf_alertrJ   r6   r$   deleter5   )
r&   r7   r8   rM   used_projectspused_projects_strprojectrF   r:   s
            r)   rS   zCmfProjectPermScheme.deletef   s8   

#5u=zz,-"--22tU[T\2]M$(IIm.T166(!}.T$U!  ^  _p  ^q  r  z~  !,,11d\k  }L1  M -,0+t,- 3388Ve  wF8  G 	)DDKK((	)w~t.v.. /Us   Dc                    t        dd      }t        j                         }i i i i i i i i i i i i d}t        j                  j	                         }t        j
                  j                  d      }i }i }t        j                         }i }	t        j                  j                  g d      D ]}  }
|
j                  r|
j                  s|
j                  |	vri |	|
j                  <   t               }|
j                  D ]  }|j                  j                  d      r|j                  |vrQt        j                  j                  |j                  	      }|D cg c]  }|j                   c}||j                  <   ||j                     D ]  }|j!                  |        |j!                  |j                          |s|
j                  |	|
j                     vr$t               |	|
j                     |
j                  <   |	|
j                     |
j                     j#                  |        t        j                         |z
  d
kD  r-t$        j'                  dt        j                         |z
          t        j                         }t        j(                  j                  g d      }t        j                         |z
  d
kD  r-t$        j'                  dt        j                         |z
          t        j                         }|D ]  }t               t               i t               t               t               t               t               t               t               t               t               d}i }i }|j                  |	v r|	|j                     }|j*                  |vr:t        j,                  j                  |j*                  g d      ||j*                  <   |j.                  D ]E  }|j                  |vrt               ||j                  <   ||j                     j!                  d       G ||j*                     D ]  }|j0                  r(|d   j!                  |j2                  j4                         |j6                  r(|d   j!                  |j2                  j4                         |j8                  r(|d   j!                  |j2                  j4                         |j:                  r(|d   j!                  |j2                  j4                         |j<                  r(|d   j!                  |j2                  j4                         |j>                  r(|d   j!                  |j2                  j4                         |j@                  r(|d   j!                  |j2                  j4                         |jB                  r(|d   j!                  |j2                  j4                         |jD                  r|jF                  r)|d   j!                  |j2                  j4                         n|j2                  j4                  |d   vr$t               |d   |j2                  j4                  <   |j                  |j                  jH                  g       D ]-  }|d   |j2                  j4                     j!                  |       / |jJ                  r(|d   j!                  |j2                  j4                         |jL                  ru|j                  jH                  |vr!t               ||j                  jH                  <   ||j                  jH                     j!                  |j2                  j4                         |jN                  r(|d   j!                  |j2                  j4                         |jP                  rW|jR                  |vrt               ||jR                  <   ||jR                     j!                  |j2                  j4                         |jT                  rh|jV                  D ]Y  }|j                  |vrt               ||j                  <   ||j                     j!                  |j2                  j4                         [ |jX                  rh|jZ                  D ]Y  }|j                  |vrt               ||j                  <   ||j                     j!                  |j2                  j4                         [ |j\                  rh|j^                  D ]Y  }|j                  |vrt               ||j                  <   ||j                     j!                  |j2                  j4                         [ |j`                  r|j`                  D ]  }|j4                  j                  d      rX|j4                  |vrt               ||j4                  <   ||j4                     j!                  |j2                  j4                         v|j                  |vrt               ||j                  <   ||j                     j!                  |j2                  j4                          |jb                  s|jb                  D ]^  }|j                  |vr||j                     D ];  }||vrt               ||<   ||   j!                  |j2                  j4                         = `  |je                         D ]   \  }}||vri ||<   |||   |j                  <   " |je                         D ]  \  }}|||   |j                  <     t        j                         |z
  dkD  r9t$        j'                  dt        j                         |z
   d tg        |              |th        _5        t$        j'                  d!t        j                         |z
   d"       t        j                         |z
  d#kD  r-t$        j'                  d$t        j                         |z
           |        y c c}w )%Nload_project_permission_datai,  )r   access_sdesk_publicaccess_sdesk_privater   r   r   r   r   r   r   r   r   zsdesk-client:defaultr/   )	parent_idz
members.idproject_role_idr!   zCmfCompany:)companyg{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   r   r   r   project_permission.coder   r   r   r   r   r   r   r   r   zPPP-PR-BROWSEr   r   r   r   r   r   r   r   rZ   r[   r   r   zvar:g?zNPROF CmfProjectPermScheme.load_project_permission_data() process projects got z count=zLoad time _PROJECT_PERM_DATA: secg333333?z=PROF CmfProjectPermScheme.load_project_permission_data() got )6r   timer#   CmfPersonGroupguest_groupCmfProjectRoler4   CmfProjectRoleAssignslistmembersr]   r\   setid
startswith	CmfPersonaddupdategdebugrP   r`   r$   cmf_project_adminsr   r
   r0   r   r   r   r   r   r   r   r   rb   valuer   r   r   r   ra   r   cmf_owner_assistantsr   
spectatorsr   	executorsr   r   itemslenr   _PROJECT_PERM_DATA)cls
prof_point
start_time	perm_dataguest_person_groupsdesk_client_rolecompany_persons_cacheloaded_scheme_rulesprof_stproject_role_membersr_membersmp_listrU   project_listrW   project_permsproject_user_permsproject_role_member_idspr_adminrF   	member_idmemberroleuser_idpermperm_funs                               r)   rY   z1CmfProjectPermScheme.load_project_permission_datav   s
   $%CSI
YY[
 "$#%$&&("$ "!# "*,!#
	  $22>>@"1155;Q5R " ))+!,,22:h2i 	RA99A$5$5
 {{"6646$Q[[1uHYY '44??=1tt#88!'!1!1!7!7!7!EEK6Lqtt6L-add321448 ( Q( LL&'   (<Q[[(IIGJu$Q[[1!2C2CD -a.?.?@GGQ3	R4 99; 4'GGnosoxoxoz  ~E  pE  oF  G  H))+((.. 7O. P 99; 4'GGdeienenepszezd{|}))+# b	7G &)U'*u(* #*-%!$&)e$'E%(U$'E.1e%(UM  "$&(#zz11*>wzz*J' --5HHFLFeFeFkFk"998 Gl 	G#G$B$BC $66 E;;&8869e&x{{3"8;;/33ODE
 ,G,J,JK ^\))!"56::4;R;R;W;WX$$!.155d6M6M6R6RS..!":;??@W@W@\@\]%%!/266t7N7N7S7ST**!"67;;D<S<S<X<XY((!"4599$:Q:Q:V:VW))!"56::4;R;R;W;WX))!"56::4;R;R;W;WX++ 11%&;<@@AXAXA]A]^  2277}Mc?ddbebgM*@A$BYBYB^B^_)@)D)DEVEYEYE_E_ac)d oI)*@A$BYBYB^B^_ccdmno ((!"4599$:Q:Q:V:VW$$),,22:LLJM%*+=+@+@+F+FG&'9'<'<'B'BCGGH_H_HdHde22!">?CCDD[D[D`D`a,,++3EECF5*7+?+?@&w';';<@@AXAXA]A]^66")">"> X!99,>><?E.vyy9*699599$:Q:Q:V:VW	X
 11")"4"4 X!99,>><?E.vyy9*699599$:Q:Q:V:VW	X
 00")"3"3 X!99,>><?E.vyy9*699599$:Q:Q:V:VW	X
 && #'"5"5 	\!;;11&9%{{2DDBE% 26;; ?.v{{;??@W@W@\@\]%yy0BB@C 2699 =.vyy9==d>U>U>Z>Z[	\ ++ $ 8 8 \#ww*AA$)@)I \I(0BB@C 29 =.y9==d>U>U>Z>Z[\\q^\d "4!9!9!; 6)+)+Ig&15	'"7::.6
 #0"5"5"7 7$26	(#GJJ/7Cb	7H 99; 3&GGdeienenepszezd{  |C  DG  HT  DU  CV  W  X2;/	0Z1G0HLM99;#c)GGSTXT]T]T_blTlSmnoE 7Ms   o>c                 2    t        d       t        dd        y )Nz"project_permission::reload triggerCmfProjectPermScheme:changed)printcmf_emit_server_event)r|   s    r)   r2   z#CmfProjectPermScheme.trigger_reloadf  s    24<dCr+   r   )channelc                  N    d }t        d       dat        j                  |       y )Nc                     t        d       t        j                  d       t        rt        d       dat        j
                  j                         5  t        j                  j                          t        j                  j                  dt        t        j                               dd      r)t         j#                  d	       t$        j'                          d d d        y t        d
       y # 1 sw Y   y xY w)Nz*project_permission::reload handler spawned   z,project_permission::reload handler do reloadFz&project_permission::clear_jscache:lockTi  )nxpxz?project_permission::reload handler do CMF_CACHE.flush_jscache()z'project_permission::reload handler skip)r   re   sleep_project_permission_changedcmfappcmf_contextr#   r   rY   REDIS_DBredisrl   strosgetpidrr   rs   	CMF_CACHEflush_jscache r+   r)   handlerzBCmfProjectPermScheme.on_project_permission_change.<locals>.handlerp  s    >@JJqM*DF.3+WW((* 2//LLN~~))*RTWXZXaXaXcTdimrw)x"ac!//12 2 ?A2 2s   BC--C6z(project_permission::reload spawn handlerT)r   r   geventspawn)_kwargsr   s     r)   on_project_permission_changez1CmfProjectPermScheme.on_project_permission_changek  s%    
	B  	8:&*#Wr+   r
   c                    |t         j                  }|j                  j                          t        j
                  j                  dd|j                  gdd|ggg d      }|sy|j                  r|j                  ry|j                  r|t         j                  k(  ry|j                  r||j                  k(  ry|j                  s$|j                  s|j                  s|j                   r|st#        d| d       |rp|j                  r||j                  k(  ry|j                  r||j$                  k(  ry|j                  r||j&                  k(  ry|j                   r||j(                  k(  ry|j*                  r||j*                  j-                         v ry|j.                  rYt        j0                  j3                  dd|gd	d
|j.                  ggdg      }|D ]   }||j4                  j-                         v s  y |syt        j6                  j                  |dg      }	t9        d|	j:                   d|j:                   d|       )Nr    =rc   )r   r   r   r   r   r   r   r   )filterr!   Tu*   DEV: check_project_role_access Право u_    разрешено для объектного поля, но объект не переданproject_roleINrk   Fr;   r0   r!   N   У пользователя нет Проектного разрешения "   " в проекте     для объекта )rr   current_userrJ   loadr#   r$   r4   r   
user_localr   anonymous_userr   	cmf_ownerr   r   r   r   rR   cmf_owner_assistant
cmf_authorresponsibler   
all_nestedr   ri   r%   rk   CmfProjectPermPermissionCmfPermissionErrorr;   )
r|   rW   r
   userobjraise_errorr   role_assignsrole_assign	perm_infos
             r)   check_project_role_access_oldz2CmfProjectPermScheme.check_project_role_access_old  sm    <>>D 	##((*..22Hc7KfKf;g<UWZ\n;o;q5c 3 d  !!doo  TQ-=-=%=$$w(((  ; ;t?Q?QUYUlUlFGYFZ  [z  {  |  3==(**3222!!3>>)&&3??*t**5577##!66;;XsT[D\>LdTXTlTl=mDoENK < QL  ,  ;..99;;  3377=OY_X`7a	 #qr{  sA  sA  rB B77>||nD[\_[`"b c 	cr+   c
                    t         j                  st         j                  ry|!t         j                  }t         j                  }
n!t
        j                  j                  |d      }
|s|rt        j                  |dg      }t        |t        j                  j                        r|j                  }|r8|s6t        |t        j                  j                        r|j                  }|}|}n2|j                  dk(  rt!        |j"                        }n|j$                  j&                  r|j(                  j&                  s|j+                  ddg       |j$                  j                  r\|j$                  j,                  r/|j$                  j.                  r|s|j$                  j.                  }nr|j$                  j                  }n[|j(                  j,                  r/|j(                  j.                  r|s|j(                  j.                  }n|j(                  j                  }|| j0                  d   vrt         j3                  d	| d
|        y|j4                  r|| j0                  d   |   v ry|j"                  j                  | j0                  v rN|| j0                  |j"                  j                     v r)|| j0                  |j"                  j                     |   v ry|
D ]9  }|| j0                  v s|| j0                  |   v s$|| j0                  |   |   v s9 y |t         j6                  k(  r|| j0                  d   |   v ry|rt        |t               s|t         j8                  k(  r(|| j0                  d   |   v rt         j:                  |k(  ry|| j0                  d   |   v rL|j<                  j,                  r&|j>                  s||j<                  j.                  k(  ry||j<                  k(  ry|| j0                  d   |   v rf|j@                  jC                          |j@                  j,                  r&|j>                  s||j@                  j.                  k(  ry||j@                  k(  ry|| j0                  d   |   v rftE        |d      rZ|jF                  jC                          |jF                  j,                  r||jF                  j.                  k(  ry||jF                  k(  ry|| j0                  d   |   v rztE        |d      rn|jH                  jC                          |jH                  j,                  r/|jH                  j.                  r(||jH                  j.                  v ry||jH                  v ry|| j0                  d   |   v r9tE        |d      r,|jJ                  jC                          |jJ                  j,                  r/|jJ                  j.                  r(||jJ                  j.                  v ry||jJ                  v ry|jJ                  j,                  rd|jJ                  j.                  rtM        |
      tM        |jJ                  j.                  D cg c]  }|j"                  j                   c}      z  rEytM        |
      tM        |jJ                  D cg c]  }|j"                  j                   c}      z  ry|| j0                  d   |   v rtE        |d      r|jN                  }|jN                  j,                  r|jN                  j.                  }|D ]j  }||j<                  k(  s||jH                  v r y|
D ]D  }||j<                  j"                  k(  s'||jH                  D cg c]  }|j"                   c}v sC  y l || j0                  d   |   v r9tE        |d      r,|jP                  jC                          |jP                  j,                  r/|jP                  j.                  r(||jP                  j.                  v ry||jP                  v ry|jP                  j,                  rd|jP                  j.                  rtM        |
      tM        |jP                  j.                  D cg c]  }|j"                  j                   c}      z  rEytM        |
      tM        |jP                  D cg c]  }|j"                  j                   c}      z  rydD ]u  }|| j0                  v s|| j0                  |   v s$|| j0                  |   |   v s9|jS                  |      }||v r y|
D ]!  }||D cg c]  }|j"                   c}v s   y w nH|rEtM               }|| j0                  d   |   v r!|jU                  |jW                  dd              || j0                  d   |   v r!|jU                  |jW                  dd              || j0                  d   |   v r!|jU                  |jW                  dd              || j0                  d   |   v r+|jW                  dg       D ]  }|jU                  |d           || j0                  d   |   v r+|jW                  dg       D ]  }|jU                  |d           |j"                  |v rytM        |
      |z  ry|| j0                  d   |   v r |jX                  rt         jZ                  dk(  ry|| j0                  d    |   v rs|j"                  j                  | j0                  d    |   |   v rt         jZ                  dk(  ry|
D ]/  }|| j0                  d    |   |   v st         jZ                  dk(  s/ y |	sy!d"}|r,t
        j\                  jW                  |d#g$      j^                  }t
        j`                  jW                  |d#g%      }tc        d&|j^                   d'| d(|       c c}w c c}w c c}w c c}w c c}w c c}w ))NT)id_onlyr   r^   rP   
project_idr\   r   uX   Пропустили проверку Проектных прав для объекта u3   , т.к. проект еще не загружен r   r   r   r   r   r   r   rv   r   rx   r   listsr   rw   )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:approversra   cmf_author_idresponsible_idrm   rZ   sd_apir[   F r;   )rm   r!   r   r   r   r   )2rr   disable_permissionsacl_admin_moder   current_person__member_ofr#   CmfAccessListsubject_full_group_listcmfutilget_obj_by_id
isinstancer   r!   CmfTyperu   
class_namer   rm   r   
is_definedr\   load_fields
is_changedoldr{   rs   r   r   sharelink_anonymous_usersharelink_access_objr   r3   r   r   hasattrr   rv   rx   rl   r   rw   extract_var_objrp   r4   servicedesk_allow	api_scoperP   r;   r   r   )r|   rW   r
   r   r   obj_idproject_id_simplecheckobj_dict_simplecheckuse_new_projectr   r   obj_parent_idcontainer_ider   lxvar_user_code	var_userssimple_check_allowed_iditmp_project_namer   s                          r)   check_project_role_accessz.CmfProjectPermScheme.check_project_role_access  s
      A$4$4<>>D()(C(C%(.(<(<(T(TUYcg(T(h%v''}'EC c3::--.))C!#0#**2D2DE)?)E)E&2M(C~~- #CFF ~~008P8POO\;$?@>>''~~00S^^5G5GP_(+(:(:(+(<(<}}//CMM4E4Eo(+(9(9(+(;(;  6 6~ FFGGjknjo  pc  dq  cr  st ??"c&<&<=P&QR_&`` 77==C222 6 6tww}} EE%)?)?)N})]]5 	$Ls555 C$:$:<$HH)S-C-CL-QR_-``#		$ 1###(:c>T>TUg>hiv>w(w%ZS-Aq111*c.D.DEa.bcp.qq))S0!S%;%;N%KM%ZZ==++CJJs}}000#s}},#!S%;%;O%L]%[[##%>>,,SZZs~~111#s~~-#!S%;%;<P%QR_%``elmpr  fA$$&??--s222#s.#!S%;%;<T%UVc%ddipqt  wM  jN((--/++66//33@X@X@\@\8\#s777#!S%;%;<N%OP]%^^cjknp{c|""$==++}}((TS]]5F5F-F#s}},#==++}}((S1J-KcgjgtgtgxgxRybcSTSWSWS]S]RyNz-z#45QTQ^Q^<_AQTTZZ<_8``#!S%;%;<O%PQ^%__dkloqxdy 		99''IIMME (Aq{{*da6L6L.L#(A ('1;;>>9\\]\r\rMsWXaddMs=s#'(( "S%;%;<O%PQ^%__dkloq}d~##%>>,,~~))dcnn6H6H.H#s~~-#>>,,~~))c2K.LshkhvhvhzhzS{cdTUTXTXT^T^S{O|.|#45QTQ_Q_<`AQTTZZ<`8aa#"` 0
 !C$:$::$(>(>}(MM-1G1G1VWd1ee(+(;(;M(JI#y0'+0I 0#/)3LQADD3L#L+/00 " '*e#!S%;%;N%KM%ZZ'++,@,D,D^UY,Z[!S%;%;O%L]%[['++,@,D,D_VZ,[\!S%;%;<P%QR_%``'++,@,D,DEUW[,\] "S%;%;<N%OP]%^^-11+rB 9A+//$89!S%;%;<O%PQ^%__-11,C 9A+//$89ww11,-0GG !7!78M!N}!]]%%!++*A !7!78N!OP]!^^ww}} 6 67M N} ]^p qq;;(* 9 $3#9#9:P#QR_#`as#tt{{h.#$ %0044vh4W\\3377=OY_X`7a	 #qr{  sA  sA  rB B77G6HH_`c_d"f g 	gc Sz =` Nt T| =a& 4Ms$   o
o
)o
*o
.o
1o 
)r'   r   r   N)N)NNT)NNNNNFT)__name__
__module____qualname____doc__r   r   api_methodsr{   rA   r*   r   r6   r   r	   r@   rS   classmethodrY   r2   staticmethodon_server_eventr   r   r   __classcell__)r:   s   @r)   r   r   	   s   < *>>JJfXUK* 6K -s -Yo -# CY ./  m m^ D D ;< = . Fcs Fc FcP eijo.2xgC xg xgr+   r   )	cmf.includemodules.project.fieldsr   re   cmf.util.cmfutilr   typingr   r   r   r+   r)   <module>r     s+     :  , }
g2GG }
gr+   