
    hLM                     p   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mZ dD  ci c]  } | d| z  
 c} Z e jC                         D ci c]  \  }}| e"|       c}}Z# eddjI                  e#D cg c]  }|dd 	 c}      z        Z% G d de&      Z'd Z(d Z)d Z*d Z+d Z,d Z-d Z. G d de      Z/d Z0d-dZ1d-d Z2d! Z3d.d"Z4d# Z5d$ Z6d/d%Z7 G d& d'e&      Z8d( Z9d) Z:d* Z;d+ Z<d, Z=yc c} w c c}}w c c}w )0    N)defaultdict)FieldDoesNotExist)modelsrouter)
LOOKUP_SEP)	Collector)pretty_name)NoReverseMatchreverse)formatstimezone)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__     ]/var/www/html/ranktracker/api/venv/lib/python3.12/site-packages/django/contrib/admin/utils.pyr   r      s    9r   r   c                 4   |j                  t              }|D ]o  }|dk(  r| j                  j                  }	 | j	                  |      }t        |d      s=|j                         }|d   j                  } t        d |D              so y y# t        $ r Y ~w xY w)zT
    Return True if 'distinct()' should be used to query the given lookup path.
    pkget_path_infoc              3   4   K   | ]  }|j                     y wN)m2m).0paths     r   	<genexpr>z(lookup_needs_distinct.<locals>.<genexpr>/   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_needs_distinctr4      s      %%j1M#  
J	 NN:.E
 uo.!//1	 },,6I66    ! 		s   B	BBc                     | j                  d      r|j                  d      }|S | j                  d      r|j                         dv}|S )zJ
    Return a lookup value prepared to be used in queryset filtering.
    __in,__isnull) false0)endswithr(   lower)keyvalues     r   prepare_lookup_valuer@   5   sI    
 ||FC  L 
j	!%77Lr   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.
    )
isinstancestr	translate	QUOTE_MAPss    r   quoterH   B   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>N   s    K!$5 r   )
UNQUOTE_REsubrF   s    r   unquoterP   L   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.
    )rB   listtupleextendappend)fieldsflatr2   s      r   flattenrX   Q   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.rV   )rT   rX   )	fieldsetsfield_namesr)   r.   s       r   flatten_fieldsetsr\   ^   s<    K 

dDN#	

 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   )usingc                    | j                   }|j                  v }| j                  }t        |j                        d| }|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__	_registry_metar   verbose_namehas_delete_permissionaddr   r)   	app_label
model_namerH   r   r
   r   )	objmodel	has_adminr.   no_edit_link	admin_url
admin_siteperms_neededrequests	         r   format_callbackz,get_deleted_objects.<locals>.format_callbackz   s    Z111	yy#+D,=,=#>D''.DDWcR  !2!23$#'1'+~~'+%8 %)5=*:	<	 8'(9(9:("$ $   " $##$s   ?AC* *C87C8)r   db_for_writere   rl   
IndexErrorsetNestedObjectscollectnested	protected
model_objsitemsverbose_name_plurallen)objsrr   rp   rk   r^   	collectorrs   	to_deleterz   rl   model_countrq   s    ``        @r   get_deleted_objectsr   h   s    51g ##CIIOO4E*Id5L <   1I1:1D1DE#%EIEQZQeQeQkQkQmn+%5;;22CI=nKnk<::W  !2sub  !P Fns   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 )
rw   c                 x    t        |   |i | i | _        t               | _        t        t              | _        y r#   )super__init__edgesrv   rz   r   r{   )selfargskwargsrc   s      r   r   zNestedObjects.__init__   s1    $)&)
%c*r   c                 Z    | j                   j                  |g       j                  |       y r#   )r   
setdefaultrU   )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+)classri   source_attr)r<   re   rj   ri   r   getattrr{   rl   rh   r   rx   r   ProtectedErrorrz   updateprotected_objectsRestrictedErrorrestricted_objects)	r   r   r   r   r   rk   related_nameerc   s	           r   rx   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_fieldrc   s         r   r   zNestedObjects.related_objects   s=    W$]NDI r  >"Z-=#5#5"Z[["Zs   :c                    ||v rg S |j                  |       g }| j                  j                  |d      D ]$  }|j                  | j	                  |||             & |r
 ||      g}n|g}|r|j                  |       |S )Nr   )rh   r   getrT   _nestedrU   )r   rk   seenrs   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   )rv   r   r   rT   r   )r   rs   r   rootsroots        r   ry   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   rx   r   r   ry   r   __classcell__)rc   s   @r   rw   rw      s'    +98$\r   rw   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.
    )rf   r}   )rB   r   Modelbase	ModelBasere   queryQuerySetrl   rf   r}   )rk   r.   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.
    rf   r}   r   )rB   r   r   r   countrl   r   r   )rk   ndsingularplurals        r   model_ngettextr      sb     #v||,,-9		Aii#A(!,A*BfHHfaf1--r   c                 B   |j                   }	 t        ||       }d }t        ||       }|||fS # t        t        f$ rb t        |       r| } ||      }nGt        ||       r| dk7  rt        ||       } ||      }n!t        ||       }t        |      r |       }n|}d }Y uw xY w)N__str__)re   _get_non_gfk_fieldr   r   r   callabler+   )r)   rk   model_adminr.   fattrr?   s          r   lookup_fieldr     s    99D#tT*$ T"dE>' ;<  D>DIE[$'DI,=;-DIE3%D~s   - A.BB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   )r.   r)   r2   s      r   r   r      sv     NN4 E(;(;@Q@Q!! !3!3y8QV[VcVcgkVk*,,Lr   c                 ,   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        }nct        |       r| }nt        ||       rt        ||       }nt        ||       rt        ||       }n|r| |j                  v r|j                  |    }ncd| d|j                  j                  }|r|d|j                  j                  z  z  }|r|d|j                  j                  z  z  }t        |      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)
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   re   rf   AttributeErrorr   r   rC   r   r+   r   rV   object_namerc   r   r   rB   propertyr   r	   r   )	r)   rl   r   return_attrformr   r2   labelmessages	            r   label_for_fieldr   5  s    D+"5;;5	;&&ET t}Y  	;''--::E	;  !*9001ED~d+{D1%ud+$$++-{{4(;?AXAXYx+*?*?*H*HHHGx$..*A*AAAG$W--t01..T8,$'$))%89		33$==J. E'6E#D)' D!s3   A / )AA AA FH:HHc                     d}	 t        |j                  |       }t        |d      r|j                  }|S # t        t
        f$ r Y |S w xY w)Nr9   	help_text)r   re   r+   r   r   r   )r)   rl   r   r2   s       r   help_text_for_fieldr   q  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 | |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t-        d| j.                  |       S t        |t        j0                        r%| r#	 t3        j4                  | d|j6                        S t;        | |      S # t8        $ 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   rB   r   BooleanFieldDateTimeFieldr   localizer   template_localtime	DateField	TimeFieldDecimalFieldnumber_formatdecimal_placesIntegerField
FloatField	FileFieldr   url	JSONFieldjsondumpsencoder	TypeErrordisplay_for_value)r?   r2   empty_value_displayr   s       r   display_for_fieldr   }  s   JumT*E%%&**52EFF 
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 !(;<<  	A$U,?@@	As   )!G G/.G/c                 H   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j'                  d | D              S t	        |       S )Nr   r   z, c              3   2   K   | ]  }t        |        y wr#   )rC   )r%   vs     r   r'   z$display_for_value.<locals>.<genexpr>  s     /AQ/s   )r   r   rB   boolrC   datetimer   r   r   r   datetimeintdecimalDecimalfloatr   rR   rS   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)NotRelationFieldN)r   r   r   r   r   r   r  r    s    r   r  c                 t    t        | d      r'| j                         d   j                  j                  S t        )Nr    r!   )r+   r    r,   rl   r  )r2   s    r   get_model_from_relationr    s2    uo&""$R(00666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)z Create 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   re   r*   r~   r  r  r   auto_createdconcreterelated_query_nameremote_fieldrl   r2   r)   r   insertr  )rl   r&   reversed_pathparentpiecespiecer2   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  rU   re   r*   )rl   r&   r  rV   r  r  s         r   get_fields_from_pathr    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changedrV   )r)   objectr   )r)   r  rV   deleted)changed_datatranslation_override#_get_changed_field_labels_from_formrU   new_objectsrC   re   rf   changed_objectsformsdeleted_objects)r   formsetsrh   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"))$'(:(:(G(G$H&),&7"+  7>6M6M 2NN"))!$'(<(<(I(I$J&).&9&I'--XYJZ\j&k$+  '.&=&= N"))!$'(<(<(I(I$J&).&9$+ !	0 >IW W	0 s   F4DFFF$c                     g }|D ]:  }	 | j                   |   j                  xs |}|j                  t	        |             < |S # t        $ r |}Y +w xY wr#   )rV   r   KeyErrorrU   rC   )r   r  r#  r1   verbose_field_names        r   r  r    sk    " =
	,!%Z!8!>!>!L* 	##C(:$;<=    	,!+	,s   AAA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.htmlr   django.utils.regex_helperr   django.utils.textr   django.utils.translationr   r   r  rE   r|   chrrK   r  rN   	Exceptionr   r4   r@   rH   rP   rX   r\   r   rw   r   r   r   r   r   r   r   r   r  r  r  r  r*  r  )ikr   xs   0000r   <module>r?     s/      # 4 $ 1 / * / * ) 6 & O%?@Q!^@	%.__%67TQq#a&y7i#((;3OaAabE3O*PPQ
	9 	
2
?:

5;p>I >B&.$4*9x	=<*	y 	4>(.b [ A73Os   !D(D--D3