3
(h8                 @   s  d Z ddlm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mZ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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j,Z-dd  Z.G d!d" d"ej/Z0G d#d$ d$e0Z1G d%d& d&ej2Z3G d'd( d(ej4Z5G d)d* d*ej/Z6G d+d, d,ej7Z8G d-d. d.ej9Z:G d/d0 d0ej/Z;G d1d2 d2e;Z<dS )3z8
Form Widget classes specific to the Django admin site.
    )unicode_literalsN)forms)CASCADE)flatatt)RadioFieldRenderer)render_to_string)reverse)NoReverseMatch)six)
force_text)format_htmlformat_html_joinsmart_urlquote)	mark_safe)	Truncator)ugettextc                   s@   e Zd ZdZedd Zdf f fdd	Zd	 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   s    dddg}t jdd |D dS )Nzcore.jszSelectBox.jszSelectFilter2.jsc             S   s   g | ]}d | qS )zadmin/js/%s ).0pathr   r   @/tmp/pip-install-q3hcpn_q/Django/django/contrib/admin/widgets.py
<listcomp>!   s    z0FilteredSelectMultiple.media.<locals>.<listcomp>)js)r   Media)selfr   r   r   r   media   s    
zFilteredSelectMultiple.mediaNc                s"   || _ || _tt| j|| d S )N)verbose_name
is_stackedsuperr   __init__)r   r   r   attrschoices)	__class__r   r   r   #   s    zFilteredSelectMultiple.__init__c                s^   |d kri }d|d< | j r*|d  d7  < | j|d< t| j |d< tt| j|||}t|S )NZselectfilterclassZstackedzdata-field-namezdata-is-stacked)r   r   intr   r   renderr   )r   namevaluer    output)r"   r   r   r%   (   s    
zFilteredSelectMultiple.render)N)	__name__
__module____qualname____doc__propertyr   r   r%   __classcell__r   r   )r"   r   r      s   r   c                   s*   e Zd Zedd Zd fdd	Z  ZS )AdminDateWidgetc             C   s   ddg}t jdd |D dS )Nzcalendar.jszadmin/DateTimeShortcuts.jsc             S   s   g | ]}d | qS )zadmin/js/%sr   )r   r   r   r   r   r   9   s    z)AdminDateWidget.media.<locals>.<listcomp>)r   )r   r   )r   r   r   r   r   r   6   s    zAdminDateWidget.mediaNc                s4   ddd}|d k	r|j | tt| j||d d S )NZ
vDateField10)r#   size)r    format)updater   r/   r   )r   r    r2   final_attrs)r"   r   r   r   ;   s    

zAdminDateWidget.__init__)NN)r)   r*   r+   r-   r   r   r.   r   r   )r"   r   r/   5   s   r/   c                   s*   e Zd Zedd Zd fdd	Z  ZS )AdminTimeWidgetc             C   s   ddg}t jdd |D dS )Nzcalendar.jszadmin/DateTimeShortcuts.jsc             S   s   g | ]}d | qS )zadmin/js/%sr   )r   r   r   r   r   r   F   s    z)AdminTimeWidget.media.<locals>.<listcomp>)r   )r   r   )r   r   r   r   r   r   C   s    zAdminTimeWidget.mediaNc                s4   ddd}|d k	r|j | tt| j||d d S )NZ
vTimeField8)r#   r1   )r    r2   )r3   r   r5   r   )r   r    r2   r4   )r"   r   r   r   H   s    

zAdminTimeWidget.__init__)NN)r)   r*   r+   r-   r   r   r.   r   r   )r"   r   r5   B   s   r5   c               @   s"   e Zd ZdZdddZdd ZdS )AdminSplitDateTimezF
    A SplitDateTime Widget that has some admin-specific styling.
    Nc             C   s   t tg}tjj| || d S )N)r/   r5   r   ZMultiWidgetr   )r   r    Zwidgetsr   r   r   r   S   s    zAdminSplitDateTime.__init__c             C   s    t dtd|d td|d S )Nz(<p class="datetime">{} {}<br />{} {}</p>zDate:r   zTime:   )r   _)r   Zrendered_widgetsr   r   r   format_outputY   s    z AdminSplitDateTime.format_output)N)r)   r*   r+   r,   r   r:   r   r   r   r   r7   O   s   
r7   c               @   s   e Zd Zdd ZdS )AdminRadioFieldRendererc             C   s$   t dt| jtdddd | D S )z,Outputs a <ul> for this set of radio fields.z<ul{}>
{}
</ul>
z<li>{}</li>c             s   s   | ]}t |fV  qd S )N)r   )r   wr   r   r   	<genexpr>e   s    z1AdminRadioFieldRenderer.render.<locals>.<genexpr>)r   r   r    r   )r   r   r   r   r%   `   s    zAdminRadioFieldRenderer.renderN)r)   r*   r+   r%   r   r   r   r   r;   _   s   r;   c               @   s   e Zd ZeZdS )AdminRadioSelectN)r)   r*   r+   r;   Zrendererr   r   r   r   r?   h   s   r?   c               @   s$   e Zd Zdejj Zdejj ZdS )AdminFileWidgetz<p class="file-upload">%s</p>z,<span class="clearable-file-input">%s</span>N)r)   r*   r+   r   ClearableFileInputZtemplate_with_initialZtemplate_with_clearr   r   r   r   r@   l   s   r@   c             C   s   i }| rt | drg }xr| j D ]f\}}t|r6| }t|ttfrZdjdd |D }nt|trnd| }n
tj	|}|j
||f q W |jt| |S )z
    Converts 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)r   xr   r   r   r>      s    z.url_params_from_lookup_dict.<locals>.<genexpr>01)rF   rG   )hasattrrB   callable
isinstancetuplelistjoinboolr
   	text_typeappendr3   dict)ZlookupsparamsrB   kvr   r   r   url_params_from_lookup_dictu   s    


rU   c                   sH   e Zd ZdZd fdd	Zd 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.
    Nc                s&   || _ || _|| _tt| j| d S )N)rel
admin_sitedbr   rV   r   )r   rW   rX   r    using)r"   r   r   r      s    zForeignKeyRawIdWidget.__init__c       
         s   | j j}|d kri }g }|| jjkrtd|jj|jjf | jjd}| j	 }|rnddj
dd |j D  }nd}d|krd	|d< |jd
|||tdf  tt| j|||g| }	|r|	j| j| tdj
|	S )Nzadmin:%s_%s_changelist)current_app?z&amp;c             s   s   | ]\}}d ||f V  qdS )z%s=%sNr   )r   rS   rT   r   r   r   r>      s    z/ForeignKeyRawIdWidget.render.<locals>.<genexpr> r#   ZvForeignKeyRawIdAdminFieldzG<a href="%s%s" class="related-lookup" id="lookup_id_%s" title="%s"></a>ZLookup)rW   modelrX   	_registryr   _meta	app_label
model_namer&   url_parametersrM   rB   rP   r9   r   rV   r%   label_for_valuer   )
r   r&   r'   r    Zrel_toextraZrelated_urlrR   urlr(   )r"   r   r   r%      s.    
zForeignKeyRawIdWidget.renderc             C   s   | j j}t|r| }t|S )N)rW   limit_choices_torI   rU   )r   rg   r   r   r   base_url_parameters   s    z)ForeignKeyRawIdWidget.base_url_parametersc             C   s.   ddl m} | j }|j|| jj ji |S )Nr   )TO_FIELD_VAR)django.contrib.admin.views.mainri   rh   r3   rW   get_related_fieldr&   )r   ri   rR   r   r   r   rc      s    z$ForeignKeyRawIdWidget.url_parametersc             C   s   | j j j}y"| j jjj| jjf ||i}W n t| j jj	fk
rL   dS X d}t
|jddd}y.td| jj|jj|jjj f |jfd}W n tk
r   Y nX td||}t||S )	Nr]   z&nbsp;<strong>{}</strong>   z...)truncatez%s:%s_%s_change)argsz<a href="{}">{}</a>)rW   rk   r&   r^   Z_default_managerrZ   rY   get
ValueErrorZDoesNotExistr   wordsr   rX   r`   ra   Zobject_namelowerpkr	   r   )r   r'   keyobjlabeltextZ
change_urlr   r   r   rd      s$    "z%ForeignKeyRawIdWidget.label_for_value)NN)N)
r)   r*   r+   r,   r   r%   rh   rc   rd   r.   r   r   )r"   r   rV      s   !rV   c                   s:   e Zd ZdZd f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.
    Nc                sV   |d kri }| j j| jjkr$d|d< |r>djdd |D }nd}tt| j|||S )NZvManyToManyRawIdAdminFieldr#   rC   c             s   s   | ]}t |V  qd S )N)r   )r   rT   r   r   r   r>      s    z/ManyToManyRawIdWidget.render.<locals>.<genexpr>r]   )rW   r^   rX   r_   rM   r   rx   r%   )r   r&   r'   r    )r"   r   r   r%      s    zManyToManyRawIdWidget.renderc             C   s   | j  S )N)rh   )r   r   r   r   rc      s    z$ManyToManyRawIdWidget.url_parametersc             C   s   dS )Nr]   r   )r   r'   r   r   r   rd      s    z%ManyToManyRawIdWidget.label_for_valuec             C   s   |j |}|r|jdS d S )NrC   )ro   split)r   datafilesr&   r'   r   r   r   value_from_datadict   s    
z)ManyToManyRawIdWidget.value_from_datadict)N)	r)   r*   r+   r,   r%   rc   rd   r|   r.   r   r   )r"   r   rx      s
   rx   c               @   sh   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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/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|| _|| _d S )NZallow_multiple_selectedFZ	on_delete)Zneeds_multipart_formr    r!   widgetrW   r^   r_   can_add_relatedgetattrcan_change_relatedr   can_delete_relatedrX   )	r   r~   rW   rX   r   r   r   multipleZcascader   r   r   r     s    z"RelatedFieldWidgetWrapper.__init__c             C   s4   t j | }t j| j||_| jj|_||t| < |S )N)copydeepcopyr~   r    id)r   memoru   r   r   r   __deepcopy__  s
    

z&RelatedFieldWidgetWrapper.__deepcopy__c             C   s   | j jS )N)r~   	is_hidden)r   r   r   r   r     s    z#RelatedFieldWidgetWrapper.is_hiddenc             C   s   | j jS )N)r~   r   )r   r   r   r   r   !  s    zRelatedFieldWidgetWrapper.mediac             G   s   t d||f  | jj|dS )Nzadmin:%s_%s_%s)r[   rn   )r   rX   r&   )r   infoactionrn   r   r   r   get_related_url%  s    z)RelatedFieldWidgetWrapper.get_related_urlc             O   s   ddl m}m} | jjj}|j|jf}| j| j	_dj
dd || jj jf|dfgD }	| j	j||f||||	|jd}
| jr| j|dd	}|
jd
|d | jr| j|d}|
jd
|d | jr| j|dd	}|
jd
|d tt| j|
S )Nr   )IS_POPUP_VARri   &c             s   s   | ]}d | V  qdS )z%s=%sNr   )r   paramr   r   r   r>   .  s    z3RelatedFieldWidgetWrapper.render.<locals>.<genexpr>r8   )r~   r&   
url_paramsr^   ZchangeZ__fk__T)r   change_related_template_urladd)r   add_related_urldelete)r   delete_related_template_url)rj   r   ri   rW   r^   r`   ra   rb   r!   r~   rM   rk   r&   r%   r   r   r   r3   r   r   r   r   template)r   r&   r'   rn   kwargsr   ri   Zrel_optsr   r   contextr   r   r   r   r   r   r%   )  s6    



z RelatedFieldWidgetWrapper.renderc             K   s   | j jf ddi|| _| jS )z5Helper function for building an attribute dictionary.extra_attrsN)r~   build_attrsr    )r   r   r   r   r   r   r   L  s    z%RelatedFieldWidgetWrapper.build_attrsc             C   s   | j j|||S )N)r~   r|   )r   rz   r{   r&   r   r   r   r|   Q  s    z-RelatedFieldWidgetWrapper.value_from_datadictc             C   s   | j j|S )N)r~   id_for_label)r   Zid_r   r   r   r   T  s    z&RelatedFieldWidgetWrapper.id_for_label)NFF)N)r)   r*   r+   r,   r   r   r   r-   r   r   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 )AdminTextareaWidgetNc                s0   ddi}|d k	r|j | tt| j|d d S )Nr#   ZvLargeTextField)r    )r3   r   r   r   )r   r    r4   )r"   r   r   r   Y  s    
zAdminTextareaWidget.__init__)N)r)   r*   r+   r   r.   r   r   )r"   r   r   X  s   r   c                   s   e Zd Zd fdd	Z  ZS )AdminTextInputWidgetNc                s0   ddi}|d k	r|j | tt| j|d d S )Nr#   
vTextField)r    )r3   r   r   r   )r   r    r4   )r"   r   r   r   a  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                s0   ddi}|d k	r|j | tt| j|d d S )Nr#   r   )r    )r3   r   r   r   )r   r    r4   )r"   r   r   r   i  s    
zAdminEmailInputWidget.__init__)N)r)   r*   r+   r   r.   r   r   )r"   r   r   h  s   r   c                   s,   e Zd Zd fdd	Zd fdd	Z  ZS )AdminURLFieldWidgetNc                s0   ddi}|d k	r|j | tt| j|d d S )Nr#   Z	vURLField)r    )r3   r   r   r   )r   r    r4   )r"   r   r   r   q  s    
zAdminURLFieldWidget.__init__c                sT   t t| j|||}|rPt| j|}dt|i}tdtdt||td|}|S )Nhrefz,<p class="url">{} <a{}>{}</a><br />{} {}</p>z
Currently:zChange:)	r   r   r%   r   Zformat_valuer   r   r9   r   )r   r&   r'   r    htmlr4   )r"   r   r   r%   w  s    zAdminURLFieldWidget.render)N)N)r)   r*   r+   r   r%   r.   r   r   )r"   r   r   p  s   r   c                   s"   e Zd ZdZd fdd	Z  ZS )AdminIntegerFieldWidgetZvIntegerFieldNc                s2   d| j i}|d k	r|j| tt| j|d d S )Nr#   )r    )
class_namer3   r   r   r   )r   r    r4   )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     s   r   )=r,   
__future__r   r   Zdjangor   Zdjango.db.models.deletionr   Zdjango.forms.utilsr   Zdjango.forms.widgetsr   Zdjango.template.loaderr   Zdjango.urlsr   Zdjango.urls.exceptionsr	   Zdjango.utilsr
   Zdjango.utils.encodingr   Zdjango.utils.htmlr   r   r   Zdjango.utils.safestringr   Zdjango.utils.textr   Zdjango.utils.translationr   r9   ZSelectMultipler   Z	DateInputr/   Z	TimeInputr5   ZSplitDateTimeWidgetr7   r;   ZRadioSelectr?   rA   r@   rU   Z	TextInputrV   rx   ZWidgetr}   ZTextarear   r   Z
EmailInputr   ZURLInputr   r   r   r   r   r   r   <module>   s@   		R^
