U
    Æ½„b˜#  ã                   @   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-iohwuy7z/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  |||¡p| j |||¡S r   r.   r0   r   r   r   r/   O   s    þzOR.has_object_permissionNr2   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   W   s    zNOT.__init__c                 C   s   | j  ||¡ S r   )r"   r*   r+   r   r   r   r*   Z   s    zNOT.has_permissionc                 C   s   | j  |||¡ S r   )r"   r/   r0   r   r   r   r/   ]   s    zNOT.has_object_permissionNr2   r   r   r   r   r   V   s   r   c                   @   s   e Zd ZdS )ÚBasePermissionMetaclassN)r   r   r   r   r   r   r   r3   a   s   r3   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*   j   s    zBasePermission.has_permissionc                 C   s   dS r5   r   r0   r   r   r   r/   p   s    z$BasePermission.has_object_permissionN)r   r   r   Ú__doc__r*   r/   r   r   r   r   r4   e   s   r4   )Ú	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   r6   r*   r   r   r   r   r8   w   s   r8   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_permissionNr9   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_permissionNr9   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_permissionNr9   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_metarL   rM   Ú	perms_mapr   ZMethodNotAllowed©r   r@   Ú	model_clsr   rQ   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   rX   rY   )r   r-   rY   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)	r[   r<   r=   Úauthenticated_users_onlyr_   rW   r@   ÚmodelÚ	has_perms)r   r,   r-   rY   Úpermsr   r   r   r*   Û   s    ÿÿ
z%DjangoModelPermissions.has_permissionN)	r   r   r   r6   rT   r`   rW   r_   r*   r   r   r   r   rB   ¢   s   ù
rB   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   r6   r`   r   r   r   r   rd   ë   s   rd   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.
    rC   rD   rE   rF   c                    s>   |j j|j jdœ‰ || jkr&t |¡‚‡ fdd„| j| D ƒS )NrK   c                    s   g | ]}|ˆ  ‘qS r   r   rN   rQ   r   r   rR     s     zKDjangoObjectPermissions.get_required_object_permissions.<locals>.<listcomp>rS   rU   r   rQ   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_   ra   r<   rf   r@   rb   rA   r   )	r   r,   r-   r1   rY   rV   r<   rc   Z
read_permsr   r   r   r/     s    

z-DjangoObjectPermissions.has_object_permissionN)r   r   r   r6   rT   rf   r/   r   r   r   r   re   ó   s   ù
re   N)r6   Zdjango.httpr   Zrest_frameworkr   rA   r   r   r
   r   r   r   Útyper3   r4   r8   r:   r>   r?   rB   rd   re   r   r   r   r   Ú<module>   s$   
		I