a
    Šxdk  ã                   @   sF  d Z ddlZddlmZ ddlmZ ddlmZ ddlm	Z	 ddl
mZ ddlmZmZ d+d	d
„Zdd„ Zd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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'd(„ Z d)d*„ Z!dS ),z·
Handled exceptions raised by REST framework.

In addition Django's built in 403 and 404 exceptions are handled.
(`django.http.Http404` and `django.core.exceptions.PermissionDenied`)
é    N)ÚJsonResponse)Ú	force_str)Úgettext_lazy)Úngettext©Ústatus)Ú
ReturnDictÚ
ReturnListc                    s–   t | ttfƒr<‡ fdd„| D ƒ}t | tƒr8t|| jdS |S t | tƒrx‡ fdd„|  ¡ D ƒ}t | tƒrtt|| jdS |S t| ƒ}t	| dˆ ƒ}t
||ƒS )zw
    Descend into a nested data structure, forcing any
    lazy translation strings or strings into `ErrorDetail`.
    c                    s   g | ]}t |ˆ ƒ‘qS © ©Ú_get_error_details©Ú.0Úitem©Údefault_coder
   úQ/var/www/html/Ranjet/env/lib/python3.9/site-packages/rest_framework/exceptions.pyÚ
<listcomp>   s   z&_get_error_details.<locals>.<listcomp>)Ú
serializerc                    s   i | ]\}}|t |ˆ ƒ“qS r
   r   ©r   ÚkeyÚvaluer   r
   r   Ú
<dictcomp>   s   ÿz&_get_error_details.<locals>.<dictcomp>Úcode)Ú
isinstanceÚlistÚtupler	   r   ÚdictÚitemsr   r   ÚgetattrÚErrorDetail)Údatar   ÚretÚtextr   r
   r   r   r      s"    
ÿ


þ
r   c                 C   s:   t | tƒrdd„ | D ƒS t | tƒr4dd„ |  ¡ D ƒS | jS )Nc                 S   s   g | ]}t |ƒ‘qS r
   ©Ú
_get_codesr   r
   r
   r   r   .   ó    z_get_codes.<locals>.<listcomp>c                 S   s   i | ]\}}|t |ƒ“qS r
   r$   r   r
   r
   r   r   0   r&   z_get_codes.<locals>.<dictcomp>©r   r   r   r   r   ©Údetailr
   r
   r   r%   ,   s
    

r%   c                 C   s@   t | tƒrdd„ | D ƒS t | tƒr4dd„ |  ¡ D ƒS | | jdœS )Nc                 S   s   g | ]}t |ƒ‘qS r
   ©Ú_get_full_detailsr   r
   r
   r   r   6   r&   z%_get_full_details.<locals>.<listcomp>c                 S   s   i | ]\}}|t |ƒ“qS r
   r*   r   r
   r
   r   r   8   r&   z%_get_full_details.<locals>.<dictcomp>)Úmessager   r'   r(   r
   r
   r   r+   4   s    

þr+   c                       sJ   e Zd ZdZdZd‡ fdd„	Z‡ fdd„Zdd„ Zd	d
„ Zdd„ Z	‡  Z
S )r    zA
    A string-like object that can additionally have a code.
    Nc                    s   t ƒ  | |¡}||_|S ©N)ÚsuperÚ__new__r   )ÚclsÚstringr   Úself©Ú	__class__r
   r   r/   E   s    zErrorDetail.__new__c                    sF   t ƒ  |¡}|tu rtS z|o(| j|jkW S  ty@   | Y S 0 d S r-   )r.   Ú__eq__ÚNotImplementedr   ÚAttributeError)r2   ÚotherÚrr3   r
   r   r5   J   s    zErrorDetail.__eq__c                 C   s   |   |¡ S r-   )r5   )r2   r8   r
   r
   r   Ú__ne__S   s    zErrorDetail.__ne__c                 C   s   dt | ƒ| jf S )NzErrorDetail(string=%r, code=%r))Ústrr   ©r2   r
   r
   r   Ú__repr__V   s    þzErrorDetail.__repr__c                 C   s   t t| ƒƒS r-   )Úhashr;   r<   r
   r
   r   Ú__hash__\   s    zErrorDetail.__hash__)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r/   r5   r:   r=   r?   Ú__classcell__r
   r
   r3   r   r    ?   s   	r    c                   @   sD   e Zd ZdZejZedƒZdZ	ddd„Z
dd„ Zd	d
„ Zdd„ ZdS )ÚAPIExceptionz‚
    Base class for REST framework exceptions.
    Subclasses should provide `.status_code` and `.default_detail` properties.
    zA server error occurred.ÚerrorNc                 C   s,   |d u r| j }|d u r| j}t||ƒ| _d S r-   )Údefault_detailr   r   r)   ©r2   r)   r   r
   r
   r   Ú__init__i   s
    zAPIException.__init__c                 C   s
   t | jƒS r-   )r;   r)   r<   r
   r
   r   Ú__str__q   s    zAPIException.__str__c                 C   s
   t | jƒS )ze
        Return only the code part of the error details.

        Eg. {"name": ["required"]}
        )r%   r)   r<   r
   r
   r   Ú	get_codest   s    zAPIException.get_codesc                 C   s
   t | jƒS )z 
        Return both the message & code parts of the error details.

        Eg. {"name": [{"message": "This field is required.", "code": "required"}]}
        )r+   r)   r<   r
   r
   r   Úget_full_details|   s    zAPIException.get_full_details)NN)r@   rA   rB   rC   r   ÚHTTP_500_INTERNAL_SERVER_ERRORÚstatus_codeÚ_rG   r   rI   rJ   rK   rL   r
   r
   r
   r   rE   `   s   
rE   c                   @   s(   e Zd ZejZedƒZdZddd„Z	dS )ÚValidationErrorzInvalid input.ÚinvalidNc                 C   sZ   |d u r| j }|d u r| j}t|tƒr0t|ƒ}nt|tƒsJt|tƒsJ|g}t||ƒ| _d S r-   )rG   r   r   r   r   r   r   r)   rH   r
   r
   r   rI   ‘   s    

zValidationError.__init__)NN)
r@   rA   rB   r   ÚHTTP_400_BAD_REQUESTrN   rO   rG   r   rI   r
   r
   r
   r   rP   Œ   s   rP   c                   @   s   e Zd ZejZedƒZdZdS )Ú
ParseErrorzMalformed request.Zparse_errorN)	r@   rA   rB   r   rR   rN   rO   rG   r   r
   r
   r
   r   rS   ¡   s   rS   c                   @   s   e Zd ZejZedƒZdZdS )ÚAuthenticationFailedz%Incorrect authentication credentials.Zauthentication_failedN©	r@   rA   rB   r   ZHTTP_401_UNAUTHORIZEDrN   rO   rG   r   r
   r
   r
   r   rT   §   s   rT   c                   @   s   e Zd ZejZedƒZdZdS )ÚNotAuthenticatedz-Authentication credentials were not provided.Znot_authenticatedNrU   r
   r
   r
   r   rV   ­   s   rV   c                   @   s   e Zd ZejZedƒZdZdS )ÚPermissionDeniedz2You do not have permission to perform this action.Zpermission_deniedN)	r@   rA   rB   r   ZHTTP_403_FORBIDDENrN   rO   rG   r   r
   r
   r
   r   rW   ³   s   rW   c                   @   s   e Zd ZejZedƒZdZdS )ÚNotFoundz
Not found.Ú	not_foundN)	r@   rA   rB   r   ZHTTP_404_NOT_FOUNDrN   rO   rG   r   r
   r
   r
   r   rX   ¹   s   rX   c                       s0   e Zd ZejZedƒZdZd‡ fdd„	Z	‡  Z
S )ÚMethodNotAllowedzMethod "{method}" not allowed.Úmethod_not_allowedNc                    s,   |d u rt | jƒj|d}tƒ  ||¡ d S )N)Úmethod©r   rG   Úformatr.   rI   )r2   r\   r)   r   r3   r
   r   rI   Ä   s    zMethodNotAllowed.__init__)NN)r@   rA   rB   r   ZHTTP_405_METHOD_NOT_ALLOWEDrN   rO   rG   r   rI   rD   r
   r
   r3   r   rZ   ¿   s   rZ   c                       s0   e Zd ZejZedƒZdZd‡ fdd„	Z	‡  Z
S )ÚNotAcceptablez,Could not satisfy the request Accept header.Únot_acceptableNc                    s   || _ tƒ  ||¡ d S r-   )Úavailable_renderersr.   rI   )r2   r)   r   ra   r3   r
   r   rI   Ï   s    zNotAcceptable.__init__)NNN)r@   rA   rB   r   ZHTTP_406_NOT_ACCEPTABLErN   rO   rG   r   rI   rD   r
   r
   r3   r   r_   Ê   s   r_   c                       s0   e Zd ZejZedƒZdZd‡ fdd„	Z	‡  Z
S )ÚUnsupportedMediaTypez1Unsupported media type "{media_type}" in request.Úunsupported_media_typeNc                    s,   |d u rt | jƒj|d}tƒ  ||¡ d S )N)Ú
media_typer]   )r2   rd   r)   r   r3   r
   r   rI   Ù   s    zUnsupportedMediaType.__init__)NN)r@   rA   rB   r   ZHTTP_415_UNSUPPORTED_MEDIA_TYPErN   rO   rG   r   rI   rD   r
   r
   r3   r   rb   Ô   s   rb   c                       s@   e Zd ZejZedƒZedƒZedƒZ	dZ
d‡ fdd„	Z‡  ZS )	Ú	ThrottledzRequest was throttled.z$Expected available in {wait} second.z%Expected available in {wait} seconds.Z	throttledNc              	      sj   |d u rt | jƒ}|d urRt |¡}d |t t| jj|d| jj|d|ƒƒf¡}|| _	t
ƒ  ||¡ d S )Nú )Úwait)r   rG   ÚmathÚceilÚjoinr   Úextra_detail_singularr^   Úextra_detail_pluralrg   r.   rI   )r2   rg   r)   r   r3   r
   r   rI   æ   s    

þþzThrottled.__init__)NNN)r@   rA   rB   r   ZHTTP_429_TOO_MANY_REQUESTSrN   rO   rG   rk   rl   r   rI   rD   r
   r
   r3   r   re   ß   s   re   c                 O   s   ddi}t |tjdS )z$
    Generic 500 error handler.
    rF   zServer Error (500)r   )r   r   rM   )ÚrequestÚargsÚkwargsr!   r
   r
   r   Úserver_errorô   s    ÿrp   c                 O   s   ddi}t |tjdS )z$
    Generic 400 error handler.
    rF   zBad Request (400)r   )r   r   rR   )rm   Ú	exceptionrn   ro   r!   r
   r
   r   Úbad_requestþ   s    ÿrr   )N)"rC   rh   Zdjango.httpr   Zdjango.utils.encodingr   Zdjango.utils.translationr   rO   r   Zrest_frameworkr   Z'rest_framework.utils.serializer_helpersr   r	   r   r%   r+   r;   r    Ú	ExceptionrE   rP   rS   rT   rV   rW   rX   rZ   r_   rb   re   rp   rr   r
   r
   r
   r   Ú<module>   s0   
!,

