3
=^#                 @   s0  d Z ddlmZ ddlm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eje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G d%d& d&eZd'S ))z2
Provides a set of pluggable permission policies.
    )unicode_literals)Http404)six)
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   I/tmp/pip-build-8app2_gc/djangorestframework/rest_framework/permissions.py__and__   s    zOperationHolderMixin.__and__c             C   s   t t| |S )N)r
   OR)r   r   r   r   r   __or__   s    zOperationHolderMixin.__or__c             C   s   t t|| S )N)r
   r   )r   r   r   r   r   __rand__   s    zOperationHolderMixin.__rand__c             C   s   t t|| S )N)r
   r   )r   r   r   r   r   __ror__   s    zOperationHolderMixin.__ror__c             C   s
   t t| S )N)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 )N)operator_class	op1_class)r   r   r   r   r   r   __init__    s    zSingleOperandHolder.__init__c             O   s   | j ||}| j|S )N)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 )N)r   r   	op2_class)r   r   r   r"   r   r   r   r   *   s    zOperandHolder.__init__c             O   s$   | j ||}| j||}| j||S )N)r   r"   r   )r   r   r   r    op2r   r   r   r!   /   s    zOperandHolder.__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S )r   c             C   s   || _ || _d S )N)r    r#   )r   r    r#   r   r   r   r   6   s    zAND.__init__c             C   s   | j j||o| jj||S )N)r    has_permissionr#   )r   requestviewr   r   r   r$   :   s    zAND.has_permissionc             C   s    | j j|||o| jj|||S )N)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   5   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 )N)r    r#   )r   r    r#   r   r   r   r   H   s    zOR.__init__c             C   s   | j j||p| jj||S )N)r    r$   r#   )r   r%   r&   r   r   r   r$   L   s    zOR.has_permissionc             C   s    | j j|||p| jj|||S )N)r    r'   r#   )r   r%   r&   r(   r   r   r   r'   R   s    zOR.has_object_permissionN)r   r   r   r   r$   r'   r   r   r   r   r   G   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 )N)r    )r   r    r   r   r   r   Z   s    zNOT.__init__c             C   s   | j j|| S )N)r    r$   )r   r%   r&   r   r   r   r$   ]   s    zNOT.has_permissionc             C   s   | j j||| S )N)r    r'   )r   r%   r&   r(   r   r   r   r'   `   s    zNOT.has_object_permissionN)r   r   r   r   r$   r'   r   r   r   r   r   Y   s   r   c               @   s   e Zd ZdS )BasePermissionMetaclassN)r   r   r   r   r   r   r   r)   d   s   r)   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   r   r$   n   s    zBasePermission.has_permissionc             C   s   dS )zL
        Return `True` if permission is granted, `False` otherwise.
        Tr   )r   r%   r&   r(   r   r   r   r'   t   s    z$BasePermission.has_object_permissionN)r   r   r   __doc__r$   r'   r   r   r   r   r*   h   s   r*   c               @   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   r   r$      s    zAllowAny.has_permissionN)r   r   r   r+   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 )N)booluseris_authenticated)r   r%   r&   r   r   r   r$      s    zIsAuthenticated.has_permissionN)r   r   r   r+   r$   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 )N)r.   r/   Zis_staff)r   r%   r&   r   r   r   r$      s    zIsAdminUser.has_permissionN)r   r   r   r+   r$   r   r   r   r   r1      s   r1   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 )N)r.   methodSAFE_METHODSr/   r0   )r   r%   r&   r   r   r   r$      s    
z(IsAuthenticatedOrReadOnly.has_permissionN)r   r   r   r+   r$   r   r   r   r   r2      s   r2   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.
    z %(app_label)s.add_%(model_name)sz#%(app_label)s.change_%(model_name)sz#%(app_label)s.delete_%(model_name)s)r   r   r   POSTPUTPATCHDELETETc                s>   |j j|j jd || jkr&tj| 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>)_metar:   r;   	perms_mapr   MethodNotAllowed)r   r3   	model_clsr   )r   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jt |dr\|j }|d k	sXtdj|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   rD   rE   )r   r&   rE   r   r   r   	_queryset   s    


z DjangoModelPermissions._querysetc             C   sR   t |ddrdS |j s(|jj r,| jr,dS | j|}| j|j|j}|jj|S )NZ_ignore_model_permissionsFT)	rG   r/   r0   authenticated_users_onlyrK   rC   r3   model	has_perms)r   r%   r&   rE   permsr   r   r   r$      s    
z%DjangoModelPermissions.has_permissionN)	r   r   r   r+   r@   rL   rC   rK   r$   r   r   r   r   r5      s   

r5   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   r+   rL   r   r   r   r   rP      s   rP   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.
    z %(app_label)s.add_%(model_name)sz#%(app_label)s.change_%(model_name)sz#%(app_label)s.delete_%(model_name)s)r   r   r   r6   r7   r8   r9   c                s>   |j j|j jd || jkr&tj| fdd| j| D S )N)r:   r;   c                s   g | ]}|  qS r   r   )r<   r=   )r   r   r   r>     s    zKDjangoObjectPermissions.get_required_object_permissions.<locals>.<listcomp>)r?   r:   r;   r@   r   rA   )r   r3   rB   r   )r   r   get_required_object_permissions  s
    

z7DjangoObjectPermissions.get_required_object_permissionsc       	      C   sb   | j |}|j}|j}| j|j|}|j||s^|jtkr>t| jd|}|j||sZtdS dS )Nr   FT)rK   rM   r/   rR   r3   rN   r4   r   )	r   r%   r&   r(   rE   rB   r/   rO   Z
read_permsr   r   r   r'     s    

z-DjangoObjectPermissions.has_object_permissionN)r   r   r   r+   r@   rR   r'   r   r   r   r   rQ      s   

rQ   N)r   r   r   )r+   
__future__r   Zdjango.httpr   Zdjango.utilsr   Zrest_frameworkr   r4   r	   r   r
   r   r   r   typer)   add_metaclassobjectr*   r,   r-   r1   r2   r5   rP   rQ   r   r   r   r   <module>   s*   
		I