o
    z,hL                     @   sL  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 dejZG dd dejZG dd deZ G dd dej!Z"G dd de"Z#G dd dej$Z%G dd dej&Z'G dd dej(Z)dd  Z*G d!d" d"ej+Z,G d#d$ d$e,Z-G d%d& d&ej.Z/G d'd( d(ej0Z1G d)d* d*ej+Z2G d+d, d,ej3Z4G d-d. d.ej5Z6G d/d0 d0ej7Z8G d1d2 d2e8Z9G d3d4 d4ej+Z:d5d6 d7D Z;e;<d8d9d: d;d< Z=G d=d> d>Z>G d?d@ d@e>ej?Z@G dAdB dBe>ejZAdS )Cz8
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                       s<   e Zd ZdZG dd dZd
 fdd	Z fdd	Z  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                   @   s   e Zd Zg dZdS )zFilteredSelectMultiple.Media)zadmin/js/core.jszadmin/js/SelectBox.jszadmin/js/SelectFilter2.jsN__name__
__module____qualname__js r   r   R/var/www/html/rh/venv/lib/python3.10/site-packages/django/contrib/admin/widgets.pyMedia   s    r   Nr   c                    s   || _ || _t || d S N)verbose_name
is_stackedsuper__init__)selfr   r   attrschoices	__class__r   r   r   %   s   zFilteredSelectMultiple.__init__c                    sj   t  |||}d|d d d< | jr|d d d  d7  < | 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    r   r   r'   *   s   z"FilteredSelectMultiple.get_context)Nr   )r   r   r   __doc__r   r   r'   __classcell__r   r   r    r   r      s
    r   c                       ,   e Zd ZG dd dZd fdd	Z  ZS )BaseAdminDateWidgetc                   @      e Zd ZddgZdS )zBaseAdminDateWidget.Mediaadmin/js/calendar.js#admin/js/admin/DateTimeShortcuts.jsNr   r   r   r   r   r   5       r   Nc                    &   ddd|pi }t  j||d d S )N
vDateField10r$   sizer   formatr   r   r   r   r;   r    r   r   r   ;      zBaseAdminDateWidget.__init__NNr   r   r   r   r   r.   r   r   r    r   r0   4       r0   c                   @      e Zd ZdZdS )AdminDateWidgetzadmin/widgets/date.htmlNr   r   r   template_namer   r   r   r   rC   @       rC   c                       r/   )BaseAdminTimeWidgetc                   @   r1   )zBaseAdminTimeWidget.Mediar2   r3   Nr   r   r   r   r   r   E   r4   r   Nc                    r5   )N
vTimeField8r8   r:   r<   r=   r    r   r   r   K   r>   zBaseAdminTimeWidget.__init__r?   r@   r   r   r    r   rG   D   rA   rG   c                   @   rB   )AdminTimeWidgetzadmin/widgets/time.htmlNrD   r   r   r   r   rJ   P   rF   rJ   c                       s.   e Zd ZdZdZdddZ fddZ  ZS )	AdminSplitDateTimezF
    A SplitDateTime Widget that has some admin-specific styling.
    z!admin/widgets/split_datetime.htmlNc                 C   s   t tg}tj| || d S r   )r0   rG   r   MultiWidgetr   )r   r   widgetsr   r   r   r   [   s   zAdminSplitDateTime.__init__c                    s,   t  |||}td|d< td|d< |S )NzDate:
date_labelzTime:
time_label)r   r'   _r)   r    r   r   r'   a   s   zAdminSplitDateTime.get_contextr   )r   r   r   r-   rE   r   r'   r.   r   r   r    r   rK   T   s
    
rK   c                   @   rB   )AdminRadioSelectzadmin/widgets/radio.htmlNrD   r   r   r   r   rQ   h   rF   rQ   c                   @   rB   )AdminFileWidgetz'admin/widgets/clearable_file_input.htmlNrD   r   r   r   r   rR   l   rF   rR   c                 C   s~   i }| r=t | dr=|  D ]/\}}t|r| }t|ttfr*ddd |D }nt|tr4d| }nt|}|||< q|S )z
    Convert the type of lookups specified in a ForeignKey limit_choices_to
    attribute to a dictionary of query parameters
    items,c                 s       | ]}t |V  qd S r   str.0xr   r   r   	<genexpr>{       z.url_params_from_lookup_dict.<locals>.<genexpr>)01)	hasattrrS   callable
isinstancetuplelistjoinboolrW   )lookupsparamskvr   r   r   url_params_from_lookup_dictp   s   


rj   c                       sJ   e Zd ZdZdZd fdd	Z fddZdd	 Zd
d Zdd Z	  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.htmlNc                    s"   || _ || _|| _t | d S r   )rel
admin_sitedbr   r   )r   rl   rm   r   usingr    r   r   r      s   zForeignKeyRawIdWidget.__init__c           	         s   t  |||}| jj}| j|rStd|jj|jj	f | jj
d}|  }|r0|dt| 7 }||d< td|d< d}t| j trH|d7 }|d	 d
 d| nd |d< |d	 d rj| |\|d< |d< |S d |d< |S )Nzadmin:%s_%s_changelist)current_app?related_urlLookup
link_titlevForeignKeyRawIdAdminFieldz vUUIDFieldr#   r   r$   r+   
link_labellink_url)r   r'   rl   modelrm   is_registeredr   _meta	app_label
model_namer*   url_parametersr   rP   ra   get_related_fieldr   
setdefaultlabel_and_url_for_value)	r   r*   r+   r   r,   rel_torr   rg   	css_classr    r   r   r'      s8   	z!ForeignKeyRawIdWidget.get_contextc                 C   s   | j j}t|r| }t|S r   )rl   limit_choices_tor`   rj   )r   r   r   r   r   base_url_parameters   s   z)ForeignKeyRawIdWidget.base_url_parametersc                 C   s.   ddl m} |  }||| j ji |S )Nr   )TO_FIELD_VAR)django.contrib.admin.views.mainr   r   updaterl   r~   r*   )r   r   rg   r   r   r   r}      s   z$ForeignKeyRawIdWidget.url_parametersc              
   C   s   | j  j}z| j jj| jjdi ||i}W n t| j jj	t
fy)   Y dS w ztd| jj|jj|jjf |jfd}W n tyJ   d}Y nw t|d|fS )N r   z%s:%s_%s_change)argsr      r   )rl   r~   r*   rx   _default_managerro   rn   get
ValueErrorDoesNotExistr   r   rm   rz   r{   r|   pkr	   r   words)r   r+   keyobjurlr   r   r   r      s(   &
	z-ForeignKeyRawIdWidget.label_and_url_for_valuer?   )r   r   r   r-   rE   r   r'   r   r}   r   r.   r   r   r    r   rk      s    "rk   c                       sD   e Zd ZdZdZ fddZdd Zdd Zd	d
 Zdd Z	  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                    s4   t  |||}| j| jjrd|d d d< |S )NvManyToManyRawIdAdminFieldr#   r   r$   )r   r'   rm   ry   rl   rx   r)   r    r   r   r'      s   z!ManyToManyRawIdWidget.get_contextc                 C   s   |   S r   )r   r   r   r   r   r}      s   z$ManyToManyRawIdWidget.url_parametersc                 C   s   dS )Nr   r   r   r+   r   r   r   r      s   z-ManyToManyRawIdWidget.label_and_url_for_valuec                 C   s   | |}|r|dS d S )NrT   )r   split)r   datafilesr*   r+   r   r   r   value_from_datadict   s   

z)ManyToManyRawIdWidget.value_from_datadictc                 C   s   |rd dd |D S dS )NrT   c                 s   rU   r   rV   rY   ri   r   r   r   r[      r\   z5ManyToManyRawIdWidget.format_value.<locals>.<genexpr>r   )rd   r   r   r   r   format_value   s   z"ManyToManyRawIdWidget.format_value)r   r   r   r-   rE   r'   r}   r   r   r   r.   r   r   r    r   r      s    r   c                   @   s   e Zd ZdZdZ				dddZdd Zed	d
 Zedd Z	edd Z
e
jdd Z
dd Zdd Zdd Zdd Zdd ZdS )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.htmlNFc           
      C   s   |j | _ |j| _|| _|| _|d u r||j}|| _t|dd}t|t	s+d| jd< | o/|| _
t|dd tu }	| o@|	 o@|| _| oF|| _|| _d S )Nallow_multiple_selectedFzavailable-sourcezdata-context	on_delete)needs_multipart_formr   r#   rl   ry   rx   can_add_relatedgetattrra   AutocompleteMixincan_change_relatedr   can_delete_relatedcan_view_relatedrm   )
r   r#   rl   rm   r   r   r   r   multiplecascader   r   r   r      s   



z"RelatedFieldWidgetWrapper.__init__c                 C   s4   t  | }t | j||_| jj|_||t| < |S r   )copydeepcopyr#   r   id)r   memor   r   r   r   __deepcopy__  s
   

z&RelatedFieldWidgetWrapper.__deepcopy__c                 C      | j jS r   )r#   	is_hiddenr   r   r   r   r   $     z#RelatedFieldWidgetWrapper.is_hiddenc                 C   r   r   )r#   mediar   r   r   r   r   (  r   zRelatedFieldWidgetWrapper.mediac                 C   r   r   r#   r   r   r   r   r   r   ,  r   z!RelatedFieldWidgetWrapper.choicesc                 C   s   || j _d S r   r   r   r   r   r   r   0  s   c                 G   s   t d||f  | jj|dS )Nzadmin:%s_%s_%s)rp   r   )r   rm   r*   )r   infoactionr   r   r   r   get_related_url4  s
   z)RelatedFieldWidgetWrapper.get_related_urlc                 C   s   ddl m}m} | jjj}|j|jf}| j j	}d
dd ||f|dffD }	| j|||| j||	|j|j| j| j| j| j| jjd}
| jrQ| |d|
d	< | jr]| |d
d|
d< | jsc| jru| d| |
d< | |dd|
d< |
S )Nr   )IS_POPUP_VARr   &c                 s   s    | ]}d | V  qdS )z%s=%sNr   )rY   paramr   r   r   r[   A  s
    
z8RelatedFieldWidgetWrapper.get_context.<locals>.<genexpr>   )rendered_widgetr   r*   
url_paramsrx   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   rl   rx   rz   r{   r|   r~   r*   rd   r#   renderr   r   r   r   r   r   r   r   )r   r*   r+   r   r   r   rel_optsr   related_field_namer   r,   r   r   r   r'   ;  sB   

z%RelatedFieldWidgetWrapper.get_contextc                 C      | j |||S r   )r#   r   r   r   r   r*   r   r   r   r   b     z-RelatedFieldWidgetWrapper.value_from_datadictc                 C   r   r   )r#   value_omitted_from_datar   r   r   r   r   e  r   z1RelatedFieldWidgetWrapper.value_omitted_from_datac                 C   s   | j |S r   )r#   id_for_label)r   id_r   r   r   r   h  s   z&RelatedFieldWidgetWrapper.id_for_label)NFFF)r   r   r   r-   rE   r   r   propertyr   r   r   setterr   r'   r   r   r   r   r   r   r   r      s,    




'r   c                          e Zd Zd fdd	Z  ZS )AdminTextareaWidgetNc                       t  jddi|p	i d d S )Nr$   vLargeTextFieldr   r<   r   r   r    r   r   r   m     zAdminTextareaWidget.__init__r   r   r   r   r   r.   r   r   r    r   r   l      r   c                       r   )AdminTextInputWidgetNc                    r   Nr$   
vTextFieldr   r<   r   r    r   r   r   r  r   zAdminTextInputWidget.__init__r   r   r   r   r    r   r   q  r   r   c                       r   )AdminEmailInputWidgetNc                    r   r   r<   r   r    r   r   r   w  r   zAdminEmailInputWidget.__init__r   r   r   r   r    r   r   v  r   r   c                       s2   e Zd ZdZdef fdd	Z fddZ  ZS )AdminURLFieldWidgetzadmin/widgets/url.htmlNc                    s&   t  jddi|p	i d | | _d S )Nr$   	vURLFieldr   )r   r   	validator)r   r   validator_classr    r   r   r   ~  s   zAdminURLFieldWidget.__init__c                    s   z|  |r|nd d}W n ty   d}Y nw t |||}td|d< td|d< |r7t|d d	 nd|d d
< ||d< |S )Nr   TFz
Currently:current_labelzChange:change_labelr#   r+   href	url_valid)r   r   r   r'   rP   r
   )r   r*   r+   r   r   r,   r    r   r   r'     s   
zAdminURLFieldWidget.get_context)r   r   r   rE   r   r   r'   r.   r   r   r    r   r   {  s    r   c                       s"   e Zd ZdZd fdd	Z  ZS )AdminIntegerFieldWidgetvIntegerFieldNc                    s    t  jd| ji|p
i d d S )Nr$   r   )r   r   
class_namer   r    r   r   r     s    z AdminIntegerFieldWidget.__init__r   )r   r   r   r   r   r.   r   r   r    r   r     s    r   c                   @   rB   )AdminBigIntegerFieldWidgetvBigIntegerFieldN)r   r   r   r   r   r   r   r   r     rF   r   c                       r   )AdminUUIDInputWidgetNc                    r   )Nr$   
vUUIDFieldr   r<   r   r    r   r   r     r   zAdminUUIDInputWidget.__init__r   r   r   r   r    r   r     r   r   c                 C   s   i | ]}|  |qS r   )lowerrX   r   r   r   
<dictcomp>  s    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                  C   sn   t  } t| }|d u r5| d ur5d }| dd| }dkr5t| d |  }r*|S | dd| }dks|S )N-r   )r   SELECT2_TRANSLATIONSr   rfind)	lang_codesupported_codeir   r   r   get_select2_language  s   
r"  c                       sN   e Zd ZdZdZdddZdd Zd fd	d
	ZdddZe	dd Z
  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:autocompleteNr   c                 C   s:   || _ || _|| _|| _|d u ri n| | _t | _d S r   )fieldrm   rn   r   r   r   r"  	i18n_name)r   r#  rm   r   r   ro   r   r   r   r     s   zAutocompleteMixin.__init__c                 C   s   t | j| jj S r   )r   url_namerm   r*   r   r   r   r   get_url  s   zAutocompleteMixin.get_urlc                    s   t  j||d}|dd |ddd|  | jjjj| jjjj	| jj
dt| j d| j|d |d r6dnd d 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&  r#  rx   rz   r{   r|   r*   jsondumpsis_requiredr$  )r   
base_attrsr'  r   r    r   r   r-    s,   

zAutocompleteMixin.build_attrsc              
      s  dg df}|g}d} fdd|D } j s' js'|d  |dddd  jjjj}t jjd|j	j
|j
 fd	d
 jj jjdi d |iD }	|	D ]+\}
}t|
|v oi|du pi j}||O }t|d }|d }| ||
||| qY|S )z9Return selected options based on the ModelChoiceIterator.Nr   Fc                    s&   h | ]}t | jjjvrt |qS r   )rW   r   r#  empty_valuesr   r   r   r   	<setcomp>  s     z.AutocompleteMixin.optgroups.<locals>.<setcomp>r   r   
field_namec                 3   s(    | ]}t | jj|fV  qd S r   )r   r   r#  label_from_instance)rY   r   r   to_field_namer   r   r[   )  s
    
z.AutocompleteMixin.optgroups.<locals>.<genexpr>z%s__inr   )r0  r   appendcreate_optionr#  remote_fieldrx   rz   r   r   attname	get_fieldr   querysetro   rn   filterrW   len)r   r*   r+   attrdefaultgroupshas_selectedselected_choicesremote_model_optsr   option_valueoption_labelselectedindexsubgroupr   r6  r   	optgroups  s>   



zAutocompleteMixin.optgroupsc                 C   sR   t jrdnd}| jrd| j fnd}tjd| d| f| d dd	| d
fid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   DEBUGr$  r   r   )r   extra	i18n_filer   r   r   r   =  s&   
zAutocompleteMixin.media)Nr   Nr   )r   r   r   r-   r%  r   r&  r-  rK  r   r   r.   r   r   r    r   r     s    

#r   c                   @      e Zd ZdS )AutocompleteSelectNr   r   r   r   r   r   r   rR  X      rR  c                   @   rQ  )AutocompleteSelectMultipleNrS  r   r   r   r   rU  \  rT  rU  )Br-   r   r.  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   rP   SelectMultipler   	DateInputr0   rC   	TimeInputrG   rJ   SplitDateTimeWidgetrK   RadioSelectrQ   ClearableFileInputrR   rj   	TextInputrk   r   Widgetr   Textarear   r   
EmailInputr   URLInputr   NumberInputr   r   r   r  r   r"  r   SelectrR  rU  r   r   r   r   <module>   sT    Tv2q