3
Ah`#                 @   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   I/tmp/pip-build-9m32_hle/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   3   s    zAND.__init__c             C   s   | j j||o| jj||S )N)r   has_permissionr!   )r
   requestviewr   r   r   r"   7   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	   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 )N)r   r!   )r
   r   r!   r   r   r   r   E   s    zOR.__init__c             C   s   | j j||p| jj||S )N)r   r"   r!   )r
   r#   r$   r   r   r   r"   I   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%   O   s    zOR.has_object_permissionN)r   r   r   r   r"   r%   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 )N)r   )r
   r   r   r   r   r   W   s    zNOT.__init__c             C   s   | j j|| S )N)r   r"   )r
   r#   r$   r   r   r   r"   Z   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   V   s   r   c               @   s   e Zd ZdS )BasePermissionMetaclassN)r   r   r   r   r   r   r   r'   a   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"   j   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%   p   s    z$BasePermission.has_object_permissionN)r   r   r   __doc__r"   r%   r   r   r   r   r(   e   s   r(   )	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   r   r"      s    zAllowAny.has_permissionN)r   r   r   r)   r"   r   r   r   r   r+   w   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   r0      s   r0   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.   r/   )r
   r#   r$   r   r   r   r"      s    
z(IsAuthenticatedOrReadOnly.has_permissionN)r   r   r   r)   r"   r   r   r   r   r1      s   r1   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>)_metar9   r:   	perms_mapr   MethodNotAllowed)r
   r2   	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   rC   rD   )r
   r$   rD   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)	rF   r.   r/   authenticated_users_onlyrJ   rB   r2   model	has_perms)r
   r#   r$   rD   permsr   r   r   r"      s    
z%DjangoModelPermissions.has_permissionN)	r   r   r   r)   r?   rK   rB   rJ   r"   r   r   r   r   r4      s   

r4   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)   rK   r   r   r   r   rO      s   rO   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   r5   r6   r7   r8   c                s>   |j j|j jd || jkr&tj| fdd| j| D S )N)r9   r:   c                s   g | ]}|  qS r   r   )r;   r<   )r   r   r   r=     s    zKDjangoObjectPermissions.get_required_object_permissions.<locals>.<listcomp>)r>   r9   r:   r?   r   r@   )r
   r2   rA   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)rJ   rL   r.   rQ   r2   rM   r3   r   )	r
   r#   r$   r&   rD   rA   r.   rN   Z
read_permsr   r   r   r%     s    

z-DjangoObjectPermissions.has_object_permissionN)r   r   r   r)   r?   rQ   r%   r   r   r   r   rP      s   

rP   N)r   r   r   )r)   Zdjango.httpr   Zrest_frameworkr   r3   r   r   r   r	   r   r   typer'   r(   r+   r,   r0   r1   r4   rO   rP   r   r   r   r   <module>   s$   
		I