î
?[Y˜  ã               @   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   úJ/home/kubikplay/www/django_dtb/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

