
u^lC              .   @   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 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 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 j#  Z$ Gd d   d e j%  Z& d d   Z' Gd d   d e j(  Z) Gd d   d e)  Z* Gd  d!   d! e j+  Z, Gd" d#   d# e j-  Z. Gd$ d%   d% e j(  Z/ Gd& d'   d' e j0  Z1 Gd( d)   d) e j2  Z3 Gd* d+   d+ e j4  Z5 Gd, d-   d- e5  Z6 Gd. d/   d/ e j(  Z7 d0 d1   d2 d3 d4 d5 d6 d7 d8 d9 d: d; d< d= d> d? d@ dA dB dC dD dE dF dG dH dI dJ dK dL dM dN dO dP dQ dR dS dT dU dV dW dX dY dZ d[ d\ d] d^ g- D Z8 e8 j9 d_ d` da db i  Gdc dd   dd  Z: Gde df   df e: e j;  Z< Gdg dh   dh e: e j  Z= d S)iz8
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                   sR   e  Z d  Z d Z e d d    Z d f    f d d  Z   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   sK   t  j r d n d } d | d d d d g } t j d d	 d
   | D  S)N z.minzvendor/jquery/jquery%s.jszjquery.init.jszcore.jszSelectBox.jszSelectFilter2.jsjsc             S   s   g  |  ] } d  |  q S)zadmin/js/%s ).0pathr   r   >/tmp/pip-build-8lau8j11/django/django/contrib/admin/widgets.py
<listcomp>%   s   	 z0FilteredSelectMultiple.media.<locals>.<listcomp>)r   DEBUGr   Media)selfextrar   r   r   r   media   s    	zFilteredSelectMultiple.mediaNc                s)   | |  _  | |  _ t   j | |  d  S)N)verbose_name
is_stackedsuper__init__)r   r   r   attrschoices)	__class__r   r   r   '   s    		zFilteredSelectMultiple.__init__c                s}   t    j | | |  } d | d d d <|  j rI | 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)__name__
__module____qualname____doc__propertyr   r   r$   r   r   )r!   r   r      s   r   c                   s;   e  Z d  Z Gd d   d  Z d d   f d d  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   7   s   r   Nc                s;   d d d d i | p i   } t    j d | d |  d  S)Nr#   Z
vDateFieldsize10r   format)r   r   )r   r   r1   )r!   r   r   r   =   s    zAdminDateWidget.__init__)r)   r*   r+   r   r   r   r   )r!   r   r.   6   s   r.   c                   s;   e  Z d  Z Gd d   d  Z d d   f d d  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   C   s   r   Nc                s;   d d d d i | p i   } t    j d | d |  d  S)Nr#   Z
vTimeFieldr/   8r   r1   )r   r   )r   r   r1   )r!   r   r   r   I   s    zAdminTimeWidget.__init__)r)   r*   r+   r   r   r   r   )r!   r   r2   B   s   r2   c                   s=   e  Z d  Z d Z d Z d d d  Z   f d d   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 j |  | |  d  S)N)r.   r2   r   ZMultiWidgetr   )r   r   Zwidgetsr   r   r   r   T   s    zAdminSplitDateTime.__init__c                s<   t    j | | |  } 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$   Z   s    zAdminSplitDateTime.get_context)r)   r*   r+   r,   template_namer   r$   r   r   )r!   r   r4   N   s   r4   c               @   s   e  Z d  Z d Z d S)AdminRadioSelectzadmin/widgets/radio.htmlN)r)   r*   r+   r6   r   r   r   r   r7   a   s   r7   c               @   s   e  Z d  Z d Z d S)AdminFileWidgetz'admin/widgets/clearable_file_input.htmlN)r)   r*   r+   r6   r   r   r   r   r8   e   s   r8   c             C   s   i  } |  r t  |  d  r x |  j   D] \ } } t |  rI |   } t | t t f  r} d j d d   | D  } n( t | t  r d | } 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)r   xr   r   r   	<genexpr>t   s    z.url_params_from_lookup_dict.<locals>.<genexpr>01)r>   r?   )	hasattrr9   callable
isinstancetuplelistjoinboolr;   )Zlookupsparamskvr   r   r   url_params_from_lookup_dicti   s    	rJ   c                   sj   e  Z d  Z d Z d Z d d   f d d  Z   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.
    z%admin/widgets/foreign_key_raw_id.htmlNc                s/   | |  _  | |  _ | |  _ t   j |  d  S)N)rel
admin_sitedbr   r   )r   rL   rM   r   using)r!   r   r   r      s    			zForeignKeyRawIdWidget.__init__c                s!  t    j | | |  } |  j j } | |  j j k r t d | j j | j j	 f d |  j j
 } |  j   } | r | d d j d d   | j   D  7} t |  | d <t d  | d	 <| d
 d j d d  n
 d  | d <| d
 d r|  j |  \ | d <| d <n
 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   rH   rI   r   r   r   r=      s    z4ForeignKeyRawIdWidget.get_context.<locals>.<genexpr>related_urlZLookupZ
link_titler"   r   r#   ZvForeignKeyRawIdAdminFieldr'   Z
link_labelZlink_url)r   r$   rL   modelrM   	_registryr   _meta	app_label
model_namer&   url_parametersrE   r9   r
   r5   
setdefaultlabel_and_url_for_value)r   r&   r'   r   r(   Zrel_torR   rG   )r!   r   r   r$      s&    	*
 
z!ForeignKeyRawIdWidget.get_contextc             C   s+   |  j  j } t |  r! |   } t |  S)N)rL   limit_choices_torA   rJ   )r   r[   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.mainr]   r\   updaterL   get_related_fieldr&   )r   r]   rG   r   r   r   rX      s    z$ForeignKeyRawIdWidget.url_parametersc             C   s   |  j  j   j } y. |  j  j j j |  j  j | | i   } Wn( t |  j  j j	 t
 f k
 rj d SYn XyA t d |  j j | j j | j j j   f d | j f } Wn t k
 r d } Yn Xt |  j d  | f S)Nr   z%s:%s_%s_changeargs   )r   r   )rL   r`   r&   rS   Z_default_managerrO   rN   get
ValueErrorZDoesNotExistr   r   rM   rU   rV   Zobject_namelowerpkr   r   words)r   r'   keyobjurlr   r   r   rZ      s    .			z-ForeignKeyRawIdWidget.label_and_url_for_value)
r)   r*   r+   r,   r6   r   r$   r\   rX   rZ   r   r   )r!   r   rK   }   s   rK   c                   s^   e  Z d  Z d Z d Z   f d d   Z 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.
    z&admin/widgets/many_to_many_raw_id.htmlc                sF   t    j | | |  } |  j j |  j j k rB d | d d d <| S)NZvManyToManyRawIdAdminFieldr"   r   r#   )r   r$   rL   rS   rM   rT   )r   r&   r'   r   r(   )r!   r   r   r$      s    z!ManyToManyRawIdWidget.get_contextc             C   s
   |  j    S)N)r\   )r   r   r   r   rX      s    z$ManyToManyRawIdWidget.url_parametersc             C   s   d S)Nr   )r   r   r   )r   r'   r   r   r   rZ      s    z-ManyToManyRawIdWidget.label_and_url_for_valuec             C   s&   | j  |  } | r" | j d  Sd  S)Nr:   )rc   split)r   datafilesr&   r'   r   r   r   value_from_datadict   s    z)ManyToManyRawIdWidget.value_from_datadictc             C   s$   | r  d j  d d   | D  Sd S)Nr:   c             s   s   |  ] } t  |  Vq d  S)N)r;   )r   rI   r   r   r   r=      s    z5ManyToManyRawIdWidget.format_value.<locals>.<genexpr>r   )rE   )r   r'   r   r   r   format_value   s    z"ManyToManyRawIdWidget.format_value)
r)   r*   r+   r,   r6   r$   rX   rZ   ro   rp   r   r   )r!   r   rk      s   rk   c               @   s   e  Z d  Z d Z d Z d 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   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 rT | j | j k } | |  _ t | d d  } | oy | |  _	 t | d d   t
 k }	 | o |	 o | |  _ | o | |  _ | |  _ d  S)Nallow_multiple_selectedFZ	on_delete)Zneeds_multipart_formr   r    r"   rL   rS   rT   can_add_relatedgetattrcan_change_relatedr   can_delete_relatedcan_view_relatedrM   )
r   r"   rL   rM   rs   ru   rv   rw   multipleZcascader   r   r   r      s    			z"RelatedFieldWidgetWrapper.__init__c             C   sJ   t  j  |   } t  j |  j |  | _ |  j j | _ | | t |   <| S)N)copydeepcopyr"   r   id)r   memori   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 d |  j j d | S)Nzadmin:%s_%s_%srP   ra   )r   rM   r&   )r   infoactionra   r   r   r   get_related_url  s    z)RelatedFieldWidgetWrapper.get_related_urlc       
      C   sP  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  } d |  j	 j | | |  d |  j d	 | d
 | d | j d |  j d |  j d |  j d |  j i	 }	 |  j r |  j | d  |	 d <|  j r!|  j | d d  |	 d <|  j s3|  j rL|  j | d d  |	 d <|	 S)Nr   )IS_POPUP_VARr]   &c             s   s   |  ] } d  | Vq d S)z%s=%sNr   )r   paramr   r   r   r=     s    z8RelatedFieldWidgetWrapper.get_context.<locals>.<genexpr>   Zrendered_widgetr~   r&   
url_paramsrS   rs   ru   rv   rw   addZadd_related_urldeleteZ__fk__Zdelete_related_template_urlZchangeZchange_related_template_url)r^   r   r]   rL   rS   rU   rV   rW   r    r"   rE   r`   r&   renderr~   r   rs   ru   rv   rw   r   )
r   r&   r'   r   r   r]   Zrel_optsr   r   r(   r   r   r   r$     s.    							z%RelatedFieldWidgetWrapper.get_contextc             C   s   |  j  j | | |  S)N)r"   ro   )r   rm   rn   r&   r   r   r   ro   2  s    z-RelatedFieldWidgetWrapper.value_from_datadictc             C   s   |  j  j | | |  S)N)r"   value_omitted_from_data)r   rm   rn   r&   r   r   r   r   5  s    z1RelatedFieldWidgetWrapper.value_omitted_from_datac             C   s   |  j  j |  S)N)r"   id_for_label)r   Zid_r   r   r   r   8  s    z&RelatedFieldWidgetWrapper.id_for_label)r)   r*   r+   r,   r6   r   r}   r-   r~   r   r   r$   ro   r   r   r   r   r   r   rq      s   rq   c                   s%   e  Z d  Z d   f d d  Z   S)AdminTextareaWidgetNc                s)   t    j d d d i | p i    d  S)Nr   r#   ZvLargeTextField)r   r   )r   r   )r!   r   r   r   =  s    zAdminTextareaWidget.__init__)r)   r*   r+   r   r   r   )r!   r   r   <  s   r   c                   s%   e  Z d  Z d   f d d  Z   S)AdminTextInputWidgetNc                s)   t    j d d d i | p i    d  S)Nr   r#   
vTextField)r   r   )r   r   )r!   r   r   r   B  s    zAdminTextInputWidget.__init__)r)   r*   r+   r   r   r   )r!   r   r   A  s   r   c                   s%   e  Z d  Z d   f d d  Z   S)AdminEmailInputWidgetNc                s)   t    j d d d i | p i    d  S)Nr   r#   r   )r   r   )r   r   )r!   r   r   r   G  s    zAdminEmailInputWidget.__init__)r)   r*   r+   r   r   r   )r!   r   r   F  s   r   c                   s@   e  Z d  Z d Z d e   f d d  Z   f d d   Z   S)AdminURLFieldWidgetzadmin/widgets/url.htmlNc                s5   t    j d d d i | p i    |   |  _ d  S)Nr   r#   Z	vURLField)r   r   	validator)r   r   Zvalidator_class)r!   r   r   r   N  s    %zAdminURLFieldWidget.__init__c                s   y# |  j  | r | n d  d } Wn t k
 r= d } Yn Xt   j | | |  } t d  | d <t d  | d <| r t | 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$   r5   r	   )r   r&   r'   r   r   r(   )r!   r   r   r$   R  s    
(
zAdminURLFieldWidget.get_context)r)   r*   r+   r6   r   r   r$   r   r   )r!   r   r   K  s   r   c                   s+   e  Z d  Z d Z d   f d d  Z   S)AdminIntegerFieldWidgetZvIntegerFieldNc                s,   t    j d d |  j i | p! i    d  S)Nr   r#   )r   r   
class_name)r   r   )r!   r   r   r   c  s    z AdminIntegerFieldWidget.__init__)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   g  s   r   c                   s%   e  Z d  Z d   f d d  Z   S)AdminUUIDInputWidgetNc                s)   t    j d d d i | p i    d  S)Nr   r#   Z
vUUIDField)r   r   )r   r   )r!   r   r   r   l  s    zAdminUUIDInputWidget.__init__)r)   r*   r+   r   r   r   )r!   r   r   k  s   r   c             C   s   i  |  ] } | | j     q Sr   )re   )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-hanszzh-CNzzh-hantzzh-TWc                   ss   e  Z d  Z d Z d Z d f  d d d  Z d d   Z d   f d d	  Z d d
 d  Z e	 d d    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_autocompleteNc             C   sI   | |  _  | |  _ | |  _ | |  _ | d  k r6 i  n	 | j   |  _ d  S)N)rL   rM   rN   r    ry   r   )r   rL   rM   r   r    rO   r   r   r   r     s
    				zAutocompleteMixin.__init__c             C   s8   |  j  j } t |  j |  j j | j j | j j f  S)N)	rL   rS   r   url_namerM   r&   rU   rV   rW   )r   rS   r   r   r   get_url  s    zAutocompleteMixin.get_urlc                s   t    j | d | } | j d d  | j d d d d d d	 d
 |  j   d d d t j |  j  d d d | d | d r d n d d i  | 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   zdata-ajax--cachetruezdata-ajax--delay   zdata-ajax--typeGETzdata-ajax--urlz
data-themezadmin-autocompletezdata-allow-clearzdata-placeholder )r   build_attrsrY   r_   r   jsondumpsis_required)r   Z
base_attrsr   r   )r!   r   r   r     s    )zAutocompleteMixin.build_attrsc                s0  d g  d f } | g } d }   f d d   | D }   j  rq   j rq | d j   j | d d d d     f d d	     j j j   j  j d
 |  D } x | D]y \ }	 }
 t	 |	  | k o | d k p   j } | | O} t
 | d  } | d } | j   j | |	 |
 | |   q W| S)z9Return selected options based on the ModelChoiceIterator.Nr   Fc                s7   h  |  ]- } t  |    j j j k r t  |   q Sr   )r;   r    fieldZempty_values)r   rI   )r   r   r   	<setcomp>  s   	z.AutocompleteMixin.optgroups.<locals>.<setcomp>r   r   c             3   s-   |  ]# } | j    j j j |  f Vq d  S)N)rf   r    r   Zlabel_from_instance)r   ri   )r   r   r   r=     s   z.AutocompleteMixin.optgroups.<locals>.<genexpr>Zpk__in)r   rr   appendZcreate_optionr    ZquerysetrO   rN   filterr;   len)r   r&   r'   attrdefaultgroupsZhas_selectedZselected_choicesr    Zoption_valueZoption_labelselectedindexZsubgroupr   )r   r   	optgroups  s"    	
&(

&zAutocompleteMixin.optgroupsc             C   s|   t  j r d n d } t j t    } | r: d | f n f  } t j d d | d | f | d d	 d
 d | d f i  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admin/js/jquery.init.jsadmin/js/autocomplete.jscssZscreenz&admin/css/vendor/select2/select2%s.csszadmin/css/autocomplete.css)r   r   )r   r   SELECT2_TRANSLATIONSrc   r   r   r   )r   r   Z	i18n_nameZ	i18n_filer   r   r   r     s    	 zAutocompleteMixin.media)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 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,   ry   r   Zdjangor   Zdjango.confr   Zdjango.core.exceptionsr   Zdjango.core.validatorsr   Zdjango.db.models.deletionr   Zdjango.urlsr   Zdjango.urls.exceptionsr   Zdjango.utils.htmlr	   Zdjango.utils.safestringr
   Zdjango.utils.textr   Zdjango.utils.translationr   r   r5   ZSelectMultipler   Z	DateInputr.   Z	TimeInputr2   ZSplitDateTimeWidgetr4   ZRadioSelectr7   ZClearableFileInputr8   rJ   Z	TextInputrK   rk   ZWidgetrq   ZTextarear   r   Z
EmailInputr   ZURLInputr   ZNumberInputr   r   r   r   r_   r   ZSelectr   r   r   r   r   r   <module>   sP   "KW	!!!Z