U
    ڲg|%                     @   s  d Z ddlmZ ddlmZ dZG dd dZG dd deZG d	d
 d
eZG dd dZ	G dd dZ
G dd dZG dd deeZG dd dedZG dd deZG dd deZG dd deZG dd deZG dd deZG d d! d!eZG d"d# d#eZd$S )%z2
Provides a set of pluggable permission policies.
    )Http404)
exceptions)GETHEADOPTIONSc                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )OperationHolderMixinc                 C   s   t t| |S NOperandHolderANDselfother r   >/tmp/pip-unpacked-wheel-11h17kvo/rest_framework/permissions.py__and__   s    zOperationHolderMixin.__and__c                 C   s   t t| |S r   r
   ORr   r   r   r   __or__   s    zOperationHolderMixin.__or__c                 C   s   t t|| S r   r	   r   r   r   r   __rand__   s    zOperationHolderMixin.__rand__c                 C   s   t t|| S r   r   r   r   r   r   __ror__   s    zOperationHolderMixin.__ror__c                 C   s
   t t| S r   )SingleOperandHolderNOTr   r   r   r   
__invert__   s    zOperationHolderMixin.__invert__N)__name__
__module____qualname__r   r   r   r   r   r   r   r   r   r      s
   r   c                   @   s   e Zd Zdd Zdd ZdS )r   c                 C   s   || _ || _d S r   )operator_class	op1_class)r   r   r   r   r   r   __init__   s    zSingleOperandHolder.__init__c                 O   s   | j ||}| |S r   )r   r   )r   argskwargsop1r   r   r   __call__!   s    zSingleOperandHolder.__call__N)r   r   r   r    r$   r   r   r   r   r      s   r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
r
   c                 C   s   || _ || _|| _d S r   )r   r   	op2_class)r   r   r   r%   r   r   r   r    '   s    zOperandHolder.__init__c                 O   s$   | j ||}| j||}| ||S r   )r   r%   r   )r   r!   r"   r#   op2r   r   r   r$   ,   s    zOperandHolder.__call__c                 C   s.   t |to,| j|jko,| j|jko,| j|jkS r   )
isinstancer
   r   r   r%   r   r   r   r   __eq__1   s    



zOperandHolder.__eq__c                 C   s   t | j| j| jfS r   )hashr   r   r%   r   r   r   r   __hash__9   s    zOperandHolder.__hash__N)r   r   r   r    r$   r(   r*   r   r   r   r   r
   &   s   r
   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )r   c                 C   s   || _ || _d S r   r#   r&   r   r#   r&   r   r   r   r    >   s    zAND.__init__c                 C   s   | j ||o| j||S r   r#   has_permissionr&   r   requestviewr   r   r   r.   B   s    zAND.has_permissionc                 C   s    | j |||o| j|||S r   )r#   has_object_permissionr&   r   r0   r1   objr   r   r   r2   H   s    zAND.has_object_permissionNr   r   r   r    r.   r2   r   r   r   r   r   =   s   r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )r   c                 C   s   || _ || _d S r   r+   r,   r   r   r   r    P   s    zOR.__init__c                 C   s   | j ||p| j||S r   r-   r/   r   r   r   r.   T   s    zOR.has_permissionc                 C   s<   | j ||r| j |||p:| j||o:| j|||S r   )r#   r.   r2   r&   r3   r   r   r   r2   Z   s    zOR.has_object_permissionNr5   r   r   r   r   r   O   s   r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )r   c                 C   s
   || _ d S r   )r#   )r   r#   r   r   r   r    e   s    zNOT.__init__c                 C   s   | j || S r   )r#   r.   r/   r   r   r   r.   h   s    zNOT.has_permissionc                 C   s   | j ||| S r   )r#   r2   r3   r   r   r   r2   k   s    zNOT.has_object_permissionNr5   r   r   r   r   r   d   s   r   c                   @   s   e Zd ZdS )BasePermissionMetaclassN)r   r   r   r   r   r   r   r6   o   s   r6   c                   @   s    e Zd ZdZdd Zdd ZdS )BasePermissionzH
    A base class from which all permission classes should inherit.
    c                 C   s   dS zL
        Return `True` if permission is granted, `False` otherwise.
        Tr   r/   r   r   r   r.   x   s    zBasePermission.has_permissionc                 C   s   dS r8   r   r3   r   r   r   r2   ~   s    z$BasePermission.has_object_permissionN)r   r   r   __doc__r.   r2   r   r   r   r   r7   s   s   r7   )	metaclassc                   @   s   e Zd ZdZdd ZdS )AllowAnyz
    Allow any access.
    This isn't strictly required, since you could use an empty
    permission_classes list, but it's useful because it makes the intention
    more explicit.
    c                 C   s   dS )NTr   r/   r   r   r   r.      s    zAllowAny.has_permissionNr   r   r   r9   r.   r   r   r   r   r;      s   r;   c                   @   s   e Zd ZdZdd ZdS )IsAuthenticatedz4
    Allows access only to authenticated users.
    c                 C   s   t |jo|jjS r   )booluseris_authenticatedr/   r   r   r   r.      s    zIsAuthenticated.has_permissionNr<   r   r   r   r   r=      s   r=   c                   @   s   e Zd ZdZdd ZdS )IsAdminUserz,
    Allows access only to admin users.
    c                 C   s   t |jo|jjS r   )r>   r?   Zis_staffr/   r   r   r   r.      s    zIsAdminUser.has_permissionNr<   r   r   r   r   rA      s   rA   c                   @   s   e Zd ZdZdd ZdS )IsAuthenticatedOrReadOnlyzL
    The request is authenticated as a user, or is a read-only request.
    c                 C   s   t |jtkp|jo|jjS r   )r>   methodSAFE_METHODSr?   r@   r/   r   r   r   r.      s
    
z(IsAuthenticatedOrReadOnly.has_permissionNr<   r   r   r   r   rB      s   rB   c                   @   sH   e Zd ZdZg g g dgdgdgdgdZdZdd Zd	d
 Zdd ZdS )DjangoModelPermissionsa}  
    The request is authenticated using `django.contrib.auth` permissions.
    See: https://docs.djangoproject.com/en/dev/topics/auth/#permissions

    It ensures that the user is authenticated, and has the appropriate
    `add`/`change`/`delete` permissions on the model.

    This permission can only be applied against view classes that
    provide a `.queryset` attribute.
     %(app_label)s.add_%(model_name)s#%(app_label)s.change_%(model_name)s#%(app_label)s.delete_%(model_name)sr   r   r   POSTPUTPATCHDELETETc                    s>   |j j|j jd || jkr&t| fdd| j| D S )z
        Given a model and an HTTP method, return the list of permission
        codes that the user is required to have.
        	app_label
model_namec                    s   g | ]}|  qS r   r   .0permr"   r   r   
<listcomp>   s     zCDjangoModelPermissions.get_required_permissions.<locals>.<listcomp>Z_metarO   rP   	perms_mapr   ZMethodNotAllowedr   rC   	model_clsr   rT   r   get_required_permissions   s    

z/DjangoModelPermissions.get_required_permissionsc                 C   sb   t |ds,t|dd d k	s,td| jjt |dr\| }|d k	sXtd|jj|S |jS )Nget_querysetquerysetz[Cannot apply {} on a view that does not set `.queryset` or have a `.get_queryset()` method.z{}.get_queryset() returned None)hasattrgetattrAssertionErrorformat	__class__r   r[   r\   )r   r1   r\   r   r   r   	_queryset   s    


z DjangoModelPermissions._querysetc                 C   sN   |j r|j js| jrdS t|ddr(dS | |}| |j|j}|j |S )NFZ_ignore_model_permissionsT)	r?   r@   authenticated_users_onlyr^   rb   rZ   rC   model	has_perms)r   r0   r1   r\   permsr   r   r   r.      s    
z%DjangoModelPermissions.has_permissionN)	r   r   r   r9   rW   rc   rZ   rb   r.   r   r   r   r   rE      s   
rE   c                   @   s   e Zd ZdZdZdS )$DjangoModelPermissionsOrAnonReadOnlyzj
    Similar to DjangoModelPermissions, except that anonymous users are
    allowed read-only access.
    FN)r   r   r   r9   rc   r   r   r   r   rg      s   rg   c                   @   s<   e Zd ZdZg g g dgdgdgdgdZdd Zdd	 Zd
S )DjangoObjectPermissionsa  
    The request is authenticated using Django's object-level permissions.
    It requires an object-permissions-enabled backend, such as Django Guardian.

    It ensures that the user is authenticated, and has the appropriate
    `add`/`change`/`delete` permissions on the object using .has_perms.

    This permission can only be applied against view classes that
    provide a `.queryset` attribute.
    rF   rG   rH   rI   c                    s>   |j j|j jd || jkr&t| fdd| j| D S )NrN   c                    s   g | ]}|  qS r   r   rQ   rT   r   r   rU     s     zKDjangoObjectPermissions.get_required_object_permissions.<locals>.<listcomp>rV   rX   r   rT   r   get_required_object_permissions  s    

z7DjangoObjectPermissions.get_required_object_permissionsc           	      C   sb   |  |}|j}|j}| |j|}|||s^|jtkr>t| d|}|||sZtdS dS )Nr   FT)rb   rd   r?   ri   rC   re   rD   r   )	r   r0   r1   r4   r\   rY   r?   rf   Z
read_permsr   r   r   r2   !  s    

z-DjangoObjectPermissions.has_object_permissionN)r   r   r   r9   rW   ri   r2   r   r   r   r   rh     s   
rh   N)r9   Zdjango.httpr   Zrest_frameworkr   rD   r   r   r
   r   r   r   typer6   r7   r;   r=   rA   rB   rE   rg   rh   r   r   r   r   <module>   s$   
		I