
 X                 @   s:  d  d l  m Z d  d l m Z d  d l m Z d  d l m Z d  d l m	 Z	 m
 Z
 m Z d  d l m Z d  d l m Z d  d l m Z d  d	 l m Z m Z m Z d  d
 l m Z d d   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)apps)settings)NotRelationFieldflattenget_fields_from_path)checks)FieldDoesNotExist)models)BaseModelFormBaseModelFormSet_get_foreign_key)Enginec              K   s   d d l  m } | S)Nr   )system_check_errors)Zdjango.contrib.admin.sitesr   )kwargsr    r   I/home/ubuntu/projects/ifolica/build/django/django/contrib/admin/checks.pycheck_admin_app   s    r   c              K   s   g  } t  j d  s: t j d d d } | j |  n  y t j   } Wn t k
 r^ YnD Xd | j k r d t	 j
 k r t j d d d } | j |  n  | S)	zF
    Check that the admin's dependencies are correctly installed.
    zdjango.contrib.contenttypesz^'django.contrib.contenttypes' must be in INSTALLED_APPS in order to use the admin application.idz
admin.E401z+django.contrib.auth.context_processors.authz)django.contrib.auth.backends.ModelBackendzi'django.contrib.auth.context_processors.auth' must be in TEMPLATES in order to use the admin application.z
admin.E402)r   Zis_installedr	   Errorappendr   Zget_default	ExceptionZcontext_processorsr   ZAUTHENTICATION_BACKENDS)r   errorsZmissing_appZdefault_template_engineZmissing_templater   r   r   check_dependencies   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   r   r   r   r   checkC   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objr   z
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>[   s   	z=BaseModelAdminChecks._check_raw_id_fields.<locals>.<listcomp>N)
isinstancer-   listtuplemust_ber   	enumerate)r)   r.   r   )r.   r)   r   r   S   s
    z)BaseModelAdminChecks._check_raw_id_fieldsc             C   s   y | j  j |  } Wn7 t k
 rO t d | d | d | d | d d  SYn> X| j r t | t j  r 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,   r0   r.   r   z
admin.E002z%a foreign key or a many-to-many fieldz
admin.E003N)	_meta	get_fieldr
   refer_to_missing_fieldmany_to_manyr5   r   
ForeignKeyr8   )r)   r.   r0   r3   labelr:   r   r   r   r/   _   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 ro t j d d   j d d	 g St	   j   } t
 |  t
 t |   k r t j 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.z
admin.E005z2The value of 'fields' contains duplicate field(s).z
admin.E006c                s+   g  |  ]! }  j      j | d    q S)rA   )_check_field_specr0   )r1   r3   )r.   r)   r   r   r4      s   	z6BaseModelAdminChecks._check_fields.<locals>.<listcomp>)rA   r5   r6   r7   r8   	fieldsetsr	   r   	__class__r   lensetr   )r)   r.   rA   r   )r.   r)   r   r   p   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,   rC   r.   r   z
admin.E007c                s5   g  |  ]+ \ } }  j      j | d  |   q S)zfieldsets[%d])_check_fieldsets_itemr0   )r1   r2   fieldset)r.   r)   r   r   r4      s   	z9BaseModelAdminChecks._check_fieldsets.<locals>.<listcomp>)rC   r5   r6   r7   r8   r   r9   )r)   r.   r   )r.   r)   r   r      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  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 rWt j 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.E010rA   z3The value of '%s[1]' must contain the key 'fields'.z
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"])rB   )r1   Zfieldset_fields)r@   r0   r.   r)   r   r   r4      s   	z>BaseModelAdminChecks._check_fieldsets_item.<locals>.<listcomp>)r5   r6   r7   r8   rE   dictr	   r   rD   r   rF   r   )r)   r.   r0   rH   r@   rA   r   )r@   r0   r.   r)   r   rG      s,     
	
 
	
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)r1   r2   r3   )r@   r0   r.   r)   r   r   r4      s   	z:BaseModelAdminChecks._check_field_spec.<locals>.<listcomp>N)r5   r7   r6   r   r9   rL   )r)   r.   r0   rA   r@   r   )r@   r0   r.   r)   r   rB      s
    z&BaseModelAdminChecks._check_field_specc             C   s   | | j  k r g  Sy | j j |  } Wn t k
 rA g  SYnS Xt | t j  r | j j j j	 r t
 j d | | f 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   z
admin.E013)readonly_fieldsr;   r<   r
   r5   r   ManyToManyFieldZremote_fieldZthroughZauto_createdr	   r   rD   )r)   r.   r0   r3   r@   r:   r   r   r   rL      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 | 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).z
admin.E015)
rO   r5   r6   r7   r8   rE   rF   r	   r   rD   )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
issubclassrP   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_itemr0   )r1   r2   r3   )r.   r)   r   r   r4     s   	z?BaseModelAdminChecks._check_filter_vertical.<locals>.<listcomp>N)rR   r5   rU   r6   r7   r8   r   r9   )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])rV   r0   )r1   r2   r3   )r.   r)   r   r   r4     s   	zABaseModelAdminChecks._check_filter_horizontal.<locals>.<listcomp>N)rR   r5   rW   r6   r7   r8   r   r9   )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  SYn* X| j su 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. r:   r,   r0   r.   r   z
admin.E019za many-to-many fieldz
admin.E020N)r;   r<   r
   r=   r>   r8   )r)   r.   r0   r3   r@   r:   r   r   r   rV     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)rX   zradio_fields["%s"])_check_radio_fields_keyr0   _check_radio_fields_value)r1   r3   val)r.   r)   r   r   r4   7  s   	z<BaseModelAdminChecks._check_radio_fields.<locals>.<listcomp>N)rR   r5   rX   rK   r8   r6   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  SYnI Xt | t j  ph | j s t j	 d | | f 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. r:   r,   r0   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.z
admin.E023N)r;   r<   r
   r=   r5   r   r?   choicesr	   r   rD   )r)   r.   r0   r3   r@   r:   r   r   r   rY   <  s    	
z,BaseModelAdminChecks._check_radio_fields_keyc             C   sS   d d l  m } m } | | | f k rK t j 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.   r   z
admin.E024N)django.contrib.admin.optionsr^   r_   r	   r   rD   )r)   r.   r[   r@   r^   r_   r   r   r   rZ   T  s    
	
z.BaseModelAdminChecks._check_radio_fields_valuec             C   s`   t  | d  rX t | j  rQ t | j t  rQ t j 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   z
admin.E025)rR   callablera   r5   boolr	   r   rD   )r)   r.   r   r   r   r&   d  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)rd   zprepopulated_fields["%s"])_check_prepopulated_fields_keyr0    _check_prepopulated_fields_value)r1   r3   r[   )r.   r)   r   r   r4   }  s   	zCBaseModelAdminChecks._check_prepopulated_fields.<locals>.<listcomp>N)rR   r5   rd   rK   r8   r6   r   r\   )r)   r.   r   )r.   r)   r   r%   s  s    z/BaseModelAdminChecks._check_prepopulated_fieldsc             C   s   y | j  j |  } Wn7 t k
 rO t d | d | d | d | d d  SYnO Xt | t j t j t j f  r t	 j
 d | | f 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.
        r:   r,   r0   r.   r   z
admin.E027zhThe value of '%s' refers to '%s', which must not be a DateTimeField, a ForeignKey, or a ManyToManyField.z
admin.E028N)r;   r<   r
   r=   r5   r   DateTimeFieldr?   rN   r	   r   rD   )r)   r.   r0   r3   r@   r:   r   r   r   re     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)r1   r2   Zsubfield_name)r@   r0   r.   r)   r   r   r4     s   	zIBaseModelAdminChecks._check_prepopulated_fields_value.<locals>.<listcomp>N)r5   r6   r7   r8   r   r9   )r)   r.   r0   r[   r@   r   )r@   r0   r.   r)   r   rf     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". r:   r,   r0   r.   r   z
admin.E030N)r;   r<   r
   r=   )r)   r.   r0   r3   r@   r   r   r   rh     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_itemr0   )r1   r2   r3   )r.   r)   r   r   r4     s   	z8BaseModelAdminChecks._check_ordering.<locals>.<listcomp>)ri   r5   r6   r7   r8   r   r9   )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. ?rJ   z^The value of 'ordering' has the random ordering marker '?', but contains other fields as well.Zhintz2Either remove the "?", or remove the other fields.r.   r   z
admin.E032__-Nr:   r,   r0   z
admin.E033)
rE   ri   r	   r   rD   
startswithr;   r<   r
   r=   )r)   r.   r0   r3   r@   r   r   r   rj     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,   rM   r.   r   z
admin.E034c                s5   g  |  ]+ \ } }  j      j | d  |   q S)zreadonly_fields[%d])_check_readonly_fields_itemr0   )r1   r2   r3   )r.   r)   r   r   r4     s   	z?BaseModelAdminChecks._check_readonly_fields.<locals>.<listcomp>N)rM   r5   r6   r7   r8   r   r9   )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 |  WnS t k
 r t j d | | j j | j j	 | j j
 f 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   z
admin.E035)rb   rR   r;   r<   r
   r	   r   rD   __name__	app_labelobject_name)r)   r.   r0   r3   r@   r   r   r   ro     s    %	z0BaseModelAdminChecks._check_readonly_fields_itemN)rp   
__module____qualname__r+   r   r/   r   r   rG   rB   rL   r    r!   r"   r#   rV   r$   rY   rZ   r&   r%   re   rf   rh   r'   rj   r(   ro   r   r   r   r   r   A   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)superru   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   )rD   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)r5   r   rc   r8   )r)   r.   r   r   r   rw     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)r5   r   rc   r8   )r)   r.   r   r   r   rx     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_itemr0   )r1   r2   item)r.   r)   r   r   r4   ,  s   	z3ModelAdminChecks._check_inlines.<locals>.<listcomp>N)r5   r   r6   r7   r8   r   r9   )r)   r.   r   )r.   r)   r   ry   %  s
    zModelAdminChecks._check_inlinesc             C   s   d j  | j | j g  } d d l m } t | |  s] t j d | d | j d d g S| j	 s t j 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.   r   z
admin.E104z#'%s' must have a 'model' attribute.z
admin.E105za Modelr,   z%s.modelz
admin.E106N)joinrs   rp   r`   r   rS   r	   r   rD   r0   r   ZModelr8   Z
admin_siter+   )r)   r.   r0   inliner@   Zinline_labelr   r   r   r   r   0  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_itemr0   )r1   r2   r   )r.   r)   r   r   r4   S  s   	z8ModelAdminChecks._check_list_display.<locals>.<listcomp>N)r5   r   r6   r7   r8   r   r9   )r)   r.   r   )r.   r)   r   rz   K  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 | j	 d d g St | t j  rt j d | d | j	 d d g Sg  Snq y | j j |  WnV t k
 rt j d | | | j	 j
 | j j | j j f 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   z
admin.E108z0The value of '%s' must not be a ManyToManyField.z
admin.E109)rb   rR   r;   r<   r
   getattrAttributeErrorr	   r   rD   rp   rq   rr   r5   r   rN   )r)   r.   r0   r   r@   r:   r   r   r   r   W  sB    (	

	
(	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)r1   r2   r3   )r.   r)   r   r   r4     s   	z>ModelAdminChecks._check_list_display_links.<locals>.<listcomp>)r   r5   r6   r7   r8   r   r9   )r)   r.   r   )r.   r)   r   r{     s    z*ModelAdminChecks._check_list_display_linksc             C   s@   | | j  k r8 t j d | | f d | j d d g Sg  Sd  S)NzIThe value of '%s' refers to '%s', which is not defined in 'list_display'.r.   r   z
admin.E111)r   r	   r   rD   )r)   r.   r3   r@   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_itemr0   )r1   r2   r   )r.   r)   r   r   r4     s   	z7ModelAdminChecks._check_list_filter.<locals>.<listcomp>)r5   r   r6   r7   r8   r   r9   )r)   r.   r   )r.   r)   r   r|     s
    z#ModelAdminChecks._check_list_filterc       	      C   sY  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 | j d d
 g Sg  Sn t | t t f  r | \ } } t | |  s t d d d d | d | d d  Sg  Sn_ | } y t | |  WnA t t f k
 rPt	 j
 d | | f 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FieldListFilterrQ   r   r,   r.   r   z
admin.E113z:The value of '%s' must not inherit from 'FieldListFilter'.z
admin.E114r   z%s[1]z
admin.E115zBThe value of '%s' refers to '%s', which does not refer to a Field.z
admin.E116N)Zdjango.contrib.adminr   r   rb   r5   r   ZFieldrS   rT   r	   r   rD   r7   r6   r   r   r
   )	r)   r.   r0   r   r@   r   r   r:   Zlist_filter_classr   r   r   r     s2    	
	
#	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)r5   r   rc   r6   r7   r8   )r)   r.   r   r   r   r}     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)r5   r   intr8   )r)   r.   r   r   r   r~     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)r5   r   r   r8   )r)   r.   r   r   r   r     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_itemr0   )r1   r2   r   )r.   r)   r   r   r4     s   	z9ModelAdminChecks._check_list_editable.<locals>.<listcomp>N)r5   r   r6   r7   r8   r   r9   )r)   r.   r   )r.   r)   r   r     s
    z%ModelAdminChecks._check_list_editablec             C   sY  y | j  j |  } Wn7 t k
 rO t d | d | d | d | d d  SYnX| | j k r t j d | | f d | j d d g S| j r | | j k r t j d	 | d | j d d
 g S| j d | k r| j r| j d  k	 rt j d | | j d f d | j d d g S| j	 sQt j d | | f d | j d d g Sg  Sd  S)Nr:   r,   r0   r.   r   z
admin.E121zKThe value of '%s' refers to '%s', which is not contained in 'list_display'.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)
r;   r<   r
   r=   r   r	   r   rD   r   editable)r)   r.   r0   r3   r@   r:   r   r   r   r     s:    *	

	
	
		
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)r5   r   r6   r7   r8   )r)   r.   r   r   r   r   =  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_hierarchyr:   r0   r.   r   z
admin.E127za DateField or DateTimeFieldz
admin.E128)r   r0   r;   r<   r
   r=   r5   r   Z	DateFieldrg   r8   )r)   r.   r:   r   r   r   r   E  s    z&ModelAdminChecks._check_date_hierarchy)rp   rs   rt   r+   rw   rx   ry   r   rz   r   r{   r   r|   r   r}   r~   r   r   r   r   r   r   r   )rD   r   ru     s$   		7	42ru   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)rv   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   )rD   r   r   r+   [  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 | 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   z
admin.E201)rv   r   r    r   rO   r   r0   r   namer	   r   r;   rq   rr   rD   )r)   r.   r   r   Zfk)rD   r   r   r   f  s    	
z5InlineModelAdminChecks._check_exclude_of_parent_modelc             C   ss   y t  | | j d | j WnK t k
 rj } z+ t j | j d d | j d d g SWYd  d  } ~ Xn Xg  Sd  S)Nr   r   r.   r   z
admin.E202)r   r0   r   
ValueErrorr	   r   argsrD   )r)   r.   r   er   r   r   r     s
    9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)r5   r   r   r8   )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   r5   r   r8   )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   r5   r   r8   )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. rQ   r   r,   formsetr.   r   z
admin.E206N)rS   r   r   rT   )r)   r.   r   r   r   r     s    z%InlineModelAdminChecks._check_formset)
rp   rs   rt   r+   r   r   r   r   r   r   r   r   )rD   r   r   Y  s   

r   c             C   s)   t  j d | |  f d | j d | g S)NzThe value of '%s' must be %s.r.   r   )r	   r   rD   )typer,   r.   r   r   r   r   r8     s    	r8   c             C   s)   t  j d | |  f d | j d | g S)Nz)The value of '%s' must inherit from '%s'.r.   r   )r	   r   rD   )rQ   r,   r.   r   r   r   r   rT     s    	rT   c             C   s;   t  j d | |  | j j | j j f 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;   rq   rr   rD   )r:   r,   r0   r.   r   r   r   r   r=     s
    	r=   N)!
__future__r   	itertoolsr   Zdjango.appsr   Zdjango.confr   Zdjango.contrib.admin.utilsr   r   r   Zdjango.corer	   Zdjango.core.exceptionsr
   Z	django.dbr   Zdjango.forms.modelsr   r   r   Zdjango.template.enginer   r   r   objectr   ru   r   r8   rT   r=   r   r   r   r   <module>   s&   '  YW

