

_V                 @   s   d  d l  m Z d  d l m Z d  d l m Z m Z m Z d  d l m	 Z	 d  d l
 m Z d  d l m Z d  d l m Z m Z m Z d d	   Z Gd
 d   d e  Z Gd d   d e  Z Gd d   d e  Z d d   Z d d   Z d d   Z d S)    )unicode_literals)chain)NotRelationFieldflattenget_fields_from_path)checks)FieldDoesNotExist)models)BaseModelFormBaseModelFormSet_get_foreign_keyc              K   s   d d l  m } | S)Nr   )system_check_errors)Zdjango.contrib.admin.sitesr   )kwargsr    r   =/tmp/pip-build-ghmbqnp_/Django/django/contrib/admin/checks.pycheck_admin_app   s    r   c               @   s<  e  Z d  Z d d   Z d d   Z d d   Z d d   Z d	 d
   Z d d   Z d d   Z	 d d   Z
 d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d d    Z d! d"   Z d# d$   Z d% d&   Z d' d(   Z d) d*   Z d+ d,   Z d- d.   Z d/ d0   Z d1 d2   Z d3 S)4BaseModelAdminChecksc             K   s  g  } | j  |  j |   | j  |  j |   | j  |  j |   | j  |  j |   | j  |  j |   | j  |  j |   | j  |  j |   | j  |  j |   | j  |  j	 |   | j  |  j
 |   | j  |  j |   | j  |  j |   | S)N)extend_check_raw_id_fields_check_fields_check_fieldsets_check_exclude_check_form_check_filter_vertical_check_filter_horizontal_check_radio_fields_check_prepopulated_fields_check_view_on_site_url_check_ordering_check_readonly_fields)self	admin_objr   errorsr   r   r   check   s    zBaseModelAdminChecks.checkc                sg   t    j t t f  s4 t d d d d   d d St t    f d d   t   j  D    Sd	 S)
z\ Check that `raw_id_fields` only contains field names that are listed
        on the model. za list or tupleoptionraw_id_fieldsobjidz
admin.E001c                s5   g  |  ]+ \ } }  j      j | d  |   q S)zraw_id_fields[%d])_check_raw_id_fields_itemmodel).0index
field_name)r&   r    r   r   
<listcomp>1   s   	z=BaseModelAdminChecks._check_raw_id_fields.<locals>.<listcomp>N)
isinstancer%   listtuplemust_ber   	enumerate)r    r&   r   )r&   r    r   r   )   s
    z)BaseModelAdminChecks._check_raw_id_fieldsc             C   s   y | j  j |  } Wn7 t k
 rO t d | d | d | d | d d  SYn< Xt | t j t j f  s t d d | d | d d Sg  Sd	 S)
z Check an item of `raw_id_fields`, i.e. check that field named
        `field_name` exists in model `model` and is a ForeignKey or a
        ManyToManyField. fieldr$   r)   r&   r'   z
admin.E002za ForeignKey or ManyToManyFieldz
admin.E003N)	_meta	get_fieldr   refer_to_missing_fieldr.   r	   
ForeignKeyManyToManyFieldr1   )r    r&   r)   r,   labelr3   r   r   r   r(   5   s    	z.BaseModelAdminChecks._check_raw_id_fields_itemc                s     j  d k r g  St   j  t t f  sG t d d d d   d d S  j ru t j d d	 d d   j d d
 g St	   j   } t
 |  t
 t |   k r t j d d	 d d   j d d g St t    f d d     j  D    S)z Check that `fields` only refer to existing fields, doesn't contain
        duplicates. Check if at most one of `fields` and `fieldsets` is defined.
        Nza list or tupler$   fieldsr&   r'   z
admin.E004z,Both 'fieldsets' and 'fields' are specified.hintz
admin.E005z2The value of 'fields' contains duplicate field(s).z
admin.E006c                s+   g  |  ]! }  j      j | d    q S)r:   )_check_field_specr)   )r*   r,   )r&   r    r   r   r-   d   s   	z6BaseModelAdminChecks._check_fields.<locals>.<listcomp>)r:   r.   r/   r0   r1   	fieldsetsr   Error	__class__r   lensetr   )r    r&   r:   r   )r&   r    r   r   F   s(    		
	
z"BaseModelAdminChecks._check_fieldsc                sz     j  d k r g  St   j  t t f  sG t d d d d   d d St t    f d d	   t   j   D    Sd S)
zT Check that fieldsets is properly formatted and doesn't contain
        duplicates. Nza list or tupler$   r=   r&   r'   z
admin.E007c                s5   g  |  ]+ \ } }  j      j | d  |   q S)zfieldsets[%d])_check_fieldsets_itemr)   )r*   r+   fieldset)r&   r    r   r   r-   r   s   	z9BaseModelAdminChecks._check_fieldsets.<locals>.<listcomp>)r=   r.   r/   r0   r1   r   r2   )r    r&   r   )r&   r    r   r   h   s    z%BaseModelAdminChecks._check_fieldsetsc                s  t  | t t f  s1 t d d   d  d d St |  d k r_ t d d   d  d d St  | d	 t  s t d
 d d   d  d d Sd | d	 k r t j d   d d d  j d d g St  | d	 d t t f  st d d d   d  d d St	 | d	 d  } t |  t t
 |   k rct j d   d d d  j d d g St t      f d d   | d	 d D    S)z~ Check an item of `fieldsets`, i.e. check that this is a pair of a
        set name and a dictionary containing "fields" key. za list or tupler$   r&   r'   z
admin.E008   zof length 2z
admin.E009   za dictionaryz%s[1]z
admin.E010r:   z3The value of '%s[1]' must contain the key 'fields'.r;   Nz
admin.E011z%s[1]['fields']z(There are duplicate field(s) in '%s[1]'.z
admin.E012c                s,   g  |  ]" }  j    | d      q S)z%s[1]["fields"])r<   )r*   Zfieldset_fields)r9   r)   r&   r    r   r   r-      s   	z>BaseModelAdminChecks._check_fieldsets_item.<locals>.<listcomp>)r.   r/   r0   r1   r@   dictr   r>   r?   r   rA   r   )r    r&   r)   rC   r9   r:   r   )r9   r)   r&   r    r   rB   v   s0     
	
 
	
z*BaseModelAdminChecks._check_fieldsets_itemc                s[   t  | t  rA t t      f d d   t |  D    S j   |    Sd S)z `fields` should be an item of `fields` or an item of
        fieldset[1]['fields'] for any `fieldset` in `fieldsets`. It should be a
        field name or a tuple of field names. c          	      s8   g  |  ]. \ } }  j    | d    | f   q S)z%s[%d])_check_field_spec_item)r*   r+   r,   )r9   r)   r&   r    r   r   r-      s   	z:BaseModelAdminChecks._check_field_spec.<locals>.<listcomp>N)r.   r0   r/   r   r2   rG   )r    r&   r)   r:   r9   r   )r9   r)   r&   r    r   r<      s
    z&BaseModelAdminChecks._check_field_specc             C   s   | | j  k r g  Sy | j j |  } Wn t k
 rA g  SYnY Xt | t j  r | j j j j	 r t
 j d | | f d d  d | j d d g Sg  Sd  S)NzvThe value of '%s' cannot include the ManyToManyField '%s', because that field manually specifies a relationship model.r;   r&   r'   z
admin.E013)readonly_fieldsr4   r5   r   r.   r	   r8   Zremote_fieldZthroughZauto_createdr   r>   r?   )r    r&   r)   r,   r9   r3   r   r   r   rG      s    		
z+BaseModelAdminChecks._check_field_spec_itemc             C   s   | j  d k r g  St | j  t t f  sG t d d d d | d d St | j   t t | j    k r t j d d	 d d | j	 d d
 g Sg  Sd S)z6 Check that exclude is a sequence without duplicates. Nza list or tupler$   excluder&   r'   z
admin.E014z3The value of 'exclude' contains duplicate field(s).r;   z
admin.E015)
rI   r.   r/   r0   r1   r@   rA   r   r>   r?   )r    r&   r   r   r   r      s    $	
z#BaseModelAdminChecks._check_excludec          	   C   sI   t  | d  rA t | j t  rA t d d d d d | d d  Sg  Sd S)	z+ Check that form subclasses BaseModelForm. formparentr
   r$   r&   r'   z
admin.E016N)hasattr
issubclassrJ   r
   must_inherit_from)r    r&   r   r   r   r      s    "z BaseModelAdminChecks._check_formc                sz   t    d  s g  St   j t t f  sG t d d d d   d d St t    f d d   t   j  D    Sd	 S)
z: Check that filter_vertical is a sequence of field names. filter_verticalza list or tupler$   r&   r'   z
admin.E017c                s5   g  |  ]+ \ } }  j      j | d  |   q S)zfilter_vertical[%d])_check_filter_itemr)   )r*   r+   r,   )r&   r    r   r   r-      s   	z?BaseModelAdminChecks._check_filter_vertical.<locals>.<listcomp>N)rL   r.   rO   r/   r0   r1   r   r2   )r    r&   r   )r&   r    r   r      s    z+BaseModelAdminChecks._check_filter_verticalc                sz   t    d  s g  St   j t t f  sG t d d d d   d d St t    f d d   t   j  D    Sd	 S)
z< Check that filter_horizontal is a sequence of field names. filter_horizontalza list or tupler$   r&   r'   z
admin.E018c                s5   g  |  ]+ \ } }  j      j | d  |   q S)zfilter_horizontal[%d])rP   r)   )r*   r+   r,   )r&   r    r   r   r-      s   	zABaseModelAdminChecks._check_filter_horizontal.<locals>.<listcomp>N)rL   r.   rQ   r/   r0   r1   r   r2   )r    r&   r   )r&   r    r   r      s    z-BaseModelAdminChecks._check_filter_horizontalc             C   s   y | j  j |  } Wn7 t k
 rO t d | d | d | d | d d  SYn3 Xt | t j  s~ t d d | d | d d Sg  Sd	 S)
z Check one item of `filter_vertical` or `filter_horizontal`, i.e.
        check that given field exists and is a ManyToManyField. r3   r$   r)   r&   r'   z
admin.E019za ManyToManyFieldz
admin.E020N)r4   r5   r   r6   r.   r	   r8   r1   )r    r&   r)   r,   r9   r3   r   r   r   rP      s    z'BaseModelAdminChecks._check_filter_itemc                st   t    d  s g  St   j t  sA t d d d d   d d St t    f d d     j j   D    Sd	 S)
z, Check that `radio_fields` is a dictionary. radio_fieldsza dictionaryr$   r&   r'   z
admin.E021c                sH   g  |  ]> \ } }  j      j | d    j   | d |   q S)rR   zradio_fields["%s"])_check_radio_fields_keyr)   _check_radio_fields_value)r*   r,   val)r&   r    r   r   r-     s   	z<BaseModelAdminChecks._check_radio_fields.<locals>.<listcomp>N)rL   r.   rR   rF   r1   r/   r   items)r    r&   r   )r&   r    r   r   
  s    z(BaseModelAdminChecks._check_radio_fieldsc             C   s   y | j  j |  } Wn7 t k
 rO t d | d | d | d | d d  SYnO Xt | t j  ph | j s t j	 d | | f d d	 d | j
 d d
 g Sg  Sd	 S)z Check that a key of `radio_fields` dictionary is name of existing
        field and that the field is a ForeignKey or has `choices` defined. r3   r$   r)   r&   r'   z
admin.E022zsThe value of '%s' refers to '%s', which is not an instance of ForeignKey, and does not have a 'choices' definition.r;   Nz
admin.E023)r4   r5   r   r6   r.   r	   r7   choicesr   r>   r?   )r    r&   r)   r,   r9   r3   r   r   r   rS     s    	
z,BaseModelAdminChecks._check_radio_fields_keyc             C   sY   d d l  m } m } | | | f k rQ t j d | d d d | j d d g Sg  Sd S)	z5 Check type of a value of `radio_fields` dictionary. r   )
HORIZONTALVERTICALzDThe value of '%s' must be either admin.HORIZONTAL or admin.VERTICAL.r;   Nr&   r'   z
admin.E024)django.contrib.admin.optionsrX   rY   r   r>   r?   )r    r&   rU   r9   rX   rY   r   r   r   rT   1  s    
	
z.BaseModelAdminChecks._check_radio_fields_valuec             C   sf   t  | d  r^ t | j  rW t | j t  rW t j d d d  d | j d d g Sg  Sn g  Sd  S)Nview_on_sitezBThe value of 'view_on_site' must be a callable or a boolean value.r;   r&   r'   z
admin.E025)rL   callabler[   r.   boolr   r>   r?   )r    r&   r   r   r   r   B  s    #	
z,BaseModelAdminChecks._check_view_on_site_urlc                st   t    d  s g  St   j t  sA t d d d d   d d St t    f d d     j j   D    Sd	 S)
zZ Check that `prepopulated_fields` is a dictionary containing allowed
        field types. prepopulated_fieldsza dictionaryr$   r&   r'   z
admin.E026c          	      sN   g  |  ]D \ } }  j      j | d    j     j | d |   q S)r^   zprepopulated_fields["%s"])_check_prepopulated_fields_keyr)    _check_prepopulated_fields_value)r*   r,   rU   )r&   r    r   r   r-   \  s   	zCBaseModelAdminChecks._check_prepopulated_fields.<locals>.<listcomp>N)rL   r.   r^   rF   r1   r/   r   rV   )r    r&   r   )r&   r    r   r   R  s    z/BaseModelAdminChecks._check_prepopulated_fieldsc             C   s   t  j t  j t  j f } y | j j |  } Wn7 t k
 rg t d | d | d | d | d d  SYnC Xt | |  r t	 j
 d | | f d d	 d | j d d
 g Sg  Sd	 S)z Check a key of `prepopulated_fields` dictionary, i.e. check that it
        is a name of existing field and the field is one of the allowed types.
        r3   r$   r)   r&   r'   z
admin.E027zcThe value of '%s' refers to '%s', which must not be a DateTimeField, ForeignKey or ManyToManyField.r;   Nz
admin.E028)r	   DateTimeFieldr7   r8   r4   r5   r   r6   r.   r   r>   r?   )r    r&   r)   r,   r9   Zforbidden_field_typesr3   r   r   r   r_   a  s     	
z3BaseModelAdminChecks._check_prepopulated_fields_keyc                sg   t  | t t f  s1 t d d   d  d d St t      f d d   t |  D    Sd S)	zf Check a value of `prepopulated_fields` dictionary, i.e. it's an
        iterable of existing fields. za list or tupler$   r&   r'   z
admin.E029c          	      s8   g  |  ]. \ } }  j    | d    | f   q S)z%s[%r])%_check_prepopulated_fields_value_item)r*   r+   Zsubfield_name)r9   r)   r&   r    r   r   r-     s   	zIBaseModelAdminChecks._check_prepopulated_fields_value.<locals>.<listcomp>N)r.   r/   r0   r1   r   r2   )r    r&   r)   rU   r9   r   )r9   r)   r&   r    r   r`     s
    z5BaseModelAdminChecks._check_prepopulated_fields_valuec             C   sV   y | j  j |  Wn7 t k
 rM t d | d | d | d | d d  SYn Xg  Sd S)z[ For `prepopulated_fields` equal to {"slug": ("title",)},
        `field_name` is "title". r3   r$   r)   r&   r'   z
admin.E030N)r4   r5   r   r6   )r    r&   r)   r,   r9   r   r   r   rb     s    z:BaseModelAdminChecks._check_prepopulated_fields_value_itemc                sz     j  d k r g  St   j  t t f  sG t d d d d   d d St t    f d d	   t   j   D    Sd S)
z= Check that ordering refers to existing fields or is random. Nza list or tupler$   orderingr&   r'   z
admin.E031c                s5   g  |  ]+ \ } }  j      j | d  |   q S)zordering[%d])_check_ordering_itemr)   )r*   r+   r,   )r&   r    r   r   r-     s   	z8BaseModelAdminChecks._check_ordering.<locals>.<listcomp>)rc   r.   r/   r0   r1   r   r2   )r    r&   r   )r&   r    r   r     s    z$BaseModelAdminChecks._check_orderingc             C   s   | d k rF t  | j  d k rF t j d d d d | j d d g S| d k rV g  Sd	 | k rf g  S| j d
  r | d d  } n  y | j j |  Wn7 t k
 r t	 d | d | d | d | d d  SYn Xg  Sd S)z2 Check that `ordering` refers to existing fields. ?rE   z^The value of 'ordering' has the random ordering marker '?', but contains other fields as well.r;   z2Either remove the "?", or remove the other fields.r&   r'   z
admin.E032__-Nr3   r$   r)   z
admin.E033)
r@   rc   r   r>   r?   
startswithr4   r5   r   r6   )r    r&   r)   r,   r9   r   r   r   rd     s$    !	
z)BaseModelAdminChecks._check_ordering_itemc                sz     j  f  k r g  St   j  t t f  sG t d d d d   d d St t    f d d   t   j   D    Sd	 S)
zA Check that readonly_fields refers to proper attribute or field. za list or tupler$   rH   r&   r'   z
admin.E034c                s5   g  |  ]+ \ } }  j      j | d  |   q S)zreadonly_fields[%d])_check_readonly_fields_itemr)   )r*   r+   r,   )r&   r    r   r   r-     s   	z?BaseModelAdminChecks._check_readonly_fields.<locals>.<listcomp>N)rH   r.   r/   r0   r1   r   r2   )r    r&   r   )r&   r    r   r     s    z+BaseModelAdminChecks._check_readonly_fieldsc             C   s   t  |  r g  St | |  r# g  St | |  r6 g  Sy | j j |  WnY t k
 r t j d | | j j | j j	 | j j
 f d d  d | j d d g SYn Xg  Sd  S)NzVThe value of '%s' is not a callable, an attribute of '%s', or an attribute of '%s.%s'.r;   r&   r'   z
admin.E035)r\   rL   r4   r5   r   r   r>   r?   __name__	app_labelobject_name)r    r&   r)   r,   r9   r   r   r   ri     s     %	z0BaseModelAdminChecks._check_readonly_fields_itemN)rj   
__module____qualname__r#   r   r(   r   r   rB   r<   rG   r   r   r   r   rP   r   rS   rT   r   r   r_   r`   rb   r   rd   r   ri   r   r   r   r   r      s2   "%	 r   c                   s   e  Z d  Z   f d d   Z d d   Z d d   Z d d   Z d	 d
   Z d d   Z d d   Z	 d d   Z
 d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d d    Z d! d"   Z d# d$   Z   S)%ModelAdminChecksc                s$  t  t |   j |  } | j |  j |   | j |  j |   | j |  j |   | j |  j |   | j |  j |   | j |  j	 |   | j |  j
 |   | j |  j |   | j |  j |   | j |  j |   | j |  j |   | j |  j |   | S)N)superro   r#   r   _check_save_as_check_save_on_top_check_inlines_check_list_display_check_list_display_links_check_list_filter_check_list_select_related_check_list_per_page_check_list_max_show_all_check_list_editable_check_search_fields_check_date_hierarchy)r    r!   r   r"   )r?   r   r   r#     s    zModelAdminChecks.checkc             C   s6   t  | j t  s. t d d d d | d d Sg  Sd S)z Check save_as is a boolean. z	a booleanr$   save_asr&   r'   z
admin.E101N)r.   r}   r]   r1   )r    r&   r   r   r   rq     s    zModelAdminChecks._check_save_asc             C   s6   t  | j t  s. t d d d d | d d Sg  Sd S)z! Check save_on_top is a boolean. z	a booleanr$   save_on_topr&   r'   z
admin.E102N)r.   r~   r]   r1   )r    r&   r   r   r   rr     s    z#ModelAdminChecks._check_save_on_topc                sg   t    j t t f  s4 t d d d d   d d St t    f d d   t   j  D    Sd	 S)
z' Check all inline model admin classes. za list or tupler$   inlinesr&   r'   z
admin.E103c                s5   g  |  ]+ \ } }  j      j | d  |   q S)zinlines[%d])_check_inlines_itemr)   )r*   r+   item)r&   r    r   r   r-     s   	z3ModelAdminChecks._check_inlines.<locals>.<listcomp>N)r.   r   r/   r0   r1   r   r2   )r    r&   r   )r&   r    r   rs     s
    zModelAdminChecks._check_inlinesc             C   s   d j  | j | j g  } d d l m } t | |  sc t j d | d d d | j d d	 g S| j	 s t j d
 | d d d | j d d g St | j	 t
 j  s t d d d | d | d d S| | | j  j   Sd S)z Check one inline model admin. .r   )BaseModelAdminz('%s' must inherit from 'BaseModelAdmin'.r;   Nr&   r'   z
admin.E104z#'%s' must have a 'model' attribute.z
admin.E105za Modelr$   z%s.modelz
admin.E106)joinrm   rj   rZ   r   rM   r   r>   r?   r)   r	   ZModelr1   Z
admin_siter#   )r    r&   r)   inliner9   Zinline_labelr   r   r   r   r     s$    
	
	
	
z$ModelAdminChecks._check_inlines_itemc                sg   t    j t t f  s4 t d d d d   d d St t    f d d   t   j  D    Sd	 S)
zL Check that list_display only contains fields or usable attributes.
        za list or tupler$   list_displayr&   r'   z
admin.E107c                s5   g  |  ]+ \ } }  j      j | d  |   q S)zlist_display[%d])_check_list_display_itemr)   )r*   r+   r   )r&   r    r   r   r-   A  s   	z8ModelAdminChecks._check_list_display.<locals>.<listcomp>N)r.   r   r/   r0   r1   r   r2   )r    r&   r   )r&   r    r   rt   9  s
    z$ModelAdminChecks._check_list_displayc             C   s  t  |  r g  St | |  r# g  St | |  r#y | j j |  } Wn@ t k
 r y t | |  } Wn t k
 r d  } Yn XYn X| d  k r t j d | | | j	 j
 | j j | j j f d d  d | j	 d d g St | t j  rt j d | d d  d | j	 d d g Sg  Snw y | j j |  Wn\ t k
 rt j d | | | j	 j
 | j j | j j f d d  d | j	 d d g SYn Xg  Sd  S)NzvThe value of '%s' refers to '%s', which is not a callable, an attribute of '%s', or an attribute or method on '%s.%s'.r;   r&   r'   z
admin.E108z0The value of '%s' must not be a ManyToManyField.z
admin.E109)r\   rL   r4   r5   r   getattrAttributeErrorr   r>   r?   rj   rk   rl   r.   r	   r8   )r    r&   r)   r   r9   r3   r   r   r   r   E  sH    (	

	
(	z)ModelAdminChecks._check_list_display_itemc                sz     j  d k r g  St   j  t t f  sG t d d d d   d d St t    f d d	   t   j   D    Sd S)
zK Check that list_display_links is a unique subset of list_display.
        Nza list, a tuple, or Noner$   list_display_linksr&   r'   z
admin.E110c                s/   g  |  ]% \ } }  j    | d  |   q S)zlist_display_links[%d])_check_list_display_links_item)r*   r+   r,   )r&   r    r   r   r-     s   	z>ModelAdminChecks._check_list_display_links.<locals>.<listcomp>)r   r.   r/   r0   r1   r   r2   )r    r&   r   )r&   r    r   ru     s    z*ModelAdminChecks._check_list_display_linksc             C   sF   | | j  k r> t j d | | f d d  d | j d d g Sg  Sd  S)NzIThe value of '%s' refers to '%s', which is not defined in 'list_display'.r;   r&   r'   z
admin.E111)r   r   r>   r?   )r    r&   r,   r9   r   r   r   r     s    	
z/ModelAdminChecks._check_list_display_links_itemc                sg   t    j t t f  s4 t d d d d   d d St t    f d d   t   j  D    Sd  S)	Nza list or tupler$   list_filterr&   r'   z
admin.E112c                s5   g  |  ]+ \ } }  j      j | d  |   q S)zlist_filter[%d])_check_list_filter_itemr)   )r*   r+   r   )r&   r    r   r   r-     s   	z7ModelAdminChecks._check_list_filter.<locals>.<listcomp>)r.   r   r/   r0   r1   r   r2   )r    r&   r   )r&   r    r   rv     s
    z#ModelAdminChecks._check_list_filterc       	      C   se  d d l  m } m } t |  r t | t j  r t | |  sc t d d d | d | d d  St | |  r t	 j
 d	 | d
 d d | j d d g Sg  Sn t | t t f  r | \ } } t | |  s t d d d d | d | d d  Sg  Sne | } y t | |  WnG t t f k
 r\t	 j
 d | | f d
 d d | j d d g SYn Xg  Sd S)aG  
        Check one item of `list_filter`, i.e. check if it is one of three options:
        1. 'field' -- a basic field filter, possibly w/ relationships (e.g.
           'field__rel')
        2. ('field', SomeFieldListFilter) - a field-based list filter class
        3. SomeListFilter - a non-field list filter class
        r   )
ListFilterFieldListFilterrK   r   r$   r&   r'   z
admin.E113z:The value of '%s' must not inherit from 'FieldListFilter'.r;   Nz
admin.E114r   z%s[1]z
admin.E115zBThe value of '%s' refers to '%s', which does not refer to a Field.z
admin.E116)Zdjango.contrib.adminr   r   r\   r.   r	   ZFieldrM   rN   r   r>   r?   r0   r/   r   r   r   )	r    r&   r)   r   r9   r   r   r3   Zlist_filter_classr   r   r   r     s8    	
	
	z(ModelAdminChecks._check_list_filter_itemc             C   s?   t  | j t t t f  s7 t d d d d | d d Sg  Sd S)zA Check that list_select_related is a boolean, a list or a tuple. za boolean, tuple or listr$   list_select_relatedr&   r'   z
admin.E117N)r.   r   r]   r/   r0   r1   )r    r&   r   r   r   rw     s    z+ModelAdminChecks._check_list_select_relatedc             C   s6   t  | j t  s. t d d d d | d d Sg  Sd S)z) Check that list_per_page is an integer. z
an integerr$   list_per_pager&   r'   z
admin.E118N)r.   r   intr1   )r    r&   r   r   r   rx     s    z%ModelAdminChecks._check_list_per_pagec             C   s6   t  | j t  s. t d d d d | d d Sg  Sd S)z- Check that list_max_show_all is an integer. z
an integerr$   list_max_show_allr&   r'   z
admin.E119N)r.   r   r   r1   )r    r&   r   r   r   ry     s    z)ModelAdminChecks._check_list_max_show_allc                sg   t    j t t f  s4 t d d d d   d d St t    f d d   t   j  D    Sd	 S)
zl Check that list_editable is a sequence of editable fields from
        list_display without first element. za list or tupler$   list_editabler&   r'   z
admin.E120c                s5   g  |  ]+ \ } }  j      j | d  |   q S)zlist_editable[%d])_check_list_editable_itemr)   )r*   r+   r   )r&   r    r   r   r-     s   	z9ModelAdminChecks._check_list_editable.<locals>.<listcomp>N)r.   r   r/   r0   r1   r   r2   )r    r&   r   )r&   r    r   rz     s
    z%ModelAdminChecks._check_list_editablec             C   s  y | j  j |  } Wn7 t k
 rO t d | d | d | d | d d  SYn1X| | j k r t j d | | f d d  d | j d d	 g S| j r | | j k r t j d
 | d d  d | j d d g S| j d | j	 k rD| j d | j	 d k rD| j d  k	 rDt j d | | j d f d d  d | j d d g S| j
 s|t j d | | f d d  d | j d d g Sg  Sd  S)Nr3   r$   r)   r&   r'   z
admin.E121zKThe value of '%s' refers to '%s', which is not contained in 'list_display'.r;   z
admin.E122zMThe value of '%s' cannot be in both 'list_editable' and 'list_display_links'.z
admin.E123r   z~The value of '%s' refers to the first field in 'list_display' ('%s'), which cannot be used unless 'list_display_links' is set.z
admin.E124zJThe value of '%s' refers to '%s', which is not editable through the admin.z
admin.E125)r4   r5   r   r6   r   r   r>   r?   r   r   editable)r    r&   r)   r,   r9   r3   r   r   r   r     sD    	

	
0	
		
z*ModelAdminChecks._check_list_editable_itemc             C   s<   t  | j t t f  s4 t d d d d | d d Sg  Sd S)z$ Check search_fields is a sequence. za list or tupler$   search_fieldsr&   r'   z
admin.E126N)r.   r   r/   r0   r1   )r    r&   r   r   r   r{   8  s    z%ModelAdminChecks._check_search_fieldsc             C   s   | j  d k r g  Sy | j j j | j   } Wn= t k
 rn t d d d | j  d | j d | d d  SYn< Xt | t j t j	 f  s t
 d	 d d d | d d
 Sg  Sd S)zA Check that date_hierarchy refers to DateField or DateTimeField. Nr$   date_hierarchyr3   r)   r&   r'   z
admin.E127za DateField or DateTimeFieldz
admin.E128)r   r)   r4   r5   r   r6   r.   r	   Z	DateFieldra   r1   )r    r&   r3   r   r   r   r|   @  s    	z&ModelAdminChecks._check_date_hierarchy)rj   rm   rn   r#   rq   rr   rs   r   rt   r   ru   r   rv   r   rw   rx   ry   rz   r   r{   r|   r   r   )r?   r   ro     s$   		:	7	7ro   c                   sp   e  Z d  Z   f d d   Z   f d d   Z d d   Z d d   Z d	 d
   Z d d   Z d d   Z	   S)InlineModelAdminChecksc                s   t  t |   j |  } | j } | j |  j | |   | j |  j | |   | j |  j |   | j |  j |   | j |  j	 |   | j |  j
 |   | S)N)rp   r   r#   parent_modelr   _check_relation_check_exclude_of_parent_model_check_extra_check_max_num_check_min_num_check_formset)r    Z
inline_objr   r"   r   )r?   r   r   r#   V  s    	zInlineModelAdminChecks.checkc                s   t  t |   j |  } | r" g  S|  j | |  r8 g  S| j d  k rK g  St | | j d | j } | j | j k r t	 j
 d | j | j j | j j f d d  d | j d d g Sg  Sd  S)Nfk_namezYCannot exclude the field '%s', because it is the foreign key to the parent model '%s.%s'.r;   r&   r'   z
admin.E201)rp   r   r   r   rI   r   r)   r   namer   r>   r4   rk   rl   r?   )r    r&   r   r"   Zfk)r?   r   r   r   a  s     	
z5InlineModelAdminChecks._check_exclude_of_parent_modelc             C   sy   y t  | | j d | j WnQ t k
 rp } z1 t j | j d d d  d | j d d g SWYd  d  } ~ Xn Xg  Sd  S)Nr   r   r;   r&   r'   z
admin.E202)r   r)   r   
ValueErrorr   r>   argsr?   )r    r&   r   er   r   r   r     s
    ?z&InlineModelAdminChecks._check_relationc             C   s6   t  | j t  s. t d d d d | d d Sg  Sd S)z! Check that extra is an integer. z
an integerr$   extrar&   r'   z
admin.E203N)r.   r   r   r1   )r    r&   r   r   r   r     s    z#InlineModelAdminChecks._check_extrac             C   sI   | j  d k r g  St | j  t  sA t d d d d | d d Sg  Sd S)z# Check that max_num is an integer. Nz
an integerr$   max_numr&   r'   z
admin.E204)r   r.   r   r1   )r    r&   r   r   r   r     s
    z%InlineModelAdminChecks._check_max_numc             C   sI   | j  d k r g  St | j  t  sA t d d d d | d d Sg  Sd S)z# Check that min_num is an integer. Nz
an integerr$   min_numr&   r'   z
admin.E205)r   r.   r   r1   )r    r&   r   r   r   r     s
    z%InlineModelAdminChecks._check_min_numc          	   C   s9   t  | j t  s1 t d d d d d | d d  Sg  Sd S)	z2 Check formset is a subclass of BaseModelFormSet. rK   r   r$   formsetr&   r'   z
admin.E206N)rM   r   r   rN   )r    r&   r   r   r   r     s    z%InlineModelAdminChecks._check_formset)
rj   rm   rn   r#   r   r   r   r   r   r   r   r   )r?   r   r   T  s   

r   c             C   s/   t  j d | |  f d d  d | j d | g S)NzThe value of '%s' must be %s.r;   r&   r'   )r   r>   r?   )typer$   r&   r'   r   r   r   r1     s
    	r1   c             C   s/   t  j d | |  f d d  d | j d | g S)Nz)The value of '%s' must inherit from '%s'.r;   r&   r'   )r   r>   r?   )rK   r$   r&   r'   r   r   r   rN     s
    	rN   c             C   sA   t  j d | |  | j j | j j f d d  d | j d | g S)NzGThe value of '%s' refers to '%s', which is not an attribute of '%s.%s'.r;   r&   r'   )r   r>   r4   rk   rl   r?   )r3   r$   r)   r&   r'   r   r   r   r6     s    	r6   N)
__future__r   	itertoolsr   Zdjango.contrib.admin.utilsr   r   r   Zdjango.corer   Zdjango.core.exceptionsr   Z	django.dbr	   Zdjango.forms.modelsr
   r   r   r   objectr   ro   r   r1   rN   r6   r   r   r   r   <module>   s     iY