B
    CVvgìC  ã               @   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)Ú	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dddgZdS )zFilteredSelectMultiple.Mediazadmin/js/core.jszadmin/js/SelectBox.jszadmin/js/SelectFilter2.jsN)Ú__name__Ú
__module__Ú__qualname__Újs© r   r   ú@/tmp/pip-install-o3oxmrkh/Django/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 )NZselectfilterÚwidgetr   ÚclassZstackedzdata-field-namezdata-is-stacked)r   Úget_contextr   r   Úint)r   ÚnameÚvaluer   Úcontext)r   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                   s,   e Zd ZG dd„ dƒZd‡ fdd„	Z‡  ZS )ÚAdminDateWidgetc               @   s   e Zd ZddgZdS )zAdminDateWidget.Mediazadmin/js/calendar.jsz#admin/js/admin/DateTimeShortcuts.jsN)r   r   r   r   r   r   r   r   r   2   s   r   Nc                s&   dddœ|pi –}t ƒ j||d� d S )NZ
vDateFieldÚ10)r   Úsize)r   Úformat)r   r   )r   r   r*   )r   r   r   r   8   s    zAdminDateWidget.__init__)NN)r   r   r   r   r   r&   r   r   )r   r   r'   1   s   r'   c                   s,   e Zd ZG dd„ dƒZd‡ fdd„	Z‡  ZS )ÚAdminTimeWidgetc               @   s   e Zd ZddgZdS )zAdminTimeWidget.Mediazadmin/js/calendar.jsz#admin/js/admin/DateTimeShortcuts.jsN)r   r   r   r   r   r   r   r   r   >   s   r   Nc                s&   dddœ|pi –}t ƒ j||d� d S )NZ
vTimeFieldÚ8)r   r)   )r   r*   )r   r   )r   r   r*   )r   r   r   r   D   s    zAdminTimeWidget.__init__)NN)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‡ 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 )N)r'   r+   r   ZMultiWidgetr   )r   r   Zwidgetsr   r   r   r   O   s    zAdminSplitDateTime.__init__c                s,   t ƒ  |||¡}tdƒ|d< tdƒ|d< |S )NzDate:Z
date_labelzTime:Z
time_label)r   r    Ú_)r   r"   r#   r   r$   )r   r   r   r    U   s    zAdminSplitDateTime.get_context)N)r   r   r   r%   Útemplate_namer   r    r&   r   r   )r   r   r-   I   s   
r-   c               @   s   e Zd ZdZdS )ÚAdminRadioSelectzadmin/widgets/radio.htmlN)r   r   r   r/   r   r   r   r   r0   \   s   r0   c               @   s   e Zd ZdZdS )ÚAdminFileWidgetz'admin/widgets/clearable_file_input.htmlN)r   r   r   r/   r   r   r   r   r1   `   s   r1   c             C   s‚   i }| r~t | dƒr~xj|  ¡ D ]^\}}t|ƒr2|ƒ }t|ttfƒrVd dd„ |D ƒ¡}nt|tƒrjd| }nt|ƒ}|||< qW |S )z‚
    Convert the type of lookups specified in a ForeignKey limit_choices_to
    attribute to a dictionary of query parameters
    Úitemsú,c             s   s   | ]}t |ƒV  qd S )N)Ústr)Ú.0Úxr   r   r   ú	<genexpr>o   s    z.url_params_from_lookup_dict.<locals>.<genexpr>)Ú0Ú1)	Úhasattrr2   ÚcallableÚ
isinstanceÚtupleÚlistÚjoinÚboolr4   )ZlookupsÚparamsÚkÚvr   r   r   Úurl_params_from_lookup_dictd   s    

rD   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 )N)ÚrelÚ
admin_siteÚdbr   r   )r   rF   rG   r   Úusing)r   r   r   r      s    zForeignKeyRawIdWidget.__init__c                sÂ   t ƒ  |||¡}| jj}|| jjkrŠtd|jj|jj	f | jj
d�}|  ¡ }|r`|dt|ƒ 7 }||d< tdƒ|d< |d d  d	d
¡ nd |d< |d d r¶|  |¡\|d< |d< nd |d< |S )Nzadmin:%s_%s_changelist)Úcurrent_appú?Úrelated_urlZLookupZ
link_titler   r   r   ZvForeignKeyRawIdAdminFieldr#   Z
link_labelZlink_url)r   r    rF   ÚmodelrG   Ú	_registryr   Ú_metaÚ	app_labelÚ
model_namer"   Úurl_parametersr
   r.   Ú
setdefaultÚlabel_and_url_for_value)r   r"   r#   r   r$   Zrel_torL   rA   )r   r   r   r    …   s&    
z!ForeignKeyRawIdWidget.get_contextc             C   s   | j j}t|ƒr|ƒ }t|ƒS )N)rF   Úlimit_choices_tor;   rD   )r   rU   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.mainrW   rV   ÚupdaterF   Úget_related_fieldr"   )r   rW   rA   r   r   r   rR   §   s    z$ForeignKeyRawIdWidget.url_parametersc          
   C   sª   | j  ¡ j}y"| j jj | j¡jf ||iŽ}W n  t| j jj	t
fk
rN   dS X y.td| jj|jj|jj ¡ f |jfd�}W n tk
r–   d}Y nX t|ƒ d¡|fS )N)Ú r[   z%s:%s_%s_change)Úargsr[   é   )rF   rZ   r"   rM   Z_default_managerrI   rH   ÚgetÚ
ValueErrorZDoesNotExistr   r   rG   rO   rP   Zobject_nameÚlowerÚpkr   r   Úwords)r   r#   ÚkeyÚobjÚurlr   r   r   rT   ­   s    "
z-ForeignKeyRawIdWidget.label_and_url_for_value)NN)r   r   r   r%   r/   r   r    rV   rR   rT   r&   r   r   )r   r   rE   x   s   rE   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kr0d|d d d< |S )NZvManyToManyRawIdAdminFieldr   r   r   )r   r    rF   rM   rG   rN   )r   r"   r#   r   r$   )r   r   r   r    Ê   s    z!ManyToManyRawIdWidget.get_contextc             C   s   |   ¡ S )N)rV   )r   r   r   r   rR   Ñ   s    z$ManyToManyRawIdWidget.url_parametersc             C   s   dS )N)r[   r[   r   )r   r#   r   r   r   rT   Ô   s    z-ManyToManyRawIdWidget.label_and_url_for_valuec             C   s   |  |¡}|r| d¡S d S )Nr3   )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 )Nr3   c             s   s   | ]}t |ƒV  qd S )N)r4   )r5   rC   r   r   r   r7   Ý   s    z5ManyToManyRawIdWidget.format_value.<locals>.<genexpr>r[   )r?   )r   r#   r   r   r   Úformat_valueÜ   s    z"ManyToManyRawIdWidget.format_value)r   r   r   r%   r/   r    rR   rT   rj   rk   r&   r   r   )r   r   rf   Ã   s   rf   c               @   sf   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 kr8|j|jk}|| _t|ddƒ}| oR|| _	t|dd ƒt
k}	| ot|	 ot|| _| o€|| _|| _d S )NÚallow_multiple_selectedFZ	on_delete)Zneeds_multipart_formr   r   r   rF   rM   rN   Úcan_add_relatedÚgetattrÚcan_change_relatedr   Úcan_delete_relatedÚcan_view_relatedrG   )
r   r   rF   rG   rn   rp   rq   rr   ÚmultipleZcascader   r   r   r   ç   s    z"RelatedFieldWidgetWrapper.__init__c             C   s4   t   | ¡}t  | j|¡|_| jj|_||t| ƒ< |S )N)ÚcopyÚdeepcopyr   r   Úid)r   Úmemord   r   r   r   Ú__deepcopy__þ   s
    

z&RelatedFieldWidgetWrapper.__deepcopy__c             C   s   | j jS )N)r   Ú	is_hidden)r   r   r   r   ry     s    z#RelatedFieldWidgetWrapper.is_hiddenc             C   s   | j jS )N)r   Úmedia)r   r   r   r   rz   	  s    zRelatedFieldWidgetWrapper.mediac             G   s   t d||f  | jj|d�S )Nzadmin:%s_%s_%s)rJ   r\   )r   rG   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gD ƒ¡}| j	 |||¡| j|||j| j| j| j| jdœ	}	| jrž|  |d¡|	d	< | jr¶|  |d
d¡|	d< | jsÂ| jrÔ|  |dd¡|	d< |	S )Nr   )ÚIS_POPUP_VARrW   ú&c             s   s   | ]}d | V  qdS )z%s=%sNr   )r5   Úparamr   r   r   r7     s    z8RelatedFieldWidgetWrapper.get_context.<locals>.<genexpr>é   )	Zrendered_widgetry   r"   Ú
url_paramsrM   rn   rp   rq   rr   ÚaddZadd_related_urlÚdeleteZ__fk__Zdelete_related_template_urlZchangeZchange_related_template_url)rX   r~   rW   rF   rM   rO   rP   rQ   r   r   r?   rZ   r"   Úrenderry   r   rn   rp   rq   rr   r}   )
r   r"   r#   r   r~   rW   Zrel_optsr{   r‚   r$   r   r   r   r      s.    



z%RelatedFieldWidgetWrapper.get_contextc             C   s   | j  |||¡S )N)r   rj   )r   rh   ri   r"   r   r   r   rj   -  s    z-RelatedFieldWidgetWrapper.value_from_datadictc             C   s   | j  |||¡S )N)r   Úvalue_omitted_from_data)r   rh   ri   r"   r   r   r   r†   0  s    z1RelatedFieldWidgetWrapper.value_omitted_from_datac             C   s   | j  |¡S )N)r   Úid_for_label)r   Zid_r   r   r   r‡   3  s    z&RelatedFieldWidgetWrapper.id_for_label)NFFF)r   r   r   r%   r/   r   rx   Úpropertyry   rz   r}   r    rj   r†   r‡   r   r   r   r   rl   à   s     
rl   c                   s   e Zd Zd‡ fdd„	Z‡  ZS )ÚAdminTextareaWidgetNc                s   t ƒ jddi|pi –d� d S )Nr   ZvLargeTextField)r   )r   r   )r   r   )r   r   r   r   8  s    zAdminTextareaWidget.__init__)N)r   r   r   r   r&   r   r   )r   r   r‰   7  s   r‰   c                   s   e Zd Zd‡ fdd„	Z‡  ZS )ÚAdminTextInputWidgetNc                s   t ƒ jddi|pi –d� d S )Nr   Ú
vTextField)r   )r   r   )r   r   )r   r   r   r   =  s    zAdminTextInputWidget.__init__)N)r   r   r   r   r&   r   r   )r   r   rŠ   <  s   rŠ   c                   s   e Zd Zd‡ fdd„	Z‡  ZS )ÚAdminEmailInputWidgetNc                s   t ƒ jddi|pi –d� d S )Nr   r‹   )r   )r   r   )r   r   )r   r   r   r   B  s    zAdminEmailInputWidget.__init__)N)r   r   r   r   r&   r   r   )r   r   rŒ   A  s   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   Z	vURLField)r   )r   r   Ú	validator)r   r   Zvalidator_class)r   r   r   r   I  s    zAdminURLFieldWidget.__init__c                sˆ   y|   |r|nd¡ d}W n tk
r2   d}Y nX tƒ  |||¡}tdƒ|d< tdƒ|d< |rpt|d d	 ƒnd|d d
< ||d< |S )Nr[   TFz
Currently:Zcurrent_labelzChange:Zchange_labelr   r#   ÚhrefÚ	url_valid)rŽ   r   r   r    r.   r	   )r   r"   r#   r   r�   r$   )r   r   r   r    M  s    
 zAdminURLFieldWidget.get_context)r   r   r   r/   r   r   r    r&   r   r   )r   r   r�   F  s   r�   c                   s"   e Zd ZdZd‡ fdd„	Z‡  ZS )ÚAdminIntegerFieldWidgetZvIntegerFieldNc                s    t ƒ jd| ji|pi –d� d S )Nr   )r   )r   r   Ú
class_name)r   r   )r   r   r   r   ^  s    z AdminIntegerFieldWidget.__init__)N)r   r   r   r’   r   r&   r   r   )r   r   r‘   [  s   r‘   c               @   s   e Zd ZdZdS )ÚAdminBigIntegerFieldWidgetZvBigIntegerFieldN)r   r   r   r’   r   r   r   r   r“   b  s   r“   c                   s   e Zd Zd‡ fdd„	Z‡  ZS )ÚAdminUUIDInputWidgetNc                s   t ƒ jddi|pi –d� d S )Nr   Z
vUUIDField)r   )r   r   )r   r   )r   r   r   r   g  s    zAdminUUIDInputWidget.__init__)N)r   r   r   r   r&   r   r   )r   r   r”   f  s   r”   c             C   s   i | ]}||  ¡ “qS r   )r`   )r5   r6   r   r   r   ú
<dictcomp>n  s    r•   )-ÚarÚazÚbgÚcaÚcsÚdaÚdeÚelÚenÚesÚetÚeuÚfaÚfiÚfrÚglÚheÚhiÚhrÚhurv   Ú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:autocompleteNr   c             C   s2   || _ || _|| _|| _|d kr$i n| ¡ | _d S )N)ÚfieldrG   rH   r   rt   r   )r   rÁ   rG   r   r   rI   r   r   r   r   �  s
    zAutocompleteMixin.__init__c             C   s   t | j| jj ƒS )N)r   Úurl_namerG   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|d |d rhd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-namezdata-field-namez
data-themezdata-allow-clearzdata-placeholderr   )r   Úbuild_attrsrS   rY   rÃ   rÁ   rM   rO   rP   rQ   r"   ÚjsonÚdumpsÚis_required)r   Z
base_attrsrÄ   r   )r   r   r   rÉ   ‹  s    

"zAutocompleteMixin.build_attrsc          
      s  dg df}|g}d}‡ fdd„|D ƒ}ˆ j sNˆ jsN|d  ˆ  |dddd¡¡ ˆ jjjj}tˆ jjd|j	j
ƒ‰| ˆ¡j
‰‡ ‡fd	d
„ˆ jj ˆ j¡jf dˆ |iŽD ƒ}	x^|	D ]V\}
}t|
ƒ|koÐ|dkpÐˆ j}||O }t|d ƒ}|d }| ˆ  ||
|||¡¡ q°W |S )z9Return selected options based on the ModelChoiceIterator.Nr   Fc                s&   h | ]}t |ƒˆ jjjkrt |ƒ’qS r   )r4   r   rÁ   Zempty_values)r5   rC   )r   r   r   ú	<setcomp>©  s   z.AutocompleteMixin.optgroups.<locals>.<setcomp>r�   r[   Ú
field_namec             3   s&   | ]}t |ˆƒˆ jj |¡fV  qd S )N)ro   r   rÁ   Zlabel_from_instance)r5   rd   )r   Úto_field_namer   r   r7   ³  s   z.AutocompleteMixin.optgroups.<locals>.<genexpr>z%s__in)rÌ   rm   ÚappendZcreate_optionrÁ   Zremote_fieldrM   rO   ro   ra   ZattnameÚ	get_fieldr   ZquerysetrI   rH   Úfilterr4   Úlen)r   r"   r#   ÚattrÚdefaultÚgroupsZhas_selectedZselected_choicesZremote_model_optsr   Zoption_valueZoption_labelÚselectedÚindexZsubgroupr   )r   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[   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.jsZscreenz&admin/css/vendor/select2/select2%s.csszadmin/css/autocomplete.css)r   Úcss)r   ÚDEBUGÚSELECT2_TRANSLATIONSr^   r   r   r   )r   ÚextraZ	i18n_nameZ	i18n_filer   r   r   rz   Á  s    zAutocompleteMixin.media)Nr   N)N)N)r   r   r   r%   rÂ   r   rÃ   rÉ   rÙ   rˆ   rz   r&   r   r   )r   r   rÀ   x  s   

rÀ   c               @   s   e Zd ZdS )ÚAutocompleteSelectN)r   r   r   r   r   r   r   rÞ   ×  s   rÞ   c               @   s   e Zd ZdS )ÚAutocompleteSelectMultipleN)r   r   r   r   r   r   r   rß   Û  s   rß   )>r%   rt   rÊ   Zdjangor   Zdjango.confr   Zdjango.core.exceptionsr   Zdjango.core.validatorsr   Zdjango.db.modelsr   Zdjango.urlsr   Zdjango.urls.exceptionsr   Zdjango.utils.htmlr	   Zdjango.utils.httpr
   Zdjango.utils.textr   Zdjango.utils.translationr   r   r.   ZSelectMultipler   Z	DateInputr'   Z	TimeInputr+   ZSplitDateTimeWidgetr-   ZRadioSelectr0   ZClearableFileInputr1   rD   Z	TextInputrE   rf   ZWidgetrl   ZTextarear‰   rŠ   Z
EmailInputrŒ   ZURLInputr�   ZNumberInputr‘   r“   r”   rÜ   rY   rÀ   ZSelectrÞ   rß   r   r   r   r   Ú<module>   sF   KW_