a
    còf|%  ã                   @   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   úW/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/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 |i |¤Ž}|  |¡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 |i |¤Ž}| j|i |¤Ž}|  ||¡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v 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v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>Ø   ó    zCDjangoModelPermissions.get_required_permissions.<locals>.<listcomp>©Ú_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 us,J d | jj¡ƒ‚t |dƒr\| ¡ }|d usXJ 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Ú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`   rc   r\   rC   ÚmodelÚ	has_perms)r   r0   r1   r^   Úpermsr   r   r   r.   é   s    ÿÿ
z%DjangoModelPermissions.has_permissionN)	r   r   r   r9   rY   rd   r\   rc   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   rd   r   r   r   r   rh   ù   s   rh   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vr&t |¡‚‡ fdd„| j| D ƒS )NrN   c                    s   g | ]}|ˆ  ‘qS r   r   rQ   rT   r   r   rU     rV   zKDjangoObjectPermissions.get_required_object_permissions.<locals>.<listcomp>rW   rZ   r   rT   r   Úget_required_object_permissions  s    þ

z7DjangoObjectPermissions.get_required_object_permissionsc           	      C   sb   |   |¡}|j}|j}|  |j|¡}| ||¡s^|jtv r>t‚|  d|¡}| ||¡sZt‚dS dS )Nr   FT)rc   re   r?   rj   rC   rf   rD   r   )	r   r0   r1   r4   r^   r[   r?   rg   Z
read_permsr   r   r   r2   !  s    

z-DjangoObjectPermissions.has_object_permissionN)r   r   r   r9   rY   rj   r2   r   r   r   r   ri     s   ù
ri   N)r9   Zdjango.httpr   Zrest_frameworkr   rD   r   r   r
   r   r   r   Útyper6   r7   r;   r=   rA   rB   rE   rh   ri   r   r   r   r   Ú<module>   s$   
		I