
    h                        S r SSKrSSKJr  SSKJr  SSKJr  SSKJ	r	  SSK
Jr  SSKJrJr  S&S	 jrS
 rS r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S  S!\5      r " S" S#\5      rS$ r S% r!g)'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           	         [        U [        [        45      (       aE  U  Vs/ s H  n[        X!5      PM     nn[        U [        5      (       a  [	        X0R
                  S9$ U$ [        U [        5      (       aX  U R                  5        VVs0 s H  u  pEU[        XQ5      _M     nnn[        U [        5      (       a  [        X0R
                  S9$ U$ [        U 5      n[        U SU5      n[        Xg5      $ s  snf s  snnf )zk
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           K/var/www/html/env/lib/python3.13/site-packages/rest_framework/exceptions.pyr   r      s    
 $u&&?C
?Ctt2t 	 
 dJ''coo>>
	D$		 #jjl
*
 #E88* 	 
 dJ''coo>>
T?D4.Dt""#

s   C1	C6c                    [        U [        5      (       a  U  Vs/ s H  n[        U5      PM     sn$ [        U [        5      (       a/  U R	                  5        VVs0 s H  u  p#U[        U5      _M     snn$ U R
                  $ s  snf s  snnf N)r   r   
_get_codesr   r   r   detailr   r   r   s       r   r    r    ,   so    &$-34VT
4 V44	FD	!	!9?H:3Z&&HH;; 5Hs   BBc                     [        U [        5      (       a  U  Vs/ s H  n[        U5      PM     sn$ [        U [        5      (       a/  U R	                  5        VVs0 s H  u  p#U[        U5      _M     snn$ U U R
                  S.$ s  snf s  snnf )N)messager   )r   r   _get_full_detailsr   r   r   r!   s       r   r%   r%   4   s{    &$4:;FD!$'F;;	FD	!	!@FO*#&u--OO  <Os   BB
c                   R   ^  \ rS rSrSrSrS
U 4S jjrU 4S jrS rS r	S r
S	rU =r$ )r   ?   z9
A string-like object that can additionally have a code.
Nc                 2   > [         TU ]  X5      nX#l        U$ r   )super__new__r   )clsstringr   self	__class__s       r   r*   ErrorDetail.__new__E   s    ws+	    c                    > [         TU ]  U5      nU[        L a  [        $  U=(       a    U R                  UR                  :H  $ ! [         a    Us $ f = fr   )r)   __eq__NotImplementedr   AttributeError)r-   otherresultr.   s      r   r2   ErrorDetail.__eq__J   sP    &^#!!	5dii5::55 	M	s   !A AAc                 P    U R                  U5      nU[        L a  [        $ U(       + $ r   )r2   r3   )r-   r5   r6   s      r   __ne__ErrorDetail.__ne__S   s&    U#^#!!zr0   c                 >    S[        U 5      < SU R                  < S3$ )NzErrorDetail(string=z, code=))strr   r-   s    r   __repr__ErrorDetail.__repr__Y   s    III
 	
r0   c                 *    [        [        U 5      5      $ r   )hashr=   r>   s    r   __hash__ErrorDetail.__hash___   s    CIr0   )r   r   )__name__
__module____qualname____firstlineno____doc__r   r*   r2   r9   r?   rC   __static_attributes____classcell__r.   s   @r   r   r   ?   s-     D

 r0   r   c                   `    \ rS rSrSr\R                  r\" S5      r	Sr
SS jrS rS rS	 rS
rg)APIExceptionc   zv
Base class for REST framework exceptions.
Subclasses should provide `.status_code` and `.default_detail` properties.
zA server error occurred.errorNc                 `    Uc  U R                   nUc  U R                  n[        X5      U l        g r   )default_detailr   r   r"   r-   r"   r   s      r   __init__APIException.__init__l   s.    >((F<$$D(6r0   c                 ,    [        U R                  5      $ r   )r=   r"   r>   s    r   __str__APIException.__str__t   s    4;;r0   c                 ,    [        U R                  5      $ )zM
Return only the code part of the error details.

Eg. {"name": ["required"]}
)r    r"   r>   s    r   	get_codesAPIException.get_codesw   s     $++&&r0   c                 ,    [        U R                  5      $ )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_detailsAPIException.get_full_details   s     !--r0   r"   NN)rE   rF   rG   rH   rI   r   HTTP_500_INTERNAL_SERVER_ERRORstatus_code_rR   r   rT   rW   rZ   r]   rJ    r0   r   rN   rN   c   s8     77K12NL7 '.r0   rN   c                   J    \ rS rSr\R
                  r\" S5      rSr	SS jr
Srg)ValidationError   zInvalid input.invalidNc                     Uc  U R                   nUc  U R                  n[        U[        5      (       a  [	        U5      nO-[        U[
        5      (       d  [        U[        5      (       d  U/n[        X5      U l        g r   )rR   r   r   r   r   r   r   r"   rS   s      r   rT   ValidationError.__init__   sf    >((F<$$D fe$$&\FFD))*VT2J2JXF(6r0   r_   r`   )rE   rF   rG   rH   r   HTTP_400_BAD_REQUESTrb   rc   rR   r   rT   rJ   rd   r0   r   rf   rf      s"    --K'(NL7r0   rf   c                   @    \ rS rSr\R
                  r\" S5      rSr	Sr
g)
ParseError   zMalformed request.parse_errorrd   N)rE   rF   rG   rH   r   rk   rb   rc   rR   r   rJ   rd   r0   r   rm   rm      s    --K+,N Lr0   rm   c                   @    \ rS rSr\R
                  r\" S5      rSr	Sr
g)AuthenticationFailed   z%Incorrect authentication credentials.authentication_failedrd   NrE   rF   rG   rH   r   HTTP_401_UNAUTHORIZEDrb   rc   rR   r   rJ   rd   r0   r   rq   rq      s    ..K>?N*Lr0   rq   c                   @    \ rS rSr\R
                  r\" S5      rSr	Sr
g)NotAuthenticated   z-Authentication credentials were not provided.not_authenticatedrd   Nrt   rd   r0   r   rw   rw      s    ..KFGN&Lr0   rw   c                   @    \ rS rSr\R
                  r\" S5      rSr	Sr
g)PermissionDenied   z2You do not have permission to perform this action.permission_deniedrd   N)rE   rF   rG   rH   r   HTTP_403_FORBIDDENrb   rc   rR   r   rJ   rd   r0   r   r{   r{      s    ++KKLN&Lr0   r{   c                   @    \ rS rSr\R
                  r\" S5      rSr	Sr
g)NotFound   z
Not found.	not_foundrd   N)rE   rF   rG   rH   r   HTTP_404_NOT_FOUNDrb   rc   rR   r   rJ   rd   r0   r   r   r      s    ++K|_NLr0   r   c                   X   ^  \ rS rSr\R
                  r\" S5      rSr	SU 4S jjr
SrU =r$ )MethodNotAllowed   zMethod "{method}" not allowed.method_not_allowedc                 n   > Uc"  [        U R                  5      R                  US9n[        TU ]  X#5        g )N)methodr   rR   formatr)   rT   )r-   r   r"   r   r.   s       r   rT   MethodNotAllowed.__init__   s3    >t223::&:IF&r0   rd   r`   )rE   rF   rG   rH   r   HTTP_405_METHOD_NOT_ALLOWEDrb   rc   rR   r   rT   rJ   rK   rL   s   @r   r   r      s(    44K78N'L' 'r0   r   c                   X   ^  \ rS rSr\R
                  r\" S5      rSr	SU 4S jjr
SrU =r$ )NotAcceptable   z,Could not satisfy the request Accept header.not_acceptablec                 0   > X0l         [        TU ]	  X5        g r   )available_renderersr)   rT   )r-   r"   r   r   r.   s       r   rT   NotAcceptable.__init__   s    #6 &r0   )r   NNN)rE   rF   rG   rH   r   HTTP_406_NOT_ACCEPTABLErb   rc   rR   r   rT   rJ   rK   rL   s   @r   r   r      s(    00KEFN#L' 'r0   r   c                   X   ^  \ rS rSr\R
                  r\" S5      rSr	SU 4S jjr
SrU =r$ )UnsupportedMediaType   z1Unsupported media type "{media_type}" in request.unsupported_media_typec                 n   > Uc"  [        U R                  5      R                  US9n[        TU ]  X#5        g )N)
media_typer   )r-   r   r"   r   r.   s       r   rT   UnsupportedMediaType.__init__   s3    >t223::j:QF&r0   rd   r`   )rE   rF   rG   rH   r   HTTP_415_UNSUPPORTED_MEDIA_TYPErb   rc   rR   r   rT   rJ   rK   rL   s   @r   r   r      s(    88KJKN+L' 'r0   r   c                   x   ^  \ rS rSr\R
                  r\" S5      r\" S5      r	\" S5      r
SrSU 4S jjrSrU =r$ )		Throttled   zRequest was throttled.z$Expected available in {wait} second.z%Expected available in {wait} seconds.	throttledc                 <  > Uc  [        U R                  5      nUbk  [        R                  " U5      nSR	                  U[        [        U R                  R                  US9U R                  R                  US9U5      5      45      nXl	        [        TU ]-  X#5        g )N wait)r   rR   mathceiljoinr   extra_detail_singularr   extra_detail_pluralr   r)   rT   )r-   r   r"   r   r.   s       r   rT   Throttled.__init__   s    >t223F99T?DXX(4#=#=#D#D$#D#O#'#;#;#B#B#B#M#') *+ ,F
 	&r0   r   r   )rE   rF   rG   rH   r   HTTP_429_TOO_MANY_REQUESTSrb   rc   rR   r   r   r   rT   rJ   rK   rL   s   @r   r   r      s@    33K/0NDECDL' 'r0   r   c                 :    SS0n[        U[        R                  S9$ )z
Generic 500 error handler.
rP   zServer Error (500)r   )r   r   ra   )requestargskwargsr   s       r   server_errorr      s&    
 	%D V%J%JKKr0   c                 :    SS0n[        U[        R                  S9$ )z
Generic 400 error handler.
rP   zBad Request (400)r   )r   r   rk   )r   	exceptionr   r   r   s        r   bad_requestr     s&    
 	$D V%@%@AAr0   r   )"rI   r   django.httpr   django.utils.encodingr   django.utils.translationr   rc   r   rest_frameworkr   'rest_framework.utils.serializer_helpersr	   r
   r   r    r%   r=   r   	ExceptionrN   rf   rm   rq   rw   r{   r   r   r   r   r   r   r   rd   r0   r   <module>r      s     $ + 6 - ! J#4!# !H".9 ".X7l 7*! !+< +'| ''| '| '| ''L ''< '' '*LBr0   