U
    {hu!                     @   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__ i/var/www/dating/data/www/fatepal.com/env/lib/python3.8/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 k	r|S t|}d|k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|k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 k	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 k	r|S | jj }| |D ]v}|jjtd| jjkrxd|krxd|krx|| jjj	|j
ddj|dO }q,|jj| |k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   s2    

 

 
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|krd	|k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   s4     
 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                    sB   |j rtjjddS | ddddh  fdd| |D S d S )	N   )depthr$   r#   publishlockc                    s   g | ]}|j j k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   rQ   r   (instances_with_direct_explore_permission   s    

z=PagePermissionPolicy.instances_with_direct_explore_permissionc                 C   sf   t || jrt|| jS | |}ztjj|ddd}W n tjk
rR   d }Y nX t|| j| |S )NT)Zinclude_selfstrict)	hasattr$_explorable_root_instance_cache_namegetattrrS   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   sr   |  |}|d k	r|S | |ddddh}dd | |D }|D ]}|| O }qBtj|}|j|jd}|S )Nr$   r#   rO   rP   c                 S   s   g | ]
}|j qS r   )r   r&   r   r   r   rR      s    z=PagePermissionPolicy.explorable_instances.<locals>.<listcomp>)Zpath__startswith)	r   rH   r+   rJ   r   r   rX   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_namerV   r   r   r   r   r   r"   r    r<   r=   r@   r>   rH   rK   rL   rS   rZ   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   