
     hO                     R   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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)d2dZ*d Z+d Z,d Z-d Z.d Z/ G d  d!e          Z0d" Z1d3d#Z2d3d$Z3d% Z4d4d'Z5d( Z6d) Z7d5d*Z8 G d+ d,e'          Z9d- Z:d. Z;d/ Z<d0 Z=d1 Z>dS )6    N)defaultdict)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     Y/var/www/surfInsights/venv3-11/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>2   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_duplicatesr?      s      %%j11M#    
J	 NN:..E
 ul++  !,	 },66I66666    44 ! 	 	 	H	 5s   B
BB,c                     |                      d          r|                    |          }n+|                      d          r|                                dv}|S )zJ
    Return a lookup value prepared to be used in queryset filtering.
    __in__isnull) false0)endswithr3   lower)keyvalue	separators      r   prepare_lookup_valuerL   9   sW    
 ||F 8I&&	j	!	! 8%77Lr   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.
    )
isinstancestr	translate	QUOTE_MAPss    r   quoterT   F   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>R   s    K!$5 r   )
UNQUOTE_REsubrR   s    r   unquoter\   P   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.
    )rN   listtupleextendappend)fieldsflatr=   s      r   flattenrd   U   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.rb   )r`   rd   )	fieldsetsfield_namesr4   r9   s       r   flatten_fieldsetsrh   b   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        v }| j        }t          |j                  d| }|rj        |                             |           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__	_registry_metar   verbose_namehas_delete_permissionaddr   r4   	app_label
model_namerT   r+   r
   r   )	objmodel	has_adminr9   no_edit_link	admin_url
admin_siteperms_neededrequests	         r   format_callbackz,get_deleted_objects.<locals>.format_callback|   s   Z11	y#+D,=#>#>#>#>D 	 '.DDWcRR 4  !2333	$#!I36]]$	 		 " $ $ $####$
 )8D4E+F+F	SV    s   0<B- -B<;B<c                 &    g | ]} |          S r   r   )r   rx   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   )rr   verbose_name_plurallen)r   ry   objss      r   r   z'get_deleted_objects.<locals>.<dictcomp>   s9       E4 	'T  r   )r   db_for_writerr   ry   
IndexErrorsetNestedObjectscollectnested	protected
model_objsitems)r   r   r}   rx   rj   	collector	to_deleter   model_countr   r~   s    ``      @@r   get_deleted_objectsr   j   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 r/   )super__init__edgesr   r   r   r   )selfargskwargsrp   s      r   r   zNestedObjects.__init__   sD    $)&)))
%c**r   c                 b    | j                             |g                               |           d S r/   )r   
setdefaultra   )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+)classrv   source_attr)rG   rr   rw   rv   r   getattrr   ry   ru   r   r   r   ProtectedErrorr   updateprotected_objectsRestrictedErrorrestricted_objects)	r   r   r   r   r   rx   related_nameerp   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   )r4   )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   qsrp   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   )ru   r   getr`   _nestedra   )r   rx   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   r   r`   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   )NNr/   )r&   r'   r(   r   r   r   r   r   r   r   __classcell__)rp   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.
    )rs   r   )rN   r   Modelbase	ModelBaserr   queryQuerySetry   rs   r   )rx   r9   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.
    Nrs   r   r   )rN   r   r   r   country   r   r   )rx   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| } ||          }n^t          ||           r"| dk    rt          ||           } ||          }n,t          ||           }t          |          r |            }n|}d }Y nw xY w|||fS )N__str__)rr   _get_non_gfk_fieldr   r   r%   callabler6   )r4   rx   model_adminr9   fattrrJ   s          r   lookup_fieldr     s    9D#tT**$ T""% ;<    D>> 	DDIIEE[$'' 	DI,=,=;--DDIIEE3%%D~~ & dE>s   , BB=<B=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)
r5   is_relationmany_to_oner   one_to_manyr   many_to_manyr6   r   r%   )r9   r4   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   rr   rs   AttributeErrorr   r   rO   r   r6   r   rb   object_namerp   r&   r   rN   propertyr   r	   r%   )	r4   ry   r   return_attrformr   r=   labelmessages	            r   label_for_fieldr   D  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 )NrD   	help_text)r   rr   r6   r   r   r%   )r4   ry   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   r   	TypeErrorr   rN   r   BooleanFieldDateTimeFieldr   localizer   template_localtime	DateField	TimeFieldDecimalFieldnumber_formatdecimal_placesIntegerField
FloatField	FileFieldr   url	JSONFieldjsondumpsencoderdisplay_for_value)rJ   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 r/   )rO   )r   r   s     r   r2   z$display_for_value.<locals>.<genexpr>  s(      //AQ//////r   )r   r   rN   boolrO   datetimer   r   r   r   datetimeintdecimalDecimalfloatr   r^   r_   join)rJ   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-   )r6   r,   r7   ry   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   )r3   r   rr   r5   r   r  r  r   auto_createdconcreterelated_query_nameremote_fieldry   r=   r4   r   insertr  )ry   r1   reversed_pathparentpiecespiecer=   r   s           r   reverse_field_pathr"    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-   )r3   r   r  ra   rr   r5   )ry   r1   r   rb   r!  r  s         r   get_fields_from_pathr$    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changedrb   )r4   objectr   )r4   r(  rb   deleted)changed_datatranslation_override#_get_changed_field_labels_from_formra   new_objectsrO   rr   rs   changed_objectsformsdeleted_objects)r   formsetsru   r*  changed_field_labelschange_messageformsetadded_objectchanged_objectchanged_fieldsdeleted_objects              r   construct_change_messager9  	  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 r/   )rb   r   KeyErrorra   rO   )r   r*  r2  r<   verbose_field_names        r   r,  r,  B  s    " = =
	,!%Z!8!>!L* 	, 	, 	,!+	,##C(:$;$;<<<<s   ,,)r@   r/   )NFN)F)?r  r  r  collectionsr   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   r+  rQ   r   rW   r  rZ   	Exceptionr%   r?   rL   rT   r\   rd   rh   r   r   r   r   r   r   r   r   r  r  r  r  r"  r$  r9  r,  r   r   r   <module>rK     si      # # # # # # 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
 
 
 
? ? ?: : :

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