
    DvgT                        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D             Z(d e()                                D             Z* e!dd+                    d e*D                       z            Z, G d de-          Z.d Z/d Z0d7dZ1d Z2d  Z3d! Z4d" Z5d# Z6d$ Z7 G d% d&e          Z8d' Z9d8d(Z:d8d)Z;d* Z<d9d,Z=d- Z>d. Z?d:d/Z@ G d0 d1e-          ZAd2 ZBd3 ZCd4 ZDd5 ZEd6 ZFdS );    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)overridec                     i | ]}|d |z  	S )z_%02X ).0is     W/var/www/pixelcanvas.ch/venv/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>5   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_duplicatesrB   "   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 )Nr0   )get
isinstancelist)
parameterskeyvalues      r   get_last_value_from_parametersrJ   <   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!   rH   rN   s     r   r&   z(prepare_lookup_value.<locals>.<listcomp>F   s)    QQQa$S!yAAAQQQr   __in__isnull) false0)rE   rF   endswithr6   lower)rH   rI   rN   s   ` `r   rO   rO   A   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 r2   )r   Q)r   itemparams     r   r5   z8build_q_object_from_lookup_parameters.<locals>.<genexpr>S   s1       U UT5$-!8!8 U U U U U Ur   )r   rY   itemsr   r   )rG   q_objectparam_item_listr[   s      @r   %build_q_object_from_lookup_parametersr_   P   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.
    )rE   str	translate	QUOTE_MAPss    r   quoterf   W   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>c   s    K!$5 r   )
UNQUOTE_REsubrd   s    r   unquotern   a   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.
    )rE   rF   tupleextendappend)fieldsflatr@   s      r   flattenru   f   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.rs   )rq   ru   )	fieldsetsfield_namesr7   r<   s       r   flatten_fieldsetsry   s   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   r7   	app_label
model_namerf   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   r{   	collector	to_deleter   model_countr   r   s    ``      @@r   get_deleted_objectsr   {   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 r2   )super__init__edgesr   r   r   r   )selfargskwargsr   s      r   r   zNestedObjects.__init__   sD    $)&)))
%c**r   c                 b    | j                             |g                               |           d S r2   )r   
setdefaultrr   )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)rU   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   )r7   )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   rD   rq   _nestedrr   )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   rD   rq   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   )NNr2   )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   )rE   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   )rE   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          ||           } ||          }nt                      }t          || |          }t          |          r |            }n>||u r8|}|                     t                    D ]}t          |||          }||u r Y dS |}t          |d          r*t          |j
        |           rt          |j
        |           }d }Y nw xY w|||fS )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   9D#tT**6 T""7 ;<    D>> 	8DDIIEE[$'' 	8DI,=,=;--DDIIEExxH3h//D~~ 	8##D $

: 6 6 4 4&tT8<<8++#3#3#3#3 ,{G,, 89JD1Q1Q 8{0$7718 dE>s   - CE?EE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)
r8   is_relationmany_to_oner   one_to_manyr   many_to_manyr9   r   r(   )r<   r7   r@   s      r   r   r   B  s     NN4  E" 
	" %*$7	" =B<M	"  !!! 	-"- E9%%- MT!!*,,,Lr   Fc                 J   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          }nt          |           r| }nt          ||           rt          ||           }nt          ||           rt          ||           }n|r| |j
        v r|j
        |          }nv	 t          ||           d         }n^# t
          t          f$ rJ 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$                    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 )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   r0   zUnable to lookup 'z' on z or short_descriptionfgetz<lambda>z--)r   r   r   AttributeErrorr   r   ra   r   r9   r   rs   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   _  s    D0"5;55	;&EE 	; 	; 	;'-:EEE	;  &* &* &*9011EDD~~ 2d++ 2{D11%% 2ud++ 2$$+--{4(2/t<<R@DD)+;< 2 2 2W4WWek>UWWG" K#J+*?*H#J#JJ D#C$.*A#C#CC(1112 t011 *.4***D&))* DI':;;*
 	3$ *=J.. EE'66EE#D))'   D!!  t}sP   A " A A A A  A B H&C=<H=AEB#H=HHc                     d}	 t          |j        |           }t          |d          r|j        }n# t          t
          f$ r Y nw xY w|S )NrR   	help_text)r   r   r9   r   r   r(   )r7   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 | |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          j                  r| rt3          d| j        |           S t          |t          j                  r?| r=	 t9          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  rD   	TypeErrorr   rE   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)rI   r@   empty_value_displayr  r  s        r   display_for_fieldr    sY   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>H H76H7c                    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                    d | D                       S t          |           S )Nr   r   z, c              3   4   K   | ]}t          |          V  d S r2   )ra   )r   r!   s     r   r5   z$display_for_value.<locals>.<genexpr>  s(      //AQ//////r   )r  r  r   rE   boolra   datetimer   r  r   r  datetimeintdecimalDecimalfloatr  rF   rp   join)rI   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 )r   N)r)   r*   r+   r   r   r   r   r     s        Dr   r   c                 ^    t          | d          r| j        d         j        j        S t          )Nr/   r0   )r9   r/   r:   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   )r6   r
   r   r8   r   r+  r   r   auto_createdconcreterelated_query_nameremote_fieldr   r@   r7   r   insertr'  )r   r4   reversed_pathparentpiecespiecer@   r   s           r   reverse_field_pathr6    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...>,
    ]
    r0   )r6   r
   r+  rr   r   r8   )r   r4   r4  rs   r5  r3  s         r   r   r     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changedrs   )r7   r   r   )r7   r   rs   deleted)changed_datatranslation_override#_get_changed_field_labels_from_formrr   new_objectsra   r   r   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_messagerK  %  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 r2   )rs   r   KeyErrorrr   ra   )r   r<  rD  r?   verbose_field_names        r   r>  r>  ^  s    " = =
	,!%Z!8!>!L* 	, 	, 	,!+	,##C(:$;$;<<<<s   ,,)rK   r2   )NFN)F)Gr   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=  rc   r\   ri   r'  rl   	Exceptionr(   rB   rJ   rO   r_   rf   rn   ru   ry   r   r   r   r   r   r   r   r   r  r  r   r+  r6  r   rK  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  &. . . .$       F  :? ? ? ?D	 	 	"= "= "=J   *	 	 	 	 	y 	 	 	  4 4 4>  (6 6 6r         r   