U
    e$                     @   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-n426yvdz/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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__Nr$   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   3   s    zAND.__init__c                 C   s   | j ||o| j||S r   r"   has_permissionr&   r   requestviewr   r   r   r*   7   s    zAND.has_permissionc                 C   s    | j |||o| j|||S r   )r"   has_object_permissionr&   r   r,   r-   objr   r   r   r.   =   s    zAND.has_object_permissionNr   r   r   r   r*   r.   r   r   r   r   r   2   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   E   s    zOR.__init__c                 C   s   | j ||p| j||S r   r)   r+   r   r   r   r*   I   s    zOR.has_permissionc                 C   s<   | j ||r| j |||p:| j||o:| j|||S r   )r"   r*   r.   r&   r/   r   r   r   r.   O   s    zOR.has_object_permissionNr1   r   r   r   r   r   D   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   Z   s    zNOT.__init__c                 C   s   | j || S r   )r"   r*   r+   r   r   r   r*   ]   s    zNOT.has_permissionc                 C   s   | j ||| S r   )r"   r.   r/   r   r   r   r.   `   s    zNOT.has_object_permissionNr1   r   r   r   r   r   Y   s   r   c                   @   s   e Zd ZdS )BasePermissionMetaclassN)r   r   r   r   r   r   r   r2   d   s   r2   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*   m   s    zBasePermission.has_permissionc                 C   s   dS r4   r   r/   r   r   r   r.   s   s    z$BasePermission.has_object_permissionN)r   r   r   __doc__r*   r.   r   r   r   r   r3   h   s   r3   )	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   r5   r*   r   r   r   r   r7   z   s   r7   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_permissionNr8   r   r   r   r   r9      s   r9   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_permissionNr8   r   r   r   r   r=      s   r=   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_permissionNr8   r   r   r   r   r>      s   r>   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_metarK   rL   	perms_mapr   ZMethodNotAllowedr   r?   	model_clsr   rP   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   rW   rX   )r   r-   rX   r   r   r   	_queryset   s    


z DjangoModelPermissions._querysetc                 C   sN   t |ddrdS |jr$|jjs(| jr(dS | |}| |j|j}|j|S )NZ_ignore_model_permissionsFT)	rZ   r;   r<   authenticated_users_onlyr^   rV   r?   model	has_perms)r   r,   r-   rX   permsr   r   r   r*      s    
z%DjangoModelPermissions.has_permissionN)	r   r   r   r5   rS   r_   rV   r^   r*   r   r   r   r   rA      s   
rA   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   r5   r_   r   r   r   r   rc      s   rc   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.
    rB   rC   rD   rE   c                    s>   |j j|j jd || jkr&t| fdd| j| D S )NrJ   c                    s   g | ]}|  qS r   r   rM   rP   r   r   rQ     s     zKDjangoObjectPermissions.get_required_object_permissions.<locals>.<listcomp>rR   rT   r   rP   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)r^   r`   r;   re   r?   ra   r@   r   )	r   r,   r-   r0   rX   rU   r;   rb   Z
read_permsr   r   r   r.     s    

z-DjangoObjectPermissions.has_object_permissionN)r   r   r   r5   rS   re   r.   r   r   r   r   rd      s   
rd   N)r5   Zdjango.httpr   Zrest_frameworkr   r@   r   r   r
   r   r   r   typer2   r3   r7   r9   r=   r>   rA   rc   rd   r   r   r   r   <module>   s$   
		I