
 XE                @   s  d  d l  m Z d  d l Z d  d l Z d  d l 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 d  d l m Z 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 m Z m Z m  Z  m! Z! m" Z" m# Z# d  d l$ m% Z% d  d l& m' Z' m( Z( m) Z) m* Z* d  d l+ m, Z, d  d l- m. Z. m/ Z/ m0 Z0 d  d l1 m2 Z2 d  d l3 m4 Z4 d  d l5 m6 Z6 m7 Z7 d  d l8 m9 Z9 m: Z: m; Z; m< Z< m= Z= d  d l> m? Z? m@ Z@ d  d lA mB ZB mC ZC d  d lD mE ZE d  d lF mG ZG mH ZH d  d lI mJ ZJ d  d lK mL ZL d  d lM mN ZN d  d lO mP ZP mQ ZQ d  d lR mS ZS mT ZT d  d lU mV ZV mW ZW d  d lX mY ZY d  d  lZ m[ Z[ m\ Z\ d  d! l] m^ Z_ m` Z` ma Zb mc Zc d  d" ld me Ze d  d# lf mg Zg d$ Zh d% Zi d& d' f \ Zj Zk d( d)   Zl d* d+   Zm Gd, d-   d- en  Zo i i e jp d. 6e jq d/ 6e. jr 6i e js d/ 6e. jt 6i e ju d/ 6e. jv 6i e jw d/ 6e. jx 6i e jy d/ 6e. jz 6i e j{ d/ 6e. j| 6i e j} d/ 6e. j~ 6i e j d/ 6e. j 6i e j d/ 6e. j 6i e j d/ 6e. j 6i e j d/ 6e. j 6Z eN ee  Z Gd0 d1   d1 eL j e j   Z eQ Gd2 d3   d3 e   Z Gd4 d5   d5 e  Z Gd6 d7   d7 e  Z Gd8 d9   d9 e  Z d S):    )unicode_literalsN)OrderedDict)partialreduceupdate_wrapper)forms)settings)messages)helperswidgets)BaseModelAdminChecksInlineModelAdminChecksModelAdminChecks)DisallowedModelAdminToField)add_preserved_filters)NestedObjectsflatten_fieldsetsget_deleted_objectslookup_needs_distinctmodel_format_dictquoteunquote)get_permission_codename)FieldDoesNotExist
FieldErrorPermissionDeniedValidationError)	Paginator)modelsroutertransaction)
LOOKUP_SEP)BLANK_CHOICE_DASH)DELETION_FIELD_NAME	all_valid)BaseInlineFormSetinlineformset_factorymodelform_defines_fieldsmodelform_factorymodelformset_factory)CheckboxSelectMultipleSelectMultiple)Http404HttpResponseRedirect)HttpResponseBase)SimpleTemplateResponseTemplateResponse)reverse)six)method_decorator)
force_textpython_2_unicode_compatible)escapeformat_html)	urlencodeurlquote)	mark_safe)capfirstget_text_list)overridestring_concatugettext	ungettext)csrf_protect)RedirectViewZ_popupZ	_to_field      c             C   s&   d d l  m } | j j |  d d S)Nr   )ContentTypeZfor_concrete_modelF)Z"django.contrib.contenttypes.modelsrE   objectsZget_for_model)objrE    rH   J/home/ubuntu/projects/ifolica/build/django/django/contrib/admin/options.pyget_content_type_for_model<   s    rJ   c             C   s   |  t  k r d Sd S)NZ	radiolistzradiolist inline)VERTICAL)Zradio_stylerH   rH   rI   get_ul_classC   s    rL   c               @   s   e  Z d  Z d S)IncorrectLookupParametersN)__name__
__module____qualname__rH   rH   rH   rI   rM   G   s   rM   Z
form_classwidgetc               @   s  e  Z d  Z d Z f  Z d Z d Z d Z e j	 Z
 f  Z f  Z i  Z i  Z i  Z f  Z d Z d Z d Z e Z d d   Z d d   Z d d	   Z d
 d   Z d d   Z d d   Z d d   Z d d d  Z d d   Z d d d  Z d d d  Z  d d   Z! d d d  Z" d d d  Z# d  d!   Z$ d" d#   Z% d$ d%   Z& d& d'   Z' d d( d)  Z( d d* d+  Z) d, d-   Z* d S).BaseModelAdminz8Functionality common to both ModelAdmin and InlineAdmin.NTc             K   s   |  j    j |  |  S)N)checks_classcheck)selfkwargsrH   rH   rI   rT   t   s    zBaseModelAdmin.checkc             C   sU   t  j t  } x6 |  j j   D]% \ } } | j | i   j |  q W| |  _ d  S)N)copydeepcopyFORMFIELD_FOR_DBFIELD_DEFAULTSformfield_overridesitems
setdefaultupdate)rU   Z	overrideskvrH   rH   rI   __init__w   s    zBaseModelAdmin.__init__c             K   s  | j  r |  j | | |  St | t j  s@ t | t j  rf| j |  j k rn t |  j | j |  } n  t | t j  r |  j	 | | |  } n* t | t j  r |  j
 | | |  } n  | rb| j |  j k rb|  j j j | j j  } i  } | r;| j d | j |  d | j |  d | j |   n  t j | j | j |  j |  | _ n  | SxR | j j   D]A } | |  j k rvt t j |  j |  |  } | j |   SqvW| j |   S)z
        Hook for specifying the form Field instance for a given database Field
        instance.

        If kwargs are given, they're passed to the form Field's constructor.
        Zcan_add_relatedZcan_change_relatedZcan_delete_related)choicesformfield_for_choice_field
isinstancer   ManyToManyFieldZ
ForeignKey	__class__rZ   dictformfield_for_foreignkeyformfield_for_manytomanynameraw_id_fields
admin_site	_registrygetremote_fieldmodelr]   has_add_permissionhas_change_permissionhas_delete_permissionr   ZRelatedFieldWidgetWrapperrQ   mrorW   rX   	formfield)rU   db_fieldrequestrV   rt   Zrelated_modeladminZwrapper_kwargsklassrH   rH   rI   formfield_for_dbfield   s2    		$	!z$BaseModelAdmin.formfield_for_dbfieldc             K   s   | j  |  j k r d | k rN t j d i t |  j | j   d 6 | d <n  d | k r | j d | j d d t d  f g  | d <q n  | j |   S)	zR
        Get a form Field for a database Field that has declared choices.
        rQ   attrsclassra   Zinclude_blankZblank_choice None)	ri   radio_fieldsr   AdminRadioSelectrL   Zget_choicesblank_rt   )rU   ru   rv   rV   rH   rH   rI   rb      s    $		"z)BaseModelAdmin.formfield_for_choice_fieldc             C   st   |  j  j j | j j  } | d k	 rp | j |  } | d k	 rp | f  k rp | j j j j |  j |   Sn  d S)z
        If the ModelAdmin specifies ordering, the queryset should respect that
        ordering.  Otherwise don't specify the queryset, let the field decide
        (returns None in that case).
        N)	rk   rl   rm   rn   ro   get_ordering_default_managerusingorder_by)rU   dbru   rv   Zrelated_adminorderingrH   rH   rI   get_field_queryset   s    "z!BaseModelAdmin.get_field_querysetc             K   s   | j  d  } | j |  j k rF t j | j |  j d | | d <na | j |  j k r t j d i t	 |  j | j  d 6 | d <| j
 r t d  n d | d <n  d | k r |  j | | |  } | d k	 r | | d <q n  | j |   S)	z4
        Get a form Field for a ForeignKey.
        r   rQ   ry   rz   r|   NZempty_labelqueryset)rm   ri   rj   r   ZForeignKeyRawIdWidgetrn   rk   r}   r~   rL   r   r   r   rt   )rU   ru   rv   rV   r   r   rH   rH   rI   rg      s    %!"z'BaseModelAdmin.formfield_for_foreignkeyc       	      K   sW  | j  j j j s d S| j d  } | j |  j k r\ t j | j  |  j	 d | | d <nM | j t
 |  j  t
 |  j  k r t j | j | j |  j k  | d <n  d | k r |  j | | |  } | d k	 r | | d <q n  | j |   } t | j t  rSt | j t  rSt d  } | j } | rGt | d |  n | | _ n  | S)z9
        Get a form Field for a ManyToManyField.
        Nr   rQ   r   zDHold down "Control", or "Command" on a Mac, to select more than one. )rn   Zthrough_metaauto_createdrm   ri   rj   r   ZManyToManyRawIdWidgetrk   listfilter_verticalfilter_horizontalZFilteredSelectMultipleverbose_namer   rt   rc   rQ   r+   r*   r   	help_textr>   )	rU   ru   rv   rV   r   r   Z
form_fieldmsgr   rH   rH   rI   rh      s&    %%%	$z'BaseModelAdmin.formfield_for_manytomanyc             C   s|   | d  k s |  j  r d  St |  j   r6 |  j  |  S|  j  rx t | d  rx t d d i t |  j d 6| j d 6Sd  S)NZget_absolute_urlzadmin:view_on_siterV   content_type_id	object_id)view_on_sitecallablehasattrr1   rJ   pk)rU   rG   rH   rH   rI   get_view_on_site_url  s    z#BaseModelAdmin.get_view_on_site_urlc             C   s:   y t  |  j  SWn" t k
 r5 t  |  j j  SYn Xd S)zP
        Return the empty_value_display set on ModelAdmin or AdminSite.
        N)r:   Zempty_value_displayAttributeErrorrk   )rU   rH   rH   rI   get_empty_value_display  s    z&BaseModelAdmin.get_empty_value_displayc             C   s   |  j  S)z-
        Hook for specifying fields.
        )fields)rU   rv   rG   rH   rH   rI   
get_fields  s    zBaseModelAdmin.get_fieldsc             C   s0   |  j  r |  j  Sd i |  j | |  d 6f g S)z0
        Hook for specifying fieldsets.
        Nr   )	fieldsetsr   )rU   rv   rG   rH   rH   rI   get_fieldsets$  s    	zBaseModelAdmin.get_fieldsetsc             C   s   |  j  p f  S)z5
        Hook for specifying field ordering.
        )r   )rU   rv   rH   rH   rI   r   ,  s    zBaseModelAdmin.get_orderingc             C   s   |  j  S)z=
        Hook for specifying custom readonly fields.
        )readonly_fields)rU   rv   rG   rH   rH   rI   get_readonly_fields2  s    z"BaseModelAdmin.get_readonly_fieldsc             C   s   |  j  S)zA
        Hook for specifying custom prepopulated fields.
        )prepopulated_fields)rU   rv   rG   rH   rH   rI   get_prepopulated_fields8  s    z&BaseModelAdmin.get_prepopulated_fieldsc             C   s=   |  j  j j   } |  j |  } | r9 | j |   } n  | S)z
        Returns a QuerySet of all model instances that can be edited by the
        admin site. This is used by changelist_view.
        )ro   r   get_querysetr   r   )rU   rv   qsr   rH   rH   rI   r   >  s
    zBaseModelAdmin.get_querysetc             C   s  d d l  m } |  j } xn | j j D]` } t |  rD |   } n  x? t j |  j   D]( \ } } | | k rZ | | k rZ d SqZ Wq& Wg  } d  }	 x | j	 t
  D] }
 y | j j |
  } Wn t k
 r PYn X|	 s|	 j r| |	 j   d j k r| j |
  n  t | d d   s'Pn  | }	 | j   d j j } q Wt |  d k r]d St
 j |  } |  j g } xx |  j D]m } t | t  rt | |  r| j | j  qt | t t f  r| j | d  q| j |  qW| | k S)Nr   )SimpleListFilterTrC   get_path_infor   )Zdjango.contrib.admin.filtersr   ro   r   Zrelated_fkey_lookupsr   r   Zurl_params_from_lookup_dictr[   splitr!   	get_fieldr   concreter   Ztarget_fieldsappendgetattrZto_optslenjoindate_hierarchylist_filterrc   type
issubclassZparameter_namer   tuple)rU   lookupvaluer   ro   lr^   r_   Zrelation_partsZ
prev_fieldpartfieldZclean_lookupZvalid_lookupsZfilter_itemrH   rH   rI   lookup_allowedJ  sB    	"zBaseModelAdmin.lookup_allowedc                sY  |  j  j } y | j |  } Wn t k
 r7 d SYn X| j rE d Sx' | j D] } | j   | k rO d SqO Wt   } xQ |  j j	 j
   D]= \ } } | j |  x! | j D] }	 | j |	 j   q Wq Wd d   | j d d  D }
 xg |
 D]_ } | j   | j j } t   f d d   | D  r t | d  r | j   | k r d Sq Wd S)z
        Returns True if the model associated with this admin should be
        allowed to be referenced by the specified field.
        FTc             s   s(   |  ] } | j  r | j r | Vq d  S)N)r   r   ).0frH   rH   rI   	<genexpr>  s    z2BaseModelAdmin.to_field_allowed.<locals>.<genexpr>Zinclude_hiddenc             3   s   |  ] } t  |    Vq d  S)N)r   )r   ro   )related_modelrH   rI   r     s    get_related_field)ro   r   r   r   Zprimary_keymany_to_manyZm2m_target_field_namesetrk   rl   r[   addinlinesr   r   r   rn   anyr   r   )rU   rv   to_fieldoptsr   r   Zregistered_modelsro   Zadmininlinerelated_objectsZrelated_objectrn   rH   )r   rI   to_field_allowed}  s0    				zBaseModelAdmin.to_field_allowedc             C   s5   |  j  } t d |  } | j j d | j | f  S)z
        Returns True if the given request has permission to add an object.
        Can be overridden by the user in subclasses.
        r   z%s.%s)r   r   userhas_perm	app_label)rU   rv   r   codenamerH   rH   rI   rp     s    	z!BaseModelAdmin.has_add_permissionc             C   s5   |  j  } t d |  } | j j d | j | f  S)a  
        Returns True if the given request has permission to change the given
        Django model instance, the default implementation doesn't examine the
        `obj` parameter.

        Can be overridden by the user in subclasses. In such case it should
        return True if the given request has permission to change the `obj`
        model instance. If `obj` is None, this should return True if the given
        request has permission to change *any* object of the given type.
        changez%s.%s)r   r   r   r   r   )rU   rv   rG   r   r   rH   rH   rI   rq     s    	z$BaseModelAdmin.has_change_permissionc             C   s5   |  j  } t d |  } | j j d | j | f  S)a  
        Returns True if the given request has permission to change the given
        Django model instance, the default implementation doesn't examine the
        `obj` parameter.

        Can be overridden by the user in subclasses. In such case it should
        return True if the given request has permission to delete the `obj`
        model instance. If `obj` is None, this should return True if the given
        request has permission to delete *any* object of the given type.
        deletez%s.%s)r   r   r   r   r   )rU   rv   rG   r   r   rH   rH   rI   rr     s    	z$BaseModelAdmin.has_delete_permissionc             C   s   | j  j |  j j  S)a  
        Returns True if the given request has any permission in the given
        app label.

        Can be overridden by the user in subclasses. In such case it should
        return True if the given request has permission to view the module on
        the admin index page and access the module's index page. Overriding it
        does not restrict access to the add, change or delete views. Use
        `ModelAdmin.has_(add|change|delete)_permission` for that.
        )r   Zhas_module_permsr   r   )rU   rv   rH   rH   rI   has_module_permission  s    z$BaseModelAdmin.has_module_permission)+rN   rO   rP   __doc__rj   r   excluder   r   	ModelFormformr   r   r}   r   rZ   r   r   r   Zshow_full_result_countr   rS   rT   r`   rx   rb   r   rg   rh   r   r   r   r   r   r   r   r   r   r   rp   rq   rr   r   rH   rH   rH   rI   rR   a   sJ   	8	3-	rR   c                   s  e  Z d  Z d Z du Z f  Z f  Z d Z d Z d Z	 f  Z
 f  Z d Z d Z d Z d Z e Z d Z g  Z d Z d Z d Z d Z d Z d Z g  Z e j Z d Z d Z d Z  e! Z"   f d d	   Z# d
 d   Z$ d d d  Z% d d   Z& d d   Z' e( e'  Z' e( d d    Z) d d   Z* d d d  Z+ d d d  Z, d d   Z- d d d  Z. d d   Z/ d  d!   Z0 d d" d#  Z1 d$ d d% d&  Z2 d' d(   Z3 d) d*   Z4 d+ d,   Z5 d- d.   Z6 e7 d/  e6 _8 d0 d1   Z9 e: d2 d3  Z; d4 d5   Z< d6 d7   Z= d8 d9   Z> d: d;   Z? d< d=   Z@ d> d?   ZA d@ dA   ZB dB dC   ZC d dD dE  ZD eE jF dF d dG dH  ZG dI dJ   ZH dK dL   ZI dM dN   ZJ dO dP   ZK dQ dR   ZL d d dF d dS dT  ZM d dU dV  ZN dW dX   ZO dY dZ   ZP d[ d\   ZQ d] d^   ZR d_ d`   ZS da db   ZT d dc dd  ZU de df   ZV eW eX jY d dF d dg dh    ZZ dF d di dj  Z[ dF d dk dl  Z\ eW d dm dn   Z] eW eX jY d do dp    Z^ d dq dr  Z_ ds dt   Z`   S)v
ModelAdminzCEncapsulates all admin options and functionality for a given model.__str__Fd      NTc                s5   | |  _  | j |  _ | |  _ t t |   j   d  S)N)ro   r   r   rk   superr   r`   )rU   ro   rk   )re   rH   rI   r`     s    		zModelAdmin.__init__c             C   s   d |  j  j j |  j j f S)Nz%s.%s)ro   r   r   re   rN   )rU   rH   rH   rI   r   	  s    zModelAdmin.__str__c             C   s   g  } x |  j  D] } | |  j |  j  } | r | j |  pa | j | |  pa | j | |  sj q n  | j |  s d | _ q n  | j |  q W| S)Nr   )r   ro   rk   rp   rq   rr   max_numr   )rU   rv   rG   inline_instancesZinline_classr   rH   rH   rI   get_inline_instances  s    zModelAdmin.get_inline_instancesc                s  d d l  m }   f d d   }   j j j   j j j f } | d |   j  d d | | d |   j  d d	 | | d
 |   j  d d | | d |   j	  d d | | d |   j
  d d | | d | t j d d   j j f |    g } | S)Nr   )urlc                s+      f d d   }  | _  t |    S)Nc                 s     j  j   |  |   S)N)rk   Z
admin_view)argsrV   )rU   viewrH   rI   wrapper  s    z2ModelAdmin.get_urls.<locals>.wrap.<locals>.wrapper)model_adminr   )r   r   )rU   )r   rI   wrap  s    	z!ModelAdmin.get_urls.<locals>.wrapz^$ri   z%s_%s_changelistz^add/$z	%s_%s_addz^(.+)/history/$z%s_%s_historyz^(.+)/delete/$z%s_%s_deletez^(.+)/change/$z%s_%s_changez^(.+)/$Zpattern_namez%s:%s_%s_change)Zdjango.conf.urlsr   ro   r   r   
model_namechangelist_viewadd_viewhistory_viewdelete_viewchange_viewrB   Zas_viewrk   ri   )rU   r   r   infoZurlpatternsrH   )rU   rI   get_urls  s    #zModelAdmin.get_urlsc             C   s
   |  j    S)N)r   )rU   rH   rH   rI   urls3  s    zModelAdmin.urlsc          	   C   s`   t  j r d n d } d d | d d d | d d	 | d
 | g } t j d d d   | D  S)Nr{   z.minzcore.jszvendor/jquery/jquery%s.jszjquery.init.jszadmin/RelatedObjectLookups.jszactions%s.jsz	urlify.jszprepopulate%s.jszvendor/xregexp/xregexp%s.jsjsc             S   s   g  |  ] } d  |  q S)zadmin/js/%srH   )r   r   rH   rH   rI   
<listcomp>D  s   	 z$ModelAdmin.media.<locals>.<listcomp>)r   DEBUGr   Media)rU   extrar   rH   rH   rI   media7  s    zModelAdmin.mediac             C   s4   i |  j  |  d 6|  j |  d 6|  j |  d 6S)z
        Returns a dict of all perms for this model. This dict has the keys
        ``add``, ``change``, and ``delete`` mapping to the True/False for each
        of those actions.
        r   r   r   )rp   rq   rr   )rU   rv   rH   rH   rI   get_model_permsF  s    zModelAdmin.get_model_permsc             C   sK   |  j  r |  j  S|  j | | d d  } t | j  t |  j | |   S)Nr   )r   get_formr   base_fieldsr   )rU   rv   rG   r   rH   rH   rI   r   R  s    	zModelAdmin.get_fieldsc                s  d | k r | j  d  } n t   j | |   }   j d k rN g  } n t   j  }   j | |  } | j |    j d k r t   j d  r   j j	 j r | j   j j	 j  n  | p d } t
   f d d   | D  } t   j j   j f |  } i | d 6| d 6| d 6t   j d | d	 6}	 |	 j |  |	 d d k r}t |	 d  r}t j |	 d <n  y t   j |	  SWnA t k
 r}
 z! t d
 |
   j j f   WYd d }
 ~
 Xn Xd S)zw
        Returns a Form class for use in the admin add view. This is used by
        add_view and change_view.
        r   Nr   c             3   s-   |  ]# } |   j  j k r | d  f Vq d  S)N)r   Zdeclared_fields)r   r   )rU   rH   rI   r   q  s    z&ModelAdmin.get_form.<locals>.<genexpr>r   r   rv   formfield_callbackz:%s. Check fields/fieldsets/exclude attributes of class %s.)popr   r   r   r   r   extendr   r   r   r   r   rN   r   rx   r]   r'   r   
ALL_FIELDSr(   ro   r   re   )rU   rv   rG   rV   r   r   r   Z	new_attrsr   defaultserH   )rU   rI   r   X  s8    	0!zModelAdmin.get_formc             K   s   d d l  m } | S)zN
        Returns the ChangeList class for use on the changelist page.
        r   )
ChangeList)django.contrib.admin.views.mainr   )rU   rv   rV   r   rH   rH   rI   get_changelist  s    zModelAdmin.get_changelistc             C   s   |  j  |  } | j } | d k r0 | j j n | j j |  } y* | j |  } | j i | | j 6  SWn" | j t	 t
 f k
 r d SYn Xd S)z
        Returns an instance matching the field and value provided, the primary
        key is used if no field is provided. Returns ``None`` if no match is
        found or the object_id fails validation.
        N)r   ro   r   r   r   Z	to_pythonrm   ri   ZDoesNotExistr   
ValueError)rU   rv   r   Z
from_fieldr   ro   r   rH   rH   rI   
get_object  s    	*zModelAdmin.get_objectc             K   st   i t  |  j d | d 6} | j |  | j d  d k rd t | j d   rd t j | d <n  t |  j |  S)zU
        Returns a Form class for use in the Formset on the changelist page.
        rv   r   r   Nr   )	r   rx   r]   rm   r'   r   r   r(   ro   )rU   rv   rV   r   rH   rH   rI   get_changelist_form  s    +zModelAdmin.get_changelist_formc             K   sT   i t  |  j d | d 6} | j |  t |  j |  j |  d d d |  j | S)zj
        Returns a FormSet class for use on the changelist page if list_editable
        is used.
        rv   r   r   r   r   )r   rx   r]   r)   ro   r   list_editable)rU   rv   rV   r   rH   rH   rI   get_changelist_formset  s    z!ModelAdmin.get_changelist_formsetc             c   s8   x1 |  j  | |  D] } | j | |  | f Vq Wd S)z@
        Yields formsets and the corresponding inlines.
        N)r   get_formset)rU   rv   rG   r   rH   rH   rI   get_formsets_with_inlines  s    z$ModelAdmin.get_formsets_with_inlinesr   c             C   s   |  j  | | | |  S)N)	paginator)rU   rv   r   Zper_pageZorphansZallow_empty_first_pagerH   rH   rI   get_paginator  s    zModelAdmin.get_paginatorc             C   sc   d d l  m } m } | j j d | j j d t |  j d | j d t |  d | d |  d	 S)
z
        Log that an object has been successfully added.

        The default implementation creates an admin LogEntry object.
        r   )LogEntryADDITIONuser_idr   r   object_repraction_flagchange_messageN)	django.contrib.admin.modelsr  r  rF   
log_actionr   r   rJ   r4   )rU   rv   objectmessager  r  rH   rH   rI   log_addition  s    	zModelAdmin.log_additionc             C   sc   d d l  m } m } | j j d | j j d t |  j d | j d t |  d | d |  d	 S)
z
        Log that an object has been successfully changed.

        The default implementation creates an admin LogEntry object.
        r   )r  CHANGEr  r   r   r	  r
  r  N)	r  r  r  rF   r  r   r   rJ   r4   )rU   rv   r  r  r  r  rH   rH   rI   
log_change  s    	zModelAdmin.log_changec             C   sW   d d l  m } m } | j j d | j j d t |  j d | j d | d |  d S)	z
        Log that an object will be deleted. Note that this method must be
        called before the deletion.

        The default implementation creates an admin LogEntry object.
        r   )r  DELETIONr  r   r   r	  r
  N)r  r  r  rF   r  r   r   rJ   )rU   rv   r  r	  r  r  rH   rH   rI   log_deletion  s    	zModelAdmin.log_deletionc             C   s   t  j j t  j t | j   S)zE
        A list_display column containing a checkbox widget.
        )r
   ZcheckboxrenderACTION_CHECKBOX_NAMEr4   r   )rU   rG   rH   rH   rI   action_checkbox  s    zModelAdmin.action_checkboxz,<input type="checkbox" id="action-toggle" />c                s    j  d k s t | j k r% t   Sg  } xN   j j  D]@ \ } } t | d | j d d   } | j | | | f  q8 Wxb   j j	   d d d
  D]D } t | d g   } | s q n  | j
   f d d   | D  q Wt d |  } t d	 d   | D  } | S)z
        Return a dictionary mapping the names of all actions for this
        ModelAdmin to a tuple of (callable, name, description) for each action.
        Nshort_descriptionr   r   rC   actionsc             3   s   |  ] }   j  |  Vq d  S)N)
get_action)r   action)rU   rH   rI   r     s    z)ModelAdmin.get_actions.<locals>.<genexpr>c             s   s-   |  ]# \ } } } | | | | f f Vq d  S)NrH   )r   funcri   descrH   rH   rI   r     s   r   )r  IS_POPUP_VARGETr   rk   r   replacer   re   rs   r   filter)rU   rv   r  ri   r  descriptionrw   Zclass_actionsrH   )rU   rI   get_actions  s     #$	zModelAdmin.get_actionsc             C   s`   g  | } xO t  j |  j |   D]5 \ } } } | | t |  j  f } | j |  q# W| S)zy
        Return a list of choices for use in a form object.  Each choice is a
        tuple (name, description).
        )r2   
itervaluesr#  r   r   r   )rU   rv   Zdefault_choicesra   r  ri   r"  choicerH   rH   rI   get_action_choices   s
    
(zModelAdmin.get_action_choicesc             C   s   t  |  r | } | j } nV t |  j |  rE t |  j |  } n/ y |  j j |  } Wn t k
 rs d SYn Xt | d  r | j } n t	 | j
 d d   } | | | f S)z
        Return a given action from a parameter, which can either be a callable,
        or the name of a method on the ModelAdmin.  Return is a tuple of
        (callable, name, description).
        Nr  r   r   )r   rN   r   re   r   rk   r  KeyErrorr  r;   r   )rU   r  r  r"  rH   rH   rI   r  +  s    	zModelAdmin.get_actionc             C   s   |  j  S)zd
        Return a sequence containing the fields to be displayed on the
        changelist.
        )list_display)rU   rv   rH   rH   rI   get_list_displayI  s    zModelAdmin.get_list_displayc             C   s>   |  j  s |  j  d k s | r& |  j  St |  d d  Sd S)z
        Return a sequence containing the fields to be displayed as links
        on the changelist. The list_display parameter is the list of fields
        returned by get_list_display().
        NrC   )list_display_linksr   )rU   rv   r(  rH   rH   rI   get_list_display_linksP  s    z!ModelAdmin.get_list_display_linksc             C   s   |  j  S)z
        Returns a sequence containing the fields to be displayed as filters in
        the right sidebar of the changelist page.
        )r   )rU   rv   rH   rH   rI   get_list_filter\  s    zModelAdmin.get_list_filterc             C   s   |  j  S)zu
        Returns a list of fields to add to the select_related() part of the
        changelist items query.
        )list_select_related)rU   rv   rH   rH   rI   get_list_select_relatedc  s    z"ModelAdmin.get_list_select_relatedc             C   s   |  j  S)z{
        Returns a sequence containing the fields to be searched whenever
        somebody submits a search query.
        )search_fields)rU   rv   rH   rH   rI   get_search_fieldsj  s    zModelAdmin.get_search_fieldsc       	         s   d d    d } |  j  |  } | r | r  f d d   | D } xH | j   D]:     f d d   | D } | j t t j |   } qS W| s x- | D]" } t |  j |  r d } Pq q Wq n  | | f S)z
        Returns a tuple containing a queryset to implement the search,
        and a boolean indicating if the results may contain duplicates.
        c             S   so   |  j  d  r! d |  d d   S|  j  d  rB d |  d d   S|  j  d  rc d |  d d   Sd |  Sd  S)	N^z%s__istartswithrC   =z
%s__iexact@z
%s__searchz%s__icontains)
startswith)
field_namerH   rH   rI   construct_searchw  s    z7ModelAdmin.get_search_results.<locals>.construct_searchFc                s"   g  |  ] }   t  |    q SrH   )str)r   Zsearch_field)r6  rH   rI   r     s   	z1ModelAdmin.get_search_results.<locals>.<listcomp>c                s&   g  |  ] } t  j i   | 6   q SrH   )r   Q)r   Z
orm_lookup)bitrH   rI   r     s   	T)r0  r   r!  r   operatoror_r   r   )	rU   rv   r   Zsearch_termZuse_distinctr/  Zorm_lookupsZ
or_queriesZsearch_specrH   )r9  r6  rI   get_search_resultsq  s     


zModelAdmin.get_search_resultsc             C   s   | j  } |  j r | r |  j j } d | j | j f } d | j | j f } | | k rn | j j	   } n | j j
 d  } | r t	 i | d 6 Sn  d S)z<
        Returns the preserved filters querystring.
        z%s:%szadmin:%s_%s_changelistZ_changelist_filtersr{   )resolver_matchpreserve_filtersro   r   Zapp_nameurl_namer   r   r  r8   rm   )rU   rv   matchr   Zcurrent_urlZchangelist_urlpreserved_filtersrH   rH   rI   get_preserved_filters  s    	z ModelAdmin.get_preserved_filtersc             C   sc  g  } | r# | j  i i  d 6 n* | j rM | j  i i | j d 6d 6 n  | r_t d   x | D] } xE | j D]: } | j  i i t | j j  d 6t |  d 6d 6 qw WxR | j D]G \ } }	 | j  i i t | j j  d 6t |  d 6|	 d 6d 6 q WxE | j D]: }
 | j  i i t |
 j j  d 6t |
  d 6d 6 qWqg WWd QXn  | S)z
        Construct a JSON structure describing changes from a changed object.
        Translations are deactivated so that strings are stored untranslated.
        Translation happens later on LogEntry access.
        addedr   changedNri   r  Zdeleted)	r   Zchanged_datatranslation_overrideZnew_objectsr4   r   r   Zchanged_objectsdeleted_objects)rU   rv   r   formsetsr   r  formsetZadded_objectZchanged_objectZchanged_fieldsZdeleted_objectrH   rH   rI   construct_change_message  s2    	!			&z#ModelAdmin.construct_change_messager{   c             C   s   t  | t  s y t t j | j    } Wq t k
 r t j j j   } d j	 d d   | D  } t
 d | | f   Yq Xn  t j | | | d | d | d S)a  
        Send a message to the user. The default implementation
        posts a message using the django.contrib.messages backend.

        Exposes almost the same API as messages.add_message(), but accepts the
        positional arguments in a different order to maintain backwards
        compatibility. For convenience, it accepts the `level` argument as
        a string rather than the usual level number.
        z, c             s   s   |  ] } d  | Vq d S)z`%s`NrH   )r   r   rH   rH   rI   r     s    z*ModelAdmin.message_user.<locals>.<genexpr>z7Bad message level string: `%s`. Possible values are: %s
extra_tagsfail_silentlyN)rc   intr   r	   	constantsupperr   ZDEFAULT_TAGSvaluesr   r   Zadd_message)rU   rv   r  levelrJ  rK  levelsZlevels_reprrH   rH   rI   message_user  s    zModelAdmin.message_userc             C   s   | j  d d  S)z
        Given a ModelForm return an unsaved instance. ``change`` is True if
        the object is being changed, and False if it's being added.
        commitF)save)rU   rv   r   r   rH   rH   rI   	save_form  s    zModelAdmin.save_formc             C   s   | j    d S)zA
        Given a model instance save it to the database.
        N)rT  )rU   rv   rG   r   r   rH   rH   rI   
save_model  s    zModelAdmin.save_modelc             C   s   | j    d S)zE
        Given a model instance delete it from the database.
        N)r   )rU   rv   rG   rH   rH   rI   delete_model  s    zModelAdmin.delete_modelc             C   s   | j    d S)zB
        Given an inline formset save it to the database.
        N)rT  )rU   rv   r   rH  r   rH   rH   rI   save_formset  s    zModelAdmin.save_formsetc             C   s8   | j    x' | D] } |  j | | | d | q Wd S)aO  
        Given the ``HttpRequest``, the parent ``ModelForm`` instance, the
        list of inline formsets and a boolean value based on whether the
        parent is being added or changed, save the related objects to the
        database. Note that at this point save_form() and save_model() have
        already been called.
        r   N)Zsave_m2mrX  )rU   rv   r   rG  r   rH  rH   rH   rI   save_related  s    
zModelAdmin.save_relatedc             C   so  |  j  j } | j } |  j |  }	 t i |	 d 6| d 6|  } |  j |  }
 | j i | d 6| d 6|  j |  d 6|  j | |  d 6|  j	 | |  d 6d d	 6|
 d  k	 d
 6|
 d 6| d 6| d 6t
 |  j   j d 6|  j d 6|  j d 6t d 6t d 6| d 6 | r'|  j d  k	 r'|  j } n	 |  j } |  j j | _ t | | phd | | j f d | d g |  S)NrA  r   r   r   rp   rq   rr   TZhas_file_fieldZhas_absolute_urlZabsolute_urlform_urlr   save_assave_on_topto_field_varis_popup_varr   zadmin/%s/%s/change_form.htmlzadmin/%s/change_form.htmlzadmin/change_form.html)ro   r   r   rB  r   r   r]   rp   rq   rr   rJ   r   r[  r\  TO_FIELD_VARr  add_form_templatechange_form_templaterk   ri   current_appr0   r   )rU   rv   contextr   r   rZ  rG   r   r   rA  Zview_on_site_urlZform_templaterH   rH   rI   render_change_form	  s>    		

	zModelAdmin.render_change_formc             C   s  | j  } | j   } |  j |  } t d | j | j f d t |  f d |  j j } |  j	 | |  r t
 d t |  |  } n t |  } i t | j  d 6| d 6}	 t | j k rH| j j t  }
 |
 r t |
  } n | j  j j } | j |  } t j i t j |  d 6t j |  d 6 } t d i | d	 6 Sd
 | j k sd | j k r|  j r|  j	 | |  rt
 t d  |	  } |  j | | t j  | d k r| } n  t  i | d 6| d 6|  } t! |  Sd | j k rRt
 t d  |	  } |  j | | t j  | j" } t  i | d 6| d 6|  } t! |  St
 t d  |	  } |  j | | t j  |  j# | |  Sd S)zE
        Determines the HttpResponse for the add_view stage.
        zadmin:%s_%s_changer   rb  z<a href="{}">{}</a>ri   rG   r   zadmin/popup_response.htmlpopup_response_data	_continue
_saveasnewzGThe {name} "{obj}" was added successfully. You may edit it again below.NrA  r   _addanotherzLThe {name} "{obj}" was added successfully. You may add another {name} below.z*The {name} "{obj}" was added successfully.)$r   _get_pk_valrB  r1   r   r   r   rk   ri   rq   r7   r9   r4   r   r  POSTrm   r_  r7  r   attnameserializable_valuejsondumpsr2   	text_typer/   save_as_continuer   rR  r	   SUCCESSr   r-   pathresponse_post_save_add)rU   rv   rG   Zpost_url_continuer   pk_valuerA  Zobj_urlZobj_reprmsg_dictr   attrr   re  r   redirect_urlrH   rH   rI   response_add.  sd    	
						
			
		zModelAdmin.response_addc             C   s  t  | j k r | j j t  } | r3 t |  n | j j j } | j j	 d } | j
 |  } t j i d d 6t j |  d 6t j |  d 6t j |  d 6 } t d i | d 6 S|  j j } | j   }	 |  j |  }
 i t | j  d	 6t d
 t | j  |  d 6} d | j k r~t t d  |  } |  j | | t j  | j } t i |
 d 6| d 6|  } t |  Sd | j k rt t d  |  } |  j | | t j  t d | j | j  f d |	 f d |  j! j" } t i |
 d 6| d 6|  } t |  Sd | j k rt t d  |  } |  j | | t j  t d | j | j  f d |  j! j" } t i |
 d 6| d 6|  } t |  St t d  |  } |  j | | t j  |  j# | |  Sd S)zH
        Determines the HttpResponse for the change_view stage.
        r   r   r  r   rG   	new_valuezadmin/popup_response.htmlre  ri   z<a href="{}">{}</a>rf  zIThe {name} "{obj}" was changed successfully. You may edit it again below.rA  r   rg  zGThe {name} "{obj}" was added successfully. You may edit it again below.zadmin:%s_%s_changer   rb  rh  zNThe {name} "{obj}" was changed successfully. You may add another {name} below.zadmin:%s_%s_addz,The {name} "{obj}" was changed successfully.N)$r  rj  rm   r_  r7  r   r   rk  r=  r   rl  rm  rn  r2   ro  r/   ro   ri  rB  r4   r   r7   r9   rr  r   rR  r	   rq  r   r-   r1   r   r   rk   ri   response_post_save_change)rU   rv   rG   r   rv  r   ry  re  r   rt  rA  ru  r   rw  rH   rH   rI   response_changey  sh    !					
			
		
		zModelAdmin.response_changec             C   s   |  j  j } |  j | d  ru t d | j | j f d |  j j } |  j |  } t	 i | d 6| d 6|  } n t d d |  j j } t
 |  S)zy
        Figure out where to redirect after the 'Save' button has been pressed
        when adding a new object.
        Nzadmin:%s_%s_changelistrb  rA  r   zadmin:index)ro   r   rq   r1   r   r   rk   ri   rB  r   r-   )rU   rv   rG   r   post_urlrA  rH   rH   rI   rs    s     	z!ModelAdmin.response_post_save_addc             C   s   |  j  j } |  j | d  ru t d | j | j f d |  j j } |  j |  } t	 i | d 6| d 6|  } n t d d |  j j } t
 |  S)z
        Figure out where to redirect after the 'Save' button has been pressed
        when editing an existing object.
        Nzadmin:%s_%s_changelistrb  rA  r   zadmin:index)ro   r   rq   r1   r   r   rk   ri   rB  r   r-   )rU   rv   rG   r   r|  rA  rH   rH   rI   rz    s     	z$ModelAdmin.response_post_save_changec             C   s  y t  | j j d d   } Wn t k
 r9 d } Yn X| j j   } | j t j d  | j d d  y% | j i | j	 d  | d 6 Wn t
 k
 r Yn X|  j | d d } |  j |  | j d _ | j   r| j d } | j d } |  j |  | d } | j j	 t j  }	 |	 rZ| rZt d  }
 |  j | |
 t j  d S| su| j d |	  } n  | |  | |  } t | t  r| St | j    Sn& t d	  }
 |  j | |
 t j  d Sd S)
z
        Handle an admin action. This is called if a request is POSTed to the
        changelist; it returns an HttpResponse if the action was handled, and
        None otherwise.
        indexr   Nr  auto_idselect_acrosszWItems must be selected in order to perform actions on them. No items have been changed.Zpk__inzNo action selected.)rL  rj  rm   r   rW   r   r
   r  r]   getlist
IndexErroraction_formr&  r   ra   is_validcleaned_datar#  r   rR  r	   WARNINGr!  rc   r.   r-   get_full_path)rU   rv   r   Zaction_indexdatar  r  r  r  selectedr   responserH   rH   rI   response_action  s>    
%zModelAdmin.response_actionc             C   s  |  j  j } t | j k rR t j i d d 6t |  d 6 } t d i | d 6 S|  j | t	 d  i t
 | j  d 6t
 |  d 6t j  |  j | d	  r t d
 | j | j f d |  j j } |  j |  } t i | d 6| d 6|  } n t d d |  j j } t |  S)zH
        Determines the HttpResponse for the delete_view stage.
        r   r  r   zadmin/popup_response.htmlre  z0The %(name)s "%(obj)s" was deleted successfully.ri   rG   Nzadmin:%s_%s_changelistrb  rA  r   zadmin:index)ro   r   r  rj  rm  rn  r7  r/   rR  r   r4   r   r	   rq  rq   r1   r   r   rk   ri   rB  r   r-   )rU   rv   obj_displayobj_idr   re  r|  rA  rH   rH   rI   response_delete'  s,    		
zModelAdmin.response_deletec             C   s}   |  j  j } | j } |  j j | _ | j d t d t d |  j	  t
 | |  j pv d j | | j  d j |  d g |  S)Nr]  r^  r   z$admin/{}/{}/delete_confirmation.htmlz!admin/{}/delete_confirmation.htmlzadmin/delete_confirmation.html)ro   r   r   rk   ri   rb  r]   r_  r  r   r0   delete_confirmation_templateformatr   )rU   rv   rc  r   r   rH   rH   rI   render_delete_formM  s    		
	zModelAdmin.render_delete_formc          	   C   s   g  } x t  | |  D] \ } } t | j | |   } t | j | |   }	 t | j | |   }
 t j | | | |
 |	 d |  } | j |  q W| S)Nr   )	zipr   r   r   rf   r   r
   ZInlineAdminFormSetr   )rU   rv   rG  r   rG   inline_admin_formsetsr   rH  r   readonlyZprepopulatedZinline_admin_formsetrH   rH   rI   get_inline_formsetsb  s    	zModelAdmin.get_inline_formsetsc             C   s   t  | j j    } xk | D]c } y |  j j j |  } Wn t k
 rR w Yn Xt | t j	  r | | j
 d  | | <q q W| S)zk
        Get the initial form data.
        Unless overridden, this populates from the GET params.
        ,)rf   r  r[   ro   r   r   r   rc   r   rd   r   )rU   rv   initialr^   r   rH   rH   rI   get_changeform_initial_datao  s    z&ModelAdmin.get_changeform_initial_datac             C   s  | j  j t | j j t   } | rM |  j | |  rM t d |   n  |  j } | j } | j d k r d | j  k r d  } n  | d  k } | r |  j	 |  s t
  n  d  }	 nx |  j | t |  |  }	 |  j | |	  s t
  n  |	 d  k r1t t d  i t | j  d 6t |  d 6  n  |  j | |	  }
 | j d k ry|
 | j  | j d |	 } | j   rd } |  j | | d	 | } n d
 } | j } |  j | | d	 | \ } } t |  rp| rp|  j | | | |  |  j | | | |  |  j | | | |  } | rJ|  j | | |  |  j | |  S|  j | | |  |  j  | |  Sqd
 } nu | r|  j! |  } |
 d |  } |  j | | j d	 d
 \ } } n- |
 d |	  } |  j | |	 d	 d \ } } t" j# | t$ |  j% | |	   |  j& | |	  |  j' | |	  d |  } |  j( | j( } |  j) | | | |	  } x | D] } | | j( } qeWt* |  j+ j, |  d | rt d  n	 t d  t | j  d | d | d |	 d t- | j  k pt- | j k d | d | d | d t" j. | |  d |  j/ |  
} | j d k rd| rdd | j  k rdd
 | d <d
 | d <d
 } n  | j0 | psi   |  j1 | | d | d	 | d |	 d | S)Nz"The field %s cannot be referenced.rj  rg  z8%(name)s object with primary key %(key)r does not exist.ri   keyinstanceTr   Fr  r   titlezAdd %sz	Change %sZ	adminformr   Zoriginalis_popupr   r   r  errorsrA  Z	show_saveZshow_save_and_continuer   rG   rZ  )2rj  rm   r_  r  r   r   ro   r   methodrp   r   r   r   rq   r,   r   r4   r   r6   r   FILESr  rU  r  _create_formsetsr$   rV  rY  rI  r  rx  r  r{  r  r
   Z	AdminFormr   r   r   r   r   r  rf   rk   each_contextr  ZAdminErrorListrB  r]   rd  )rU   rv   r   rZ  extra_contextr   ro   r   r   rG   r   r   Zform_validatedZ
new_objectrG  r   r  r  Z	adminFormr   Zinline_formsetsZinline_formsetrc  rH   rH   rI   changeform_view  s    !						'		$	+%

	zModelAdmin.changeform_viewc             C   s   |  j  | d  | |  S)N)r  )rU   rv   rZ  r  rH   rH   rI   r     s    zModelAdmin.add_viewc             C   s   |  j  | | | |  S)N)r  )rU   rv   r   rZ  r  rH   rH   rI   r     s    zModelAdmin.change_viewc          )   C   s  d d l  m } |  j j } | j } |  j | d  s@ t  n  |  j |  } |  j | |  } |  j	 |  } |  j
 |  }	 |  j |  }
 |  j |  } | r d g t |  } n  |  j |  } y@ | | |  j | | | |  j |	 |
 |  j |  j |  j |   } WnZ t k
 rd| | j j   k rGt d i t d  d 6 St | j d | d	  SYn Xd
 } | j j t j  } | r| j d k rd | j k rd | j k r| r|  j | d | j  |  } | r| Sd } qt d  } |  j! | | t" j#  d } n  | r| j d k rt j | j k rd | j k rd | j k r| r|  j | d | j  |  } | r| Sd } qn  d } | _$ | j d k rM| j rMd | j k rM| rM|  j% |  } | | j | j& d |  j  |  } | _$ | j'   rd } x | j( D] } | j)   r%|  j* | | d d } |  j+ | | | d d |  j, | | d g  d d |  j- | | d  } |  j. | | |  | d 7} q%q%W| r:| d k rt/ | j0  } n t/ | j1  } t2 d d |  i | d 6| d 6t/ |  d 6} |  j! | | t" j3  n  t | j4    Sn4 | j r|  j% |  } | d | j5  } | _$ n  | r|  j6 | j6 } n	 |  j6 } | r|  j7 d d  } |  j8 |  | j9 d _: n d } t2 d d | j;  } t< |  j= j> |  d t/ | j1  d t d  i t? | j5  d  6d! | i | j; d" 6d | j@ d# | jA d$ | jB d% | d& | d' |  jC |  d( | jD d) | d* |  jE d+ |  jF d, |  jG d- |  jH |  } | jI | pi   |  j= jJ | _K tL | |  jM p
d. | | jN f d/ | d0 g |  S)1z>
        The 'change list' admin view for this model.
        r   )
ERROR_FLAGNr  zadmin/invalid_setup.htmlzDatabase errorr  ?z=1Frj  r}  Z_saver   TzWItems must be selected in order to perform actions on them. No items have been changed.r   rG  rC   z,%(count)s %(name)s was changed successfully.z-%(count)s %(name)s were changed successfully.countri   rG   r~  r  z%(total_count)s selectedzAll %(total_count)s selectedmodule_nameZselection_notez0 of %(cnt)s selectedZcntselection_note_allZtotal_countr  r   clr   rp   r   r  actions_on_topactions_on_bottomactions_selection_counterrA  zadmin/%s/%s/change_list.htmlzadmin/%s/change_list.htmlzadmin/change_list.html)Or   r  ro   r   r   rq   r   r)  r+  r,  r0  r.  r#  r   r   r   list_per_pagelist_max_show_allr   rM   r  keysr/   r   r-   rr  rj  r  r
   r  r  r  r   rR  r	   r  rH  r  r  r  r   Zhas_changedrU  rV  rY  rI  r  r4   r   verbose_name_pluralr@   rq  r  Zresult_listr   r  r&  r   ra   Zresult_countrf   rk   r  r   r  r  r   rp   r   r  r  r  rB  r]   ri   rb  r0   change_list_templater   )rU   rv   r  r  r   r   r(  r*  r   r/  r-  r  r   r  Zaction_failedr  r  r   rH  FormSetZchangecountr   rG   Z
change_msgri   r   r  r  rc  rH   rH   rI   r     s    					+		 							zModelAdmin.changelist_viewc             C   s  |  j  j } | j } | j j t | j j t   } | rb |  j | |  rb t d |   n  |  j	 | t
 |  |  } |  j | |  s t  n  | d k r t t d  i t | j  d 6t |  d 6  n  t j |  j   } t | g | | j |  j |  \ }	 }
 } } | j r| r| r8t  n  t |  } | rVt |  n	 | j j } | j |  } |  j | | |  |  j | |  |  j | | |  St | j  } | s| rt d  i | d 6} n t d  } t |  j j |  d | d	 | d
 | d |	 d t |
  j    d | d | d | d | d |  j! |  d t" | j k pit" | j k d | } | j# | pi   |  j$ | |  S)z'The 'delete' admin view for this model.z"The field %s cannot be referenced.Nz8%(name)s object with primary key %(key)r does not exist.ri   r  zCannot delete %(name)szAre you sure?r  object_namer  rF  model_countZperms_lacking	protectedr   r   rA  r  r   )%ro   r   r   rj  rm   r_  r  r   r   r   r   rr   r   r,   r   r4   r   r6   r   db_for_writer   r   rk   r7  r   rk  rl  r  rW  r  rf   r  r[   rB  r  r]   r  )rU   rv   r   r  r   r   r   rG   r   rF  r  Zperms_neededr  r  rv  r  r  r  rc  rH   rH   rI   r     sZ    	!		**		zModelAdmin.delete_viewc             C   s  d d l  m } |  j } |  j | t |   } | d k rv t t d  i t | j j	  d 6t
 |  d 6  n  |  j | |  s t  n  | j } | j } | j j d t |  d t |   j   j d	  }	 t |  j j |  d
 t d  t |  d |	 d t t | j   d | d | d |  j |  }
 |
 j | pLi   |  j j | _ t | |  j pd | | j f d | d g |
  S)z(The 'history' admin view for this model.r   )r  Nz8%(name)s object with primary key %(key)r does not exist.ri   r  r   content_typeZaction_timer  zChange history: %saction_listr  r  r   rA  zadmin/%s/%s/object_history.htmlzadmin/%s/object_history.htmlzadmin/object_history.html)r  r  ro   r   r   r,   r   r4   r   r   r6   rq   r   r   rF   r!  rJ   Zselect_relatedr   rf   rk   r  r;   r  rB  r]   ri   rb  r0   object_history_templater   )rU   rv   r   r  r  ro   rG   r   r   r  rc  rH   rH   rI   r     s<    					zModelAdmin.history_viewc             C   s6  g  } g  } i  } | g } | r1 | j  |  n  x |  j |   D] \ } }	 | j   }
 | j |
 d  d | |
 <| |
 d k s |
 r d |
 | |
 f }
 n  i | d 6|
 d 6|	 j |  d 6} | j d k r| j i | j d 6| j d	 6d
 | j k d 6 n  | j  | |    | j  |	  qA W| | f S)z9Helper function to generate formsets for add/change_view.r   rC   z%s-%sr  prefixr   rj  r  filesrg  Zsave_as_new)	r   r  Zget_default_prefixrm   r   r  r]   rj  r  )rU   rv   rG   r   rG  r   prefixesZget_formsets_argsr  r   r  Zformset_paramsrH   rH   rI   r    s.    		

zModelAdmin._create_formsets)z__str__)arN   rO   rP   r   r(  r*  r   r-  r  r  r   r/  r   r[  rp  r\  r   r  r>  r   r`  ra  r  r  Z%delete_selected_confirmation_templater  r  r
   Z
ActionFormr  r  r  r  r   rS   r`   r   r   r   r   propertyr   r   r   r   r   r   r   r  r  r  r  r  r  r  r:   r  r#  r"   r&  r  r)  r+  r,  r.  r0  r<  rB  rI  r	   INFOrR  rU  rV  rW  rX  rY  rd  rx  r{  rs  rz  r  r  r  r  r  csrf_protect_mr    Zatomicr  r   r   r   r   r   r  rH   rH   )re   rI   r     s   	1%!'	%KHC&cA*r   c                   s  e  Z d  Z d Z d Z d Z e Z d Z d Z	 d Z
 d Z d Z d Z d Z d Z e Z d Z   f d d   Z e d d	    Z d d
 d  Z d d d  Z d d d  Z d d d  Z d d d  Z   f d d   Z   f d d   Z d d d  Z d   f d d  Z   S)InlineModelAdminz
    Options for inline editing of ``model`` instances.

    Provide ``fk_name`` to specify the attribute name of the ``ForeignKey``
    from ``model`` to its parent. This is required if ``model`` has more than
    one ``ForeignKey`` to its parent.
    N   TFc                s   | |  _  | |  _ |  j j |  _ | j |  j  |  _ t t |   j	   |  j
 d  k rm |  j j j
 |  _
 n  |  j d  k r |  j j j |  _ n  d  S)N)rk   parent_modelro   r   r   Zis_registeredZhas_registered_modelr   r  r`   r   r  )rU   r  rk   )re   rH   rI   r`   2  s    		zInlineModelAdmin.__init__c             C   s   t  j r d n d } d | d d | g } |  j s> |  j rT | j d d g  n  |  j r d |  j k r | j d	 |  n  t j d
 d d   | D  S)Nr{   z.minzvendor/jquery/jquery%s.jszjquery.init.jszinlines%s.jszSelectBox.jszSelectFilter2.jsZcollapsezcollapse%s.jsr   c             S   s   g  |  ] } d  |  q S)zadmin/js/%srH   )r   r   rH   rH   rI   r   F  s   	 z*InlineModelAdmin.media.<locals>.<listcomp>)	r   r   r   r   r   classesr   r   r   )rU   r   r   rH   rH   rI   r   =  s    
zInlineModelAdmin.mediac             K   s   |  j  S)z6Hook for customizing the number of extra inline forms.)r   )rU   rv   rG   rV   rH   rH   rI   	get_extraH  s    zInlineModelAdmin.get_extrac             K   s   |  j  S)z4Hook for customizing the min number of inline forms.)min_num)rU   rv   rG   rV   rH   rH   rI   get_min_numL  s    zInlineModelAdmin.get_min_numc             K   s   |  j  S)z:Hook for customizing the max number of extra inline forms.)r   )rU   rv   rG   rV   rH   rH   rI   get_max_numP  s    zInlineModelAdmin.get_max_numc       	         s  d | k r | j  d  } n t |  j | |   } |  j d k rN g  } n t |  j  } | j |  j | |   |  j d k r t |  j d  r |  j j	 j r | j |  j j	 j  n  | p d } |  j
 o |  j | |  } i
 |  j d 6|  j d 6|  j d 6| d 6| d 6t |  j d | d	 6|  j | | |  d
 6|  j | | |  d 6|  j | | |  d 6| d 6} | j |  | d } G  f d d   d |      | d <| d d k rt | d  rt j | d <n  t |  j |  j |  S)zDReturns a BaseInlineFormSet class for use in admin add/change views.r   Nr   r   rH  fk_namer   rv   r   r   r  r   
can_deletec                   s1   e  Z d  Z d d   Z    f d d   Z   S)z>InlineModelAdmin.get_formset.<locals>.DeleteProtectedModelFormc             S   s  |  j  j t d  rt j |  j j  } t d |  } |  j j	 d k rO d S| j
 |  j g  | j rg  } x< | j D]1 } | j t d  i | j j d 6| d 6 q{ Wi |  j j j j d 6|  j d 6t | t d   d 6} t d	  } t | d
 d d |  qn  d S)z
                We don't validate the 'DELETE' field itself because on
                templates it's not rendered using the field information, but
                just using a generic "deletion_field" of the InlineModelAdmin.
                Fr   Nz%(class_name)s %(instance)s
class_namer  andr   zxDeleting %(class_name)s %(instance)s would require deleting the following protected related objects: %(related_objects)scodeZdeleting_protectedparams)r  rm   r#   r   r  r   ro   r   r  r   Zcollectr  r   r   r   r<   r   )rU   r   Z	collectorobjspr  r   rH   rH   rI   hand_clean_DELETEx  s$    	
zPInlineModelAdmin.get_formset.<locals>.DeleteProtectedModelForm.hand_clean_DELETEc                s#   t    |   j   } |  j   | S)N)r   r  r  )rU   result)DeleteProtectedModelFormre   rH   rI   r    s    
zGInlineModelAdmin.get_formset.<locals>.DeleteProtectedModelForm.is_valid)rN   rO   rP   r  r  rH   )r  )re   rI   r  w  s   r  )r   r   r   r   r   r   r   r   r   r   r  rr   rH  r  r   rx   r  r  r  r]   r'   r   r   r&   r  ro   )	rU   rv   rG   rV   r   r   r  r   Zbase_model_formrH   )r  rI   r  T  s:    	0




$
!zInlineModelAdmin.get_formsetc             C   sN   |  j  r |  j  S|  j | | d d  j } t | j  t |  j | |   S)Nr   )r   r  r   r   r   r   )rU   rv   rG   r   rH   rH   rI   r     s    	zInlineModelAdmin.get_fieldsc                s:   t  t |   j |  } |  j |  s6 | j   } n  | S)N)r   r  r   rq   none)rU   rv   r   )re   rH   rI   r     s    zInlineModelAdmin.get_querysetc                s/   |  j  j r |  j |  St t |   j |  S)N)r   r   rq   r   r  rp   )rU   rv   )re   rH   rI   rp     s    z#InlineModelAdmin.has_add_permissionc             C   s   |  j  } | j rZ xE | j D]7 } | j r | j j |  j k r | j j j } Pq q Wn  t d |  } | j j	 d | j
 | f  S)Nr   z%s.%s)r   r   r   rn   ro   r  r   r   r   r   r   )rU   rv   rG   r   r   r   rH   rH   rI   rq     s    		z&InlineModelAdmin.has_change_permissionc                s5   |  j  j r |  j | |  St t |   j | |  S)N)r   r   rq   r   r  rr   )rU   rv   rG   )re   rH   rI   rr     s    z&InlineModelAdmin.has_delete_permission)rN   rO   rP   r   ro   r  r%   rH  r   r  r   templater   r  r  Zshow_change_linkr   rS   r  r`   r  r   r  r  r  r  r   r   rp   rq   rr   rH   rH   )re   rI   r    s2   N	r  c               @   s   e  Z d  Z d Z d S)StackedInlinezadmin/edit_inline/stacked.htmlN)rN   rO   rP   r  rH   rH   rH   rI   r    s   r  c               @   s   e  Z d  Z d Z d S)TabularInlinezadmin/edit_inline/tabular.htmlN)rN   rO   rP   r  rH   rH   rH   rI   r    s   r  )
__future__r   rW   rm  r:  collectionsr   	functoolsr   r   r   Zdjangor   Zdjango.confr   Zdjango.contribr	   Zdjango.contrib.adminr
   r   Zdjango.contrib.admin.checksr   r   r   Zdjango.contrib.admin.exceptionsr   Z,django.contrib.admin.templatetags.admin_urlsr   Zdjango.contrib.admin.utilsr   r   r   r   r   r   r   Zdjango.contrib.authr   Zdjango.core.exceptionsr   r   r   r   Zdjango.core.paginatorr   Z	django.dbr   r   r    Zdjango.db.models.constantsr!   Zdjango.db.models.fieldsr"   Zdjango.forms.formsetsr#   r$   Zdjango.forms.modelsr%   r&   r'   r(   r)   Zdjango.forms.widgetsr*   r+   Zdjango.httpr,   r-   Zdjango.http.responser.   Zdjango.template.responser/   r0   Zdjango.urlsr1   Zdjango.utilsr2   Zdjango.utils.decoratorsr3   Zdjango.utils.encodingr4   r5   Zdjango.utils.htmlr6   r7   Zdjango.utils.httpr8   r9   Zdjango.utils.safestringr:   Zdjango.utils.textr;   r<   Zdjango.utils.translationr=   rE  r>   r?   r   r@   Zdjango.views.decorators.csrfrA   Zdjango.views.genericrB   r  r_  Z
HORIZONTALrK   rJ   rL   	ExceptionrM   ZSplitDateTimeFieldZAdminSplitDateTimeZDateTimeFieldZAdminDateWidgetZ	DateFieldZAdminTimeWidgetZ	TimeFieldZAdminTextareaWidgetZ	TextFieldZAdminURLFieldWidgetZURLFieldZAdminIntegerFieldWidgetZIntegerFieldZAdminBigIntegerFieldWidgetZBigIntegerFieldZAdminTextInputWidgetZ	CharFieldZAdminFileWidgetZ
ImageFieldZ	FileFieldZAdminEmailInputWidgetZ
EmailFieldrY   r  with_metaclassZMediaDefiningClassrR   r   r  r  r  rH   rH   rH   rI   <module>   s   4"("
"      A