
    hnB                        d 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 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  G d dej6                        Z G d dej:                        Z G d dej>                        Z  G d dejB                        Z" G d dejF                        Z$ G d dejJ                        Z&d Z' G d dejP                        Z) G d de)      Z* G d d ejV                        Z, G d! d"ejZ                        Z. G d# d$ejP                        Z/ G d% d&ej`                        Z1 G d' d(ejd                        Z3 G d) d*ejh                        Z5 G d+ d,e5      Z6 G d- d.ejP                        Z7d/D  ci c]  } | jq                         |  c} Z9e9ju                  d0d1d2        G d3 d4      Z; G d5 d6e;ejx                        Z= G d7 d8e;ej6                        Z>yc c} w )9z8
Form Widget classes specific to the Django admin site.
    N)forms)settings)ValidationError)URLValidator)CASCADE)reverse)NoReverseMatch)smart_urlquote)	urlencode)	Truncator)get_languagegettextc                   B     e Zd ZdZ G d d      Zd fd	Z fdZ xZS )FilteredSelectMultiplez
    A SelectMultiple with a JavaScript filter interface.

    Note that the resulting JavaScript assumes that the jsi18n
    catalog has been loaded in the page
    c                       e Zd Zg dZy)FilteredSelectMultiple.Media)zadmin/js/core.jszadmin/js/SelectBox.jszadmin/js/SelectFilter2.jsN__name__
__module____qualname__js     _/var/www/html/ranktracker/api/venv/lib/python3.12/site-packages/django/contrib/admin/widgets.pyMediar      s	    
r   r   c                 B    || _         || _        t        |   ||       y N)verbose_name
is_stackedsuper__init__)selfr   r   attrschoices	__class__s        r   r!   zFilteredSelectMultiple.__init__"   s!    ($(r   c                     t         |   |||      }d|d   d   d<   | j                  r|d   d   dxx   dz  cc<   | j                  |d   d   d<   t	        | j                        |d   d   d<   |S )Nselectfilterwidgetr#   classstackedzdata-field-namezdata-is-stacked)r    get_contextr   r   intr"   namevaluer#   contextr%   s        r   r+   z"FilteredSelectMultiple.get_context'   s    '%dE59.<'"7+??Hg&w/9</8<8I8I'"#458;DOO8L'"#45r   )Nr   )r   r   r   __doc__r   r!   r+   __classcell__r%   s   @r   r   r      s!    
 
)
 r   r   c                   4     e Zd Z G d d      Zd fd	Z xZS )AdminDateWidgetc                       e Zd ZddgZy)AdminDateWidget.Mediaadmin/js/calendar.js#admin/js/admin/DateTimeShortcuts.jsNr   r   r   r   r   r7   2       "1
r   r   c                 >    ddd|xs i }t         |   ||       y )N
vDateField10r)   sizer#   formatr    r!   r"   r#   rA   r%   s      r   r!   zAdminDateWidget.__init__8   s(    &F"FuV4r   NNr   r   r   r   r!   r2   r3   s   @r   r5   r5   1       
 
5 5r   r5   c                   4     e Zd Z G d d      Zd fd	Z xZS )AdminTimeWidgetc                       e Zd ZddgZy)AdminTimeWidget.Mediar8   r9   Nr   r   r   r   r   rJ   >   r:   r   r   c                 >    ddd|xs i }t         |   ||       y )N
vTimeField8r>   r@   rB   rC   s      r   r!   zAdminTimeWidget.__init__D   s(    &EEuV4r   rD   rE   r3   s   @r   rH   rH   =   rF   r   rH   c                   .     e Zd ZdZdZddZ fdZ xZS )AdminSplitDateTimezF
    A SplitDateTime Widget that has some admin-specific styling.
    z!admin/widgets/split_datetime.htmlc                 ^    t         t        g}t        j                  j	                  | ||       y r   )r5   rH   r   MultiWidgetr!   )r"   r#   widgetss      r   r!   zAdminSplitDateTime.__init__O   s&    "O4 	""4%8r   c                 b    t         |   |||      }t        d      |d<   t        d      |d<   |S )NzDate:
date_labelzTime:
time_label)r    r+   _r-   s        r   r+   zAdminSplitDateTime.get_contextU   s7    '%dE59 !'
 !'
r   r   )r   r   r   r1   template_namer!   r+   r2   r3   s   @r   rO   rO   I   s     8M9 r   rO   c                       e Zd ZdZy)AdminRadioSelectzadmin/widgets/radio.htmlNr   r   r   rW   r   r   r   rY   rY   \   s    .Mr   rY   c                       e Zd ZdZy)AdminFileWidgetz'admin/widgets/clearable_file_input.htmlNrZ   r   r   r   r\   r\   `   s    =Mr   r\   c                 $   i }| rt        | d      r| j                         D ]l  \  }}t        |      r |       }t        |t        t
        f      rdj                  d |D              }n!t        |t              rd|   }nt        |      }|||<   n |S )z
    Convert the type of lookups specified in a ForeignKey limit_choices_to
    attribute to a dictionary of query parameters
    items,c              3   2   K   | ]  }t        |        y wr   str).0xs     r   	<genexpr>z.url_params_from_lookup_dict.<locals>.<genexpr>o   s     /SV/   )01)	hasattrr^   callable
isinstancetuplelistjoinboolrb   )lookupsparamskvs       r   url_params_from_lookup_dictrt   d   s    
 F77G,MMO 		DAq{C!eT]+HH/Q//At$qMFF1I		 Mr   c                   D     e Zd ZdZdZd fd	Z fdZd Zd Zd Z	 xZ
S )	ForeignKeyRawIdWidgetzj
    A Widget for displaying ForeignKeys in the "raw_id" interface rather than
    in a <select> box.
    z%admin/widgets/foreign_key_raw_id.htmlc                 N    || _         || _        || _        t        |   |       y r   )rel
admin_sitedbr    r!   )r"   rx   ry   r#   usingr%   s        r   r!   zForeignKeyRawIdWidget.__init__   s%    $r   c                     t         |   |||      }| j                  j                  }|| j                  j
                  v rt        d|j                  j                  d|j                  j                  d| j                  j                        }| j                         }|r|dt        |      z   z  }||d<   t        d      |d<   |d	   d
   j                  dd       nd |d<   |d	   d   r| j                  |      \  |d<   |d<   |S d |d<   |S )Nzadmin:rV   _changelist)current_app?related_urlLookup
link_titler(   r#   r)   vForeignKeyRawIdAdminFieldr/   
link_labellink_url)r    r+   rx   modelry   	_registryr   _meta	app_label
model_namer.   url_parametersr   rV   
setdefaultlabel_and_url_for_value)	r"   r.   r/   r#   r0   rel_tor   rq   r%   s	           r   r+   z!ForeignKeyRawIdWidget.get_context   s   '%dE59T__...!LL**LL++ !OO00K ((*FsYv%666%0GM"$%hKGL!Hg&11';WX%)GM"8W%9=9U9UV[9\6GL!7:#6  %)GL!r   c                 h    | j                   j                  }t        |      r |       }t        |      S r   )rx   limit_choices_torj   rt   )r"   r   s     r   base_url_parametersz)ForeignKeyRawIdWidget.base_url_parameters   s0    8844$%/1*+;<<r   c                     ddl m} | j                         }|j                  || j                  j                         j                  i       |S )Nr   )TO_FIELD_VAR)django.contrib.admin.views.mainr   r   updaterx   get_related_fieldr.   )r"   r   rq   s      r   r   z$ForeignKeyRawIdWidget.url_parameters   s<    @))+|TXX%?%?%A%F%FGHr   c                 |   | j                   j                         j                  }	  | j                   j                  j                  j                  | j                        j                  di ||i}	 t        | j                  j                  d|j                  j                  d|j                  j                  j!                         d|j"                  f      }t'        |      j)                  d      |fS # t        | j                   j                  j                  t        f$ r Y yw xY w# t$        $ r d}Y ]w xY w)	N r   :rV   _change)argsr      r   )rx   r   r.   r   _default_managerr{   rz   get
ValueErrorDoesNotExistr   r   ry   r   r   object_namelowerpkr	   r   words)r"   r/   keyobjurls        r   r   z-ForeignKeyRawIdWidget.label_and_url_for_value   s    hh((*//	D$((..1177@DDTU|TC
	OO((II''II))//1
 ffYC ~##B',, DHHNN77I 		  	C	s%   AC9 2A+D- 9.D*)D*-D;:D;rD   )r   r   r   r1   rW   r!   r+   r   r   r   r2   r3   s   @r   rv   rv   x   s(     <M 8=-r   rv   c                   >     e Zd ZdZdZ fdZd Zd Zd Zd Z	 xZ
S )ManyToManyRawIdWidgetzv
    A Widget for displaying ManyToMany ids in the "raw_id" interface rather than
    in a <select multiple> box.
    z&admin/widgets/many_to_many_raw_id.htmlc                     t         |   |||      }| j                  j                  | j                  j
                  v rd|d   d   d<   |S )NvManyToManyRawIdAdminFieldr(   r#   r)   )r    r+   rx   r   ry   r   r-   s        r   r+   z!ManyToManyRawIdWidget.get_context   sI    '%dE5988>>T__6662NGHg&w/r   c                 "    | j                         S r   )r   r"   s    r   r   z$ManyToManyRawIdWidget.url_parameters   s    ''))r   c                      y)Nr   r   r"   r/   s     r   r   z-ManyToManyRawIdWidget.label_and_url_for_value   s    r   c                 L    |j                  |      }|r|j                  d      S y )Nr_   )r   split)r"   datafilesr.   r/   s        r   value_from_datadictz)ManyToManyRawIdWidget.value_from_datadict   s&    ;;s## r   c                 :    |rdj                  d |D              S dS )Nr_   c              3   2   K   | ]  }t        |        y wr   ra   )rc   rs   s     r   re   z5ManyToManyRawIdWidget.format_value.<locals>.<genexpr>   s     .1A.rf   r   )rn   r   s     r   format_valuez"ManyToManyRawIdWidget.format_value   s    27sxx...?R?r   )r   r   r   r1   rW   r+   r   r   r   r   r2   r3   s   @r   r   r      s)     =M*$
@r   r   c                   f    e Zd ZdZdZ	 	 	 ddZd Zed        Zed        Z	d Z
d	 Zd
 Zd Zd Zy)RelatedFieldWidgetWrapperzd
    This class is a wrapper to a given widget to add the add icon for the
    admin interface.
    z)admin/widgets/related_widget_wrapper.htmlNc                 h   |j                   | _         |j                  | _        |j                  | _        || _        || _        ||j
                  |j                  v }|| _        t        |dd      }| xr || _	        t        |dd       t        u }	| xr |	 xr || _        | xr || _        || _        y )Nallow_multiple_selectedF	on_delete)needs_multipart_formr#   r$   r(   rx   r   r   can_add_relatedgetattrcan_change_relatedr   can_delete_relatedcan_view_relatedry   )
r"   r(   rx   ry   r   r   r   r   multiplecascades
             r   r!   z"RelatedFieldWidgetWrapper.__init__   s     %+$?$?!\\
~~ "!ii:+?+??O.6#<eD&.,"E3E#{D1W<&.,"Uw;"UCU$, A1A$r   c                     t        j                   |       }t        j                  | j                  |      |_        | j                  j                  |_        ||t	        |       <   |S r   )copydeepcopyr(   r#   id)r"   memor   s      r   __deepcopy__z&RelatedFieldWidgetWrapper.__deepcopy__   sH    iio]]4;;5
KK%%	RX
r   c                 .    | j                   j                  S r   )r(   	is_hiddenr   s    r   r   z#RelatedFieldWidgetWrapper.is_hidden  s    {{$$$r   c                 .    | j                   j                  S r   )r(   mediar   s    r   r   zRelatedFieldWidgetWrapper.media	  s    {{   r   c                 T    t        d||fz   z  | j                  j                  |      S )Nzadmin:%s_%s_%s)r~   r   )r   ry   r.   )r"   infoactionr   s       r   get_related_urlz)RelatedFieldWidgetWrapper.get_related_url  s/    '46)+;<#'??#7#7dD 	Dr   c           
         ddl m}m} | j                  j                  j
                  }|j                  |j                  f}| j                  | j                  _        dj                  d || j                  j                         j                  f|dffD              }| j                  j                  |||      | j                  |||j                  | j                   | j"                  | j$                  | j&                  d	}	| j                   r| j)                  |d      |	d<   | j$                  r| j)                  |d	d
      |	d<   | j&                  s| j"                  r| j)                  |dd
      |	d<   |	S )Nr   )IS_POPUP_VARr   &c              3   &   K   | ]	  }d |z    yw)z%s=%sNr   )rc   params     r   re   z8RelatedFieldWidgetWrapper.get_context.<locals>.<genexpr>  s      %go s      )	rendered_widgetr   r.   
url_paramsr   r   r   r   r   addadd_related_urldelete__fk__delete_related_template_urlchangechange_related_template_url)r   r   r   rx   r   r   r   r   r$   r(   rn   r   r.   renderr   r   r   r   r   r   r   )
r"   r.   r/   r#   r   r   rel_optsr   r   r0   s
             r   r+   z%RelatedFieldWidgetWrapper.get_context  sQ   N88>>''""H$7$78"llXX 488557<<=1<
  

  ${{11$uE$**#33"&"9"9"&"9"9 $ 5 5

 )-)=)=dE)JG%&""595I5I$PXZb5cG12  D$;$;595I5I$PXZb5cG12r   c                 <    | j                   j                  |||      S r   )r(   r   r"   r   r   r.   s       r   r   z-RelatedFieldWidgetWrapper.value_from_datadict-  s    {{..tUDAAr   c                 <    | j                   j                  |||      S r   )r(   value_omitted_from_datar   s       r   r   z1RelatedFieldWidgetWrapper.value_omitted_from_data0  s    {{224EEr   c                 8    | j                   j                  |      S r   )r(   id_for_label)r"   id_s     r   r   z&RelatedFieldWidgetWrapper.id_for_label3  s    {{'',,r   )NFFF)r   r   r   r1   rW   r!   r   propertyr   r   r   r+   r   r   r   r   r   r   r   r      sf     @M@D>C"'%. % % ! !D8BF-r   r   c                         e Zd Zd fd	Z xZS )AdminTextareaWidgetc                 6    t         |   ddi|xs i        y )Nr)   vLargeTextFieldr#   rB   r"   r#   r%   s     r   r!   zAdminTextareaWidget.__init__8  s"    ):Lu{LMr   r   r   r   r   r!   r2   r3   s   @r   r   r   7  s    N Nr   r   c                         e Zd Zd fd	Z xZS )AdminTextInputWidgetc                 6    t         |   ddi|xs i        y Nr)   
vTextFieldr   rB   r   s     r   r!   zAdminTextInputWidget.__init__=  !    G%+2GHr   r   r   r3   s   @r   r   r   <      I Ir   r   c                         e Zd Zd fd	Z xZS )AdminEmailInputWidgetc                 6    t         |   ddi|xs i        y r   rB   r   s     r   r!   zAdminEmailInputWidget.__init__B  r   r   r   r   r3   s   @r   r   r   A  r   r   r   c                   2     e Zd ZdZdef fd	Z fdZ xZS )AdminURLFieldWidgetzadmin/widgets/url.htmlNc                 N    t         |   ddi|xs i         |       | _        y )Nr)   	vURLFieldr   )r    r!   	validator)r"   r#   validator_classr%   s      r   r!   zAdminURLFieldWidget.__init__I  s+    F"FG(*r   c                     	 | j                  |r|nd       d}t        |   |||      }t	        d      |d<   t	        d      |d<   |rt        |d   d	         nd|d   d
<   ||d<   |S # t        $ r d}Y \w xY w)Nr   TFz
Currently:current_labelzChange:change_labelr(   r/   href	url_valid)r  r   r    r+   rV   r
   )r"   r.   r/   r#   r  r0   r%   s         r   r+   zAdminURLFieldWidget.get_contextM  s    	NNE5r2I '%dE59#$\? "#I,RWN783DW3M$N]_&!(  	I	s   A) )A76A7)r   r   r   rW   r   r!   r+   r2   r3   s   @r   r   r   F  s    ,M!< + r   r   c                   $     e Zd ZdZd fd	Z xZS )AdminIntegerFieldWidgetvIntegerFieldc                 J    t         |   d| j                  i|xs i        y )Nr)   r   )r    r!   
class_namer   s     r   r!   z AdminIntegerFieldWidget.__init__^  s%    JU[bJKr   r   )r   r   r   r  r!   r2   r3   s   @r   r
  r
  [  s     JL Lr   r
  c                       e Zd ZdZy)AdminBigIntegerFieldWidgetvBigIntegerFieldN)r   r   r   r  r   r   r   r  r  b  s    #Jr   r  c                         e Zd Zd fd	Z xZS )AdminUUIDInputWidgetc                 6    t         |   ddi|xs i        y )Nr)   
vUUIDFieldr   rB   r   s     r   r!   zAdminUUIDInputWidget.__init__g  r   r   r   r   r3   s   @r   r  r  f  r   r   r  )-arazbgcacsdadeeleneseteufafifrglhehihrhur   isitjakmkoltlvmkmsnbnlplzpt-BRptroruskzsr-Cyrlsrsvthtrukvizzh-CNzzh-TW)zzh-hanszzh-hantc                   N     e Zd ZdZdZddZd Zd	 fd	Zd	dZe	d        Z
 xZS )
AutocompleteMixinz
    Select widget mixin that loads options from AutocompleteJsonView via AJAX.

    Renders the necessary data attributes for select2 and adds the static form
    media.
    z%s:%s_%s_autocompletec                 z    || _         || _        || _        || _        |i | _        y |j	                         | _        y r   )rx   ry   rz   r$   r   r#   )r"   rx   ry   r#   r$   r{   s         r   r!   zAutocompleteMixin.__init__  s5    $ =R
ejjl
r   c                     | j                   j                  }t        | j                  | j                  j
                  |j                  j                  |j                  j                  fz        S r   )	rx   r   r   url_namery   r.   r   r   r   )r"   r   s     r   get_urlzAutocompleteMixin.get_url  sK    t}}(<(<ekk>S>SUZU`U`UkUk'llmmr   c                     t         |   ||      }|j                  dd       |j                  ddd| j	                         dt        j                  | j                         d|d   |d   rdndz   dz   d	       |S )
z
        Set select2's AJAX attributes.

        Attributes can be set using the html5 data attribute.
        Nested attributes require a double dash as per
        https://select2.org/configuration/data-attributes#nested-subkey-options
        )extra_attrsr)   r   true   GETzadmin-autocomplete )zdata-ajax--cachezdata-ajax--delayzdata-ajax--typezdata-ajax--urlz
data-themezdata-allow-clearzdata-placeholderr)   )r    build_attrsr   r   rD  jsondumpsis_required)r"   
base_attrsrF  r#   r%   s       r   rK  zAutocompleteMixin.build_attrs  s     #JK#H"% & #$"lln. $

t/?/?+? @ "7^eGns"EH\\	
 		 r   c           
          dg df}|g}d}|D ch c]8  }t        |       j                  j                  j                  vrt        |      : }} j                  s3 j
                  s'|d   j                   j                  |dddd              fd j                  j                  j                   j                        j                  |      D        }	|	D ]b  \  }
}t        |
      |v xr |du xs  j
                  }||z  }t        |d         }|d   }|j                   j                  ||
|||             d |S c c}w )z9Return selected options based on the ModelChoiceIterator.Nr   Fr   r   c              3      K   | ]5  }|j                   j                  j                  j                  |      f 7 y wr   )r   r$   fieldlabel_from_instance)rc   r   r"   s     r   re   z.AutocompleteMixin.optgroups.<locals>.<genexpr>  s7      
 VVT\\'';;C@A
s   ;>)pk__in)rb   r$   rR  empty_valuesrN  r   appendcreate_optionquerysetr{   rz   filterlen)r"   r.   r/   attrdefaultgroupshas_selectedrs   selected_choicesr$   option_valueoption_labelselectedindexsubgroups   `              r   	optgroupszAutocompleteMixin.optgroups  sY   Q-!
1vT\\//<<< F
 
 (D(DAJd00r2uaHI
||,,22477;BBJZB[
 +2 	k&L,L!U* H&F$*F*F  H$L
OEqzHOOD..t\<Qachij	k '
s   =D?c                     t         j                  rdnd}t        j                  t	                     }|rd|z  fnd}t        j                  d|z  d|z  f|z   dz   dd	|z  d
fi      S )Nr   z.minz"admin/js/vendor/select2/i18n/%s.jsr   z"admin/js/vendor/jquery/jquery%s.jsz)admin/js/vendor/select2/select2.full%s.js)zadmin/js/jquery.init.jszadmin/js/autocomplete.jsscreenz&admin/css/vendor/select2/select2%s.csszadmin/css/autocomplete.css)r   css)r   DEBUGSELECT2_TRANSLATIONSr   r   r   r   )r"   extra	i18n_name	i18n_files       r   r   zAutocompleteMixin.media  s    nn&(,,\^<	KT9IEGZ\	{{4u<;eC  <uD0
 	
r   )Nr   Nr   )r   r   r   r1   rC  r!   rD  rK  re  r   r   r2   r3   s   @r   r@  r@  x  s8     'H;n,4 
 
r   r@  c                       e Zd Zy)AutocompleteSelectNr   r   r   r   r   r   ro  ro        r   ro  c                       e Zd Zy)AutocompleteSelectMultipleNrp  r   r   r   rs  rs    rq  r   rs  )?r1   r   rL  djangor   django.confr   django.core.exceptionsr   django.core.validatorsr   django.db.modelsr   django.urlsr   django.urls.exceptionsr	   django.utils.htmlr
   django.utils.httpr   django.utils.textr   django.utils.translationr   r   rV   SelectMultipler   	DateInputr5   	TimeInputrH   SplitDateTimeWidgetrO   RadioSelectrY   ClearableFileInputr\   rt   	TextInputrv   r   Widgetr   Textarear   r   
EmailInputr   URLInputr   NumberInputr
  r  r  r   rj  r   r@  Selectro  rs  )rd   s   0r   <module>r     s        2 / $  1 , ' ' ?U11 :	5eoo 	5	5eoo 	522 &/u(( />e.. >(H-EOO H-V@1 @:T- T-nN%.. N
I5?? I
IE,, I
%.. *Le// L$!8 $I5?? I/ 	1     GD EW
 W
t	*ELL 		!2E4H4H 	Qs   G8