

_V9                 @   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 m Z m Z d d l m Z d d l m Z d d l  m! Z" Gd d   d e j#  Z$ Gd d   d e j%  Z& Gd d   d e j'  Z( Gd d   d e j)  Z* Gd d   d e  Z+ Gd d   d e j,  Z- Gd d   d e j.  Z/ d d    Z0 Gd! d"   d" e j1  Z2 Gd# d$   d$ e2  Z3 Gd% d&   d& e j4  Z5 Gd' d(   d( e j6  Z7 Gd) d*   d* e j1  Z8 Gd+ d,   d, e j9  Z: Gd- d.   d. e j;  Z< Gd/ d0   d0 e j1  Z= Gd1 d2   d2 e=  Z> Gd3 d4   d4 e j1  Z? d S)5z8
Form Widget classes specific to the Django admin site.
    )unicode_literalsN)forms)static)reverse)CASCADE)flatatt)RadioFieldRenderer)render_to_string)six)
force_text)escapeescapejsformat_htmlformat_html_joinsmart_urlquote)	mark_safe)	Truncator)ugettextc                   sX   e  Z d  Z d Z e d d    Z d f    f d d  Z d f    f d d  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.jsjsc             S   s    g  |  ] } t  d  |   q S)zadmin/js/%s)r   ).0path r   >/tmp/pip-build-ghmbqnp_/Django/django/contrib/admin/widgets.py
<listcomp>#   s   	 z0FilteredSelectMultiple.media.<locals>.<listcomp>)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  } n  d | d <|  j  r9 | d d 7<n  t t |   j | | | |  g } | j d  | j d | t |  j  t |  j   f  t d j	 |   S)NZselectfilterclassZstackedzE<script type="text/javascript">addEvent(window, "load", function(e) {z3SelectFilter.init("id_%s", "%s", %s); });</script>
 )
r   r    r   renderappendr   r   intr   join)r   namevaluer"   r#   output)r$   r   r   r'   *   s    	
	$	#zFilteredSelectMultiple.render)__name__
__module____qualname____doc__propertyr   r!   r'   r   r   )r$   r   r      s   r   c                   s:   e  Z d  Z e d d    Z d d   f d d  Z   S)AdminDateWidgetc             C   s)   d d g } t  j d d d   | D  S)Nzcalendar.jszadmin/DateTimeShortcuts.jsr   c             S   s    g  |  ] } t  d  |   q S)zadmin/js/%s)r   )r   r   r   r   r   r   =   s   	 z)AdminDateWidget.media.<locals>.<listcomp>)r   r   )r   r   r   r   r   r   :   s    zAdminDateWidget.mediaNc                sS   i d d 6d d 6} | d  k	 r0 | j  |  n  t t |   j d | d |  d  S)NZ
vDateFieldr%   10sizer"   format)updater    r3   r!   )r   r"   r6   final_attrs)r$   r   r   r!   ?   s    zAdminDateWidget.__init__)r.   r/   r0   r2   r   r!   r   r   )r$   r   r3   9   s   r3   c                   s:   e  Z d  Z e d d    Z d d   f d d  Z   S)AdminTimeWidgetc             C   s)   d d g } t  j d d d   | D  S)Nzcalendar.jszadmin/DateTimeShortcuts.jsr   c             S   s    g  |  ] } t  d  |   q S)zadmin/js/%s)r   )r   r   r   r   r   r   J   s   	 z)AdminTimeWidget.media.<locals>.<listcomp>)r   r   )r   r   r   r   r   r   G   s    zAdminTimeWidget.mediaNc                sS   i d d 6d d 6} | d  k	 r0 | j  |  n  t t |   j d | d |  d  S)NZ
vTimeFieldr%   8r5   r"   r6   )r7   r    r9   r!   )r   r"   r6   r8   )r$   r   r   r!   L   s    zAdminTimeWidget.__init__)r.   r/   r0   r2   r   r!   r   r   )r$   r   r9   F   s   r9   c               @   s1   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)r3   r9   r   ZMultiWidgetr!   )r   r"   Zwidgetsr   r   r   r!   W   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_output]   s    z AdminSplitDateTime.format_output)r.   r/   r0   r1   r!   r>   r   r   r   r   r;   S   s   r;   c               @   s   e  Z d  Z d d   Z d S)AdminRadioFieldRendererc             C   s2   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>i   s    z1AdminRadioFieldRenderer.render.<locals>.<genexpr>)r   r   r"   r   )r   r   r   r   r'   d   s    	zAdminRadioFieldRenderer.renderN)r.   r/   r0   r'   r   r   r   r   r?   c   s   r?   c               @   s   e  Z d  Z e Z d S)AdminRadioSelectN)r.   r/   r0   r?   Zrendererr   r   r   r   rC   l   s   rC   c               @   s0   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/   r0   r   ClearableFileInputZtemplate_with_initialZtemplate_with_clearr   r   r   r   rD   p   s   rD   c             C   s   i  } |  r t  |  d  r g  } x |  j   D] \ } } t |  rR |   } n  t | t t f  r d j d d   | D  } n+ t | t  r d | } n t j	 |  } | j
 | | f  q. W| j t |   n  | 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   rB      s    z.url_params_from_lookup_dict.<locals>.<genexpr>01)rJ   rK   )hasattrrF   callable
isinstancetuplelistr*   boolr
   	text_typer(   r7   dict)ZlookupsparamsrF   kvr   r   r   url_params_from_lookup_dictw   s    rW   c                   sg   e  Z d  Z d Z d d   f d d  Z d   f d d  Z d d   Z d	 d
   Z d d   Z   S)ForeignKeyRawIdWidgetzj
    A Widget for displaying ForeignKeys in the "raw_id" interface rather than
    in a <select> box.
    Nc                s5   | |  _  | |  _ | |  _ t t |   j |  d  S)N)rel
admin_sitedbr    rX   r!   )r   rY   rZ   r"   using)r$   r   r   r!      s    			zForeignKeyRawIdWidget.__init__c       
         s>  |  j  j } | d  k r! i  } n  g  } | |  j j k r t d | j j | j j f d |  j j } |  j	   } | r d d j
 d d   | j   D  } n d } d | k r d	 | d <n  | j d
 | | | t d  f  n  t t |   j | | |  g | }	 | r+|	 j |  j |   n  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   rU   rV   r   r   r   rB      s    z/ForeignKeyRawIdWidget.render.<locals>.<genexpr>r&   r%   ZvForeignKeyRawIdAdminFieldzG<a href="%s%s" class="related-lookup" id="lookup_id_%s" title="%s"></a>ZLookup)rY   modelrZ   	_registryr   _meta	app_label
model_namer+   url_parametersr*   rF   r(   r=   r    rX   r'   label_for_valuer   )
r   r+   r,   r"   Zrel_toextraZrelated_urlrT   urlr-   )r$   r   r   r'      s,    		)	%zForeignKeyRawIdWidget.renderc             C   s.   |  j  j } t |  r$ |   } n  t |  S)N)rY   limit_choices_torM   rW   )r   rh   r   r   r   base_url_parameters   s    z)ForeignKeyRawIdWidget.base_url_parametersc             C   s@   d d l  m } |  j   } | j i |  j j   j | 6 | S)Nr   )TO_FIELD_VAR)django.contrib.admin.views.mainrj   ri   r7   rY   get_related_fieldr+   )r   rj   rT   r   r   r   rd      s     z$ForeignKeyRawIdWidget.url_parametersc             C   s   |  j  j   j } yR |  j  j j j |  j  j i | | 6  } d t t	 |  j
 d d d  SWn% t |  j  j j f k
 r d SYn Xd  S)Nz&nbsp;<strong>%s</strong>   truncatez...r&   )rY   rl   r+   r_   Z_default_managerr\   r[   getr   r   words
ValueErrorZDoesNotExist)r   r,   keyobjr   r   r   re      s    +'z%ForeignKeyRawIdWidget.label_for_value)	r.   r/   r0   r1   r!   r'   ri   rd   re   r   r   )r$   r   rX      s   rX   c                   sO   e  Z d  Z d Z d   f d d  Z d d   Z d d   Z d	 d
   Z   S)ManyToManyRawIdWidgetzv
    A Widget for displaying ManyToMany ids in the "raw_id" interface rather than
    in a <select multiple> box.
    Nc                s   | d  k r i  } n  |  j  j |  j j k r: d | d <n  | r_ d j d d   | D  } n d } t t |   j | | |  S)NZvManyToManyRawIdAdminFieldr%   rG   c             s   s   |  ] } t  |  Vq d  S)N)r   )r   rV   r   r   r   rB      s    z/ManyToManyRawIdWidget.render.<locals>.<genexpr>r&   )rY   r_   rZ   r`   r*   r    rt   r'   )r   r+   r,   r"   )r$   r   r   r'      s    	zManyToManyRawIdWidget.renderc             C   s
   |  j    S)N)ri   )r   r   r   r   rd      s    z$ManyToManyRawIdWidget.url_parametersc             C   s   d S)Nr&   r   )r   r,   r   r   r   re      s    z%ManyToManyRawIdWidget.label_for_valuec             C   s&   | j  |  } | r" | j d  Sd  S)NrG   )ro   split)r   datafilesr+   r,   r   r   r   value_from_datadict   s    z)ManyToManyRawIdWidget.value_from_datadict)r.   r/   r0   r1   r'   rd   re   rx   r   r   )r$   r   rt      s
   rt   c               @   s   e  Z d  Z d Z d Z d d 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 rW | j | j k } n  | |  _ t | d d  } | o| | |  _	 t | d d   t
 k } | o | o | |  _ | |  _ d  S)NZallow_multiple_selectedFZ	on_delete)Zneeds_multipart_formr"   r#   widgetrY   r_   r`   can_add_relatedgetattrcan_change_relatedr   can_delete_relatedrZ   )	r   rz   rY   rZ   r{   r}   r~   multipleZcascader   r   r   r!      s    			z"RelatedFieldWidgetWrapper.__init__c             C   sJ   t  j  |   } t  j |  j |  | _ |  j j | _ | | t |   <| S)N)copydeepcopyrz   r"   id)r   memors   r   r   r   __deepcopy__  s
    z&RelatedFieldWidgetWrapper.__deepcopy__c             C   s
   |  j  j S)N)rz   	is_hidden)r   r   r   r   r     s    z#RelatedFieldWidgetWrapper.is_hiddenc             C   s
   |  j  j S)N)rz   r   )r   r   r   r   r     s    zRelatedFieldWidgetWrapper.mediac             G   s'   t  d | | f d |  j j d | S)Nzadmin:%s_%s_%sr]   args)r   rZ   r+   )r   infoactionr   r   r   r   get_related_url  s    z)RelatedFieldWidgetWrapper.get_related_urlc             O   sr  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  }	 i |  j	 j | | | |  d 6| d 6|	 d	 6| j d
 6}
 |  j r |  j | d d  } |
 j d d d |  n  |  j r%|  j | d  } |
 j d d d |  n  |  j r\|  j | d d  } |
 j d d d |  n  t t |  j |
   S)Nr   )IS_POPUP_VARrj   &c             s   s   |  ] } d  | Vq d S)z%s=%sNr   )r   paramr   r   r   rB     s    z3RelatedFieldWidgetWrapper.render.<locals>.<genexpr>r<   rz   r+   
url_paramsr_   ZchangeZ__fk__r}   Tchange_related_template_urladdr{   add_related_urldeleter~   delete_related_template_url)rk   r   rj   rY   r_   ra   rb   rc   r#   rz   r*   rl   r+   r'   r   r}   r   r7   r{   r~   r   r	   template)r   r+   r,   r   kwargsr   rj   Zrel_optsr   r   contextr   r   r   r   r   r   r'     s8    		
		
		
z RelatedFieldWidgetWrapper.renderc             K   s"   |  j  j d d |  |  _ |  j S)z5Helper function for building an attribute dictionary.extra_attrsN)rz   build_attrsr"   )r   r   r   r   r   r   r   <  s    z%RelatedFieldWidgetWrapper.build_attrsc             C   s   |  j  j | | |  S)N)rz   rx   )r   rv   rw   r+   r   r   r   rx   A  s    z-RelatedFieldWidgetWrapper.value_from_datadictc             C   s   |  j  j |  S)N)rz   id_for_label)r   Zid_r   r   r   r   D  s    z&RelatedFieldWidgetWrapper.id_for_label)r.   r/   r0   r1   r   r!   r   r2   r   r   r   r'   r   rx   r   r   r   r   r   ry      s   #ry   c                   s%   e  Z d  Z d   f d d  Z   S)AdminTextareaWidgetNc                sF   i d d 6} | d  k	 r) | j  |  n  t t |   j d |  d  S)NZvLargeTextFieldr%   r"   )r7   r    r   r!   )r   r"   r8   )r$   r   r   r!   I  s    zAdminTextareaWidget.__init__)r.   r/   r0   r!   r   r   )r$   r   r   H  s   r   c                   s%   e  Z d  Z d   f d d  Z   S)AdminTextInputWidgetNc                sF   i d d 6} | d  k	 r) | j  |  n  t t |   j d |  d  S)N
vTextFieldr%   r"   )r7   r    r   r!   )r   r"   r8   )r$   r   r   r!   Q  s    zAdminTextInputWidget.__init__)r.   r/   r0   r!   r   r   )r$   r   r   P  s   r   c                   s%   e  Z d  Z d   f d d  Z   S)AdminEmailInputWidgetNc                sF   i d d 6} | d  k	 r) | j  |  n  t t |   j d |  d  S)Nr   r%   r"   )r7   r    r   r!   )r   r"   r8   )r$   r   r   r!   Y  s    zAdminEmailInputWidget.__init__)r.   r/   r0   r!   r   r   )r$   r   r   X  s   r   c                   s:   e  Z d  Z d   f d d  Z d   f d d  Z   S)AdminURLFieldWidgetNc                sF   i d d 6} | d  k	 r) | j  |  n  t t |   j d |  d  S)NZ	vURLFieldr%   r"   )r7   r    r   r!   )r   r"   r8   )r$   r   r   r!   a  s    zAdminURLFieldWidget.__init__c                s   t  t |   j | | |  } | r| t |  j |   } i t |  d 6} t d t d  t |  | t d  |  } n  | S)Nhrefz,<p class="url">{} <a{}>{}</a><br />{} {}</p>z
Currently:zChange:)	r    r   r'   r   Z_format_valuer   r   r=   r   )r   r+   r,   r"   htmlr8   )r$   r   r   r'   g  s    zAdminURLFieldWidget.render)r.   r/   r0   r!   r'   r   r   )r$   r   r   `  s   r   c                   s+   e  Z d  Z d Z d   f d d  Z   S)AdminIntegerFieldWidgetZvIntegerFieldNc                sI   i |  j  d 6} | d  k	 r, | j |  n  t t |   j d |  d  S)Nr%   r"   )
class_namer7   r    r   r!   )r   r"   r8   )r$   r   r   r!   w  s    z AdminIntegerFieldWidget.__init__)r.   r/   r0   r   r!   r   r   )r$   r   r   t  s   r   c               @   s   e  Z d  Z d Z d S)AdminBigIntegerFieldWidgetZvBigIntegerFieldN)r.   r/   r0   r   r   r   r   r   r   ~  s   r   c                   s%   e  Z d  Z d   f d d  Z   S)%AdminCommaSeparatedIntegerFieldWidgetNc                sF   i d d 6} | d  k	 r) | j  |  n  t t |   j d |  d  S)NZvCommaSeparatedIntegerFieldr%   r"   )r7   r    r   r!   )r   r"   r8   )r$   r   r   r!     s    z.AdminCommaSeparatedIntegerFieldWidget.__init__)r.   r/   r0   r!   r   r   )r$   r   r     s   r   )@r1   
__future__r   r   Zdjangor   Z.django.contrib.admin.templatetags.admin_staticr   Zdjango.core.urlresolversr   Zdjango.db.models.deletionr   Zdjango.forms.utilsr   Zdjango.forms.widgetsr   Zdjango.template.loaderr	   Zdjango.utilsr
   Zdjango.utils.encodingr   Zdjango.utils.htmlr   r   r   r   r   Zdjango.utils.safestringr   Zdjango.utils.textr   Zdjango.utils.translationr   r=   ZSelectMultipler   Z	DateInputr3   Z	TimeInputr9   ZSplitDateTimeWidgetr;   r?   ZRadioSelectrC   rE   rD   rW   Z	TextInputrX   rt   ZWidgetry   ZTextarear   r   Z
EmailInputr   ZURLInputr   r   r   r   r   r   r   r   <module>   sB   ( 	?^
