U
    h                     @   sD   d dl mZ d dlmZmZ d dlT d dlmZ G dd deZdS )    )deque)datetimetimezone)*)CmfEvagitRoleAssignc                       sz   e Zd Z fddZ fddZ fddZddd	Zd
d Zdd Zdd Z	e
dd Ze
dd Ze
dd Z  ZS )r   c                    s   t   dddddg S )Ngit_role.perm_push	namespacemembertree_parentexpiration_date)supersave_preload_fields)self	__class__ 1./modules/evagit/models/cmf_evagit_role_assign.pyr      s    z'CmfEvagitRoleAssign.save_preload_fieldsc                    sz   | j r>| jjjdkr&tjd| j ntjd| j |   | jj rl| jrl| jt	j
tjdk rltddd t j||S )NCmfEvagitRepoperm_setup_repo_accessperm_setup_group_access)Ztzuk   Дата истечения срока действия роли не может быть в прошломT)abort)Z
is_changedr   value
class_namemodelsCmfEvagitRolecheck_role_permissionadd_ssh_key_permsr   r   Znowr   ZutcZ	cmf_alertr   saver   argskwargsr   r   r   r      s    zCmfEvagitRoleAssign.savec                    sZ   |  dddddg | jjjdkr4tjd| j ntjd| j |   t j	||S )	Nr   r   znamespace.tree_parentr	   r
   r   r   r   )
load_fieldsr   r   r   r   r   r   del_ssh_key_permsr   deleter   r   r   r   r#      s    zCmfEvagitRoleAssign.deleteNc                 C   s   |  dddddg |p&tjj| jd}|  }|r8|s<d S i }|D ]8}| jjrTdnd| jrft	| jnd d	|d
|j
 d< qD|D ]}|j|d qd S )Nr   r   r	   r
   r   parentrwr)Zallowr   /.git)Z	additions)r!   r   	CmfSshKeylistr	    _calc_child_repos_without_assigngit_roleZ	perm_pushr   strurlupdate_key_file)r   ssh_keysreposdatarepossh_keyr   r   r   r   &   s    z%CmfEvagitRoleAssign.add_ssh_key_permsc                 C   s~   |  dddddg tj| jj| j}|r6|  nDtjj	| jd}| 
 }|rV|sZd S |D ]}|jdd |D d	 q^d S )
Nr   r   r	   r
   r   r$   c                 S   s   g | ]}d |j  dqS )r(   r)   )r/   ).0r4   r   r   r   
<listcomp>G   s     z9CmfEvagitRoleAssign.del_ssh_key_perms.<locals>.<listcomp>)Z	deletions)r!   r   r   calc_parent_role_assignr   r
   r	   r   r*   r+   r,   r0   )r   Znew_role_assignr1   r2   r5   r   r   r   r"   9   s    
z%CmfEvagitRoleAssign.del_ssh_key_permsc                 C   s`   | j jjdkr$| j j  | j g}n8| | j | j g }tjjdd|gdd| j	ggdgd}|S )Nr   r
   INrole_assigns.member!=r/   filterZfields)
r   r   r   r/   load!_calc_child_groups_without_assignr   r   r+   r	   )r   r2   child_groupsr   r   r   r,   I   s    
z4CmfEvagitRoleAssign._calc_child_repos_without_assignc                 C   s>   t jjdd|gdd| jggd}|D ]}|| | q$|S )Nr
   ==r:   r;   r=   )r   ZCmfEvagitGroupr+   r	   extendr?   )r   noder@   Zchild_groupr   r   r   r?   U   s    z5CmfEvagitRoleAssign._calc_child_groups_without_assignc                 C   sN   |j jdkrJtjjdd|gdd|ggddgd}|r8|S |j  |j}q d S )NCmfRegistryr   rA   r	   r-   r   r<   )r   r   r   r   getr
   r>   )clsrD   r	   role_assignr   r   r   r8   ^   s    
z+CmfEvagitRoleAssign.calc_parent_role_assignc                 C   s   | dg g dd |jD  }}|j}|jjdkr|j  |tjj	dd|gdd|ggd	 |d
d |D  |j  |j}q(|S )Nrole_assignsc                 S   s   g | ]
}|j qS r   r	   r6   rH   r   r   r   r7   p   s     zDCmfEvagitRoleAssign._calc_role_assigns_to_update.<locals>.<listcomp>rE   r   rA   r	   zNOT INrB   c                 S   s   g | ]
}|j qS r   rJ   rK   r   r   r   r7   y   s     )
r!   rI   r
   r   r   r>   rC   r   r   r+   )rG   r4   rI   membersrD   r   r   r   _calc_role_assigns_to_updatel   s    


z0CmfEvagitRoleAssign._calc_role_assigns_to_updatec                 C   s.   | dddg tj|D ]}|  qd S )NrI   r:   r
   )r!   r   r   rM   r   )rG   r4   rH   r   r   r   calc_repo_ssh_key_perms   s    z+CmfEvagitRoleAssign.calc_repo_ssh_key_perms)N)__name__
__module____qualname__r   r   r#   r   r"   r,   r?   classmethodr8   rM   rN   __classcell__r   r   r   r   r      s   
	

r   N)collectionsr   r   r   Zcmf.includeZ,modules.evagit.fields.cmf_evagit_role_assignr   r   r   r   r   <module>   s   