a
    Dg!                     @   sL   d dl mZmZ d dlmZ d dlmZmZ d dlm	Z	 G dd de	Z
dS )    )get_permission_codenameget_user_model)Q)GroupPagePermissionPage)OwnershipPermissionPolicyc                       s   e Zd ZdZdZef fdd	Zdd Zdd Zd	d
 Z	dd Z
dd Zd$ddZd%ddZdd Zdd Zdd Zd&ddZd'ddZdd Zd d! Zd"d# Z  ZS )(PagePermissionPolicyZ_page_permission_cacheZ_explorable_root_page_cachec                    s   t  j|d d S )N)model)super__init__)selfr	   	__class__ `/var/www/lab.imftr.de/x/nb_venv/lib/python3.9/site-packages/wagtail/permission_policies/pages.pyr      s    zPagePermissionPolicy.__init__c                 C   s2   |j r|js|jrtj S tjj|dddS )N)Zgroup__userpage
permission)	is_activeZis_anonymousis_superuserr   objectsnonefilterZselect_relatedr   userr   r   r   get_all_permissions_for_user   s
    
z1PagePermissionPolicy.get_all_permissions_for_userc                 C   s   |j s
dS |jrdS d S )NFT)r   r   r   r   r   r   _base_user_has_permission   s
    z.PagePermissionPolicy._base_user_has_permissionc                 C   s(   |j s| jj S |jr$| jj S d S N)r   r	   _default_managerr   r   allr   r   r   r   _base_queryset_for_user   s
    z,PagePermissionPolicy._base_queryset_for_userc                 C   s   |  ||hS r   )user_has_any_permission)r   r   actionr   r   r   user_has_permission$   s    z(PagePermissionPolicy.user_has_permissionc                 C   sV   |  |}|d ur|S t|}d|v r0|d dd | |D }t| ||@ S )Nchangeaddc                 S   s   h | ]}|j jqS r   )r   codename.0permr   r   r   	<setcomp>1   s   z?PagePermissionPolicy.user_has_any_permission.<locals>.<setcomp>)r   setr$   get_cached_permissions_for_userbool_get_permission_codenames)r   r   actionsbase_permissionpermissionsr   r   r   r    '   s    

z,PagePermissionPolicy.user_has_any_permissionTc                 C   sn   t |}d|v r|d tjj| |djddd}t|d}|rT|tddO }t j	jdd	|
 S )
Nr#   r$   )permission__codename__ingroupTZflatZ
groups__inr   r   )r*   r$   r   r   r   r-   values_listr   r   r   distinct)r   r.   include_superusersgroupsqr   r   r   users_with_any_permission7   s"    

z.PagePermissionPolicy.users_with_any_permissionc                 C   s   |  |h|S r   )r<   )r   r!   r9   r   r   r   users_with_permissionL   s    z*PagePermissionPolicy.users_with_permissionc                 C   s   |  ||h|S r   )$user_has_any_permission_for_instance)r   r   r!   instancer   r   r    user_has_permission_for_instanceO   s    z5PagePermissionPolicy.user_has_permission_for_instancec                 C   s   |  |}|d ur|S t }| |D ]`}|j|jksB||jr&||jj	 |jj	t
d| jjkr&|j|jkr&|t
d| jj q&t| ||@ S )Nr$   r#   )r   r*   r+   pkZpage_idZis_descendant_ofr   r$   r   r%   r   r	   _metaowner_idr,   r-   )r   r   r.   r?   r/   r0   r(   r   r   r   r>   R   s    

z9PagePermissionPolicy.user_has_any_permission_for_instancec                 C   s   |  |}|d ur|S | jj }| |D ]v}|jjtd| jjkrxd|vrxd|v rx|| jjj	|j
ddj|dO }q,|jj| |v r,|| jjj	|j
ddO }q,|S )Nr$   r#   TZ	inclusive)owner)r   r	   r   r   r+   r   r%   r   rB   Zdescendant_ofr   r   r-   )r   r   r.   base_querysetpagesr(   r   r   r   %instances_user_has_any_permission_ford   s.    




z:PagePermissionPolicy.instances_user_has_any_permission_forc                 C   s   |j dd}tjj| ||djddd}t|d}|rH|tddO }d|v rd	|vrtjjtd	| jj	|d
jddd}|t|dt|j
d@ O }t jjdd| S )NTrD   )r1   page__inr2   r3   r4   r5   r#   r$   )Zpermission__codenamerI   )rA   r6   )get_ancestorsr   r   r   r-   r7   r   r   r	   rB   rC   r   r   r8   )r   r.   r?   r9   Z	ancestorsr:   r;   Z
add_groupsr   r   r   &users_with_any_permission_for_instancez   s0    
z;PagePermissionPolicy.users_with_any_permission_for_instancec                 C   s   |  |h||S r   )rK   )r   r!   r?   r9   r   r   r   "users_with_permission_for_instance   s    z7PagePermissionPolicy.users_with_permission_for_instancec                    s>   |j rtjjddS | h d  fdd| |D S d S )N   )depth>   lockpublishunlockr$   r#   bulk_deletec                    s   g | ]}|j j v r|jqS r   )r   r%   r   r&   Z	codenamesr   r   
<listcomp>   s   zQPagePermissionPolicy.instances_with_direct_explore_permission.<locals>.<listcomp>)r   r   r   r   r-   r+   r   r   rS   r   (instances_with_direct_explore_permission   s    
z=PagePermissionPolicy.instances_with_direct_explore_permissionc                 C   sd   t || jrt|| jS | |}ztjj|ddd}W n tjyP   d }Y n0 t|| j| |S )NT)Zinclude_selfstrict)	hasattr$_explorable_root_instance_cache_namegetattrrU   r   r   first_common_ancestor_ofZDoesNotExistsetattr)r   r   rG   Z	root_pager   r   r   explorable_root_instance   s    


z-PagePermissionPolicy.explorable_root_instancec                 C   sn   |  |}|d ur|S | |h d}dd | |D }|D ]}|| O }q>tj|}|j|jd}|S )N>   rO   rP   rQ   r$   r#   rR   c                 S   s   g | ]
}|j qS r   )r   r&   r   r   r   rT      s   z=PagePermissionPolicy.explorable_instances.<locals>.<listcomp>)Zpath__startswith)	r   rH   r+   rJ   r   r   rZ   r   path)r   r   rF   Zexplorable_pagesZpage_permissionsr   Zfca_pager   r   r   explorable_instances   s    
	z)PagePermissionPolicy.explorable_instances)T)T)T)T)__name__
__module____qualname__Zpermission_cache_namerX   r   r   r   r   r   r"   r    r<   r=   r@   r>   rH   rK   rL   rU   r\   r^   __classcell__r   r   r   r   r      s(   

 
" 
r   N)Zdjango.contrib.authr   r   Zdjango.db.modelsr   Zwagtail.modelsr   r   Z wagtail.permission_policies.baser   r   r   r   r   r   <module>   s   