o
    cZh$                     @   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      t t| |S NOperandHolderANDselfother r   Q/var/www/html/lang_env/lib/python3.10/site-packages/rest_framework/permissions.py__and__      zOperationHolderMixin.__and__c                 C   r   r	   r   ORr   r   r   r   __or__   r   zOperationHolderMixin.__or__c                 C      t t|| S r	   r
   r   r   r   r   __rand__   r   zOperationHolderMixin.__rand__c                 C   r   r	   r   r   r   r   r   __ror__   r   zOperationHolderMixin.__ror__c                 C   s
   t t| S r	   )SingleOperandHolderNOT)r   r   r   r   
__invert__      
zOperationHolderMixin.__invert__N)__name__
__module____qualname__r   r   r   r   r   r   r   r   r   r      s    r   c                   @      e Zd Zdd Zdd ZdS )r   c                 C      || _ || _d S r	   )operator_class	op1_class)r   r#   r$   r   r   r   __init__      
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                   @   r!   )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__Nr+   r   r   r   r   r   &   s    r   c                   @   $   e Zd Zdd Zdd Zdd ZdS )r   c                 C   r"   r	   r)   r-   r   r)   r-   r   r   r   r%   3   r&   zAND.__init__c                 C   s   | j ||o| j||S r	   r)   has_permissionr-   r   requestviewr   r   r   r2   7      zAND.has_permissionc                 C   s    | j |||o| j|||S r	   )r)   has_object_permissionr-   r   r4   r5   objr   r   r   r7   =   s   zAND.has_object_permissionNr   r   r    r%   r2   r7   r   r   r   r   r   2       r   c                   @   r.   )r   c                 C   r"   r	   r/   r0   r   r   r   r%   E   r&   zOR.__init__c                 C   s   | j ||p| j||S r	   r1   r3   r   r   r   r2   I   r6   zOR.has_permissionc                 C   s<   | j ||o| j |||p| j||o| j|||S r	   )r)   r2   r7   r-   r8   r   r   r   r7   O   s   zOR.has_object_permissionNr:   r   r   r   r   r   D   r;   r   c                   @   r.   )r   c                 C   s
   || _ d S r	   )r)   )r   r)   r   r   r   r%   Z   r   zNOT.__init__c                 C   s   | j || S r	   )r)   r2   r3   r   r   r   r2   ]   s   zNOT.has_permissionc                 C   s   | j ||| S r	   )r)   r7   r8   r   r   r   r7   `      zNOT.has_object_permissionNr:   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      dS zL
        Return `True` if permission is granted, `False` otherwise.
        Tr   r3   r   r   r   r2   m      zBasePermission.has_permissionc                 C   r?   r@   r   r8   r   r   r   r7   s   rA   z$BasePermission.has_object_permissionN)r   r   r    __doc__r2   r7   r   r   r   r   r>   h   s    r>   )	metaclassc                   @      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   r?   )NTr   r3   r   r   r   r2      s   zAllowAny.has_permissionNr   r   r    rB   r2   r   r   r   r   rE   z   s    rE   c                   @   rD   )IsAuthenticatedz4
    Allows access only to authenticated users.
    c                 C      t |jo|jjS r	   )booluseris_authenticatedr3   r   r   r   r2      r<   zIsAuthenticated.has_permissionNrF   r   r   r   r   rG          rG   c                   @   rD   )IsAdminUserz,
    Allows access only to admin users.
    c                 C   rH   r	   )rI   rJ   Zis_staffr3   r   r   r   r2      r<   zIsAdminUser.has_permissionNrF   r   r   r   r   rM      rL   rM   c                   @   rD   )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	   )rI   methodSAFE_METHODSrJ   rK   r3   r   r   r   r2      s
   
z(IsAuthenticatedOrReadOnly.has_permissionNrF   r   r   r   r   rN      rL   rN   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                    >   |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                       g | ]}|  qS r   r   .0permr(   r   r   
<listcomp>       zCDjangoModelPermissions.get_required_permissions.<locals>.<listcomp>_metar\   r]   	perms_mapr   ZMethodNotAllowedr   rO   	model_clsr   rb   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s,J 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   rk   rl   )r   r5   rl   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)	rn   rJ   rK   authenticated_users_onlyrq   rj   rO   model	has_perms)r   r4   r5   rl   permsr   r   r   r2      s   
z%DjangoModelPermissions.has_permissionN)	r   r   r    rB   rg   rr   rj   rq   r2   r   r   r   r   rQ      s    
rQ   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    rB   rr   r   r   r   r   rv      s    rv   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.
    rR   rS   rT   rU   c                    rZ   )Nr[   c                    r^   r   r   r_   rb   r   r   rc     rd   zKDjangoObjectPermissions.get_required_object_permissions.<locals>.<listcomp>re   rh   r   rb   r   get_required_object_permissions  s   

z7DjangoObjectPermissions.get_required_object_permissionsc           	      C   sb   |  |}|j}|j}| |j|}|||s/|jtv rt| d|}|||s-tdS dS )Nr   FT)rq   rs   rJ   rx   rO   rt   rP   r   )	r   r4   r5   r9   rl   ri   rJ   ru   Z
read_permsr   r   r   r7     s   

z-DjangoObjectPermissions.has_object_permissionN)r   r   r    rB   rg   rx   r7   r   r   r   r   rw      s    
rw   N)rB   Zdjango.httpr   Zrest_frameworkr   rP   r   r   r   r   r   r   typer=   r>   rE   rG   rM   rN   rQ   rv   rw   r   r   r   r   <module>   s&    
		I