
    k"gT                        d dl Z d dl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lmZ d d	lmZ d d
lmZ d dlmZmZ d dlmZ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% d dl$m&Z' dD  ci c]  } | d| z  
 c} Z(e(jS                         D ci c]  \  }}| e*|       c}}Z+ e!ddjY                  e+D cg c]  }|dd 	 c}      z        Z- G d de.      Z/d Z0d Z1d4dZ2d Z3d Z4d Z5d  Z6d! Z7d" Z8 G d# d$e      Z9d% Z:d5d&Z;d5d'Z<d( Z=d6d)Z>d* Z?d+ Z@d7d,ZA G d- d.e.      ZBd/ ZCd0 ZDd1 ZEd2 ZFd3 ZGyc c} w c c}}w c c}w )8    N)defaultdict)reduce)or_)FieldDoesNotExist)EMPTY_VALUES)modelsrouter)
LOOKUP_SEP)	Collector)pretty_name)NoReverseMatchreverse)formatstimezone)make_hashable)format_html)_lazy_re_compile)capfirst)ngettext)overrides   ":/_#?;@&=+$,"[]<>%
\z_%02Xz_(?:%s)|   c                       e Zd ZdZy)FieldIsAForeignKeyColumnNamez/A field is a foreign key attname, i.e. <FK>_id.N)__name__
__module____qualname____doc__     S/var/www/html/djangosite/lib/python3.12/site-packages/django/contrib/admin/utils.pyr   r      s    9r    r   c                 ,   |j                  t              }|D ]k  }|dk(  r| j                  j                  }	 | j	                  |      }t        |d      s=|j                  }|d   j                  } t        d |D              sk y y# t        $ r Y zw xY w)zA
    Return True if the given lookup path spawns duplicates.
    pk
path_infosc              3   4   K   | ]  }|j                     y wN)m2m).0paths     r!   	<genexpr>z+lookup_spawns_duplicates.<locals>.<genexpr>5   s     6Dtxx6s   TF)
splitr
   r#   name	get_fieldhasattrr$   to_optsanyr   )optslookup_pathlookup_fields
field_namefield	path_infos         r!   lookup_spawns_duplicatesr8   "   s      %%j1M#  
J	 NN:.E
 ul+!,,	 },,6I66  ! "  ! 		s   B	BBc                 R    | j                  |      }t        |t              r|d   S |S )Nr%   )get
isinstancelist)
parameterskeyvalues      r!   get_last_value_from_parametersr@   <   s(    NN3E"5$/59:U:r    c                     t        |t              r|D cg c]  }t        | ||       c}S | j                  d      r|j	                  |      }|S | j                  d      r|j                         dv}|S c c}w )zJ
    Return a lookup value prepared to be used in queryset filtering.
    )	separator__in__isnull) false0)r;   r<   prepare_lookup_valueendswithr,   lower)r>   r?   rB   vs       r!   rH   rH   A   st     %KPQa$S!yAQQ
||FI& L 
j	!%77L Rs   A6c                     t        j                         }| j                         D ]!  \  }|t        t        fd|D              z  }# |S )Nc              3   L   K   | ]  }t        j                  |f        y wr'   )r   Q)r)   itemparams     r!   r+   z8build_q_object_from_lookup_parameters.<locals>.<genexpr>S   s      UT5$-!8 Us   !$)r   rN   itemsr   r   )r=   q_objectparam_item_listrP   s      @r!   %build_q_object_from_lookup_parametersrT   P   sI    xxzH","2"2"4 WF3 U_ UVVWOr    c                 P    t        | t              r| j                  t              S | S )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.
    )r;   str	translate	QUOTE_MAPss    r!   quoter[   W   s!     &03%71;;y!>Q>r    c                 0    t         j                  d |       S )zUndo the effects of quote().c                     t         | d      S )Nr   )UNQUOTE_MAP)ms    r!   <lambda>zunquote.<locals>.<lambda>c   s    K!$5 r    )
UNQUOTE_REsubrY   s    r!   unquoterc   a   s    >>5q99r    c                     g }| D ];  }t        |t        t        f      r|j                  |       +|j	                  |       = |S )zS
    Return a list which is a single level of flattening of the original list.
    )r;   r<   tupleextendappend)fieldsflatr6   s      r!   flattenrj   f   sE     D edE]+KKKK	
 Kr    c                 X    g }| D ]"  \  }}|j                  t        |d                $ |S )z?Return a list of field names from an admin fieldsets structure.rh   )rf   rj   )	fieldsetsfield_namesr-   r2   s       r!   flatten_fieldsetsrn   s   s7    K 4
d74>234r    c                    	 | d   }t        j                  |j                  j                        }t        ||       }|j                  |        t               fd}|j                  |      }|j                  D cg c]
  } ||       }}|j                  j                         D 	 ci c]%  \  }	} |	j                  j                  t        |       ' }
}	} ||
|fS # t        $ r g i t               g fcY S w xY wc c}w c c} }	w )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`` filter.
    r   )usingoriginc                    | j                   }| j                  }t        |j                        d| }j	                  |      rj                  |      j                  |       sj                  |j                         	 t        j                  d|j                  d|j                  dd t        | j                        f      }t        dt        |j                        ||       S |S # t        $ r |cY S w xY w)Nz: :__changez{}: <a href="{}">{}</a>)	__class___metar   verbose_nameis_registeredget_model_adminhas_delete_permissionaddr   r-   	app_label
model_namer[   r#   r   r   )objmodelr2   no_edit_link	admin_url
admin_siteperms_neededrequests        r!   format_callbackz,get_deleted_objects.<locals>.format_callback   s    yy#+D,=,=#>D##E*--e4JJ   !2!23	$#!I366]$		 )8D4E4E+F	SV    " $##$s   AC- -C;:C;)r	   db_for_writerw   r   
IndexErrorsetNestedObjectscollectnested	protected
model_objsrQ   verbose_name_plurallen)objsr   r   r   rp   	collectorr   	to_deleter   r   model_countr   s    ``        @r!   get_deleted_objectsr   {   s   51g ##CIIOO4E$7Id5L >   1I1:1D1DE#%EIE %//557E4 	''T2K 
 k<::_  !2sub  !R Fs   C" C?/*D"C<;C<c                   N     e Zd Z fdZd Zd fd	Z fdZd Zd	dZd Z	 xZ
S )
r   c                 x    t        |   |i | i | _        t               | _        t        t              | _        y r'   )super__init__edgesr   r   r   r   )selfargskwargsrv   s      r!   r   zNestedObjects.__init__   s1    $)&)
%c*r    c                 Z    | j                   j                  |g       j                  |       y r'   )r   
setdefaultrg   )r   sourcetargets      r!   add_edgezNestedObjects.add_edge   s!    

fb)008r    c                    |D ]  }|r^|j                  d      sM||j                  j                  |j                  j                  dz  }| j	                  t        ||      |       n| j	                  d |       | j                  |j                  j                     j                  |        	 t        | (  |fd|i|S # t        j                  $ r/}| j                  j                  |j                         Y d }~y d }~wt        j                   $ r/}| j                  j                  |j"                         Y d }~y d }~ww xY w)N+)classr}   source_attr)rI   rw   r~   r}   r   getattrr   r   r|   r   r   r   ProtectedErrorr   updateprotected_objectsRestrictedErrorrestricted_objects)	r   r   r   r   r   r   related_nameerv   s	           r!   r   zNestedObjects.collect   s    		6C;#7#7#<*#\\44!'!7!7.   gc<8#>dC(OOCIIOO,005		6	87?4K[KFKK$$ 	7NN!!!"5"566%% 	8NN!!!"6"677	8s$   .C   E%C==E%D==Ec                 ~    t         |   |||      } |j                  |D cg c]  }|j                   c} S c c}w r'   )r   related_objectsselect_relatedr-   )r   related_modelrelated_fieldsr   qsrelated_fieldrv   s         r!   r   zNestedObjects.related_objects   sB    W$]NDI r  6DE]m  E
 	
Es   :c                    ||v rg S |j                  |       g }| j                  j                  |d      D ]$  }|j                  | j	                  |||             & |r
 ||      g}n|g}|r|j                  |       |S )Nr   )r|   r   r:   rf   _nestedrg   )r   r   seenr   childrenchildrets          r!   r   zNestedObjects._nested   s    $;IZZ^^C, 	HEOODLLoFG	H"3'(C%CJJx 
r    c                     t               }g }| j                  j                  dd      D ]$  }|j                  | j	                  |||             & |S )z4
        Return the graph as a nested list.
        Nr   )r   r   r:   rf   r   )r   r   r   rootsroots        r!   r   zNestedObjects.nested   sN     uJJNN4, 	DDLLdD/BC	Dr    c                      y)z
        We always want to load the objects into memory so that we can display
        them to the user in confirm page.
        Fr   )r   r   r   s      r!   can_fast_deletezNestedObjects.can_fast_delete   s    
 r    )NNr'   )r   r   r   r   r   r   r   r   r   r   __classcell__)rv   s   @r!   r   r      s&    +98$
r    r   c                 0   t        | t        j                  t        j                  j                  f      r| j
                  }n=t        | t        j                  j                        r| j                  j
                  }n| }|j                  |j                  d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.
    )rx   r   )r;   r   Modelbase	ModelBaserw   queryQuerySetr   rx   r   )r   r2   s     r!   model_format_dictr      sl     #fkk&;&;<=yy	C..	/yy))#77 r    c                     t        | t        j                  j                        r|| j	                         }| j
                  } t        |       }|d   |d   }}t        |||xs d      S )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.
    rx   r   r   )r;   r   r   r   countr   r   r   )r   ndsingularplurals        r!   model_ngettextr     sb     #v||,,-9		Aii#A(!,A*BfHHfaf1--r    c                 0   |j                   }	 t        ||       }d }t        ||       }|||fS # t        t        f$ r t        |       r| } ||      }nt        ||       r| dk7  rt        ||       } ||      }nt               }t        || |      }t        |      r |       }n6||u r0|}| j                  t              D ]  }t        |||      }||u s Y y |}t        |d      r,t        |j                  |       rt        |j                  |       }d }Y w xY w)N__str__)NNNr   )rw   _get_non_gfk_fieldr   r   r   callabler/   objectr,   r
   r   )	r-   r   model_adminr2   fattrr?   sentinelparts	            r!   lookup_fieldr     s'   99D#tT*6 T"dE>9 ;<  D>DIE[$'DI,=;-DIExH3h/D~8#D $

: 6 4&tT8<8+#34 {G,9J9JD1Q{00$71s   - B$DD=DDc                    | j                  |      }|j                  r.|j                  r|j                  r|j                  r
t               |j                  r1|j                  s%t        |d      r|j                  |k(  r
t               |S )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)
r.   is_relationmany_to_oner   one_to_manyr   many_to_manyr/   r   r   )r2   r-   r6   s      r!   r   r   B  sw     NN4 E 

E$7$7E<M<M!! 	""E9%MMT!*,,Lr    c                 t   d}	 t        |j                  |       }	 |j                  }|r||fS |S # t        $ r# |j                  j                  j                  }Y 3w xY w# t
        $ r | dk(  r't        |j                  j                        }t        }nt        |       r| }nt        ||       rt        ||       }nt        ||       rt        ||       }n|r| |j                  v r|j                  |    }n	 t        ||       d   }nv# t
        t        f$ rd d|  d|j                  j                   }|r|d|j                  j                   z  }|r|d|j                  j                   z  }t        |      w xY wt        |d      r|j                   }nt#        |t$              r9t        |d      r-t        |j&                  d      r|j&                  j                   }n>t        |      r(|j                  d	k(  rd
}n!t)        |j                        }nt)        |       }Y t*        $ r t)        |       }| }Y w xY w)a  
    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   rw   rx   AttributeErrorr   r   rV   r   r/   r   rh   get_fields_from_pathNotRelationFieldobject_namerv   r   r   r;   propertyr   r   r   )	r-   r   r   return_attrformr   r6   labelmessages	            r!   label_for_fieldr   _  s    D0"5;;5	;&&E^ t}c  	;''--::E	;  &*9001ED~d+{D1%ud+$$++-{{4(2/t<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..4*D&)DII':;		33$==J. E'6E#D)' D!sM   A / )AA AA BH75DH7A3E88B#H7H76H7c                     d}	 t        |j                  |       }t        |d      r|j                  }|S # t        t
        f$ r Y |S w xY w)NrE   	help_text)r   rw   r/   r   r   r   )r-   r   r   r6   s       r!   help_text_for_fieldr     sY    I("5;;5 5+&I ;<  s   4 AAc                    ddl m} t        |dd       r&	 t        |j                        j                  | |      S t        |t        j                        r ||       S | |j                  v r|S t        |t        j                        r(t        j                  t        j                   |             S t        |t        j"                  t        j$                  f      rt        j                  |       S t        |t        j&                        r t        j(                  | |j*                        S t        |t        j,                  t        j.                  f      rt        j(                  |       S t        |t        j0                        r| rt3        d| j4                  |       S t        |t        j6                        r%| r#	 t9        j:                  | d|j<                        S t?        | |      S # t        $ r> t        |j                        }t        |       } t        |      j                  | |      cY S w xY w# t        $ r t?        | |      cY S w xY w)Nr   _boolean_iconflatchoicesz<a href="{}">{}</a>F)ensure_asciicls) ,django.contrib.admin.templatetags.admin_listr   r   dictr   r:   	TypeErrorr   r;   r   BooleanFieldempty_valuesDateTimeFieldr   localizer   template_localtime	DateField	TimeFieldDecimalFieldnumber_formatdecimal_placesIntegerField
FloatField	FileFieldr   url	JSONFieldjsondumpsencoderdisplay_for_value)r?   r6   empty_value_displayr   r   s        r!   display_for_fieldr    s   JumT*	E))*..u6IJJ 
E6..	/U##	%$$	$""	E6//	0 ; ;E BCC	EF,,f.>.>?	@&&	E6..	/$$UE,@,@AA	EF//1B1BC	D$$U++	E6++	,0%))UCC	E6++	,	A::e%U]]KK !(;<<9  	E'(9(9:K!%(E$((0CDD		E2  	A$U,?@@	As$   $G$ 6!H. $AH+*H+.IIc                 T   ddl m} |r ||       S | t        v r|S t        | t              rt        |       S t        | t        j                        r(t        j                  t        j                  |             S t        | t        j                  t        j                  f      rt        j                  |       S t        | t        t        j                  t         f      rt        j"                  |       S t        | t$        t&        f      rdj)                  d | D              S t        |       S )Nr   r   z, c              3   2   K   | ]  }t        |        y wr'   )rV   )r)   rK   s     r!   r+   z$display_for_value.<locals>.<genexpr>  s     /AQ/s   )r   r   r   r;   boolrV   datetimer   r   r   r   datetimeintdecimalDecimalfloatr  r<   re   join)r?   r  booleanr   s       r!   r  r    s    JU##	,	""	E4	 5z	E8,,	- ; ;E BCC	EHMM8==9	:&&	EC%8	9$$U++	ED%=	)yy////5zr    c                       e Zd Zy)r   N)r   r   r   r   r    r!   r   r     s    r    r   c                 l    t        | d      r#| j                  d   j                  j                  S t        )Nr$   r%   )r/   r$   r0   r   r   )r6   s    r!   get_model_from_relationr    s/    ul##++111r    c                    g }| }|j                  t              }|D ]  }|j                  j                  |      }t	        |      t	        |      dz
  k(  r	 t        |       |j                  r?|j                  r|j                  r'|j                         }|j                  j                  }n"|j                  j                  }|j                  }|j!                  d|        |t        j"                  |      fS # t        $ r Y  #w xY w)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   )r,   r
   rw   r.   r   r  r   r   auto_createdconcreterelated_query_nameremote_fieldr   r6   r-   r   insertr  )r   r*   reversed_pathparentpiecespiecer6   r   s           r!   reverse_field_pathr(    s     MFZZ
#F .&&u-}Vq0'.
 e&8&8 335L''--F ;;++L((FQ-!." JOOM233 $ s   C88	DDc                     |j                  t              }g }|D ]?  }|rt        |d         }n| }|j                  |j                  j                  |             A |S )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%   )r,   r
   r  rg   rw   r.   )r   r*   r&  rh   r'  r%  s         r!   r   r     s^     ZZ
#FF 5,VBZ8FFfll,,U345 Mr    c                 N   | j                   }t        d      5  t        | |      }ddd       g }|r|j                  di i       n!| j                   r|j                  ddii       |r"t        d      5  |D ]  }|j                  D ]>  }|j                  dt        |j                  j                        t        |      di       @ |j                  D ]Y  \  }}	|j                  dt        |j                  j                        t        |      t        |j                  d   |	      di       [ |j                  D ]>  }
|j                  dt        |
j                  j                        t        |
      di       @  	 ddd       |S |S # 1 sw Y   jxY w# 1 sw Y   |S xY w)	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.
    Naddedchangedrh   )r-   r   r   )r-   r   rh   deleted)changed_datatranslation_override#_get_changed_field_labels_from_formrg   new_objectsrV   rw   rx   changed_objectsformsdeleted_objects)r   formsetsr|   r.  changed_field_labelschange_messageformsetadded_objectchanged_objectchanged_fieldsdeleted_objects              r!   construct_change_messager=  %  s    $$L	d	# W  C4V	W N
wm,			y85I*JKL!$' 	# $+$7$7 L"))#(+L,>,>,K,K(L*-l*;& 7>6M6M 2NN"))%(+N,@,@,M,M(N*-n*=*M$+MM!$4n+"(
 '.&=&= N"))%(+N,@,@,M,M(N*-n*=(-	@ >YW W	@ s   F4DFFF$c                     g }|D ]:  }	 | j                   |   j                  xs |}|j                  t	        |             < |S # t        $ r |}Y +w xY wr'   )rh   r   KeyErrorrg   rV   )r   r.  r6  r5   verbose_field_names        r!   r0  r0  ^  sk    " =
	,!%Z!8!>!>!L* 	##C(:$;<=    	,!+	,s   AAA),r'   )NFN)F)Hr  r  r	  collectionsr   	functoolsr   operatorr   django.core.exceptionsr   django.core.validatorsr   	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.textr   django.utils.translationr   r   r/  rX   rQ   chrr^   r  ra   	Exceptionr   r8   r@   rH   rT   r[   rc   rj   rn   r   r   r   r   r   r   r   r   r  r  r   r  r(  r   r=  r0  )ikrK   xs   0000r!   <module>rW     sL      #   4 / $ 1 / * / * / ) 6 & - E%?@Q!^@	%.__%67TQq#a&y7i#((;3OaAabE3O*PPQ
	9 	4;
?:

9;x@I @F&.$ F:?D	"=J*	y 	4>(6r O A73Os   =E E	E