o
    uvXjGC  ã                   @   s  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„ dejƒZG dd„ dejƒZG dd„ dejƒ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j-ƒZ.G d$d%„ d%ej(ƒZ/G d&d'„ d'ej0ƒZ1G d(d)„ d)ej2ƒZ3G d*d+„ d+ej4ƒZ5G d,d-„ d-e5ƒZ6G d.d/„ d/ej(ƒZ7d0d1„ d2D ƒZ8e8 9d3d4d5œ¡ G d6d7„ d7ƒZ:G d8d9„ d9e:ej;ƒZ<G d:d;„ d;e:ejƒZ=dS )<z8
Form Widget classes specific to the Django admin site.
é    N)Úforms)Úsettings)ÚValidationError)ÚURLValidator)ÚCASCADE)Úreverse)ÚNoReverseMatch)Úsmart_urlquote)Ú	mark_safe)Ú	Truncator)Úget_languageÚgettextc                       s:   e Zd ZdZe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                 C   s6   t jrdnd}d| ddddg}tjdd	„ |D ƒd
�S )NÚ ú.minzvendor/jquery/jquery%s.jszjquery.init.jszcore.jszSelectBox.jszSelectFilter2.jsc                 S   s   g | ]}d | ‘qS )zadmin/js/%s© )Ú.0Úpathr   r   úY/var/www/html/myproject/venv/lib/python3.10/site-packages/django/contrib/admin/widgets.pyÚ
<listcomp>%   s    z0FilteredSelectMultiple.media.<locals>.<listcomp>)Újs)r   ÚDEBUGr   ÚMedia)ÚselfÚextrar   r   r   r   Úmedia   s   ûzFilteredSelectMultiple.mediaNr   c                    s   || _ || _tƒ  ||¡ d S ©N)Úverbose_nameÚ
is_stackedÚsuperÚ__init__)r   r   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Ústackedzdata-field-namezdata-is-stacked)r   Úget_contextr   r   Úint©r   ÚnameÚvaluer!   Úcontextr#   r   r   r)   ,   s   z"FilteredSelectMultiple.get_context)Nr   )	Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úpropertyr   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 )ÚAdminDateWidgetc                   @   ó   e Zd ZddgZdS )zAdminDateWidget.Mediaúadmin/js/calendar.jsú#admin/js/admin/DateTimeShortcuts.jsN©r/   r0   r1   r   r   r   r   r   r   7   ó    þr   Nc                    ó&   dddœ|pi ¥}t ƒ j||d� d S )NÚ
vDateFieldÚ10©r'   Úsize©r!   Úformat©r   r    ©r   r!   rB   r#   r   r   r    =   ó   zAdminDateWidget.__init__©NN©r/   r0   r1   r   r    r4   r   r   r#   r   r6   6   ó    r6   c                       r5   )ÚAdminTimeWidgetc                   @   r7   )zAdminTimeWidget.Mediar8   r9   Nr:   r   r   r   r   r   C   r;   r   Nc                    r<   )NÚ
vTimeFieldÚ8r?   rA   rC   rD   r#   r   r   r    I   rE   zAdminTimeWidget.__init__rF   rG   r   r   r#   r   rI   B   rH   rI   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   )r6   rI   r   ÚMultiWidgetr    )r   r!   Úwidgetsr   r   r   r    T   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)   Z   s   zAdminSplitDateTime.get_contextr   )r/   r0   r1   r2   Útemplate_namer    r)   r4   r   r   r#   r   rL   N   s
    
rL   c                   @   ó   e Zd ZdZdS )ÚAdminRadioSelectzadmin/widgets/radio.htmlN©r/   r0   r1   rR   r   r   r   r   rT   a   ó    rT   c                   @   rS   )ÚAdminFileWidgetz'admin/widgets/clearable_file_input.htmlNrU   r   r   r   r   rW   e   rV   rW   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©r   Úxr   r   r   Ú	<genexpr>t   ó   € z.url_params_from_lookup_dict.<locals>.<genexpr>)Ú0Ú1)	ÚhasattrrX   ÚcallableÚ
isinstanceÚtupleÚlistÚjoinÚboolr\   )ÚlookupsÚparamsÚkÚvr   r   r   Úurl_params_from_lookup_dicti   s   


rn   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   rp   rq   r!   Úusingr#   r   r   r    „   s   zForeignKeyRawIdWidget.__init__c                    sØ   t ƒ  |||¡}| jj}|| jjv rOtd|jj|jj	f | jj
d�}|  ¡ }|r8|dd dd„ | ¡ D ƒ¡ 7 }t|ƒ|d< tdƒ|d	< |d
 d  dd¡ nd |d< |d
 d rf|  |¡\|d< |d< |S d |d< |S )Nzadmin:%s_%s_changelist)Úcurrent_appú?z&amp;c                 s   s    � | ]\}}d ||f V  qdS ©z%s=%sNr   )r   rl   rm   r   r   r   r_   ™   s   € z4ForeignKeyRawIdWidget.get_context.<locals>.<genexpr>Úrelated_urlÚLookupÚ
link_titler&   r!   r'   ÚvForeignKeyRawIdAdminFieldr-   Ú
link_labelÚlink_url)r   r)   rp   Úmodelrq   Ú	_registryr   Ú_metaÚ	app_labelÚ
model_namer,   Úurl_parametersrh   rX   r
   rQ   Ú
setdefaultÚlabel_and_url_for_value)r   r,   r-   r!   r.   Úrel_torw   rk   r#   r   r   r)   Š   s,   þû ÿz!ForeignKeyRawIdWidget.get_contextc                 C   s   | j j}t|ƒr|ƒ }t|ƒS r   )rp   Úlimit_choices_tord   rn   )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‡   Úupdaterp   Úget_related_fieldr,   )r   rˆ   rk   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yL   d}Y nw t|ƒ d¡|fS )N©r   r   z%s:%s_%s_change)Úargsr   é   r   )rp   r‹   r,   r}   Ú_default_managerrs   rr   ÚgetÚ
ValueErrorÚDoesNotExistr   r   rq   r   r€   Úobject_nameÚlowerÚpkr   r   Úwords)r   r-   ÚkeyÚobjÚurlr   r   r   r„   ²   s&   &ÿ
ý
úÿz-ForeignKeyRawIdWidget.label_and_url_for_valuerF   )r/   r0   r1   r2   rR   r    r)   r‡   r‚   r„   r4   r   r   r#   r   ro   }   s    ro   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jv rd|d d d< |S )NÚvManyToManyRawIdAdminFieldr&   r!   r'   )r   r)   rp   r}   rq   r~   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 )NrY   )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 )NrY   c                 s   rZ   r   r[   ©r   rm   r   r   r   r_   â   r`   z5ManyToManyRawIdWidget.format_value.<locals>.<genexpr>r   )rh   r�   r   r   r   Úformat_valueá   s   z"ManyToManyRawIdWidget.format_value)r/   r0   r1   r2   rR   r)   r‚   r„   r¡   r£   r4   r   r   r#   r   rš   È   s    rš   c                   @   sl   e Zd ZdZdZ			ddd„Zdd„ Zed	d
„ ƒZe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| _|j| _|| _|| _|d u r|j|jv }|| _t|ddƒ}| o)|| _	t|dd ƒt
u }	| o:|	 o:|| _| o@|| _|| _d S )NÚallow_multiple_selectedFÚ	on_delete)Úneeds_multipart_formr!   r"   r&   rp   r}   r~   Úcan_add_relatedÚgetattrÚcan_change_relatedr   Úcan_delete_relatedÚcan_view_relatedrq   )
r   r&   rp   rq   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&   r   rœ   r   r   r   r     r¶   zRelatedFieldWidgetWrapper.mediac                 G   s   t d||f  | jj|d�S )Nzadmin:%s_%s_%s)rt   r�   )r   rq   r,   )r   ÚinfoÚactionr�   r   r   r   Úget_related_url  s   ÿz)RelatedFieldWidgetWrapper.get_related_urlc           
   
   C   sØ   ddl m}m} | jjj}|j|jf}| j| j	_d 
dd„ || j ¡ jf|dffD ƒ¡}| j	 |||¡| j|||j| j| j| j| jdœ	}	| jrO|  |d¡|	d	< | jr[|  |d
d¡|	d< | jsa| jrj|  |dd¡|	d< |	S )Nr   )ÚIS_POPUP_VARrˆ   ú&c                 s   s   � | ]}d | V  qdS rv   r   )r   Úparamr   r   r   r_     r`   z8RelatedFieldWidgetWrapper.get_context.<locals>.<genexpr>é   )	Ú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ˆ   rp   r}   r   r€   r�   r"   r&   rh   r‹   r,   Úrenderrµ   r   r¨   rª   r«   r¬   r¹   )
r   r,   r-   r!   rº   rˆ   Úrel_optsr·   r¿   r.   r   r   r   r)     s2   



þ÷z%RelatedFieldWidgetWrapper.get_contextc                 C   ó   | j  |||¡S r   )r&   r¡   ©r   rŸ   r    r,   r   r   r   r¡   2  ó   z-RelatedFieldWidgetWrapper.value_from_datadictc                 C   rÉ   r   )r&   Úvalue_omitted_from_datarÊ   r   r   r   rÌ   5  rË   z1RelatedFieldWidgetWrapper.value_omitted_from_datac                 C   s   | j  |¡S r   )r&   Úid_for_label)r   Úid_r   r   r   rÍ   8  s   z&RelatedFieldWidgetWrapper.id_for_label)NFFF)r/   r0   r1   r2   rR   r    r³   r3   rµ   r   r¹   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!   rC   ©r   r!   r#   r   r   r    =  ó   zAdminTextareaWidget.__init__r   ©r/   r0   r1   r    r4   r   r   r#   r   rÐ   <  ó    rÐ   c                       rÏ   )ÚAdminTextInputWidgetNc                    rÑ   ©Nr'   Ú
vTextFieldrÓ   rC   rÔ   r#   r   r   r    B  rÕ   zAdminTextInputWidget.__init__r   rÖ   r   r   r#   r   rØ   A  r×   rØ   c                       rÏ   )ÚAdminEmailInputWidgetNc                    rÑ   rÙ   rC   rÔ   r#   r   r   r    G  rÕ   zAdminEmailInputWidget.__init__r   rÖ   r   r   r#   r   rÛ   F  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    N  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)   rQ   r	   )r   r,   r-   r!   rã   r.   r#   r   r   r)   R  s   ÿ zAdminURLFieldWidget.get_context)r/   r0   r1   rR   r   r    r)   r4   r   r   r#   r   rÜ   K  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    c  s    z AdminIntegerFieldWidget.__init__r   )r/   r0   r1   ræ   r    r4   r   r   r#   r   rä   `  s    rä   c                   @   rS   )ÚAdminBigIntegerFieldWidgetÚvBigIntegerFieldN)r/   r0   r1   ræ   r   r   r   r   rç   g  rV   rç   c                       rÏ   )ÚAdminUUIDInputWidgetNc                    rÑ   )Nr'   Ú
vUUIDFieldrÓ   rC   rÔ   r#   r   r   r    l  rÕ   zAdminUUIDInputWidget.__init__r   rÖ   r   r   r#   r   ré   k  r×   ré   c                 C   s   i | ]}|  ¡ |“qS r   )r”   r]   r   r   r   Ú
<dictcomp>s  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                       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 )Ú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_autocompleteNr   c                 C   s8   || _ || _|| _|| _|d u ri | _d S | ¡ | _d S r   )rp   rq   rr   r"   r¯   r!   )r   rp   rq   r!   r"   rs   r   r   r   r    †  s
    zAutocompleteMixin.__init__c                 C   s(   | j j}t| j| jj|jj|jjf ƒS r   )	rp   r}   r   Úurl_namerq   r,   r   r€   r�   )r   r}   r   r   r   Úget_url�  s    zAutocompleteMixin.get_urlc                    s`   t ƒ j||d�}| dd¡ | dd|  ¡ dt | j ¡d|d |d r&d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--typezdata-ajax--urlz
data-themezdata-allow-clearzdata-placeholderr'   )r   Úbuild_attrsrƒ   rŠ   r  ÚjsonÚdumpsÚis_required)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¡¡ ‡ fdd	„ˆ jj ˆ j¡j|d
�D ƒ}|D ]+\}	}
t	|	ƒ|v oL|du pLˆ j}||O }t
|d ƒ}|d }| ˆ  ||	|
||¡¡ q<|S )z9Return selected options based on the ModelChoiceIterator.Nr   Fc                    s&   h | ]}t |ƒˆ jjjvrt |ƒ’qS r   )r\   r"   ÚfieldÚempty_valuesr¢   rœ   r   r   Ú	<setcomp>«  s
    ÿz.AutocompleteMixin.optgroups.<locals>.<setcomp>r½   r   c                 3   s$   � | ]}|j ˆ jj |¡fV  qd S r   )r•   r"   r"  Úlabel_from_instance)r   r˜   rœ   r   r   r_   ±  s
   € ÿ
ÿz.AutocompleteMixin.optgroups.<locals>.<genexpr>)Úpk__in)r   r¥   ÚappendÚcreate_optionr"   Úquerysetrs   rr   Úfilterr\   Úlen)r   r,   r-   ÚattrÚdefaultÚgroupsÚhas_selectedÚselected_choicesr"   Úoption_valueÚoption_labelÚselectedÚindexÚsubgroupr   rœ   r   Ú	optgroups¦  s(   

ÿ
þþzAutocompleteMixin.optgroupsc                 C   sZ   t jrdnd}t tƒ ¡}|rd| fnd}tjd| d| f| d dd	| d
fid�S )Nr   r   z"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   r   ÚSELECT2_TRANSLATIONSr�   r   r   r   )r   r   Ú	i18n_nameÚ	i18n_filer   r   r   r   À  s"   þýýþÿøzAutocompleteMixin.media)Nr   Nr   )r/   r0   r1   r2   r  r    r  r  r6  r3   r   r4   r   r   r#   r   r  }  s    

r  c                   @   ó   e Zd ZdS )ÚAutocompleteSelectN©r/   r0   r1   r   r   r   r   r=  Ö  ó    r=  c                   @   r<  )ÚAutocompleteSelectMultipleNr>  r   r   r   r   r@  Ú  r?  r@  )>r2   r¯   r  Údjangor   Údjango.confr   Údjango.core.exceptionsr   Údjango.core.validatorsr   Údjango.db.models.deletionr   Údjango.urlsr   Údjango.urls.exceptionsr   Údjango.utils.htmlr	   Údjango.utils.safestringr
   Údjango.utils.textr   Údjango.utils.translationr   r   rQ   ÚSelectMultipler   Ú	DateInputr6   Ú	TimeInputrI   ÚSplitDateTimeWidgetrL   ÚRadioSelectrT   ÚClearableFileInputrW   rn   Ú	TextInputro   rš   ÚWidgetr¤   ÚTextarearÐ   rØ   Ú
EmailInputrÛ   ÚURLInputrÜ   ÚNumberInputrä   rç   ré   r9  rŠ   r  ÚSelectr=  r@  r   r   r   r   Ú<module>   sH    "KWY