o
    h                     @   s^   d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	 G dd dZ
G dd	 d	e
Zd
S )    )get_permission_codename)
Permission)ContentType)cached_property)Pagec                   @   s~   e Zd ZdZdddZdd Zedd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )PermissionHelperz
    Provides permission-related helper functions to help determine what a
    user can do with a 'typical' model (where permissions are granted
    model-wide), and to a specific instance of that model.
    Fc                 C   s   || _ |j| _|| _d S N)model_metaoptsinspect_view_enabled)selfr	   r    r   e/var/www/html/ndineBlogger/venv/lib/python3.10/site-packages/wagtail_modeladmin/helpers/permission.py__init__   s   
zPermissionHelper.__init__c                 C   s   t jj| jj| jjdS )z|
        Return a queryset of all Permission objects pertaining to the `model`
        specified at initialisation.
        )content_type__app_labelcontent_type__model)r   objectsfilterr   	app_label
model_namer   r   r   r   get_all_model_permissions   s   z*PermissionHelper.get_all_model_permissionsc                 C   s   t |  jddd S )NcodenameT)flat)listr   values_listdistinctr   r   r   r   all_permission_codenames   s   z)PermissionHelper.all_permission_codenamesc                 C   s   t || jS r   )r   r   )r   actionr   r   r   get_perm_codename'   s   z"PermissionHelper.get_perm_codenamec                 C   s   | d| jj|f S )z
        Combine `perm_codename` with `self.opts.app_label` to call the provided
        Django user's built-in `has_perm` method.
        z%s.%s)has_permr   r   r   userperm_codenamer   r   r   user_has_specific_permission*   s   z-PermissionHelper.user_has_specific_permissionc                 C   s"   | j D ]}| ||r dS qdS )zd
        Return a boolean to indicate whether `user` has any model-wide
        permissions
        TF)r   r%   r"   r   r   r   user_has_any_permissions2   s
   
z)PermissionHelper.user_has_any_permissionsc                 C   s
   |  |S )zy
        Return a boolean to indicate whether `user` is permitted to access the
        list view for self.model
        )r&   r   r#   r   r   r   user_can_list<   s   
zPermissionHelper.user_can_listc                 C   s   |  d}| ||S )zz
        Return a boolean to indicate whether `user` is permitted to create new
        instances of `self.model`
        addr    r%   r"   r   r   r   user_can_createC      
z PermissionHelper.user_can_createc                 C   s   | j o| |S )z
        Return a boolean to indicate whether `user` is permitted to 'inspect'
        a specific `self.model` instance.
        )r   r&   r   r#   objr   r   r   user_can_inspect_objK   s   z%PermissionHelper.user_can_inspect_objc                 C      |  d}| ||S )z
        Return a boolean to indicate whether `user` is permitted to 'change'
        a specific `self.model` instance.
        changer*   r   r#   r.   r$   r   r   r   user_can_edit_objR   r,   z"PermissionHelper.user_can_edit_objc                 C   r0   )z
        Return a boolean to indicate whether `user` is permitted to 'delete'
        a specific `self.model` instance.
        deleter*   r2   r   r   r   user_can_delete_objZ   r,   z$PermissionHelper.user_can_delete_objc                 C      dS NFr   r-   r   r   r   user_can_unpublish_objb      z'PermissionHelper.user_can_unpublish_objc                 C   r6   r7   r   r-   r   r   r   user_can_copy_obje   r9   z"PermissionHelper.user_can_copy_objN)F)__name__
__module____qualname____doc__r   r   r   r   r    r%   r&   r(   r+   r/   r3   r5   r8   r:   r   r   r   r   r      s     


r   c                   @   sH   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dS )PagePermissionHelpera;  
    Provides permission-related helper functions to help determine what
    a user can do with a model extending Wagtail's Page model. It differs
    from `PermissionHelper`, because model-wide permissions aren't really
    relevant. We generally need to determine permissions on an
    object-specific basis.
    c                 C   s   t tjj| j   }tjj|d}|j	r tj
 }||@ S tj }ddlm} dd | |D }|D ]}|tjj|jddO }q8||@ S )a8  
        Identifies possible parent pages for the current user by first looking
        at allowed_parent_page_models() on self.model to limit options to the
        correct type of page, then checking permissions on those individual
        pages to make sure we have permission to add a subpage to it.
        )content_type__inr   )PagePermissionPolicyc                 S   s   h | ]
}|j jd kr|qS )add_page)
permissionr   ).0permr   r   r   	<setcomp>   s
    z>PagePermissionHelper.get_valid_parent_pages.<locals>.<setcomp>T)	inclusive)r   r   r   get_for_modelsr	   allowed_parent_page_modelsvaluesr   r   is_superuserallnone!wagtail.permission_policies.pagesrA   get_cached_permissions_for_userdescendant_ofpage)r   r#   !allowed_parent_page_content_typesallowed_parent_pagespages_where_user_can_addrA   permsrE   r   r   r   get_valid_parent_pagesr   s,   



z+PagePermissionHelper.get_valid_parent_pagesc                 C   r6   )af  
        For models extending Page, permitted actions are determined by
        permissions on individual objects. Rather than check for change
        permissions on every object individually (which would be quite
        resource intensive), we simply always allow the list view to be
        viewed, and limit further functionality when relevant.
        Tr   r'   r   r   r   r(      s   z"PagePermissionHelper.user_can_listc                 C   s   |  | S )z
        For models extending Page, whether or not a page of this type can be
        added somewhere in the tree essentially determines the add permission,
        rather than actual model-wide permissions
        )rV   existsr'   r   r   r   r+      s   z$PagePermissionHelper.user_can_createc                 C      | |}| S r   )permissions_for_usercan_editr   r#   r.   rU   r   r   r   r3         
z&PagePermissionHelper.user_can_edit_objc                 C   rX   r   )rY   
can_deleter[   r   r   r   r5      r\   z(PagePermissionHelper.user_can_delete_objc                 C   s   | |}|jo| S r   )rY   livecan_unpublishr[   r   r   r   r8      s   
z+PagePermissionHelper.user_can_unpublish_objc                 C   s   |  }|| S r   )
get_parentrY   can_publish_subpage)r   r#   r.   parent_pager   r   r   r:      s   z&PagePermissionHelper.user_can_copy_objN)r;   r<   r=   r>   rV   r(   r+   r3   r5   r8   r:   r   r   r   r   r?   i   s    )
r?   N)django.contrib.authr   django.contrib.auth.modelsr   "django.contrib.contenttypes.modelsr   django.utils.functionalr   wagtail.modelsr   r   r?   r   r   r   r   <module>   s    a