o
    ¤ó·it%  ã                   @   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   ú`C:\Users\psant\Downloads\PAF backend\school\venv\Lib\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                   @   s   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                   @   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.   r0   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%   >   r&   zAND.__init__c                 C   s   | j  ||¡o| j ||¡S r	   ©r)   Úhas_permissionr,   ©r   ÚrequestÚviewr   r   r   r5   B   ó   þzAND.has_permissionc                 C   s    | j  |||¡o| j |||¡S r	   )r)   Úhas_object_permissionr,   ©r   r7   r8   Úobjr   r   r   r:   H   s   þzAND.has_object_permissionN©r   r    r!   r%   r5   r:   r   r   r   r   r   =   ó    r   c                   @   r1   )r   c                 C   r"   r	   r2   r3   r   r   r   r%   P   r&   zOR.__init__c                 C   s   | j  ||¡p| j ||¡S r	   r4   r6   r   r   r   r5   T   r9   zOR.has_permissionc                 C   s<   | j  ||¡o| j  |||¡p| j ||¡o| j |||¡S r	   )r)   r5   r:   r,   r;   r   r   r   r:   Z   s   þûzOR.has_object_permissionNr=   r   r   r   r   r   O   r>   r   c                   @   r1   )r   c                 C   s
   || _ d S r	   )r)   )r   r)   r   r   r   r%   e   r   zNOT.__init__c                 C   s   | j  ||¡ S r	   )r)   r5   r6   r   r   r   r5   h   s   zNOT.has_permissionc                 C   s   | j  |||¡ S r	   )r)   r:   r;   r   r   r   r:   k   ó   zNOT.has_object_permissionNr=   r   r   r   r   r   d   s    r   c                   @   s   e Zd ZdS )ÚBasePermissionMetaclassN)r   r    r!   r   r   r   r   r@   o   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.
        TNr   r6   r   r   r   r5   x   ó   zBasePermission.has_permissionc                 C   rB   rC   r   r;   r   r   r   r:   ~   rD   z$BasePermission.has_object_permissionN)r   r    r!   Ú__doc__r5   r:   r   r   r   r   rA   s   s    rA   )Ú	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   rB   )NTr   r6   r   r   r   r5   �   s   zAllowAny.has_permissionN©r   r    r!   rE   r5   r   r   r   r   rH   …   s    rH   c                   @   rG   )ÚIsAuthenticatedz4
    Allows access only to authenticated users.
    c                 C   ó   t |jo|jjƒS r	   )ÚboolÚuserÚis_authenticatedr6   r   r   r   r5   –   r?   zIsAuthenticated.has_permissionNrI   r   r   r   r   rJ   ‘   ó    rJ   c                   @   rG   )ÚIsAdminUserz,
    Allows access only to admin users.
    c                 C   rK   r	   )rL   rM   Zis_staffr6   r   r   r   r5   Ÿ   r?   zIsAdminUser.has_permissionNrI   r   r   r   r   rP   š   rO   rP   c                   @   rG   )Ú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	   )rL   ÚmethodÚSAFE_METHODSrM   rN   r6   r   r   r   r5   ¨   s
   
ýz(IsAuthenticatedOrReadOnly.has_permissionNrI   r   r   r   r   rQ   £   rO   rQ   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>N©Z_metar_   r`   Ú	perms_mapr   ZMethodNotAllowed©r   rR   Ú	model_clsr   re   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 |jj› d�ƒ‚|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   rm   rn   )r   r8   rn   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)	rM   rN   Úauthenticated_users_onlyrp   rs   rl   rR   ÚmodelÚ	has_perms)r   r7   r8   rn   Úpermsr   r   r   r5   é   s   ÿÿ
z%DjangoModelPermissions.has_permissionN)	r   r    r!   rE   ri   rt   rl   rs   r5   r   r   r   r   rT   °   s    ù
rT   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!   rE   rt   r   r   r   r   rx   ù   s    rx   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.
    rU   rV   rW   rX   c                    r]   )Nr^   c                    ra   r   r   rb   re   r   r   rf     rg   zKDjangoObjectPermissions.get_required_object_permissions.<locals>.<listcomp>rh   rj   r   re   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)rs   ru   rM   rz   rR   rv   rS   r   )	r   r7   r8   r<   rn   rk   rM   rw   Z
read_permsr   r   r   r:   !  s   

z-DjangoObjectPermissions.has_object_permissionN)r   r    r!   rE   ri   rz   r:   r   r   r   r   ry     s    ù
ry   N)rE   Zdjango.httpr   Zrest_frameworkr   rS   r   r   r   r   r   r   Útyper@   rA   rH   rJ   rP   rQ   rT   rx   ry   r   r   r   r   Ú<module>   s&    
		I