
    k"gL                     8   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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  G d dej8                        Z G d dej<                        Z G d de      Z  G d dejB                        Z" G d de"      Z# G d dejH                        Z% G d dejL                        Z' G d dejP                        Z)d Z* G d  d!ejV                        Z, G d" d#e,      Z- G d$ d%ej\                        Z/ G d& d'ej`                        Z1 G d( d)ejV                        Z2 G d* d+ejf                        Z4 G d, d-ejj                        Z6 G d. d/ejn                        Z8 G d0 d1e8      Z9 G d2 d3ejV                        Z:d4D  ci c]  } | jw                         |  c} Z<e<j{                  d5d6d7       d8 Z> G d9 d:      Z? G d; d<e?ej                        ZA G d= d>e?ej8                        ZByc c} w )?z8
Form Widget classes specific to the Django admin site.
    N)forms)settings)ValidationError)URLValidator)CASCADE	UUIDField)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     U/var/www/html/djangosite/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stacked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 )BaseAdminDateWidgetc                       e Zd ZddgZy)BaseAdminDateWidget.Mediaadmin/js/calendar.js#admin/js/admin/DateTimeShortcuts.jsNr   r   r   r   r   r9   5       "1
r   r   c                 >    ddd|xs i }t         |   ||       y )N
vDateField10r*   sizer$   formatr!   r"   r#   r$   rC   r&   s      r   r"   zBaseAdminDateWidget.__init__;   s(    &F"FuV4r   NNr   r   r   r   r"   r4   r5   s   @r   r7   r7   4       
 
5 5r   r7   c                       e Zd ZdZy)AdminDateWidgetzadmin/widgets/date.htmlNr   r   r   template_namer   r   r   rJ   rJ   @       -Mr   rJ   c                   4     e Zd Z G d d      Zd fd	Z xZS )BaseAdminTimeWidgetc                       e Zd ZddgZy)BaseAdminTimeWidget.Mediar:   r;   Nr   r   r   r   r   rQ   E   r<   r   r   c                 >    ddd|xs i }t         |   ||       y )N
vTimeField8r@   rB   rD   rE   s      r   r"   zBaseAdminTimeWidget.__init__K   s(    &EEuV4r   rF   rG   r5   s   @r   rO   rO   D   rH   r   rO   c                       e Zd ZdZy)AdminTimeWidgetzadmin/widgets/time.htmlNrK   r   r   r   rV   rV   P   rM   r   rV   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   )r7   rO   r   MultiWidgetr"   )r#   r$   widgetss      r   r"   zAdminSplitDateTime.__init__[   s'    &(;< 	""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_contexta   s7    '%dE59 !'
 !'
r   r   )r   r   r   r3   rL   r"   r-   r4   r5   s   @r   rX   rX   T   s     8M9 r   rX   c                       e Zd ZdZy)AdminRadioSelectzadmin/widgets/radio.htmlNrK   r   r   r   ra   ra   h   s    .Mr   ra   c                       e Zd ZdZy)AdminFileWidgetz'admin/widgets/clearable_file_input.htmlNrK   r   r   r   rc   rc   l   s    =Mr   rc   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>{   s     /SV/   )01)	hasattrre   callable
isinstancetuplelistjoinboolri   )lookupsparamskvs       r   url_params_from_lookup_dictr{   p   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#   r   r   r$   usingr&   s        r   r"   zForeignKeyRawIdWidget.__init__   s%    $r   c                    t         	|   |||      }| j                  j                  }| j                  j                  |      rt        d|j                  j                  d|j                  j                  d| j                  j                        }| j                         }|r|dt        |      z   z  }||d<   t        d      |d<   d	}t        | j                  j                         t               r|d
z  }|d   d   j#                  d|       nd |d<   |d   d   r| j%                  |      \  |d<   |d<   |S d |d<   |S )Nzadmin:r_   _changelist)current_app?related_urlLookup
link_titlevForeignKeyRawIdAdminFieldz vUUIDFieldr)   r$   r*   r1   
link_labellink_url)r!   r-   r   modelr   is_registeredr	   _meta	app_label
model_namer0   url_parametersr   r_   rr   get_related_fieldr   
setdefaultlabel_and_url_for_value)
r#   r0   r1   r$   r2   rel_tor   rx   	css_classr&   s
            r   r-   z!ForeignKeyRawIdWidget.get_context   s?   '%dE59??((0! LL**LL++
 !OO00K ((*FsYv%666%0GM"$%hKGL!4I$((446	B]*	Hg&11'9E%)GM"8W%9=9U9U:6GL!7:#6
  %)GL!r   c                 h    | j                   j                  }t        |      r |       }t        |      S r   )r   limit_choices_torq   r{   )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   updater   r   r0   )r#   r   rx   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                  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   :r_   _change)argsr      r   )r   r   r0   r   _default_managerr   r   get
ValueErrorDoesNotExistr   r	   r   r   r   r   pkr
   r   words)r#   r1   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((	 ffYC ~##B',,! DHHNN77I 		  	C	s%   AC+ 2AD +.DDD-,D-rF   )r   r   r   r3   rL   r"   r-   r   r   r   r4   r5   s   @r   r}   r}      s)    
 <M  D=-r   r}   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
                        rd|d   d   d<   |S )NvManyToManyRawIdAdminFieldr)   r$   r*   )r!   r-   r   r   r   r   r/   s        r   r-   z!ManyToManyRawIdWidget.get_context   sI    '%dE59??((82NGHg&w/r   c                 "    | j                         S r   )r   r#   s    r   r   z$ManyToManyRawIdWidget.url_parameters   s    ''))r   c                      y)Nr   r   r#   r1   s     r   r   z-ManyToManyRawIdWidget.label_and_url_for_value   s    r   c                 L    |j                  |      }|r|j                  d      S y )Nrf   )r   split)r#   datafilesr0   r1   s        r   value_from_datadictz)ManyToManyRawIdWidget.value_from_datadict   s&    ;;s## r   c                 :    |rdj                  d |D              S dS )Nrf   c              3   2   K   | ]  }t        |        y wr   rh   )rj   rz   s     r   rl   z5ManyToManyRawIdWidget.format_value.<locals>.<genexpr>   s     .1A.rm   r   )ru   r   s     r   format_valuez"ManyToManyRawIdWidget.format_value   s    27sxx...?R?r   )r   r   r   r3   rL   r-   r   r   r   r   r4   r5   s   @r   r   r      s)    
 =M*$
@r   r   c                       e Zd ZdZdZ	 	 	 	 ddZd Zed        Zed        Z	ed        Z
e
j                  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                    |j                   | _         |j                  | _        || _        || _        ||j	                  |j
                        }|| _        t        |dd      }t        |t              sd| j                  d<   | xr || _
        t        |dd       t        u }	| xr |	 xr || _        | xr || _        || _        y )Nallow_multiple_selectedFzavailable-sourcezdata-context	on_delete)needs_multipart_formr$   r)   r   r   r   can_add_relatedgetattrrr   AutocompleteMixincan_change_relatedr   can_delete_relatedcan_view_relatedr   )
r#   r)   r   r   r   r   r   r   multiplecascades
             r   r"   z"RelatedFieldWidgetWrapper.__init__   s     %+$?$?!\\
 "(66syyAO.6#<eD&"34);DJJ~&&.,"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                 .    | j                   j                  S r   r)   r%   r   s    r   r%   z!RelatedFieldWidgetWrapper.choices,  s    {{"""r   c                 &    || j                   _        y r   r   r   s     r   r%   z!RelatedFieldWidgetWrapper.choices0  s    #r   c                 T    t        d||fz   z  | j                  j                  |      S )Nzadmin:%s_%s_%s)r   r   )r	   r   r0   )r#   infoactionr   s       r   get_related_urlz)RelatedFieldWidgetWrapper.get_related_url4  s.    y 01,,
 	
r   c                    ddl m}m} | j                  j                  j
                  }|j                  |j                  f}| j                  j                         j                  }dj                  d ||f|dffD              }	| j                  j                  |||      | j                  ||	|j                  |j                  | j                  | j                   | j"                  | j$                  | j                  j&                  d}
| j                  r| j)                  |d      |
d<   | j"                  r| j)                  |d	d
      |
d<   | j$                  s| j                   r | d| |
d<   | j)                  |dd
      |
d<   |
S )Nr   )IS_POPUP_VARr   &c              3   &   K   | ]	  }d |z    yw)z%s=%sNr   )rj   params     r   rl   z8RelatedFieldWidgetWrapper.get_context.<locals>.<genexpr>A  s      
 eO
s      )rendered_widgetr   r0   
url_paramsr   r   r   r   r   r   model_has_limit_choices_toaddadd_related_urldelete__fk__delete_related_template_url=view_related_url_paramschangechange_related_template_url)r   r   r   r   r   r   r   r   r   r0   ru   r)   renderr   r   r   r   r   r   r   r   )r#   r0   r1   r$   r   r   rel_optsr   related_field_namer   r2   s              r   r-   z%RelatedFieldWidgetWrapper.get_context;  s~   N88>>''""H$7$78!XX779>>XX 
 12q!
 

  ${{11$uE$**"--#33"&"9"9"&"9"9 $ 5 5*.((*C*C
 )-)=)=dE)JG%&""595I5Ih6G12   D$;$;4@>CUBV1WG-.595I5Ih6G12 r   c                 <    | j                   j                  |||      S r   )r)   r   r#   r   r   r0   s       r   r   z-RelatedFieldWidgetWrapper.value_from_datadictb  s    {{..tUDAAr   c                 <    | j                   j                  |||      S r   )r)   value_omitted_from_datar   s       r   r   z1RelatedFieldWidgetWrapper.value_omitted_from_datae  s    {{224EEr   c                 8    | j                   j                  |      S r   )r)   id_for_label)r#   id_s     r   r   z&RelatedFieldWidgetWrapper.id_for_labelh  s    {{'',,r   )NFFF)r   r   r   r3   rL   r"   r   propertyr   r   r%   setterr   r-   r   r   r   r   r   r   r   r      s    
 @M   %> % % ! ! # # ^^$ $
%N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$   rD   r#   r$   r&   s     r   r"   zAdminTextareaWidget.__init__m  s"    ):Lu{LMr   r   r   r   r   r"   r4   r5   s   @r   r   r   l  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   rD   r  s     r   r"   zAdminTextInputWidget.__init__r  !    G%+2GHr   r   r  r5   s   @r   r  r  q      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  rD   r  s     r   r"   zAdminEmailInputWidget.__init__w  r  r   r   r  r5   s   @r   r  r  v  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__~  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)   r1   href	url_valid)r  r   r!   r-   r_   r   )r#   r0   r1   r$   r  r2   r&   s         r   r-   zAdminURLFieldWidget.get_context  s    	NNE5r2I '%dE59#$\? "#I,:CN78,W56 	&!  )  	I	s   A) )A76A7)r   r   r   rL   r   r"   r-   r4   r5   s   @r   r  r  {  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"   r4   r5   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    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   rD   r  s     r   r"   zAdminUUIDInputWidget.__init__  r  r   r   r  r5   s   @r   r!  r!    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                      t               } t        j                  |       }|Q| Od }| j                  dd|      x}dkD  r5t        j                  | d |       x}r|S | j                  dd|      x}dkD  r5|S )N-r   )r   SELECT2_TRANSLATIONSr   rfind)	lang_codesupported_codeis      r   get_select2_languagerV    s    I)--i8N)"7 OOCA..q"4!5!9!9)BQ-!HH~H%% OOCA..q"4 r   c                   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 )
r   z
    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:autocompletec                     || _         || _        || _        || _        |i n|j	                         | _        t               | _        y r   )fieldr   r   r%   r   r$   rV  	i18n_name)r#   rY  r   r$   r%   r   s         r   r"   zAutocompleteMixin.__init__  s;    
$ =Rejjl
-/r   c                 Z    t        | j                  | j                  j                  z        S r   )r	   url_namer   r0   r   s    r   get_urlzAutocompleteMixin.get_url  s     t}}t';';;<<r   c                    t         |   ||      }|j                  dd       |j                  ddd| j	                         | j
                  j                  j                  j                  | j
                  j                  j                  j                  | j
                  j                  dt        j                  | j                         d| j                  |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-app-labelzdata-model-namer,   z
data-themezdata-allow-clearzdata-placeholderlangr*   )r!   build_attrsr   r   r]  rY  r   r   r   r   r0   jsondumpsis_requiredrZ  )r#   
base_attrsr_  r$   r&   s       r   re  zAutocompleteMixin.build_attrs  s     #JK#H"%$*$'#("&,,."&**"2"2"8"8"B"B#'::#3#3#9#9#D#D#'::??2$(JJ43C3C/C$D$&w.3b2&'	
$ r   c           
          dg df}|g}d}|D ch c]9  }t        |       j                  j                  j                  vs/t        |      ; }} j                  s3 j
                  s'|d   j                   j                  |dddd              j                  j                  j                  j                  }	t         j                  j                  d|	j                  j                        |	j                        j                   fd  j                  j                  j!                   j"                        j$                  d	i dz  |i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   
field_namec              3      K   | ]5  }t        |      j                  j                  j                  |      f 7 y wr   )r   r%   rY  label_from_instance)rj   r   r#   to_field_names     r   rl   z.AutocompleteMixin.optgroups.<locals>.<genexpr>)  s;      
 S-($,,*<*<*P*PQT*UV
s   ;>z%s__inr   )ri   r%   rY  empty_valuesrh  r   appendcreate_optionremote_fieldr   r   r   r   attname	get_fieldquerysetr   r   filterlen)r#   r0   r1   attrdefaultgroupshas_selectedrz   selected_choicesremote_model_optsr%   option_valueoption_labelselectedindexsubgrouprn  s   `               @r   	optgroupszAutocompleteMixin.optgroups  s   Q-!
SV4<<3E3E3R3R%RCF
 
 (D(DAJd00r2uaHI JJ3399??JJ##\3D3G3G3O3O
 *33MBJJ
Bt||,,22477;BB m+-=>
 +2 	&L,<(E1 %E)E)E  H$L
OEqzHOO"",6F	 9
s   0GGc                     t         j                  rdnd}| j                  rd| j                  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   DEBUGrZ  r   r   )r#   extra	i18n_files      r   r   zAutocompleteMixin.media=  s    nn& ~~ 2DNNBD 	
 {{4u<;eC 	
 <uD0
 	
r   )Nr   Nr   )r   r   r   r3   r\  r"   r]  re  r  r   r   r4   r5   s   @r   r   r     s8     !H0=<!F 
 
r   r   c                       e Zd Zy)AutocompleteSelectNr   r   r   r   r   r   r  r  X      r   r  c                       e Zd Zy)AutocompleteSelectMultipleNr  r   r   r   r  r  \  r  r   r  )Cr3   r   rf  djangor   django.confr   django.core.exceptionsr   django.core.validatorsr   django.db.modelsr   r   django.urlsr	   django.urls.exceptionsr
   django.utils.htmlr   django.utils.httpr   django.utils.textr   django.utils.translationr   r   r_   SelectMultipler   	DateInputr7   rJ   	TimeInputrO   rV   SplitDateTimeWidgetrX   RadioSelectra   ClearableFileInputrc   r{   	TextInputr}   r   Widgetr   Textarear   r  
EmailInputr  URLInputr  NumberInputr  r  r!  lowerrQ  r   rV  r   Selectr  r  )rk   s   0r   <module>r     s        2 / /  1 , ' ' 1 1U11 <	5%// 	5.) .	5%// 	5.) .22 (/u(( />e.. >(Q-EOO Q-h@1 @<s- s-lN%.. N
I5?? I
IE,, I
%.. .Le// L$!8 $I5?? I.1	 GGIqL1 d   GD E
n
 n
b	*ELL 		!2E4H4H 	o1s   .H