
    Nwg                        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!y)'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      rB| D cg c]  }t        ||       }}t        | t              rt	        || j
                        S |S t        | t              rV| j                         D ci c]  \  }}|t        ||       }}}t        | t              rt        || j
                        S |S t        |       }t        | d|      }t        ||      S c c}w c c}}w )zw
    Descend into a nested data structure, forcing any
    lazy translation strings or strings into `ErrorDetail`.
    )
serializercode)
isinstancelisttuple_get_error_detailsr
   r   dictitemsr	   r   getattrErrorDetail)datadefault_codeitemretkeyvaluetextr   s           P/var/www/horilla/myenv/lib/python3.12/site-packages/rest_framework/exceptions.pyr   r      s    
 $u&?C
7;t\2
 
 dJ'cdoo>>
	D$	 #jjl
U #E<88
 
 dJ'cdoo>>
T?D4.DtT""#

s   C#<C(c                     t        | t              r| D cg c]  }t        |       c}S t        | t              r-| j	                         D ci c]  \  }}|t        |       c}}S | j
                  S c c}w c c}}w N)r   r   
_get_codesr   r   r   detailr   r   r   s       r   r    r    ,   sc    &$-34T
4 44	FD	!9?H:3Z&&HH;; 5Hs   A3A8c                    t        | t              r| D cg c]  }t        |       c}S t        | t              r-| j	                         D ci c]  \  }}|t        |       c}}S | | j
                  dS c c}w c c}}w )N)messager   )r   r   _get_full_detailsr   r   r   r!   s       r   r%   r%   4   so    &$4:;D!$';;	FD	!@FO*#u&u--OO  <Os   A6A;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                 6    t         |   | |      }||_        |S r   )super__new__r   )clsstringr   self	__class__s       r   r)   zErrorDetail.__new__E   s    wsF+	    c                     t         |   |      }|t        u rt        S 	 |xr | j                  |j                  k(  S # t        $ r |cY S w xY wr   )r(   __eq__NotImplementedr   AttributeError)r,   otherresultr-   s      r   r0   zErrorDetail.__eq__J   sP    &^#!!	5dii5::55 	M	s   = A
Ac                 F    | j                  |      }|t        u rt        S | S r   )r0   r1   )r,   r3   r4   s      r   __ne__zErrorDetail.__ne__S   s&    U#^#!!zr.   c                 :    dt        |       d| j                  dS )NzErrorDetail(string=z, code=))strr   r,   s    r   __repr__zErrorDetail.__repr__Y   s    III
 	
r.   c                 *    t        t        |             S r   )hashr9   r:   s    r   __hash__zErrorDetail.__hash___   s    CIr.   r   )__name__
__module____qualname____doc__r   r)   r0   r6   r;   r>   __classcell__r-   s   @r   r   r   ?   s(     D

r.   r   c                   V    e Zd ZdZej
                  Z ed      ZdZ	d	dZ
d Zd Zd Zy)
APIExceptionz
    Base class for REST framework exceptions.
    Subclasses should provide `.status_code` and `.default_detail` properties.
    zA server error occurred.errorNc                 ^    || j                   }|| j                  }t        ||      | _        y r   )default_detailr   r   r"   r,   r"   r   s      r   __init__zAPIException.__init__l   s0    >((F<$$D(6r.   c                 ,    t        | j                        S r   )r9   r"   r:   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"   r:   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"}]}
        )r%   r"   r:   s    r   get_full_detailszAPIException.get_full_details   s     !--r.   NN)r?   r@   rA   rB   r   HTTP_500_INTERNAL_SERVER_ERRORstatus_code_rI   r   rK   rM   rO   rQ    r.   r   rF   rF   c   s8     77K12NL7 '.r.   rF   c                   @    e Zd Zej                  Z ed      ZdZddZ	y)ValidationErrorzInvalid input.invalidNc                     || j                   }|| j                  }t        |t              rt	        |      }n#t        |t
              st        |t              s|g}t        ||      | _        y r   )rI   r   r   r   r   r   r   r"   rJ   s      r   rK   zValidationError.__init__   s_    >((F<$$D fe$&\FFD)*VT2JXF(6r.   rR   )
r?   r@   rA   r   HTTP_400_BAD_REQUESTrT   rU   rI   r   rK   rV   r.   r   rX   rX      s"    --K'(NL7r.   rX   c                   8    e Zd Zej                  Z ed      ZdZy)
ParseErrorzMalformed request.parse_errorN)	r?   r@   rA   r   r[   rT   rU   rI   r   rV   r.   r   r]   r]      s    --K+,N Lr.   r]   c                   8    e Zd Zej                  Z ed      ZdZy)AuthenticationFailedz%Incorrect authentication credentials.authentication_failedN	r?   r@   rA   r   HTTP_401_UNAUTHORIZEDrT   rU   rI   r   rV   r.   r   r`   r`      s    ..K>?N*Lr.   r`   c                   8    e Zd Zej                  Z ed      ZdZy)NotAuthenticatedz-Authentication credentials were not provided.not_authenticatedNrb   rV   r.   r   re   re      s    ..KFGN&Lr.   re   c                   8    e Zd Zej                  Z ed      ZdZy)PermissionDeniedz2You do not have permission to perform this action.permission_deniedN)	r?   r@   rA   r   HTTP_403_FORBIDDENrT   rU   rI   r   rV   r.   r   rh   rh      s    ++KKLN&Lr.   rh   c                   8    e Zd Zej                  Z ed      ZdZy)NotFoundz
Not found.	not_foundN)	r?   r@   rA   r   HTTP_404_NOT_FOUNDrT   rU   rI   r   rV   r.   r   rl   rl      s    ++K|_NLr.   rl   c                   L     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_allowedc                 t    |%t        | j                        j                  |      }t        |   ||       y )N)methodr   rI   formatr(   rK   )r,   rs   r"   r   r-   s       r   rK   zMethodNotAllowed.__init__   s5    >t223::&:IF&r.   rR   )r?   r@   rA   r   HTTP_405_METHOD_NOT_ALLOWEDrT   rU   rI   r   rK   rC   rD   s   @r   rp   rp      s(    44K78N'L' 'r.   rp   c                   L     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_acceptablec                 4    || _         t        | 	  ||       y r   )available_renderersr(   rK   )r,   r"   r   r{   r-   s       r   rK   zNotAcceptable.__init__   s    #6 &r.   NNN)r?   r@   rA   r   HTTP_406_NOT_ACCEPTABLErT   rU   rI   r   rK   rC   rD   s   @r   rx   rx      s(    00KEFN#L' 'r.   rx   c                   L     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_typec                 t    |%t        | j                        j                  |      }t        |   ||       y )N)
media_typert   )r,   r   r"   r   r-   s       r   rK   zUnsupportedMediaType.__init__   s5    >t223::j:QF&r.   rR   )r?   r@   rA   r   HTTP_415_UNSUPPORTED_MEDIA_TYPErT   rU   rI   r   rK   rC   rD   s   @r   r   r      s(    88KJKN+L' 'r.   r   c                   l     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.	throttledc                 F   |t        | j                        }|pt        j                  |      }dj	                  |t        t        | j                  j                  |      | j                  j                  |      |            f      }|| _	        t        | -  ||       y )N )wait)r   rI   mathceiljoinr   extra_detail_singularru   extra_detail_pluralr   r(   rK   )r,   r   r"   r   r-   s       r   rK   zThrottled.__init__   s    >t223F99T?DXX(4#=#=#D#D$#D#O#'#;#;#B#B#B#M#') *+ ,F
 	&r.   r|   )r?   r@   rA   r   HTTP_429_TOO_MANY_REQUESTSrT   rU   rI   r   r   r   rK   rC   rD   s   @r   r   r      s@    33K/0NDECDL' 'r.   r   c                 @    ddi}t        |t        j                        S )z$
    Generic 500 error handler.
    rG   zServer Error (500)r   )r   r   rS   )requestargskwargsr   s       r   server_errorr      s&    
 	%D V%J%JKKr.   c                 @    ddi}t        |t        j                        S )z$
    Generic 400 error handler.
    rG   zBad Request (400)r   )r   r   r[   )r   	exceptionr   r   r   s        r   bad_requestr     s&    
 	$D V%@%@AAr.   r   )"rB   r   django.httpr   django.utils.encodingr   django.utils.translationr   rU   r   rest_frameworkr   'rest_framework.utils.serializer_helpersr	   r
   r   r    r%   r9   r   	ExceptionrF   rX   r]   r`   re   rh   rl   rp   rx   r   r   r   r   rV   r.   r   <module>r      s     $ + 6 - ! J#4!# !H".9 ".X7l 7*! !+< +'| ''| '| '| ''L ''< '' '*LBr.   