
    `fR                     v   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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D             Z&d e&'                                D             Z( edd)                    d e(D                       z            Z* G d de+          Z,d Z-d Z.d6dZ/d Z0d Z1d  Z2d! Z3d" Z4d# Z5 G d$ d%e          Z6d& Z7d7d'Z8d7d(Z9d) Z:d8d+Z;d, Z<d- Z=d9d.Z> G d/ d0e+          Z?d1 Z@d2 ZAd3 ZBd4 ZCd5 ZDdS ):    N)defaultdict)reduce)or_)FieldDoesNotExist)modelsrouter)
LOOKUP_SEP)	Collector)pretty_name)NoReverseMatchreverse)formatstimezone)make_hashable)format_html)_lazy_re_compile)capfirst)ngettext)overridec                     i | ]}|d |z  	S )z_%02X ).0is     L/var/www/html/env/lib/python3.11/site-packages/django/contrib/admin/utils.py
<dictcomp>r      s    @@@Q!@@@    s   ":/_#?;@&=+$,"[]<>%
\c                 4    i | ]\  }}|t          |          S r   )chr)r   kvs      r   r   r      s$    777TQq#a&&777r   z_(?:%s)|c                 "    g | ]}|d d         S )   Nr   )r   xs     r   
<listcomp>r%      s     3O3O3OaAabbE3O3O3Or   c                       e Zd ZdZdS )FieldIsAForeignKeyColumnNamez/A field is a foreign key attname, i.e. <FK>_id.N)__name__
__module____qualname____doc__r   r   r   r'   r'      s        99Dr   r'   c                 4   |                     t                    }|D ]z}|dk    r| j        j        }	 |                     |          }t          |d          r0|j        }|d         j        } t          d |D                       r dS k# t          $ r Y ww xY wdS )zA
    Return True if the given lookup path spawns duplicates.
    pk
path_infosc              3   $   K   | ]}|j         V  d S N)m2m)r   paths     r   	<genexpr>z+lookup_spawns_duplicates.<locals>.<genexpr>4   s$      66Dtx666666r   TF)
splitr	   r-   name	get_fieldhasattrr.   to_optsanyr   )optslookup_pathlookup_fields
field_namefield	path_infos         r   lookup_spawns_duplicatesrA   !   s      %%j11M#    
J	 NN:..E
 ul++  !,	 },66I66666    44 ! 	 	 	H	 5s   B
BBc                 j    |                      |          }t          |t                    r|d         n|S )Nr/   )get
isinstancelist)
parameterskeyvalues      r   get_last_value_from_parametersrI   ;   s0    NN3E"5$//:599U:r   ,c                      t          |t                    r fd|D             S                      d          r|                              }n+                     d          r|                                dv}|S )zJ
    Return a lookup value prepared to be used in queryset filtering.
    c                 4    g | ]}t          |           S ))	separator)prepare_lookup_value)r   r    rG   rM   s     r   r%   z(prepare_lookup_value.<locals>.<listcomp>E   s)    QQQa$S!yAAAQQQr   __in__isnull) false0)rD   rE   endswithr5   lower)rG   rH   rM   s   ` `r   rN   rN   @   s     % RQQQQQ5QQQQ
||F 8I&&	j	!	! 8%77Lr   c                     t          j                    }|                                 D ])\  }|t          t          fd|D                       z  }*|S )Nc              3   D   K   | ]}t          j        |f          V  d S r1   )r   Q)r   itemparams     r   r4   z8build_q_object_from_lookup_parameters.<locals>.<genexpr>R   s1       U UT5$-!8!8 U U U U U Ur   )r   rX   itemsr   r   )rF   q_objectparam_item_listrZ   s      @r   %build_q_object_from_lookup_parametersr^   O   s`    xzzH","2"2"4"4 W WF3 U U U U_ U U UVVVOr   c                 d    t          | t                    r|                     t                    n| 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.
    )rD   str	translate	QUOTE_MAPss    r   quotere   V   s*     &03%7%7>1;;y!!!Q>r   c                 :    t                               d |           S )zUndo the effects of quote().c                 (    t           | d                  S )Nr   )UNQUOTE_MAP)ms    r   <lambda>zunquote.<locals>.<lambda>b   s    K!$5 r   )
UNQUOTE_REsubrc   s    r   unquoterm   `   s    >>55q999r   c                     g }| D ]I}t          |t          t          f          r|                    |           4|                    |           J|S )zS
    Return a list which is a single level of flattening of the original list.
    )rD   rE   tupleextendappend)fieldsflatr?   s      r   flattenrt   e   s]     D  edE]++ 	KKKKKr   c                 j    g }| D ]-\  }}|                     t          |d                              .|S )z?Return a list of field names from an admin fieldsets structure.rr   )rp   rt   )	fieldsetsfield_namesr6   r;   s       r   flatten_fieldsetsrx   r   sC    K 4 4
d74>223333r   c                   	
 	 | d         }t          j        |j        j                  }n"# t          $ r g i t                      g fcY S w xY wt          ||           }|                    |            t                      

fd	|                    	          }	fd|j	        D             }d |j
                                        D             }||
|fS )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| }                    |          r                    |                              |           s                    |j                   	 t          j	        d|j
        d|j        dd t          | j                  f          }n# t          $ r |cY S w xY wt          dt          |j                  ||           S |S )Nz: :__changez{}: <a href="{}">{}</a>)	__class___metar   verbose_nameis_registeredget_model_adminhas_delete_permissionaddr   r6   	app_label
model_namere   r-   r   r   )objmodelr;   no_edit_link	admin_url
admin_siteperms_neededrequests        r   format_callbackz,get_deleted_objects.<locals>.format_callback   s(   y#+D,=#>#>#>#>D##E** 	 --e44JJ  4   !2333	$#!I36]]$	 		 " $ $ $####$
 )8D4E+F+F	SV    s   <B? ?CCc                 &    g | ]} |          S r   r   )r   r   r   s     r   r%   z'get_deleted_objects.<locals>.<listcomp>   s#    EEE#%%EEEr   c                 H    i | ]\  }}|j         j        t          |           S r   )r   verbose_name_plurallen)r   r   objss      r   r   z'get_deleted_objects.<locals>.<dictcomp>   s9       E4 	'T  r   )r   db_for_writer   r   
IndexErrorsetNestedObjectscollectnested	protected
model_objsr[   )r   r   r   r   rz   	collector	to_deleter   model_countr   r   s    ``      @@r   get_deleted_objectsr   z   s%   51g #CIO44  ! ! !2suub    ! E$777Id55L             >   11IEEEE1DEEEI $/5577  K
 k<::s   - AA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                      t                      j        |i | i | _        t                      | _        t          t                    | _        d S r1   )super__init__edgesr   r   r   r   )selfargskwargsr   s      r   r   zNestedObjects.__init__   sD    $)&)))
%c**r   c                 b    | j                             |g                               |           d S r1   )r   
setdefaultrq   )r   sourcetargets      r   add_edgezNestedObjects.add_edge   s.    
fb))0088888r   Nc                 ^   |D ]}|rV|                     d          sA||j        j        |j        j        dz  }|                     t          ||          |           n|                     d |           | j        |j        j                                     |           	  t                      j
        |fd|i|S # t          j        $ r*}| j                            |j                   Y d }~d S d }~wt          j        $ r*}| j                            |j                   Y d }~d S d }~ww xY w)N+)classr   source_attr)rT   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   zNestedObjects.collect   se    		6 		6C );#7#7#<#< )*#\4!'!7. .   gc<88#>>>>dC(((OCIO,005555	8"577?4KK[KFKKK$ 	7 	7 	7N!!!"5666666666% 	8 	8 	8N!!!"6777777777	8s$    B< <D,C00D,D''D,c                 r    t                                          |||          } |j        d |D              S )Nc                     g | ]	}|j         
S r   )r6   )r   related_fields     r   r%   z1NestedObjects.related_objects.<locals>.<listcomp>   s    EEE]m EEEr   )r   related_objectsselect_related)r   related_modelrelated_fieldsr   qsr   s        r   r   zNestedObjects.related_objects   sA    WW$$]NDII r EEnEEE
 	
r   c                 "   ||v rg S |                     |           g }| j                            |d          D ],}|                    |                     |||                     -|r ||          g}n|g}|r|                    |           |S )Nr   )r   r   rC   rp   _nestedrq   )r   r   seenr   childrenchildrets          r   r   zNestedObjects._nested   s    $;;IZ^^C,, 	H 	HEOODLLoFFGGGG 	"?3''(CC%C 	!JJx   
r   c                     t                      }g }| j                            dd          D ],}|                    |                     |||                     -|S )z4
        Return the graph as a nested list.
        Nr   )r   r   rC   rp   r   )r   r   r   rootsroots        r   r   zNestedObjects.nested   s]     uuJNN4,, 	D 	DDLLdD/BBCCCCr   c                     dS )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	    
 ur   )NNr1   )r(   r)   r*   r   r   r   r   r   r   r   __classcell__)r   s   @r   r   r      s        + + + + +9 9 98 8 8 8 8 8$
 
 
 
 
           r   r   c                     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.
    )r   r   )rD   r   Modelbase	ModelBaser   queryQuerySetr   r   r   )r   r;   s     r   model_format_dictr      sm     #fk&;<== y	C.	/	/ y)#7  r   c                     t          | t          j        j                  r||                                 }| j        } t          |           }|d         |d         }}t          |||p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.
    Nr   r   r   )rD   r   r   r   countr   r   r   )r   ndsingularplurals        r   model_ngettextr     sk     #v|,-- 9		Ai#A(!,A*BfHHfaf1---r   c                    |j         }	 t          ||           }d }t          ||           }n# t          t          f$ r t          |           r| } ||          }nt          ||           r"| dk    rt          ||           } ||          }nft          ||           }t          |          r |            }n|}t          |d          r*t          |j        |           rt          |j        |           }d }Y nw xY w|||fS )N__str__r   )r   _get_non_gfk_fieldr   r   r'   callabler8   r   )r6   r   model_adminr;   fattrrH   s          r   lookup_fieldr     s4   9D#tT**( T"") ;<    D>> 	8DDIIEE[$'' 
	8DI,=,=;--DDIIEE3%%D~~ {G,, 89JD1Q1Q 8{0$77#* dE>s   , CC76C7c                     |                      |          }|j        r#|j        r|j        r|j        rt                      |j        r0|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)
r7   is_relationmany_to_oner   one_to_manyr   many_to_manyr8   r   r'   )r;   r6   r?   s      r   r   r   :  s     NN4  E" 
	" %*$7	" =B<M	"  !!! 	-"- E9%%- MT!!*,,,Lr   Fc                    d}	 t          |j        |           }	 |j        }n!# t          $ r |j        j        j        }Y nw xY wn# t
          $ r | dk    r"t          |j        j                  }t          }nVt          |           r| }nt          ||           rt          ||           }nt          ||           rt          ||           }nb|r| |j
        v r|j
        |          }nId| d|j        j        }|r|d|j        j        z  z  }|r|d|j        j        z  z  }t          |          t          |d          r|j        }nt          |t                     r2t          |d          r"t          |j        d          r|j        j        }nAt          |          r#|j        dk    rd	}n$t%          |j                  }nt%          |           }Y n t&          $ r t%          |           }| }Y nw xY w|r||fS |S )
ak  
    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. 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   zUnable to lookup 'z' on z or %sshort_descriptionfgetz<lambda>z--)r   r   r   AttributeErrorr   r   r`   r   r8   r   rr   object_namer   r(   r   rD   propertyr   r   r'   )	r6   r   r   return_attrformr   r?   labelmessages	            r   label_for_fieldr   W  sj    D0"5;55	;&EE 	; 	; 	;'-:EEE	;  &* &* &*9011EDD~~ .d++ .{D11%% .ud++ .$$+--{4( DDK++  Ix+*?*HHHG Bx$.*AAAG$W---t011 *.4***D&))* DI':;;*
 	3$ *=J.. EE'66EE#D))'   D!!  t}s6   A " A A A A  A F	G-G-,G-c                     d}	 t          |j        |           }t          |d          r|j        }n# t          t
          f$ r Y nw xY w|S )NrQ   	help_text)r   r   r8   r   r   r'   )r6   r   r   r?   s       r   help_text_for_fieldr     si    I("5;55 5+&& 	(I	 ;<   
 s   1 AAc                    ddl m} t          |dd           r	 t          |j                                      | |          S # t          $ rI t          |j                  }t          |           } t          |                              | |          cY S w xY wt          |t          j
                  r ||           S | |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          j                  r| rt1          d| j        |           S t          |t          j                  r?| r=	 t7          j        | d|j                  S # t          $ r t=          | |          cY S w xY wt=          | |          S )Nr   _boolean_iconflatchoicesz<a href="{}">{}</a>F)ensure_asciicls),django.contrib.admin.templatetags.admin_listr   r   dictr   rC   	TypeErrorr   rD   r   BooleanFieldDateTimeFieldr   localizer   template_localtime	DateField	TimeFieldDecimalFieldnumber_formatdecimal_placesIntegerField
FloatField	FileFieldr   url	JSONFieldjsondumpsencoderdisplay_for_value)rH   r?   empty_value_displayr   r   s        r   display_for_fieldr    sP   JJJJJJumT** =	E)**..u6IJJJ 	E 	E 	E'(9::K!%((E$$((0CDDDDD		E 
E6.	/	/ =}U###	""	E6/	0	0 = ;E B BCCC	EF,f.>?	@	@ =&&&	E6.	/	/ =$UE,@AAA	EF/1BC	D	D 
=$U+++	E6+	,	, = =0%)UCCC	E6+	,	, = =	A:e%U]KKKK 	A 	A 	A$U,?@@@@@	A !(;<<<s$   'A ABB7H H0/H0c                 v   ddl m} |r ||           S | |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                    d | D                       S t	          |           S )Nr   r   z, c              3   4   K   | ]}t          |          V  d S r1   )r`   )r   r    s     r   r4   z$display_for_value.<locals>.<genexpr>  s(      //AQ//////r   )r   r   rD   boolr`   datetimer   r  r   r  datetimeintdecimalDecimalfloatr	  rE   ro   join)rH   r  booleanr   s       r   r  r    s!   JJJJJJ }U###	""	E4	 	  5zz	E8,	-	- 	 ;E B BCCC	EHM8=9	:	: &&&	EC%8	9	9 $U+++	ED%=	)	) yy////////5zzr   c                       e Zd ZdS )NotRelationFieldN)r(   r)   r*   r   r   r   r#  r#    s        Dr   r#  c                 ^    t          | d          r| j        d         j        j        S t          )Nr.   r/   )r8   r.   r9   r   r#  )r?   s    r   get_model_from_relationr%    s.    ul## #+11r   c                    g }| }|                     t                    }|D ]}|j                            |          }t	          |          t	          |          dz
  k    r"	 t          |           n# t          $ r Y  ndw xY w|j        r/|j        r|j	        r!|
                                }|j        j        }n|j        j        }|j        }|                    d|           |t          j        |          fS )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   )r5   r	   r   r7   r   r%  r#  r   auto_createdconcreterelated_query_nameremote_fieldr   r?   r6   r   insertr   )r   r3   reversed_pathparentpiecespiecer?   r   s           r   reverse_field_pathr0    s    MFZZ
##F . .&&u--}Vq00'....#     	)e&8 	) 	) 3355L'-FF ;+L(FQ----JOM2233s   !A11
A?>A?c                     |                     t                    }g }|D ]I}|rt          |d                   }n| }|                    |j                            |                     J|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/   )r5   r	   r%  rq   r   r7   )r   r3   r.  rr   r/  r-  s         r   get_fields_from_pathr2    ss     ZZ
##FF 5 5 	,VBZ88FFFfl,,U334444Mr   c                 D   | j         }t          d          5  t          | |          }ddd           n# 1 swxY w Y   g }|r|                    di i           n | j         r|                    dd|ii           |r"t          d          5  |D ]}|j        D ]@}|                    dt          |j        j                  t          |          di           A|j        D ]]\  }}	|                    dt          |j        j                  t          |          t          |j	        d         |	          di           ^|j
        D ]@}
|                    dt          |
j        j                  t          |
          di           A	 ddd           n# 1 swxY w Y   |S )	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changedrr   )r6   objectr   )r6   r6  rr   deleted)changed_datatranslation_override#_get_changed_field_labels_from_formrq   new_objectsr`   r   r   changed_objectsformsdeleted_objects)r   formsetsr   r8  changed_field_labelschange_messageformsetadded_objectchanged_objectchanged_fieldsdeleted_objects              r   construct_change_messagerG    s    $L	d	#	# W W  C4VV	W W W W W W W W W W W W W W W N
 Mwm,,,,		 My85I*JKLLL  !$'' 	 	#  $+$7  L"))#(+L,>,K(L(L*-l*;*;& &    7>6M  2NN"))%(+N,@,M(N(N*-n*=*=*M$+M!$4n+" +"( (
 
 
 
 '.&=  N"))%(+N,@,M(N(N*-n*=*=( (   -	 	 	 	 	 	 	 	 	 	 	 	 	 	 	@ s   488C;FFFc                     g }|D ]L}	 | j         |         j        p|}n# t          $ r |}Y nw xY w|                    t	          |                     M|S r1   )rr   r   KeyErrorrq   r`   )r   r8  r@  r>   verbose_field_names        r   r:  r:  U  s    " = =
	,!%Z!8!>!L* 	, 	, 	,!+	,##C(:$;$;<<<<s   ,,)rJ   r1   )NFN)F)Er  r  r  collectionsr   	functoolsr   operatorr   django.core.exceptionsr   	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   r9  rb   r[   rh   r   rk   	Exceptionr'   rA   rI   rN   r^   re   rm   rt   rx   r   r   r   r   r   r   r   r   r  r  r#  r%  r0  r2  rG  r:  r   r   r   <module>r[     s      # # # # # #             4 4 4 4 4 4 $ $ $ $ $ $ $ $ 1 1 1 1 1 1 / / / / / / * * * * * * / / / / / / / / * * * * * * * * / / / / / / ) ) ) ) ) ) 6 6 6 6 6 6 & & & & & & - - - - - - E E E E E E@@%?@@@	77Y__%6%6777i#((3O3O;3O3O3O*P*PPQQ
	 	 	 	 	9 	 	 	  4; ; ;
     ? ? ?: : :

 
 
  9; 9; 9;x@ @ @ @ @I @ @ @F  &. . . .$   8  :> > > >B	 	 	"= "= "=J   *	 	 	 	 	y 	 	 	  4 4 4>  (6 6 6r         r   