3
(h                 @   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G dd deZG dd deZG d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   ?/tmp/pip-install-q3hcpn_q/Django/django/contrib/admin/checks.pycheck_admin_app   s    r   c              K   sx   g }t jds&tjddd}|j| ytj }W n tk
rF   Y n.X d|jkrtdt	j
krttjddd}|j| |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.z
admin.E401)idz+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   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d1d2 Zd3S )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                sF   t  jttfs tdd ddS tt fddt jD  S dS )z\ Check that `raw_id_fields` only contains field names that are listed
        on the model. za list or tupleraw_id_fieldsz
admin.E001)optionobjr   c                s&   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   sb   y|j j|}W n" tk
r2   t||||ddS X |j rZt|tj rZtd||ddS g S d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. z
admin.E002)fieldr.   r1   r/   r   z%a foreign key or a many-to-many fieldz
admin.E003)r.   r/   r   N)	_meta	get_fieldr
   refer_to_missing_fieldmany_to_manyr6   r   
ForeignKeyr9   )r*   r/   r1   r4   labelr;   r   r   r   r0   _   s    z.BaseModelAdminChecks._check_raw_id_fields_itemc                s    j dkrg S t j ttfs.tdd ddS  jrHtjd jddgS t	 j }t
|t
t|krztjd	 jd
dgS t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 tuplefieldsz
admin.E004)r.   r/   r   z,Both 'fieldsets' and 'fields' are specified.z
admin.E005)r/   r   z2The value of 'fields' contains duplicate field(s).z
admin.E006c                s   g | ]}j   j|d qS )rB   )_check_field_specr1   )r2   r4   )r/   r*   r   r   r5      s   z6BaseModelAdminChecks._check_fields.<locals>.<listcomp>)rB   r6   r7   r8   r9   	fieldsetsr	   r   	__class__r   lensetr   )r*   r/   rB   r   )r/   r*   r   r   p   s$    



z"BaseModelAdminChecks._check_fieldsc                sT    j dkrg S t j ttfs.tdd ddS tt fddt j D  S dS )zT Check that fieldsets is properly formatted and doesn't contain
        duplicates. Nza list or tuplerD   z
admin.E007)r.   r/   r   c                s&   g | ]\}}j   j|d | qS )zfieldsets[%d])_check_fieldsets_itemr1   )r2   r3   fieldset)r/   r*   r   r   r5      s   z9BaseModelAdminChecks._check_fieldsets.<locals>.<listcomp>)rD   r6   r7   r8   r9   r   r:   )r*   r/   r   )r/   r*   r   r       s    
z%BaseModelAdminChecks._check_fieldsetsc                s  t |ttfstd ddS t|dkr:td ddS t |d ts\tdd	  d
dS d|d krtjd  jddgS t |d d ttfstdd  ddS t	|d d }t|tt
|krtjd  jddgS t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 tuplez
admin.E008)r.   r/   r      zof length 2z
admin.E009   za dictionaryz%s[1]z
admin.E010rB   z3The value of '%s[1]' must contain the key 'fields'.z
admin.E011)r/   r   z%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"])rC   )r2   Zfieldset_fields)rA   r1   r/   r*   r   r   r5      s   z>BaseModelAdminChecks._check_fieldsets_item.<locals>.<listcomp>)r6   r7   r8   r9   rF   dictr	   r   rE   r   rG   r   )r*   r/   r1   rI   rA   rB   r   )rA   r1   r/   r*   r   rH      s,    

z*BaseModelAdminChecks._check_fieldsets_itemc                sB   t |tr.tt fddt|D  S j| S d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          	      s(   g | ] \}}j |d  |f qS )z%s[%d])_check_field_spec_item)r2   r3   r4   )rA   r1   r/   r*   r   r   r5      s   z:BaseModelAdminChecks._check_field_spec.<locals>.<listcomp>N)r6   r8   r7   r   r:   rM   )r*   r/   r1   rB   rA   r   )rA   r1   r/   r*   r   rC      s
    
z&BaseModelAdminChecks._check_field_specc             C   sr   ||j krg S y|jj|}W n tk
r2   g S X t|tjrj|jjjj	 rjt
jd||f |jddgS g S d S )NzvThe value of '%s' cannot include the ManyToManyField '%s', because that field manually specifies a relationship model.z
admin.E013)r/   r   )readonly_fieldsr<   r=   r
   r6   r   ManyToManyFieldZremote_fieldZthroughZauto_createdr	   r   rE   )r*   r/   r1   r4   rA   r;   r   r   r   rM      s    

z+BaseModelAdminChecks._check_field_spec_itemc             C   sb   |j dkrg S t|j ttfs.tdd|ddS t|j tt|j krZtjd|j	ddgS g S dS )	z6 Check that exclude is a sequence without duplicates. Nza list or tupleexcludez
admin.E014)r.   r/   r   z3The value of 'exclude' contains duplicate field(s).z
admin.E015)r/   r   )
rP   r6   r7   r8   r9   rF   rG   r	   r   rE   )r*   r/   r   r   r   r!      s    

z#BaseModelAdminChecks._check_excludec             C   s0   t |dr(t|jt r(tdd|ddS g S dS )z+ Check that form subclasses BaseModelForm. formr   z
admin.E016)parentr.   r/   r   N)hasattr
issubclassrQ   r   must_inherit_from)r*   r/   r   r   r   r"      s    
z BaseModelAdminChecks._check_formc                sT   t  dsg S t jttfs.tdd ddS tt fddt jD  S dS )z: Check that filter_vertical is a sequence of field names. filter_verticalza list or tuplez
admin.E017)r.   r/   r   c                s&   g | ]\}}j   j|d | qS )zfilter_vertical[%d])_check_filter_itemr1   )r2   r3   r4   )r/   r*   r   r   r5     s   z?BaseModelAdminChecks._check_filter_vertical.<locals>.<listcomp>N)rS   r6   rV   r7   r8   r9   r   r:   )r*   r/   r   )r/   r*   r   r#     s    
z+BaseModelAdminChecks._check_filter_verticalc                sT   t  dsg S t jttfs.tdd ddS tt fddt jD  S dS )z< Check that filter_horizontal is a sequence of field names. filter_horizontalza list or tuplez
admin.E018)r.   r/   r   c                s&   g | ]\}}j   j|d | qS )zfilter_horizontal[%d])rW   r1   )r2   r3   r4   )r/   r*   r   r   r5     s   zABaseModelAdminChecks._check_filter_horizontal.<locals>.<listcomp>N)rS   r6   rX   r7   r8   r9   r   r:   )r*   r/   r   )r/   r*   r   r$     s    
z-BaseModelAdminChecks._check_filter_horizontalc             C   sR   y|j j|}W n" tk
r2   t||||ddS X |jsJtd||ddS g S dS )z Check one item of `filter_vertical` or `filter_horizontal`, i.e.
        check that given field exists and is a ManyToManyField. z
admin.E019)r;   r.   r1   r/   r   za many-to-many fieldz
admin.E020)r.   r/   r   N)r<   r=   r
   r>   r?   r9   )r*   r/   r1   r4   rA   r;   r   r   r   rW     s    z'BaseModelAdminChecks._check_filter_itemc                sP   t  dsg S t jts*tdd ddS tt fdd jj D  S dS )z, Check that `radio_fields` is a dictionary. radio_fieldsza dictionaryz
admin.E021)r.   r/   r   c                s4   g | ],\}}j   j|d j |d|  qS )rY   zradio_fields["%s"])_check_radio_fields_keyr1   _check_radio_fields_value)r2   r4   val)r/   r*   r   r   r5   7  s   z<BaseModelAdminChecks._check_radio_fields.<locals>.<listcomp>N)rS   r6   rY   rL   r9   r7   r   items)r*   r/   r   )r/   r*   r   r%   .  s    
z(BaseModelAdminChecks._check_radio_fieldsc             C   sj   y|j j|}W n" tk
r2   t||||ddS X t|tjpD|jsbtj	d||f |j
ddgS g S d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. z
admin.E022)r;   r.   r1   r/   r   zsThe value of '%s' refers to '%s', which is not an instance of ForeignKey, and does not have a 'choices' definition.z
admin.E023)r/   r   N)r<   r=   r
   r>   r6   r   r@   choicesr	   r   rE   )r*   r/   r1   r4   rA   r;   r   r   r   rZ   <  s    
z,BaseModelAdminChecks._check_radio_fields_keyc             C   s<   ddl m}m} |||fkr4tjd| |jddgS g S d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.z
admin.E024)r/   r   N)django.contrib.admin.optionsr_   r`   r	   r   rE   )r*   r/   r\   rA   r_   r`   r   r   r   r[   T  s    
z.BaseModelAdminChecks._check_radio_fields_valuec             C   sF   t |dr>t|j r8t|jt r8tjd|jddgS g S ng S d S )Nview_on_sitezBThe value of 'view_on_site' must be a callable or a boolean value.z
admin.E025)r/   r   )rS   callablerb   r6   boolr	   r   rE   )r*   r/   r   r   r   r'   d  s    

z,BaseModelAdminChecks._check_view_on_site_urlc                sP   t  dsg S t jts*tdd ddS tt fdd jj D  S dS )zZ Check that `prepopulated_fields` is a dictionary containing allowed
        field types. prepopulated_fieldsza dictionaryz
admin.E026)r.   r/   r   c          	      s8   g | ]0\}}j   j|d j  j|d|  qS )re   zprepopulated_fields["%s"])_check_prepopulated_fields_keyr1    _check_prepopulated_fields_value)r2   r4   r\   )r/   r*   r   r   r5   }  s   zCBaseModelAdminChecks._check_prepopulated_fields.<locals>.<listcomp>N)rS   r6   re   rL   r9   r7   r   r]   )r*   r/   r   )r/   r*   r   r&   s  s    
z/BaseModelAdminChecks._check_prepopulated_fieldsc             C   sn   y|j j|}W n" tk
r2   t||||ddS X t|tjtjtjfrft	j
d||f |jddgS g S d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.
        z
admin.E027)r;   r.   r1   r/   r   zhThe value of '%s' refers to '%s', which must not be a DateTimeField, a ForeignKey, or a ManyToManyField.z
admin.E028)r/   r   N)r<   r=   r
   r>   r6   r   DateTimeFieldr@   rO   r	   r   rE   )r*   r/   r1   r4   rA   r;   r   r   r   rf     s    
z3BaseModelAdminChecks._check_prepopulated_fields_keyc                sF   t |ttfstd ddS tt fddt|D  S dS )zf Check a value of `prepopulated_fields` dictionary, i.e. it's an
        iterable of existing fields. za list or tuplez
admin.E029)r.   r/   r   c          	      s(   g | ] \}}j |d  |f qS )z%s[%r])%_check_prepopulated_fields_value_item)r2   r3   Zsubfield_name)rA   r1   r/   r*   r   r   r5     s   zIBaseModelAdminChecks._check_prepopulated_fields_value.<locals>.<listcomp>N)r6   r7   r8   r9   r   r:   )r*   r/   r1   r\   rA   r   )rA   r1   r/   r*   r   rg     s
    z5BaseModelAdminChecks._check_prepopulated_fields_valuec             C   s<   y|j j| W n" tk
r2   t||||ddS X g S dS )z[ For `prepopulated_fields` equal to {"slug": ("title",)},
        `field_name` is "title". z
admin.E030)r;   r.   r1   r/   r   N)r<   r=   r
   r>   )r*   r/   r1   r4   rA   r   r   r   ri     s
    z:BaseModelAdminChecks._check_prepopulated_fields_value_itemc                sT    j dkrg S t j ttfs.tdd ddS tt fddt j D  S dS )z= Check that ordering refers to existing fields or is random. Nza list or tupleorderingz
admin.E031)r.   r/   r   c                s&   g | ]\}}j   j|d | qS )zordering[%d])_check_ordering_itemr1   )r2   r3   r4   )r/   r*   r   r   r5     s   z8BaseModelAdminChecks._check_ordering.<locals>.<listcomp>)rj   r6   r7   r8   r9   r   r:   )r*   r/   r   )r/   r*   r   r(     s    
z$BaseModelAdminChecks._check_orderingc             C   s   |dkr,t |jdkr,tjdd|jddgS |dkr8g S d|krDg S |jdrZ|dd	 }y|jj| W n" tk
r   t	||||d
dS X g S d	S )z2 Check that `ordering` refers to existing fields. ?rK   z^The value of 'ordering' has the random ordering marker '?', but contains other fields as well.z2Either remove the "?", or remove the other fields.z
admin.E032)Zhintr/   r   __-Nz
admin.E033)r;   r.   r1   r/   r   )
rF   rj   r	   r   rE   
startswithr<   r=   r
   r>   )r*   r/   r1   r4   rA   r   r   r   rk     s"    

z)BaseModelAdminChecks._check_ordering_itemc                sT    j f krg S t j ttfs.tdd ddS tt fddt j D  S dS )zA Check that readonly_fields refers to proper attribute or field. za list or tuplerN   z
admin.E034)r.   r/   r   c                s&   g | ]\}}j   j|d | qS )zreadonly_fields[%d])_check_readonly_fields_itemr1   )r2   r3   r4   )r/   r*   r   r   r5     s   z?BaseModelAdminChecks._check_readonly_fields.<locals>.<listcomp>N)rN   r6   r7   r8   r9   r   r:   )r*   r/   r   )r/   r*   r   r)     s    
z+BaseModelAdminChecks._check_readonly_fieldsc             C   s~   t |rg S t||rg S t||r(g S y|jj| W n< tk
rt   tjd||jj|jj	|jj
f |jddgS X g S d S )NzVThe value of '%s' is not a callable, an attribute of '%s', or an attribute of '%s.%s'.z
admin.E035)r/   r   )rc   rS   r<   r=   r
   r	   r   rE   __name__	app_labelobject_name)r*   r/   r1   r4   rA   r   r   r   rp     s    

z0BaseModelAdminChecks._check_readonly_fields_itemN)rq   
__module____qualname__r,   r   r0   r   r    rH   rC   rM   r!   r"   r#   r$   rW   r%   rZ   r[   r'   r&   rf   rg   ri   r(   rk   r)   rp   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  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)superrv   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   )rE   r   r   r,     s    zModelAdminChecks.checkc             C   s$   t |jtstdd|ddS g S dS )z Check save_as is a boolean. z	a booleansave_asz
admin.E101)r.   r/   r   N)r6   r   rd   r9   )r*   r/   r   r   r   rx     s    
zModelAdminChecks._check_save_asc             C   s$   t |jtstdd|ddS g S dS )z! Check save_on_top is a boolean. z	a booleansave_on_topz
admin.E102)r.   r/   r   N)r6   r   rd   r9   )r*   r/   r   r   r   ry     s    
z#ModelAdminChecks._check_save_on_topc                sF   t  jttfs tdd ddS tt fddt jD  S dS )z' Check all inline model admin classes. za list or tupleinlinesz
admin.E103)r.   r/   r   c                s&   g | ]\}}j   j|d | qS )zinlines[%d])_check_inlines_itemr1   )r2   r3   item)r/   r*   r   r   r5   ,  s   z3ModelAdminChecks._check_inlines.<locals>.<listcomp>N)r6   r   r7   r8   r9   r   r:   )r*   r/   r   )r/   r*   r   rz   %  s
    zModelAdminChecks._check_inlinesc             C   s   dj |j|jg}ddlm} t||s@tjd| |jddgS |j	s^tjd| |jddgS t|j	t
jstd	d
| |ddS |||jj S dS )z Check one inline model admin. .r   )BaseModelAdminz('%s' must inherit from 'BaseModelAdmin'.z
admin.E104)r/   r   z#'%s' must have a 'model' attribute.z
admin.E105za Modelz%s.modelz
admin.E106)r.   r/   r   N)joinrt   rq   ra   r   rT   r	   r   rE   r1   r   ZModelr9   Z
admin_siter,   )r*   r/   r1   inlinerA   Zinline_labelr   r   r   r   r   0  s    


z$ModelAdminChecks._check_inlines_itemc                sF   t  jttfs tdd ddS tt fddt jD  S dS )zL Check that list_display only contains fields or usable attributes.
        za list or tuplelist_displayz
admin.E107)r.   r/   r   c                s&   g | ]\}}j   j|d | qS )zlist_display[%d])_check_list_display_itemr1   )r2   r3   r   )r/   r*   r   r   r5   S  s   z8ModelAdminChecks._check_list_display.<locals>.<listcomp>N)r6   r   r7   r8   r9   r   r:   )r*   r/   r   )r/   r*   r   r{   K  s
    z$ModelAdminChecks._check_list_displayc             C   s,  t |rg S t||rg S t||ry|jj|}W n< tk
rp   yt||}W n tk
rj   d }Y nX Y nX |d krtjd|||j	j
|jj|jjf |j	ddgS t|tjrtjd| |j	ddgS g S nVy|jj| W n@ tk
r"   tjd|||j	j
|jj|jjf |j	ddgS X g S d 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'.z
admin.E108)r/   r   z0The value of '%s' must not be a ManyToManyField.z
admin.E109)rc   rS   r<   r=   r
   getattrAttributeErrorr	   r   rE   rq   rr   rs   r6   r   rO   )r*   r/   r1   r   rA   r;   r   r   r   r   W  sB    



z)ModelAdminChecks._check_list_display_itemc                sT    j dkrg S t j ttfs.tdd ddS tt fddt j D  S dS )zK Check that list_display_links is a unique subset of list_display.
        Nza list, a tuple, or Nonelist_display_linksz
admin.E110)r.   r/   r   c                s"   g | ]\}}j  |d | qS )zlist_display_links[%d])_check_list_display_links_item)r2   r3   r4   )r/   r*   r   r   r5     s   z>ModelAdminChecks._check_list_display_links.<locals>.<listcomp>)r   r6   r7   r8   r9   r   r:   )r*   r/   r   )r/   r*   r   r|     s    
z*ModelAdminChecks._check_list_display_linksc             C   s.   ||j kr&tjd||f |jddgS g S d S )NzIThe value of '%s' refers to '%s', which is not defined in 'list_display'.z
admin.E111)r/   r   )r   r	   r   rE   )r*   r/   r4   rA   r   r   r   r     s    

z/ModelAdminChecks._check_list_display_links_itemc                sF   t  jttfs tdd ddS tt fddt jD  S d S )Nza list or tuplelist_filterz
admin.E112)r.   r/   r   c                s&   g | ]\}}j   j|d | qS )zlist_filter[%d])_check_list_filter_itemr1   )r2   r3   r   )r/   r*   r   r   r5     s   z7ModelAdminChecks._check_list_filter.<locals>.<listcomp>)r6   r   r7   r8   r9   r   r:   )r*   r/   r   )r/   r*   r   r}     s
    z#ModelAdminChecks._check_list_filterc       	      C   s   ddl m}m} t|rht|tj rht||s@td||ddS t||rbt	j
d| |jddgS g S nt|ttfr|\}}t||std	d
| |ddS g S nH|}yt|| W n0 ttfk
r   t	j
d||f |jddgS X g S d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FieldListFilterr   z
admin.E113)rR   r.   r/   r   z:The value of '%s' must not inherit from 'FieldListFilter'.z
admin.E114)r/   r   r   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   rc   r6   r   ZFieldrT   rU   r	   r   rE   r8   r7   r   r   r
   )	r*   r/   r1   r   rA   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s"tdd|ddS g S dS )zA Check that list_select_related is a boolean, a list or a tuple. za boolean, tuple or listlist_select_relatedz
admin.E117)r.   r/   r   N)r6   r   rd   r7   r8   r9   )r*   r/   r   r   r   r~     s    z+ModelAdminChecks._check_list_select_relatedc             C   s$   t |jtstdd|ddS g S dS )z) Check that list_per_page is an integer. z
an integerlist_per_pagez
admin.E118)r.   r/   r   N)r6   r   intr9   )r*   r/   r   r   r   r     s    z%ModelAdminChecks._check_list_per_pagec             C   s$   t |jtstdd|ddS g S dS )z- Check that list_max_show_all is an integer. z
an integerlist_max_show_allz
admin.E119)r.   r/   r   N)r6   r   r   r9   )r*   r/   r   r   r   r     s    z)ModelAdminChecks._check_list_max_show_allc                sF   t  jttfs tdd ddS tt fddt jD  S dS )zl Check that list_editable is a sequence of editable fields from
        list_display without first element. za list or tuplelist_editablez
admin.E120)r.   r/   r   c                s&   g | ]\}}j   j|d | qS )zlist_editable[%d])_check_list_editable_itemr1   )r2   r3   r   )r/   r*   r   r   r5     s   z9ModelAdminChecks._check_list_editable.<locals>.<listcomp>N)r6   r   r7   r8   r9   r   r:   )r*   r/   r   )r/   r*   r   r     s
    z%ModelAdminChecks._check_list_editablec             C   s   y|j j|}W n" tk
r2   t||||ddS X ||jkrZtjd||f |jddgS |jr||jkrtjd| |jddgS |jd |kr|j r|jd k	rtjd	||jd f |jd
dgS |j	stjd||f |jddgS g S d S )Nz
admin.E121)r;   r.   r1   r/   r   zKThe value of '%s' refers to '%s', which is not contained in 'list_display'.z
admin.E122)r/   r   zMThe 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   rE   r   editable)r*   r/   r1   r4   rA   r;   r   r   r   r     s:    





z*ModelAdminChecks._check_list_editable_itemc             C   s(   t |jttfs tdd|ddS g S dS )z$ Check search_fields is a sequence. za list or tuplesearch_fieldsz
admin.E126)r.   r/   r   N)r6   r   r7   r8   r9   )r*   r/   r   r   r   r   =  s    z%ModelAdminChecks._check_search_fieldsc             C   st   |j dkrg S y|jjj|j }W n& tk
rH   td|j |j|ddS X t|tjtj	fslt
dd|ddS g S dS )zA Check that date_hierarchy refers to DateField or DateTimeField. Ndate_hierarchyz
admin.E127)r.   r;   r1   r/   r   za DateField or DateTimeFieldz
admin.E128)r.   r/   r   )r   r1   r<   r=   r
   r>   r6   r   Z	DateFieldrh   r9   )r*   r/   r;   r   r   r   r   E  s    
z&ModelAdminChecks._check_date_hierarchy)rq   rt   ru   r,   rx   ry   rz   r   r{   r   r|   r   r}   r   r~   r   r   r   r   r   r   __classcell__r   r   )rE   r   rv     s$   		7	42rv   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	  Z
S )InlineModelAdminChecksc                s~   t t| j|}|j}|j| j|| |j| j|| |j| j| |j| j| |j| j	| |j| j
| |S )N)rw   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   )rE   r   r   r,   [  s    zInlineModelAdminChecks.checkc                s   t t| j|}|rg S | j||r(g S |jd kr6g S t||j|jd}|j|jkr|t	j
d|j|jj|jjf |jddgS g S d S )N)fk_namezYCannot exclude the field '%s', because it is the foreign key to the parent model '%s.%s'.z
admin.E201)r/   r   )rw   r   r!   r   rP   r   r1   r   namer	   r   r<   rr   rs   rE   )r*   r/   r   r   Zfk)rE   r   r   r   f  s    

z5InlineModelAdminChecks._check_exclude_of_parent_modelc             C   sV   yt ||j|jd W n6 tk
rL } ztj|jd |jddgS d }~X nX g S d S )N)r   r   z
admin.E202)r/   r   )r   r1   r   
ValueErrorr	   r   argsrE   )r*   r/   r   er   r   r   r     s
    &z&InlineModelAdminChecks._check_relationc             C   s$   t |jtstdd|ddS g S dS )z! Check that extra is an integer. z
an integerextraz
admin.E203)r.   r/   r   N)r6   r   r   r9   )r*   r/   r   r   r   r     s    z#InlineModelAdminChecks._check_extrac             C   s2   |j dkrg S t|j ts*tdd|ddS g S dS )z# Check that max_num is an integer. Nz
an integermax_numz
admin.E204)r.   r/   r   )r   r6   r   r9   )r*   r/   r   r   r   r     s
    
z%InlineModelAdminChecks._check_max_numc             C   s2   |j dkrg S t|j ts*tdd|ddS g S dS )z# Check that min_num is an integer. Nz
an integermin_numz
admin.E205)r.   r/   r   )r   r6   r   r9   )r*   r/   r   r   r   r     s
    
z%InlineModelAdminChecks._check_min_numc             C   s$   t |jtstdd|ddS g S dS )z2 Check formset is a subclass of BaseModelFormSet. r   formsetz
admin.E206)rR   r.   r/   r   N)rT   r   r   rU   )r*   r/   r   r   r   r     s    z%InlineModelAdminChecks._check_formset)rq   rt   ru   r,   r   r   r   r   r   r   r   r   r   )rE   r   r   Y  s   

r   c             C   s   t jd|| f |j|dgS )NzThe value of '%s' must be %s.)r/   r   )r	   r   rE   )typer.   r/   r   r   r   r   r9     s    
r9   c             C   s   t jd|| f |j|dgS )Nz)The value of '%s' must inherit from '%s'.)r/   r   )r	   r   rE   )rR   r.   r/   r   r   r   r   rU     s    
rU   c             C   s(   t jd|| |jj|jjf |j|dgS )NzGThe value of '%s' refers to '%s', which is not an attribute of '%s.%s'.)r/   r   )r	   r   r<   rr   rs   rE   )r;   r.   r1   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   rv   r   r9   rU   r>   r   r   r   r   <module>   s,   '   C  ZW

