
    ^f                        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	Zd
 Zd 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 G d de          Z G d de          Z G d  d!e          Z G d" d#e          Zd$ Z 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                    t          | t          t          f          r;fd| D             }t          | t                    rt          || j                  S |S t          | t
                    rMfd|                                 D             }t          | t                    rt          || j                  S |S t          |           }t          | d          }t          ||          S )zw
    Descend into a nested data structure, forcing any
    lazy translation strings or strings into `ErrorDetail`.
    c                 0    g | ]}t          |          S  _get_error_details).0itemdefault_codes     K/var/www/html/env/lib/python3.11/site-packages/rest_framework/exceptions.py
<listcomp>z&_get_error_details.<locals>.<listcomp>   s1     
 
 
7;t\22
 
 
    )
serializerc                 8    i | ]\  }}|t          |          S r   r   )r   keyvaluer   s      r   
<dictcomp>z&_get_error_details.<locals>.<dictcomp>   s:     
 
 
U #E<88
 
 
r   code)
isinstancelisttupler
   r   dictitemsr	   r   getattrErrorDetail)datar   rettextr   s    `   r   r   r      s   
 $u&& 
 
 
 
?C
 
 
 dJ'' 	?cdo>>>>
	D$		 
 
 
 
"jjll
 
 
 dJ'' 	?cdo>>>>
T??D4..DtT"""r   c                     t          | t                    rd | D             S t          | t                    rd |                                 D             S | j        S )Nc                 ,    g | ]}t          |          S r   
_get_codesr   r   s     r   r   z_get_codes.<locals>.<listcomp>.   s     444T
4  444r   c                 4    i | ]\  }}|t          |          S r   r(   r   r   r   s      r   r   z_get_codes.<locals>.<dictcomp>0   s&    HHH:3Z&&HHHr   r   r   r   r    r   details    r   r)   r)   ,   s`    &$ I44V4444	FD	!	! IHHHHHH;r   c                     t          | t                    rd | D             S t          | t                    rd |                                 D             S | | j        dS )Nc                 ,    g | ]}t          |          S r   _get_full_detailsr*   s     r   r   z%_get_full_details.<locals>.<listcomp>6   s!    ;;;D!$'';;;r   c                 4    i | ]\  }}|t          |          S r   r2   r,   s      r   r   z%_get_full_details.<locals>.<dictcomp>8   s'    OOO*#u&u--OOOr   )messager   r-   r.   s    r   r3   r3   4   so    &$ P;;F;;;;	FD	!	! POOOOOO  r   c                   D     e Zd ZdZdZd fd	Z fdZd Zd Zd Z	 xZ
S )	r"   zA
    A string-like object that can additionally have a code.
    Nc                 Z    t                                          | |          }||_        |S N)super__new__r   )clsstringr   self	__class__s       r   r:   zErrorDetail.__new__E   s&    wwsF++	r   c                     t                                          |          }|t          u rt          S 	 |o| j        |j        k    S # t          $ r |cY S w xY wr8   )r9   __eq__NotImplementedr   AttributeError)r=   otherresultr>   s      r   r@   zErrorDetail.__eq__J   sf    &&^##!!	5di5:55 	 	 	MMM	s   A AAc                 R    |                      |          }|t          u rt          S | S r8   )r@   rA   )r=   rC   rD   s      r   __ne__zErrorDetail.__ne__S   s,    U##^##!!zr   c                 8    dt          |           d| j        dS )NzErrorDetail(string=z, code=))strr   r=   s    r   __repr__zErrorDetail.__repr__Y   s$     IIIIIII
 	
r   c                 :    t          t          |                     S r8   )hashrI   rJ   s    r   __hash__zErrorDetail.__hash___   s    CIIr   r8   )__name__
__module____qualname____doc__r   r:   r@   rF   rK   rN   __classcell__r>   s   @r   r"   r"   ?   s          D     
      
 
 
      r   r"   c                   T    e Zd ZdZej        Z ed          ZdZ	d	dZ
d Zd Z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                 T    || j         }|| j        }t          ||          | _        d S r8   )default_detailr   r   r/   r=   r/   r   s      r   __init__zAPIException.__init__l   s1    >(F<$D(66r   c                 *    t          | j                  S r8   )rI   r/   rJ   s    r   __str__zAPIException.__str__t   s    4;r   c                 *    t          | j                  S )ze
        Return only the code part of the error details.

        Eg. {"name": ["required"]}
        )r)   r/   rJ   s    r   	get_codeszAPIException.get_codesw   s     $+&&&r   c                 *    t          | j                  S )z
        Return both the message & code parts of the error details.

        Eg. {"name": [{"message": "This field is required.", "code": "required"}]}
        )r3   r/   rJ   s    r   get_full_detailszAPIException.get_full_details   s     !---r   NN)rO   rP   rQ   rR   r   HTTP_500_INTERNAL_SERVER_ERRORstatus_code_rY   r   r[   r]   r_   ra   r   r   r   rV   rV   c   s~          7KQ122NL7 7 7 7     ' ' '. . . . .r   rV   c                   >    e Zd Zej        Z ed          ZdZddZ	dS )ValidationErrorzInvalid input.invalidNc                     || j         }|| j        }t          |t                    rt	          |          }n-t          |t
                    st          |t                    s|g}t          ||          | _        d S r8   )rY   r   r   r   r   r   r   r/   rZ   s      r   r[   zValidationError.__init__   s|    >(F<$D fe$$ 	&\\FFFD)) 	*VT2J2J 	XF(66r   rb   )
rO   rP   rQ   r   HTTP_400_BAD_REQUESTrd   re   rY   r   r[   r   r   r   rg   rg      sE        -KQ'((NL7 7 7 7 7 7r   rg   c                   6    e Zd Zej        Z ed          ZdZdS )
ParseErrorzMalformed request.parse_errorN)	rO   rP   rQ   r   rj   rd   re   rY   r   r   r   r   rl   rl      s+        -KQ+,,N LLLr   rl   c                   6    e Zd Zej        Z ed          ZdZdS )AuthenticationFailedz%Incorrect authentication credentials.authentication_failedN	rO   rP   rQ   r   HTTP_401_UNAUTHORIZEDrd   re   rY   r   r   r   r   ro   ro      s+        .KQ>??N*LLLr   ro   c                   6    e Zd Zej        Z ed          ZdZdS )NotAuthenticatedz-Authentication credentials were not provided.not_authenticatedNrq   r   r   r   rt   rt      s+        .KQFGGN&LLLr   rt   c                   6    e Zd Zej        Z ed          ZdZdS )PermissionDeniedz2You do not have permission to perform this action.permission_deniedN)	rO   rP   rQ   r   HTTP_403_FORBIDDENrd   re   rY   r   r   r   r   rw   rw      s+        +KQKLLN&LLLr   rw   c                   6    e Zd Zej        Z ed          ZdZdS )NotFoundz
Not found.	not_foundN)	rO   rP   rQ   r   HTTP_404_NOT_FOUNDrd   re   rY   r   r   r   r   r{   r{      s(        +KQ|__NLLLr   r{   c                   H     e Zd Zej        Z ed          ZdZd fd	Z	 xZ
S )MethodNotAllowedzMethod "{method}" not allowed.method_not_allowedNc                     |(t          | j                                      |          }t                                          ||           d S )N)methodr   rY   formatr9   r[   )r=   r   r/   r   r>   s       r   r[   zMethodNotAllowed.__init__   sI    >t233::&:IIF&&&&&r   rb   )rO   rP   rQ   r   HTTP_405_METHOD_NOT_ALLOWEDrd   re   rY   r   r[   rS   rT   s   @r   r   r      sZ        4KQ788N'L' ' ' ' ' ' ' ' ' 'r   r   c                   H     e Zd Zej        Z ed          ZdZd fd	Z	 xZ
S )NotAcceptablez,Could not satisfy the request Accept header.not_acceptableNc                 Z    || _         t                                          ||           d S r8   )available_renderersr9   r[   )r=   r/   r   r   r>   s       r   r[   zNotAcceptable.__init__   s+    #6 &&&&&r   NNN)rO   rP   rQ   r   HTTP_406_NOT_ACCEPTABLErd   re   rY   r   r[   rS   rT   s   @r   r   r      sZ        0KQEFFN#L' ' ' ' ' ' ' ' ' 'r   r   c                   H     e Zd Zej        Z ed          ZdZd fd	Z	 xZ
S )UnsupportedMediaTypez1Unsupported media type "{media_type}" in request.unsupported_media_typeNc                     |(t          | j                                      |          }t                                          ||           d S )N)
media_typer   )r=   r   r/   r   r>   s       r   r[   zUnsupportedMediaType.__init__   sI    >t233::j:QQF&&&&&r   rb   )rO   rP   rQ   r   HTTP_415_UNSUPPORTED_MEDIA_TYPErd   re   rY   r   r[   rS   rT   s   @r   r   r      sZ        8KQJKKN+L' ' ' ' ' ' ' ' ' 'r   r   c                   t     e Zd Zej        Z ed          Z ed          Z ed          Z	dZ
d fd	Z xZS )	ThrottledzRequest was throttled.z$Expected available in {wait} second.z%Expected available in {wait} seconds.	throttledNc                 |   |t          | j                  }|yt          j        |          }d                    |t          t          | j                            |          | j                            |          |                    f          }|| _	        t                                          ||           d S )N )wait)r   rY   mathceiljoinr   extra_detail_singularr   extra_detail_pluralr   r9   r[   )r=   r   r/   r   r>   s       r   r[   zThrottled.__init__   s    >t233F9T??DXX(4#=#D#D$#D#O#O#'#;#B#B#B#M#M#') ) * *+ , ,F
 	&&&&&r   r   )rO   rP   rQ   r   HTTP_429_TOO_MANY_REQUESTSrd   re   rY   r   r   r   r[   rS   rT   s   @r   r   r      s|        3KQ/00NADEE!CDDL' ' ' ' ' ' ' ' ' 'r   r   c                 @    ddi}t          |t          j                  S )z$
    Generic 500 error handler.
    rW   zServer Error (500)r   )r   r   rc   )requestargskwargsr#   s       r   server_errorr      s)    
 	%D V%JKKKKr   c                 @    ddi}t          |t          j                  S )z$
    Generic 400 error handler.
    rW   zBad Request (400)r   )r   r   rj   )r   	exceptionr   r   r#   s        r   bad_requestr     s)    
 	$D V%@AAAAr   r8   )"rR   r   django.httpr   django.utils.encodingr   django.utils.translationr   re   r   rest_frameworkr   'rest_framework.utils.serializer_helpersr	   r
   r   r)   r3   rI   r"   	ExceptionrV   rg   rl   ro   rt   rw   r{   r   r   r   r   r   r   r   r   r   <module>r      s     $ $ $ $ $ $ + + + + + + 6 6 6 6 6 6 - - - - - - ! ! ! ! ! ! J J J J J J J J# # # #4    ! ! ! ! !# ! ! !H". ". ". ". ".9 ". ". ".X7 7 7 7 7l 7 7 7*! ! ! ! ! ! ! !+ + + + +< + + +' ' ' ' '| ' ' '' ' ' ' '| ' ' '    |   ' ' ' ' '| ' ' '' ' ' ' 'L ' ' '' ' ' ' '< ' ' '' ' ' ' ' ' ' '*L L LB B B B Br   