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
   Q/var/www/ecommerce/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    
$,

