
    Nwg|%                     j   d Z ddlmZ ddlmZ dZ G d d      Z G d de      Z G d	 d
e      Z G d d      Z	 G d d      Z
 G d d      Z G d dee      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d  d!e      Z G d" d#e      Zy$)%z2
Provides a set of pluggable permission policies.
    )Http404)
exceptions)GETHEADOPTIONSc                   *    e Zd Zd Zd Zd Zd Zd Zy)OperationHolderMixinc                 $    t        t        | |      S NOperandHolderANDselfothers     Q/var/www/horilla/myenv/lib/python3.12/site-packages/rest_framework/permissions.py__and__zOperationHolderMixin.__and__   s    S$..    c                 $    t        t        | |      S r   r   ORr   s     r   __or__zOperationHolderMixin.__or__   s    Ru--r   c                 $    t        t        ||       S r   r   r   s     r   __rand__zOperationHolderMixin.__rand__   s    S%..r   c                 $    t        t        ||       S r   r   r   s     r   __ror__zOperationHolderMixin.__ror__   s    R--r   c                 "    t        t        |       S r   )SingleOperandHolderNOTr   s    r   
__invert__zOperationHolderMixin.__invert__   s    "3--r   N)__name__
__module____qualname__r   r   r   r   r!    r   r   r	   r	      s    /./..r   r	   c                       e Zd Zd Zd Zy)r   c                      || _         || _        y r   )operator_class	op1_class)r   r(   r)   s      r   __init__zSingleOperandHolder.__init__   s    ,"r   c                 H     | j                   |i |}| j                  |      S r   )r)   r(   )r   argskwargsop1s       r   __call__zSingleOperandHolder.__call__!   s(    dnnd-f-""3''r   N)r"   r#   r$   r*   r/   r%   r   r   r   r      s    #(r   r   c                   $    e Zd Zd Zd Zd Zd Zy)r   c                 .    || _         || _        || _        y r   )r(   r)   	op2_class)r   r(   r)   r2   s       r   r*   zOperandHolder.__init__'   s    ,""r   c                 n     | j                   |i |} | j                  |i |}| j                  ||      S r   )r)   r2   r(   )r   r,   r-   r.   op2s        r   r/   zOperandHolder.__call__,   s?    dnnd-f-dnnd-f-""3,,r   c                     t        |t              xrO | j                  |j                  k(  xr4 | j                  |j                  k(  xr | j                  |j                  k(  S r   )
isinstancer   r(   r)   r2   r   s     r   __eq__zOperandHolder.__eq__1   sV    um, .5#7#77.NNeoo-. NNeoo-		
r   c                 Z    t        | j                  | j                  | j                  f      S r   )hashr(   r)   r2   r    s    r   __hash__zOperandHolder.__hash__9   s"    T(($..$..IJJr   N)r"   r#   r$   r*   r/   r7   r:   r%   r   r   r   r   &   s    #
-

Kr   r   c                       e Zd Zd Zd Zd Zy)r   c                      || _         || _        y r   r.   r4   r   r.   r4   s      r   r*   zAND.__init__>       r   c                 v    | j                   j                  ||      xr | j                  j                  ||      S r   r.   has_permissionr4   r   requestviews      r   rB   zAND.has_permissionB   4    HH##GT2 3HH##GT2	
r   c                 z    | j                   j                  |||      xr | j                  j                  |||      S r   )r.   has_object_permissionr4   r   rD   rE   objs       r   rH   zAND.has_object_permissionH   s8    HH**7D#> ?HH**7D#>	
r   Nr"   r#   r$   r*   rB   rH   r%   r   r   r   r   =   s    

r   r   c                       e Zd Zd Zd Zd Zy)r   c                      || _         || _        y r   r=   r>   s      r   r*   zOR.__init__P   r?   r   c                 v    | j                   j                  ||      xs | j                  j                  ||      S r   rA   rC   s      r   rB   zOR.has_permissionT   rF   r   c                     | j                   j                  ||      xr | j                   j                  |||      xs; | j                  j                  ||      xr | j                  j                  |||      S r   )r.   rB   rH   r4   rI   s       r   rH   zOR.has_object_permissionZ   sn    HH##GT2 C..wcB
 HH##GT2 C..wcB	
r   NrK   r%   r   r   r   r   O   s    

r   r   c                       e Zd Zd Zd Zd Zy)r   c                     || _         y r   )r.   )r   r.   s     r   r*   zNOT.__init__e   s	    r   c                 <    | j                   j                  ||       S r   )r.   rB   rC   s      r   rB   zNOT.has_permissionh   s    88**7D999r   c                 >    | j                   j                  |||       S r   )r.   rH   rI   s       r   rH   zNOT.has_object_permissionk   s    8811'4EEEr   NrK   r%   r   r   r   r   d   s    :Fr   r   c                       e Zd Zy)BasePermissionMetaclassN)r"   r#   r$   r%   r   r   rU   rU   o   s    r   rU   c                       e Zd ZdZd Zd Zy)BasePermissionzH
    A base class from which all permission classes should inherit.
    c                      yzL
        Return `True` if permission is granted, `False` otherwise.
        Tr%   rC   s      r   rB   zBasePermission.has_permissionx        r   c                      yrY   r%   rI   s       r   rH   z$BasePermission.has_object_permission~   rZ   r   N)r"   r#   r$   __doc__rB   rH   r%   r   r   rW   rW   s   s    r   rW   )	metaclassc                       e Zd ZdZd Zy)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                      y)NTr%   rC   s      r   rB   zAllowAny.has_permission   s    r   Nr"   r#   r$   r\   rB   r%   r   r   r_   r_      s    r   r_   c                       e Zd ZdZd Zy)IsAuthenticatedz4
    Allows access only to authenticated users.
    c                 \    t        |j                  xr |j                  j                        S r   )booluseris_authenticatedrC   s      r   rB   zIsAuthenticated.has_permission   s     GLLBW\\%B%BCCr   Nra   r%   r   r   rc   rc      s    Dr   rc   c                       e Zd ZdZd Zy)IsAdminUserz,
    Allows access only to admin users.
    c                 \    t        |j                  xr |j                  j                        S r   )re   rf   is_staffrC   s      r   rB   zIsAdminUser.has_permission   s     GLL:W\\%:%:;;r   Nra   r%   r   r   ri   ri      s    <r   ri   c                       e Zd ZdZd Zy)IsAuthenticatedOrReadOnlyzL
    The request is authenticated as a user, or is a read-only request.
    c                     t        |j                  t        v xs$ |j                  xr |j                  j                        S r   )re   methodSAFE_METHODSrf   rg   rC   s      r   rB   z(IsAuthenticatedOrReadOnly.has_permission   s9    NNl* *LL *LL))
 	
r   Nra   r%   r   r   rm   rm      s    
r   rm   c                   B    e Zd ZdZg g g dgdgdgdgdZdZd Zd Zd	 Zy
)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	        j
                  |      | j                  |   D cg c]  }||z  	 c}S c c}w )z
        Given a model and an HTTP method, return the list of permission
        codes that the user is required to have.
        	app_label
model_name_metar}   r~   	perms_mapr   MethodNotAllowedr   ro   	model_clsr-   perms        r   get_required_permissionsz/DjangoModelPermissions.get_required_permissions   se     #22#//44

 '--f55*...*@A$vAAA   "A1c                 4   t        |d      s7t        |dd       *J dj                  | j                  j                               t        |d      r>|j                         }|*J 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format	__class__r"   r   r   )r   rE   r   s      r   	_querysetz DjangoModelPermissions._queryset   s    t^,tZ.:	*>
&((
)		* ; 4(((*H' 1889P9PQ' O}}r   c                     |j                   r"|j                   j                  s| j                  ryt        |dd      ry| j	                  |      }| j                  |j                  |j                        }|j                   j                  |      S )NF_ignore_model_permissionsT)	rf   rg   authenticated_users_onlyr   r   r   ro   model	has_perms)r   rD   rE   r   permss        r   rB   z%DjangoModelPermissions.has_permission   sp    ||||,,1N1N 44e<>>$'--gnnhnnM||%%e,,r   N)	r"   r#   r$   r\   r   r   r   r   rB   r%   r   r   rr   rr      sI    	 34567889I  $B-r   rr   c                       e Zd ZdZdZy)$DjangoModelPermissionsOrAnonReadOnlyzj
    Similar to DjangoModelPermissions, except that anonymous users are
    allowed read-only access.
    FN)r"   r#   r$   r\   r   r%   r   r   r   r      s      %r   r   c                   8    e Zd ZdZg g g dgdgdgdgdZd Zd Zy)	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.
    rs   rt   ru   rv   c                     |j                   j                  |j                   j                  d}|| j                  vrt	        j
                  |      | j                  |   D cg c]  }||z  	 c}S c c}w )Nr|   r   r   s        r   get_required_object_permissionsz7DjangoObjectPermissions.get_required_object_permissions  sc    "22#//44

 '--f55*...*@A$vAAAr   c                 8   | j                  |      }|j                  }|j                  }| j                  |j                  |      }|j                  ||      sC|j                  t        v rt        | j                  d|      }|j                  ||      st        yy)Nr   FT)r   r   rf   r   ro   r   rp   r   )	r   rD   rE   rJ   r   r   rf   r   
read_permss	            r   rH   z-DjangoObjectPermissions.has_object_permission!  s    >>$'NN	||44W^^YO~~eS)
 ~~- ==eYOJ>>*c2 r   N)r"   r#   r$   r\   r   r   rH   r%   r   r   r   r     s<    	 34567889I	Br   r   N)r\   django.httpr   rest_frameworkr   rp   r	   r   r   r   r   r   typerU   rW   r_   rc   ri   rm   rr   r   r   r%   r   r   <module>r      s      %). ."(. (K( K.
 
$
 
*F F	2D 	6 $	~ 	Dn D<. <

 

F-^ F-R%+A %94 9r   