
    jZ                        S SK r S SK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KJrJr  S S	KJr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KJ r 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+  S SK,J-r-  S SK,J.r/  S V s0 s H  o SU -  _M
     sn r0\0Rc                  5        VVs0 s H  u  pU\2" U5      _M     snnr3\'" SSRi                  \3 Vs/ s H  o3SS PM	     sn5      -  5      r5 " S S\65      r7S r8S r9S7S jr:S  r;S! r<S" r=S# r>S$ r?S% r@ " S& S'\5      rAS( rBS8S) jrCS8S* jrDS+ rES9S, jrFS- rGS:S. jrHS:S/ jrI " S0 S1\65      rJS2 rKS3 rLS4 rMS5 rNS6 rOgs  sn f s  snnf s  snf );    N)defaultdict)reduce)or_)get_user_model)render_password_as_hash)FieldDoesNotExistValidationError)EMPTY_VALUESURLValidator)modelsrouter)
LOOKUP_SEP)	Collector)pretty_name)NoReverseMatchreverse)formatstimezone)make_hashable)format_html)_lazy_re_compile)
SafeString)capfirst)ngettext)overrides   ":/_#?;@&=+$,"[]<>%
\z_%02Xz_(?:%s)|   c                       \ rS rSrSrSrg)FieldIsAForeignKeyColumnName   z/A field is a foreign key attname, i.e. <FK>_id. N)__name__
__module____qualname____firstlineno____doc____static_attributes__r!       R/var/www/html/KUNJ/venv/lib/python3.13/site-packages/django/contrib/admin/utils.pyr   r      s    9r(   r   c                 L   UR                  [        5      nU Hx  nUS:X  a  U R                  R                  n U R	                  U5      n[        US5      (       a6  UR                  nUS   R                  n [        S U 5       5      (       a    gMx  Mz     g! [         a     M  f = f)z9
Return True if the given lookup path spawns duplicates.
pk
path_infosc              3   8   #    U  H  oR                   v   M     g 7fN)m2m).0paths     r)   	<genexpr>+lookup_spawns_duplicates.<locals>.<genexpr>8   s     6IDxxI   TF)
splitr   r+   name	get_fieldhasattrr,   to_optsanyr   )optslookup_pathlookup_fields
field_namefield	path_infos         r)   lookup_spawns_duplicatesrB   %   s      %%j1M#
J	 NN:.E
 ul++!,,	 },,6I666   7	 , $"  ! 		s   B
B#"B#c                 \    U R                  U5      n[        U[        5      (       a  US   $ U$ )Nr-   )get
isinstancelist)
parameterskeyvalues      r)   get_last_value_from_parametersrJ   ?   s+    NN3E"5$//59:U:r(   c           	         [        U[        5      (       a  U Vs/ s H  n[        XUS9PM     sn$ U R                  S5      (       a  UR	                  U5      nU$ U R                  S5      (       a  UR                  5       S;  nU$ s  snf )zB
Return a lookup value prepared to be used in queryset filtering.
)	separator__in__isnull) false0)rE   rF   prepare_lookup_valueendswithr6   lower)rH   rI   rL   vs       r)   rR   rR   D   s     %KPQ5a$SyA5QQ
||FI&
 L 
j	!	!%77L Rs   Bc                    ^ [         R                  " 5       nU R                  5        H#  u  mnU[        [        U4S jU 5       5      -  nM%     U$ )Nc              3   T   >#    U  H  n[         R                  " TU45      v   M     g 7fr/   )r   Q)r1   itemparams     r)   r3   8build_q_object_from_lookup_parameters.<locals>.<genexpr>W   s!      U_T5$-!8!8_s   %()r   rX   itemsr   r   )rG   q_objectparam_item_listrZ   s      @r)   %build_q_object_from_lookup_parametersr_   T   sB    xxzH","2"2"4F3 U_ UVV #5Or(   c                 Z    [        U [        5      (       a  U R                  [        5      $ U $ )a  
Ensure that primary key values do not confuse the admin URLs by escaping
any '/', '_' and ':' and similarly problematic characters.
Similar to urllib.parse.quote(), except that the quoting is slightly
different so that it doesn't get automatically unquoted by the web browser.
)rE   str	translate	QUOTE_MAPss    r)   quoterf   [   s$     &03%7%71;;y!>Q>r(   c                 0    [         R                  S U 5      $ )zUndo the effects of quote().c                     [         U S      $ )Nr   )UNQUOTE_MAP)ms    r)   <lambda>unquote.<locals>.<lambda>g   s    K!$5r(   )
UNQUOTE_REsubrd   s    r)   unquotero   e   s    >>5q99r(   c                     / nU  HB  n[        U[        [        45      (       a  UR                  U5        M1  UR	                  U5        MD     U$ )zK
Return a list which is a single level of flattening of the original list.
)rE   rF   tupleextendappend)fieldsflatr@   s      r)   flattenrv   j   sC     DedE]++KKKK	 
 Kr(   c                 Z    / nU  H"  u  p#UR                  [        US   5      5        M$     U$ )z?Return a list of field names from an admin fieldsets structure.rt   )rr   rv   )	fieldsetsfield_namesr7   r<   s       r)   flatten_fieldsetsrz   w   s0    K
74>23  r(   c                 (  ^^^^ SSK Jm   U S   n[        R                  " UR                  R
                  5      n[        X@S9nUR                  U 5        [        5       mUUUU4S jnUR                  U5      nUR                   Vs/ s H
  o6" U5      PM     nnUR                  R                  5        V	V s0 s H%  u  pU	R                  R                  [        U 5      _M'     n
n	n XzTU4$ ! [         a    / 0 [        5       / 4s $ f = fs  snf s  sn n	f )a  
Find all objects related to ``objs`` that should also be deleted. ``objs``
must be a homogeneous iterable of objects (e.g. a QuerySet).

Return a nested list of strings suitable for display in the
template with the ``unordered_list``
and ``truncated_unordered_list`` filters.
r   )EMPTY_VALUE_STRING)usingoriginc                 F  > U R                   nU R                  n[        UR                  5      < SU < 3nTR	                  U5      (       a  TR                  U5      R                  T	U 5      (       d  TR                  UR                  5         [        TR                  < SUR                  < SUR                  < S3S [        U R                  5      45      n[        [!        U 5      T5      n[#        S[        UR                  5      UU5      $ U$ ! [         a    Us $ f = f)Nz: :__changez{}: <a href="{}">{}</a>)	__class___metar   verbose_nameis_registeredget_model_adminhas_delete_permissionaddr   r7   	app_label
model_namerf   r+   r   display_for_valuera   r   )
objmodelr<   no_edit_link	admin_urlobj_displayr|   
admin_siteperms_neededrequests
         r)   format_callback,get_deleted_objects.<locals>.format_callback   s   yy#+D,=,=#>D##E**--e4JJ    !2!23	$#!I366]$		 ,CH6HIK)**+	    " $##$s   AD D D )django.contrib.admin.optionsr|   r   db_for_writer   r   
IndexErrorsetNestedObjectscollectnested	protected
model_objsr\   verbose_name_plurallen)objsr   r   r   r}   	collectorr   	to_deleter   r   model_countr|   r   s    ``        @@r)   get_deleted_objectsr      s    @51g ##CIIOO4E7Id5L!  ! F   1I1:1D1DE1D#%1DIE %//5577KE 	''T27  
 <::g  !2sub  !Z Fs   C+ D	7,D+DDc                   b   ^  \ rS rSrSS.U 4S jjrS rSU 4S jjrU 4S jrS rSS	 jr	S
r
U =r$ )r      T)force_collectionc                ~   > [         TU ]  " USU0UD6  0 U l        [        5       U l        [        [        5      U l        g )Nr   )super__init__edgesr   r   r   r   )selfr   argskwargsr   s       r)   r   NestedObjects.__init__   s7    $L1ALVL
%c*r(   c                 Z    U R                   R                  U/ 5      R                  U5        g r/   )r   
setdefaultrs   )r   sourcetargets      r)   add_edgeNestedObjects.add_edge   s!    

fb)008r(   c                   > U H  nU(       ab  UR                  S5      (       dL  UUR                  R                  UR                  R                  S.-  nU R	                  [        XV5      U5        OU R	                  S U5        U R                  UR                  R                     R                  U5        M      [        TU ](  " U4SU0UD6$ ! [        R                   a/  nU R                  R                  UR                  5         S nAg S nAf[        R                    a/  nU R                  R                  UR"                  5         S nAg S nAff = f)N+)classr   source_attr)rS   r   r   r   r   getattrr   r   r   r   r   r   ProtectedErrorr   updateprotected_objectsRestrictedErrorrestricted_objects)	r   r   r   r   r   r   related_nameer   s	           r)   r   NestedObjects.collect   s   C;#7#7#<#<*#\\44!'!7!7.   gc8#>dC(OOCIIOO,005 	87?4K[KFKK$$ 	7NN!!!"5"566%% 	8NN!!!"6"677	8s$   9C E %D

E!%EEc                    > [         TU ]  XU5      nUR                  " U Vs/ s H  oUR                  PM     sn6 $ s  snf r/   )r   related_objectsselect_relatedr7   )r   related_modelrelated_fieldsr   qsrelated_fieldr   s         r)   r   NestedObjects.related_objects   s@    W$]DI  6DEn]  nE
 	
Es   ;c                    X;   a  / $ UR                  U5        / nU R                  R                  US5       H$  nUR                  U R	                  XRU5      5        M&     U(       a
  U" U5      /nOU/nU(       a  UR                  U5        U$ )Nr!   )r   r   rD   rr   _nestedrs   )r   r   seenr   childrenchildrets          r)   r   NestedObjects._nested   sw    ;IZZ^^C,EOODLLoFG -"3'(C%CJJx 
r(   c                     [        5       n/ nU R                  R                  SS5       H$  nUR                  U R	                  XBU5      5        M&     U$ )z$
Return the graph as a nested list.
Nr!   )r   r   rD   rr   r   )r   r   r   rootsroots        r)   r   NestedObjects.nested   sE     uJJNN4,DLLd/BC -r(   )r   r   r   )NNr/   )r"   r#   r$   r%   r   r   r   r   r   r   r'   __classcell__)r   s   @r)   r   r      s.    /3 + +98$
 r(   r   c                 D   [        U [        R                  [        R                  R                  45      (       a  U R
                  nOB[        U [        R                  R                  5      (       a  U R                  R
                  nOU nUR                  UR                  S.$ )z
Return a `dict` with keys 'verbose_name' and 'verbose_name_plural',
typically for use with string formatting.

`obj` may be a `Model` instance, `Model` subclass, or `QuerySet` instance.
)r   r   )rE   r   Modelbase	ModelBaser   queryQuerySetr   r   r   )r   r<   s     r)   model_format_dictr      sr     #fkk&;&;<==yy	C..	/	/yy))#77 r(   c                     [        U [        R                  R                  5      (       a  Uc  U R	                  5       nU R
                  n [        U 5      nUS   US   pC[        X4U=(       d    S5      $ )a  
Return the appropriate `verbose_name` or `verbose_name_plural` value for
`obj` depending on the count `n`.

`obj` may be a `Model` instance, `Model` subclass, or `QuerySet` instance.
If `obj` is a `QuerySet` instance, `n` is optional and the length of the
`QuerySet` is used.
r   r   r   )rE   r   r   r   countr   r   r   )r   ndsingularplurals        r)   model_ngettextr     sa     #v||,,--9		Aii#A(!,A*BfHaf1--r(   c                 b   UR                   n [        X05      nS n[        X5      nXEU4$ ! [        [        4 a    S n[        U 5      (       a  U nU" U5      n N2[        X 5      (       a  U S:w  a  [        X 5      nU" U5      n N][        5       n[        XU5      n[        U5      (       a  U" 5       nO7XWL a1  UnU R                  [        5       H  n[        XXU5      nXWL d  M     g   Un[        US5      (       a1  [        UR                  U 5      (       a  [        UR                  U 5      n GNf = f)N__str__)NNNr   )r   _get_non_gfk_fieldr   r   r   callabler9   objectr6   r   r   )	r7   r   model_adminr<   fattrrI   sentinelparts	            r)   lookup_fieldr   #  s   99D#t*6 "E>9 ;< 8 D>>DIE[''DI,=;-DIExH3h/D~~#D $

: 6&t8<+#3 !7 {G,,9J9JD1Q1Q{00$718s)   * ,D.)D.AD.!D.$AD.-D.c                 ^   U R                  U5      nUR                  (       a=  UR                  (       a  UR                  (       a  UR                  (       a
  [        5       eUR                  (       a<  UR                  (       d+  [        US5      (       a  UR                  U:X  a
  [        5       eU$ )a   
For historical reasons, the admin app relies on GenericForeignKeys as being
"not found" by get_field(). This could likely be cleaned up.

Reverse relations should also be excluded as these aren't attributes of the
model (rather something like `foo_set`).
attname)
r8   is_relationmany_to_oner   one_to_manyr   many_to_manyr9   r   r   )r<   r7   r@   s      r)   r   r   F  sz     NN4 E 

E$7$7E<M<M!! 	""E9%%MMT!*,,Lr(   c                    Sn [        UR                  U 5      n UR                  nU(       a  Xu4$ U$ ! [         a#    UR                  R                  R                  n N8f = f! [
         Ga    U S:X  a'  [        UR                  R                  5      n[        n Nt[        U 5      (       a  U nO[        X 5      (       a  [        X 5      nO[        X5      (       a  [        X5      nOU(       a  XR                  ;   a  UR                  U    nO [        X5      S   nO! [
        [        4 an    SU  SUR                  R                   3nU(       a  USUR                  R                   3-  nU(       a  USUR                  R                   3-  n[        U5      ef = f[        US5      (       a  UR                   n GN[#        U[$        5      (       aE  [        US5      (       a4  [        UR&                  S5      (       a  UR&                  R                   n GN[        U5      (       a-  UR                  S	:X  a  S
n GN[)        UR                  5      n GN-[)        U 5      n GN;[*         a    [)        U 5      nU n GNTf = f)au  
Return a sensible label for a field name. The name can be a callable,
property (but not created with @property decorator), or the name of an
object's attribute, as well as a model field, including across related
objects. If return_attr is True, also return the resolved attribute
(which could be a callable). This will be None if (and only if) the name
refers to a field.
Nr   r-   zUnable to lookup 'z' on z or short_descriptionfgetz<lambda>z--)r   r   r   AttributeErrorr   r   ra   r   r9   r   rt   get_fields_from_pathNotRelationFieldobject_namer   r"   r   rE   propertyr   r   r   )	r7   r   r   return_attrformr   r@   labelmessages	            r)   label_for_fieldr  c  s    D0"5;;5	;&&E^ }c  	;''--::E	;  &*9001ED~~++{1%%u+$++-{{4(2/<R@D)+;< 2 24&ekk>U>U=VWG"T+*?*?*H*H)I#JJT$..*A*A)B#CC(112 t011..4**D&))DII':;;		33$==J. E'6E#D)' D!sk   A# 3 *A A# A  A# #6I<A1I<DI<A>F I<=AI<"I<<I<I<"I<;I<c                     Sn [        UR                  U 5      n[        US5      (       a  UR                  nU$ ! [        [
        4 a     U$ f = f)NrO   	help_text)r   r   r9   r  r   r   )r7   r   r  r@   s       r)   help_text_for_fieldr    s\    I("5;;5 5+&&I ;<  s   9 AAc                    SSK Jn  SSKJn  UR                  S:X  a#  UR
                  [        5       :X  a  [        U 5      $ [        USS 5      (       a%   [        UR                  5      R                  X5      $ [        U[        R                   5      (       a   [        X5      (       a  U" S 5      $ U" U 5      $ XR"                  ;   d  [        X5      (       a  U$ [        U[        R$                  5      (       a*  [&        R(                  " [*        R,                  " U 5      5      $ [        U[        R.                  [        R0                  45      (       a  [&        R(                  " U 5      $ [        U[        R2                  5      (       a   [&        R4                  " XR6                  5      $ [        U[        R8                  [        R:                  45      (       a  [&        R4                  " U 5      $ [        U[        R<                  5      (       a%  U (       a  U(       d  [?        SU R@                  U 5      $ [        U[        RB                  5      (       a+  U (       a$  U(       d   [E        5       " U 5        [?        SX 5      $ [        U[        RJ                  5      (       a(  U (       a!   [L        RN                  " U SURP                  S9$ [I        X5      $ ! [         a=    [        UR                  5      n[        U 5      n [        U5      R                  X5      s $ f = f! [F         a    [I        X5      s $ f = f! [         a    [I        X5      s $ f = f)	Nr   _boolean_iconDatabaseDefaultpasswordflatchoicesz<a href="{}">{}</a>F)ensure_asciicls)),django.contrib.admin.templatetags.admin_listr
  django.db.models.expressionsr  r7   r   r   r   r   dictr  rD   	TypeErrorr   rE   r   BooleanFieldempty_valuesDateTimeFieldr   localizer   template_localtime	DateField	TimeFieldDecimalFieldnumber_formatdecimal_placesIntegerField
FloatField	FileFieldr   urlURLFieldr   r	   r   	JSONFieldjsondumpsencoder)rI   r@   empty_value_display
avoid_linkr
  r  r  s          r)   display_for_fieldr*    s   J<zzZEKK>3C$C&u--	t	,	,	E))*..uJJ 
E6..	/	/e-- &&U##	$$	$
5(J(J""	E6//	0	0 ; ;E BCC	EF,,f.>.>?	@	@&&	E6..	/	/$$U,@,@AA	EF//1B1BC	D	D$$U++	E6++	,	,z0%))UCC	E6??	+	+j
	AN5! 0%??	E6++	,	,	A::e%U]]KK !<<Q  	E'(9(9:K!%(E$((DD		E>  	A$U@@	A  	A$U@@	As7   #K	 L L. 	ALLL+*L+.MMc                    SSK Jn  SSKJn  U(       a*  U [        ;   d  [        X5      (       a  U" S 5      $ U" U 5      $ [        U [        5      (       a%  [        U [        5      (       d  U R                  5       n U [        ;   d  [        X5      (       a  U$ [        U [        5      (       a  [        U 5      $ [        U [        R                  5      (       a*  [        R                  " [        R                  " U 5      5      $ [        U [        R                  [        R                   45      (       a  [        R                  " U 5      $ [        U ["        [$        R&                  [(        45      (       a  [        R*                  " U 5      $ [        U [,        [.        45      (       a  SR1                  S U  5       5      $ [        U 5      $ )Nr   r	  r  z, c              3   8   #    U  H  n[        U5      v   M     g 7fr/   )ra   )r1   rU   s     r)   r3   $display_for_value.<locals>.<genexpr>  s     /AQr5   )r  r
  r  r  r
   rE   ra   r   stripbooldatetimer   r  r   r  datetimeintdecimalDecimalfloatr  rF   rq   join)rI   r(  booleanr
  r  s        r)   r   r     s9   J<L Ju$F$F &&U##%j
&C&C
5 B B""	E4	 	 5z	E8,,	-	- ; ;E BCC	EHMM8==9	:	:&&	EC%8	9	9$$U++	ED%=	)	)yy////5zr(   c                       \ rS rSrSrg)r   i  r!   N)r"   r#   r$   r%   r'   r!   r(   r)   r   r     s    r(   r   c                 v    [        U S5      (       a#  U R                  S   R                  R                  $ [        e)Nr,   r-   )r9   r,   r:   r   r   )r@   s    r)   get_model_from_relationr;    s2    ul###++111r(   c                 :   / nU nUR                  [        5      nU H  nUR                  R                  U5      n[	        U5      [	        U5      S-
  :X  a   [        U5        UR                  (       aI  UR                  (       a  UR                  (       a'  UR                  5       nUR                  R                  nO"UR                  R                  nUR                  nUR!                  SU5        M     U[        R"                  " U5      4$ ! [         a       M&  f = f)zCreate a reversed field path.

E.g. Given (Order, "user__groups"),
return (Group, "user__order").

Final field must be a related model, not a data field.
r   r   )r6   r   r   r8   r   r;  r   r   auto_createdconcreterelated_query_nameremote_fieldr   r@   r7   r   insertr7  )r   r2   reversed_pathparentpiecespiecer@   r   s           r)   reverse_field_pathrF  
  s     MFZZ
#F&&u-}Vq0'.
 e&8&8 335L''--F ;;++L((FQ-! " JOOM233 $ s   D
DDc                     UR                  [        5      n/ nU HE  nU(       a  [        US   5      nOU nUR                  UR                  R                  U5      5        MG     U$ )a"  Return list of Fields given path relative to model.

e.g. (ModelX, "user__groups__name") -> [
    <django.db.models.fields.related.ForeignKey object at 0x...>,
    <django.db.models.fields.related.ManyToManyField object at 0x...>,
    <django.db.models.fields.CharField object at 0x...>,
]
r-   )r6   r   r;  rs   r   r8   )r   r2   rD  rt   rE  rC  s         r)   r   r   )  sY     ZZ
#FF,VBZ8FFfll,,U34  Mr(   c                 v   / nU(       a  UR                  S0 05        OGU R                  =n(       a4  [        S5         [        X5      nSSS5        UR                  SSW005        U(       Ga(  [        S5         U GH  nUR                   H?  nUR                  S[        UR                  R                  5      [        U5      S.05        MA     UR                   HY  u  pUR                  S[        UR                  R                  5      [        U5      [        UR                  S   U	5      S.05        M[     UR                   H?  n
UR                  S[        U
R                  R                  5      [        U
5      S.05        MA     GM     SSS5        U$ U$ ! , (       d  f       GNV= f! , (       d  f       U$ = f)	z
Construct a JSON structure describing changes from a changed object.
Translations are deactivated so that strings are stored untranslated.
Translation happens later on LogEntry access.
addedNchangedrt   )r7   r   r   )r7   r   rt   deleted)rs   changed_datatranslation_override#_get_changed_field_labels_from_formnew_objectsra   r   r   changed_objectsformsdeleted_objects)r  formsetsr   change_messagerL  changed_field_labelsformsetadded_objectchanged_objectchanged_fieldsdeleted_objects              r)   construct_change_messager[  =  s    N
wm,
 **	*	*!$' $G$ 	 ( 	y85I*JKL!$'#$+$7$7L"))#(+L,>,>,K,K(L*-l*;& %8 7>6M6M2N"))%(+N,@,@,M,M(N*-n*=*M$+MM!$4n+"(
 7N '.&=&=N"))%(+N,@,@,M,M(N*-n*=( '>- $ (@ >S (' ('@ s   F8DF)
F&)
F8c                     / nU H@  n U R                   U   R                  =(       d    UnUR                  [	        U5      5        MB     U$ ! [         a    Un N.f = fr/   )rt   r  KeyErrorrs   ra   )r  rL  rU  r?   verbose_field_names        r)   rN  rN  w  sf    "
	,!%Z!8!>!>!L* 	##C(:$;< #    	,!+	,s   "AAA),r/   )NFN)F)Pr0  r4  r%  collectionsr   	functoolsr   operatorr   django.contrib.authr   %django.contrib.auth.templatetags.authr   django.core.exceptionsr   r	   django.core.validatorsr
   r   	django.dbr   r   django.db.models.constantsr   django.db.models.deletionr   django.forms.utilsr   django.urlsr   r   django.utilsr   r   django.utils.hashabler   django.utils.htmlr   django.utils.regex_helperr   django.utils.safestringr   django.utils.textr   django.utils.translationr   r   rM  rc   r\   chrri   r7  rm   	Exceptionr   rB   rJ   rR   r_   rf   ro   rv   rz   r   r   r   r   r   r   r  r  r*  r   r   r;  rF  r   r[  rN  )ikrU   xs   0000r)   <module>rx     s^      #   . I E = $ 1 / * / * / ) 6 . & - E%?@%?!^%?@	%.__%67%6TQq#a&y%67i#((;3O;aabE;3O*PPQ
	9 	4;
 ?:

@;F9I 9x&.$ F:?D	1=h4	y 	4>(7t { A73Os   E.8E3#E9