o
     Þhß  ã                   @   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ƒrt|| jd�S |S t | tƒr<‡ fdd„|  ¡ D ƒ}t | tƒr:t|| 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
   úY/var/www/html/premium_crap/venv/lib/python3.10/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ƒrdd„ |  ¡ D ƒS | jS )Nc                 S   ó   g | ]}t |ƒ‘qS r
   ©Ú
_get_codesr   r
   r
   r   r   .   ó    z_get_codes.<locals>.<listcomp>c                 S   ó   i | ]	\}}|t |ƒ“qS r
   r%   r   r
   r
   r   r   0   ó    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ƒrdd„ |  ¡ D ƒS | | jdœS )Nc                 S   r$   r
   ©Ú_get_full_detailsr   r
   r
   r   r   6   r'   z%_get_full_details.<locals>.<listcomp>c                 S   r(   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   r2   E   s   zErrorDetail.__new__c                    sB   t ƒ  |¡}|tu rtS z	|o| j|jkW S  ty    | Y S w r0   )r1   Ú__eq__ÚNotImplementedr   ÚAttributeError©r5   ÚotherÚresultr6   r
   r   r8   J   s   ÿzErrorDetail.__eq__c                 C   s   |   |¡}|tu rtS | S r0   )r8   r9   r;   r
   r
   r   Ú__ne__S   s   
zErrorDetail.__ne__c                 C   s   dt | ƒ| jf S )NzErrorDetail(string=%r, code=%r))Ústrr   ©r5   r
   r
   r   Ú__repr__Y   s   þzErrorDetail.__repr__c                 C   s   t t| ƒƒS r0   )Úhashr?   r@   r
   r
   r   Ú__hash___   s   zErrorDetail.__hash__r0   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r2   r8   r>   rA   rC   Ú__classcell__r
   r
   r6   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 r0   )Údefault_detailr   r   r,   ©r5   r,   r   r
   r
   r   Ú__init__l   s
   zAPIException.__init__c                 C   ó
   t | jƒS r0   )r?   r,   r@   r
   r
   r   Ú__str__t   s   
zAPIException.__str__c                 C   rN   )ze
        Return only the code part of the error details.

        Eg. {"name": ["required"]}
        )r&   r,   r@   r
   r
   r   Ú	get_codesw   ó   
zAPIException.get_codesc                 C   rN   )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   rQ   zAPIException.get_full_details©NN)rD   rE   rF   rG   r   ÚHTTP_500_INTERNAL_SERVER_ERRORÚstatus_codeÚ_rK   r   rM   rO   rP   rR   r
   r
   r
   r   rI   c   s    
rI   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ƒrt|ƒ}nt|tƒs%t|tƒs%|g}t||ƒ| _d S r0   )rK   r   r   r   r   r   r   r,   rL   r
   r
   r   rM   ”   s   

zValidationError.__init__rS   )
rD   rE   rF   r   ÚHTTP_400_BAD_REQUESTrU   rV   rK   r   rM   r
   r
   r
   r   rW   �   s
    rW   c                   @   ó   e Zd ZejZedƒZdZdS )Ú
ParseErrorzMalformed request.Úparse_errorN)	rD   rE   rF   r   rY   rU   rV   rK   r   r
   r
   r
   r   r[   ¤   ó    r[   c                   @   rZ   )ÚAuthenticationFailedz%Incorrect authentication credentials.Úauthentication_failedN©	rD   rE   rF   r   ÚHTTP_401_UNAUTHORIZEDrU   rV   rK   r   r
   r
   r
   r   r^   ª   r]   r^   c                   @   rZ   )ÚNotAuthenticatedz-Authentication credentials were not provided.Únot_authenticatedNr`   r
   r
   r
   r   rb   °   r]   rb   c                   @   rZ   )ÚPermissionDeniedz2You do not have permission to perform this action.Úpermission_deniedN)	rD   rE   rF   r   ÚHTTP_403_FORBIDDENrU   rV   rK   r   r
   r
   r
   r   rd   ¶   r]   rd   c                   @   rZ   )ÚNotFoundz
Not found.Ú	not_foundN)	rD   rE   rF   r   ÚHTTP_404_NOT_FOUNDrU   rV   rK   r   r
   r
   r
   r   rg   ¼   r]   rg   c                       ó0   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                    ó,   |d u rt | jƒj|d�}tƒ  ||¡ d S )N)Úmethod©r   rK   Úformatr1   rM   )r5   rn   r,   r   r6   r
   r   rM   Ç   ó   zMethodNotAllowed.__init__rS   )rD   rE   rF   r   ÚHTTP_405_METHOD_NOT_ALLOWEDrU   rV   rK   r   rM   rH   r
   r
   r6   r   rk   Â   ó
    rk   c                       rj   )ÚNotAcceptablez,Could not satisfy the request Accept header.Únot_acceptableNc                    s   || _ tƒ  ||¡ d S r0   )Úavailable_renderersr1   rM   )r5   r,   r   rv   r6   r
   r   rM   Ò   s   zNotAcceptable.__init__©NNN)rD   rE   rF   r   ÚHTTP_406_NOT_ACCEPTABLErU   rV   rK   r   rM   rH   r
   r
   r6   r   rt   Í   rs   rt   c                       rj   )ÚUnsupportedMediaTypez1Unsupported media type "{media_type}" in request.Úunsupported_media_typeNc                    rm   )N)Ú
media_typero   )r5   r{   r,   r   r6   r
   r   rM   Ü   rq   zUnsupportedMediaType.__init__rS   )rD   rE   rF   r   ÚHTTP_415_UNSUPPORTED_MEDIA_TYPErU   rV   rK   r   rM   rH   r
   r
   r6   r   ry   ×   rs   ry   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.Ú	throttledNc              	      sj   |d u r	t | jƒ}|d ur)t |¡}d |t t| jj|d�| jj|d�|ƒƒf¡}|| _	t
ƒ  ||¡ d S )Nú )Úwait)r   rK   ÚmathÚceilÚjoinr   Úextra_detail_singularrp   Úextra_detail_pluralr€   r1   rM   )r5   r€   r,   r   r6   r
   r   rM   é   s   

þþzThrottled.__init__rw   )rD   rE   rF   r   ÚHTTP_429_TOO_MANY_REQUESTSrU   rV   rK   r„   r…   r   rM   rH   r
   r
   r6   r   r}   â   s    r}   c                 O   s   ddi}t |tjd�S )z$
    Generic 500 error handler.
    rJ   zServer Error (500)r   )r   r   rT   )ÚrequestÚargsÚkwargsr!   r
   r
   r   Úserver_error÷   ó   ÿrŠ   c                 O   s   ddi}t |tjd�S )z$
    Generic 400 error handler.
    rJ   zBad Request (400)r   )r   r   rY   )r‡   Ú	exceptionrˆ   r‰   r!   r
   r
   r   Úbad_request  r‹   r�   r0   )"rG   r�   Údjango.httpr   Údjango.utils.encodingr   Údjango.utils.translationr   rV   r   Úrest_frameworkr   Ú'rest_framework.utils.serializer_helpersr   r	   r   r&   r.   r?   r    Ú	ExceptionrI   rW   r[   r^   rb   rd   rg   rk   rt   ry   r}   rŠ   r�   r
   r
   r
   r   Ú<module>   s2    
$,

