B
    CVvg[²  ã               @   s  d dl 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 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„ Zdd„ Z dd„ Z!dd„ Z"G dd„ dƒZ#G dd„ de#ƒZ$G dd„ de#ƒZ%dd„ Z&dd „ Z'd!d"„ Z(dS )#é    N)Úchain)Úapps)Úsettings)ÚNotRelationFieldÚflattenÚget_fields_from_path)Úchecks)ÚFieldDoesNotExist)Úmodels)Ú
LOOKUP_SEP)Ú
Combinable)ÚBaseModelFormÚBaseModelFormSetÚ_get_foreign_key)Úengines)ÚDjangoTemplates)Úimport_stringc             C   s$   y
t | |ƒS  tk
r   dS X dS )zX
    issubclass() variant that doesn't raise an exception if cls isn't a
    class.
    FN)Ú
issubclassÚ	TypeError)ÚclsZ	classinfo© r   ú?/tmp/pip-install-o3oxmrkh/Django/django/contrib/admin/checks.pyÚ_issubclass   s    
r   c          	   C   sL   t | ƒ}x>|D ]6}yt |ƒ}W n tk
r4   wY nX t||ƒrdS qW dS )z|
    Return whether or not a dotted class path (or a subclass of that class) is
    found in a list of candidate paths.
    TF)r   ÚImportErrorr   )Z
class_pathZcandidate_pathsr   ÚpathZcandidate_clsr   r   r   Ú_contains_subclass!   s    

r   c             K   s2   ddl m} g }x|D ]}| | | ¡¡ qW |S )Nr   )Ú	all_sites)Údjango.contrib.admin.sitesr   ÚextendÚcheck)Zapp_configsÚkwargsr   ÚerrorsÚsiter   r   r   Úcheck_admin_app2   s
    
r#   c        	      K   sˆ  ddl m} t d¡sg S g }d}x6|D ].\}}t |¡s(| tjd| d| d�¡ q(W x&t ¡ D ]}t	|t
ƒrd|j}P qdW d}|sœ| tjd	d
d�¡ n€d|jkrÆtdtjƒrÆ| tjddd�¡ d|jkrä| tjddd�¡ tdd„ |D ƒƒ}|�rd|jk�r| tjddd�¡ tdtjƒ�s>| tjddd�¡ tdtjƒ�s`| tjddd�¡ tdtjƒ�s„| tjddd d!�¡ |S )"zF
    Check that the admin's dependencies are correctly installed.
    r   )r   zdjango.contrib.admin))zdjango.contrib.contenttypesi‘  )zdjango.contrib.authi•  )zdjango.contrib.messagesi–  zE'%s' must be in INSTALLED_APPS in order to use the admin application.z	admin.E%d)ÚidNzƒA 'django.template.backends.django.DjangoTemplates' instance must be configured in TEMPLATES in order to use the admin application.z
admin.E403z+django.contrib.auth.context_processors.authz)django.contrib.auth.backends.ModelBackendz¥'django.contrib.auth.context_processors.auth' must be enabled in DjangoTemplates (TEMPLATES) if using the default auth backend in order to use the admin application.z
admin.E402z3django.contrib.messages.context_processors.messagesz‹'django.contrib.messages.context_processors.messages' must be enabled in DjangoTemplates (TEMPLATES) in order to use the admin application.z
admin.E404c             s   s   | ]}|j V  qd S )N)Zenable_nav_sidebar)Ú.0r"   r   r   r   ú	<genexpr>m   s    z%check_dependencies.<locals>.<genexpr>z*django.template.context_processors.requestz‰'django.template.context_processors.request' must be enabled in DjangoTemplates (TEMPLATES) in order to use the admin navigation sidebar.z
admin.W411z7django.contrib.auth.middleware.AuthenticationMiddlewarezv'django.contrib.auth.middleware.AuthenticationMiddleware' must be in MIDDLEWARE in order to use the admin application.z
admin.E408z4django.contrib.messages.middleware.MessageMiddlewarezs'django.contrib.messages.middleware.MessageMiddleware' must be in MIDDLEWARE in order to use the admin application.z
admin.E409z4django.contrib.sessions.middleware.SessionMiddlewarezs'django.contrib.sessions.middleware.SessionMiddleware' must be in MIDDLEWARE in order to use the admin application.zInsert 'django.contrib.sessions.middleware.SessionMiddleware' before 'django.contrib.auth.middleware.AuthenticationMiddleware'.z
admin.E410)Úhintr$   )r   r   r   Zis_installedÚappendr   ÚErrorr   ÚallÚ
isinstancer   ÚengineZcontext_processorsr   r   ZAUTHENTICATION_BACKENDSÚanyÚWarningZ
MIDDLEWARE)	r    r   r!   Zapp_dependenciesZapp_nameZ
error_coder,   Zdjango_templates_instanceZsidebar_enabledr   r   r   Úcheck_dependencies:   sf    









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d3d4„ Zd5d6„ Zd7S )8ÚBaseModelAdminChecksc             K   sl   |   |¡|  |¡|  |¡|  |¡|  |¡|  |¡|  |¡|  |¡|  |¡|  	|¡|  
|¡|  |¡|  |¡•S )N)Ú_check_autocomplete_fieldsÚ_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   ”   s    zBaseModelAdminChecks.checkc                sH   t ˆ jttfƒs tddˆ dd�S tt ‡ ‡fdd„tˆ jƒD ƒ¡ƒS dS )zV
        Check that `autocomplete_fields` is a list or tuple of model fields.
        za list or tupleÚautocomplete_fieldsz
admin.E036)ÚoptionÚobjr$   c                s"   g | ]\}}ˆ  ˆ |d | ¡‘qS )zautocomplete_fields[%d])Ú_check_autocomplete_fields_item)r%   ÚindexÚ
field_name)rB   r>   r   r   ú
<listcomp>­   s   zCBaseModelAdminChecks._check_autocomplete_fields.<locals>.<listcomp>N)r+   r@   ÚlistÚtupleÚmust_ber   Úfrom_iterableÚ	enumerate)r>   rB   r   )rB   r>   r   r1   ¥   s
    z/BaseModelAdminChecks._check_autocomplete_fieldsc          	   C   sÌ   y|j j |¡}W n  tk
r2   t|||dd�S X |jsVt|tjƒsVt	d||dd�S |j
j |jj ¡}|dkr˜tjd|jj jt|ƒjf |jdd	�gS |jsÄtjd
|jjt|ƒjf |jdd	�gS g S dS )z¹
        Check that an item in `autocomplete_fields` is a ForeignKey or a
        ManyToManyField and that the item has a related ModelAdmin with
        search_fields defined.
        z
admin.E037)ÚfieldrA   rB   r$   z%a foreign key or a many-to-many fieldz
admin.E038)rA   rB   r$   NzXAn admin for model "%s" has to be registered to be referenced by %s.autocomplete_fields.z
admin.E039)rB   r$   zR%s must define "search_fields", because it's referenced by %s.autocomplete_fields.z
admin.E040)ÚmodelÚ_metaÚ	get_fieldr	   Úrefer_to_missing_fieldÚmany_to_manyr+   r
   Ú
ForeignKeyrI   Ú
admin_siteÚ	_registryÚgetÚremote_fieldr   r)   Ú__name__ÚtypeÚ	__class__Úsearch_fields)r>   rB   rE   ÚlabelrL   Zrelated_adminr   r   r   rC   ±   s0    

z4BaseModelAdminChecks._check_autocomplete_fields_itemc                sH   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)rA   rB   r$   c             3   s$   | ]\}}ˆ  ˆ |d | ¡V  qdS )zraw_id_fields[%d]N)Ú_check_raw_id_fields_item)r%   rD   rE   )rB   r>   r   r   r&   ä   s   z<BaseModelAdminChecks._check_raw_id_fields.<locals>.<genexpr>N)r+   r\   rG   rH   rI   r   rJ   rK   )r>   rB   r   )rB   r>   r   r2   Ü   s
    z)BaseModelAdminChecks._check_raw_id_fieldsc          	   C   s^   y|j j |¡}W n  tk
r2   t|||dd�S X |jsVt|tjƒsVt	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)rL   rA   rB   r$   z%a foreign key or a many-to-many fieldz
admin.E003)rA   rB   r$   N)
rM   rN   rO   r	   rP   rQ   r+   r
   rR   rI   )r>   rB   rE   r[   rL   r   r   r   r]   è   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)rA   rB   r$   z,Both 'fieldsets' and 'fields' are specified.z
admin.E005)rB   r$   z2The value of 'fields' contains duplicate field(s).z
admin.E006c             3   s   | ]}ˆ  ˆ |d ¡V  qdS )r^   N)Ú_check_field_spec)r%   rE   )rB   r>   r   r   r&     s   z5BaseModelAdminChecks._check_fields.<locals>.<genexpr>)r^   r+   rG   rH   rI   Ú	fieldsetsr   r)   rY   r   ÚlenÚsetr   rJ   )r>   rB   r^   r   )rB   r>   r   r3   ÷   s$    



z"BaseModelAdminChecks._check_fieldsc                s\   ˆ j dkrg S tˆ j ttfƒs.tddˆ dd�S g ‰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 tupler`   z
admin.E007)rA   rB   r$   c             3   s&   | ]\}}ˆ  ˆ |d | ˆ¡V  qdS )zfieldsets[%d]N)Ú_check_fieldsets_item)r%   rD   Úfieldset)rB   Úseen_fieldsr>   r   r   r&   "  s   z8BaseModelAdminChecks._check_fieldsets.<locals>.<genexpr>)r`   r+   rG   rH   rI   r   rJ   rK   )r>   rB   r   )rB   re   r>   r   r4     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r€tjdˆ  ˆjdd�gS t |d d ttfƒsªtddˆ  ˆdd�S | 	t
|d d ƒ¡ t|ƒtt|ƒƒkrìt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)rA   rB   r$   é   zof length 2z
admin.E009é   za dictionaryz%s[1]z
admin.E010r^   z3The value of '%s[1]' must contain the key 'fields'.z
admin.E011)rB   r$   z%s[1]['fields']z(There are duplicate field(s) in '%s[1]'.z
admin.E012c             3   s    | ]}ˆ  ˆ|d ˆ  ¡V  qdS )z%s[1]["fields"]N)r_   )r%   Zfieldset_fields)r[   rB   r>   r   r   r&   E  s   z=BaseModelAdminChecks._check_fieldsets_item.<locals>.<genexpr>)r+   rG   rH   rI   ra   Údictr   r)   rY   r   r   rb   r   rJ   )r>   rB   rd   r[   re   r   )r[   rB   r>   r   rc   &  s,    

z*BaseModelAdminChecks._check_fieldsets_itemc                s@   t |tƒr.tt ‡ ‡‡fdd„t|ƒD ƒ¡ƒS ˆ ˆ|ˆ ¡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             3   s(   | ] \}}ˆ  ˆ|d ˆ |f ¡V  qdS )z%s[%d]N)Ú_check_field_spec_item)r%   rD   rE   )r[   rB   r>   r   r   r&   P  s   z9BaseModelAdminChecks._check_field_spec.<locals>.<genexpr>N)r+   rH   rG   r   rJ   rK   ri   )r>   rB   r^   r[   r   )r[   rB   r>   r   r_   I  s
    
z&BaseModelAdminChecks._check_field_specc             C   sr   ||j krg S y|jj |¡}W n tk
r4   g S X t|tjƒrj|jj	jj
sjt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)rB   r$   )Úreadonly_fieldsrM   rN   rO   r	   r+   r
   ÚManyToManyFieldrV   ZthroughZauto_createdr   r)   rY   )r>   rB   rE   r[   rL   r   r   r   ri   V  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)rA   rB   r$   z3The value of 'exclude' contains duplicate field(s).z
admin.E015)rB   r$   )
rl   r+   rG   rH   rI   ra   rb   r   r)   rY   )r>   rB   r   r   r   r5   r  s    

z#BaseModelAdminChecks._check_excludec             C   s$   t |jtƒstdd|dd�S g S dS )z+ Check that form subclasses BaseModelForm. r   Úformz
admin.E016)ÚparentrA   rB   r$   N)r   rm   r   Úmust_inherit_from)r>   rB   r   r   r   r6   „  s    
z BaseModelAdminChecks._check_formc                sH   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. za list or tupleÚfilter_verticalz
admin.E017)rA   rB   r$   c             3   s$   | ]\}}ˆ  ˆ |d | ¡V  qdS )zfilter_vertical[%d]N)Ú_check_filter_item)r%   rD   rE   )rB   r>   r   r   r&   ’  s   z>BaseModelAdminChecks._check_filter_vertical.<locals>.<genexpr>N)r+   rp   rG   rH   rI   r   rJ   rK   )r>   rB   r   )rB   r>   r   r7   Œ  s
    z+BaseModelAdminChecks._check_filter_verticalc                sH   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. za list or tupleÚfilter_horizontalz
admin.E018)rA   rB   r$   c             3   s$   | ]\}}ˆ  ˆ |d | ¡V  qdS )zfilter_horizontal[%d]N)rq   )r%   rD   rE   )rB   r>   r   r   r&   œ  s   z@BaseModelAdminChecks._check_filter_horizontal.<locals>.<genexpr>N)r+   rr   rG   rH   rI   r   rJ   rK   )r>   rB   r   )rB   r>   r   r8   –  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)rL   rA   rB   r$   za many-to-many fieldz
admin.E020)rA   rB   r$   N)rM   rN   rO   r	   rP   rQ   rI   )r>   rB   rE   r[   rL   r   r   r   rq      s    z'BaseModelAdminChecks._check_filter_itemc                sD   t ˆ jtƒstddˆ dd�S tt ‡ ‡fdd„ˆ j ¡ D ƒ¡ƒS dS )z, Check that `radio_fields` is a dictionary. za dictionaryÚradio_fieldsz
admin.E021)rA   rB   r$   c             3   s2   | ]*\}}ˆ  ˆ |d ¡ˆ ˆ |d| ¡ V  qdS )rs   zradio_fields["%s"]N)Ú_check_radio_fields_keyÚ_check_radio_fields_value)r%   rE   Úval)rB   r>   r   r   r&   ´  s   z;BaseModelAdminChecks._check_radio_fields.<locals>.<genexpr>N)r+   rs   rh   rI   rG   r   rJ   Úitems)r>   rB   r   )rB   r>   r   r9   ®  s
    z(BaseModelAdminChecks._check_radio_fieldsc          	   C   sj   y|j j |¡}W n  tk
r2   t|||dd�S X t|tjƒsb|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)rL   rA   rB   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)rB   r$   N)rM   rN   rO   r	   rP   r+   r
   rR   Úchoicesr   r)   rY   )r>   rB   rE   r[   rL   r   r   r   rt   ¹  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)rB   r$   N)Údjango.contrib.admin.optionsry   rz   r   r)   rY   )r>   rB   rv   r[   ry   rz   r   r   r   ru   Ð  s    
z.BaseModelAdminChecks._check_radio_fields_valuec             C   s2   t |jƒs*t|jtƒs*tjd|jdd�gS g S d S )NzBThe value of 'view_on_site' must be a callable or a boolean value.z
admin.E025)rB   r$   )ÚcallableZview_on_siter+   Úboolr   r)   rY   )r>   rB   r   r   r   r;   à  s    
z,BaseModelAdminChecks._check_view_on_site_urlc                sD   t ˆ jtƒstddˆ dd�S tt ‡ ‡fdd„ˆ j ¡ D ƒ¡ƒS dS )zZ Check that `prepopulated_fields` is a dictionary containing allowed
        field types. za dictionaryÚprepopulated_fieldsz
admin.E026)rA   rB   r$   c             3   s2   | ]*\}}ˆ  ˆ |d ¡ˆ ˆ |d| ¡ V  qdS )r~   zprepopulated_fields["%s"]N)Ú_check_prepopulated_fields_keyÚ _check_prepopulated_fields_value)r%   rE   rv   )rB   r>   r   r   r&   ó  s   zBBaseModelAdminChecks._check_prepopulated_fields.<locals>.<genexpr>N)r+   r~   rh   rI   rG   r   rJ   rw   )r>   rB   r   )rB   r>   r   r:   ì  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)rL   rA   rB   r$   zyThe value of '%s' refers to '%s', which must not be a DateTimeField, a ForeignKey, a OneToOneField, or a ManyToManyField.z
admin.E028)rB   r$   N)rM   rN   rO   r	   rP   r+   r
   ÚDateTimeFieldrR   rk   r   r)   rY   )r>   rB   rE   r[   rL   r   r   r   r   ø  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)rA   rB   r$   c             3   s(   | ] \}}ˆ  ˆ|d ˆ |f ¡V  qdS )z%s[%r]N)Ú%_check_prepopulated_fields_value_item)r%   rD   Zsubfield_name)r[   rB   r>   r   r   r&     s   zHBaseModelAdminChecks._check_prepopulated_fields_value.<locals>.<genexpr>N)r+   rG   rH   rI   r   rJ   rK   )r>   rB   rv   r[   r   )r[   rB   r>   r   r€     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)rL   rA   rB   r$   N)rM   rN   rO   r	   rP   )r>   rB   rE   r[   r   r   r   r‚     s
    z:BaseModelAdminChecks._check_prepopulated_fields_value_itemc                sV   ˆ 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)rA   rB   r$   c             3   s$   | ]\}}ˆ  ˆ |d | ¡V  qdS )zordering[%d]N)Ú_check_ordering_item)r%   rD   rE   )rB   r>   r   r   r&   /  s   z7BaseModelAdminChecks._check_ordering.<locals>.<genexpr>)rƒ   r+   rG   rH   rI   r   rJ   rK   )r>   rB   r   )rB   r>   r   r<   %  s    
z$BaseModelAdminChecks._check_orderingc          	   C   sâ   t |ttjfƒr@t |tjƒs$| ¡ }t |jtjƒr<|jj}ng S |dkrlt|j	ƒdkrlt
jdd|jdd�gS |dkrxg S t|kr„g S | d¡rš|dd… }|d	kr¦g S 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. ú?rg   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)r'   rB   r$   ú-NÚpkz
admin.E033)rL   rA   rB   r$   )r+   r   r
   ZOrderByZascZ
expressionÚFÚnamera   rƒ   r   r)   rY   r   Ú
startswithrM   rN   rO   r	   rP   )r>   rB   rE   r[   r   r   r   r„   3  s2    


z)BaseModelAdminChecks._check_ordering_itemc                sV   ˆ 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 )	zA Check that readonly_fields refers to proper attribute or field. r   za list or tuplerj   z
admin.E034)rA   rB   r$   c             3   s$   | ]\}}ˆ  ˆ |d | ¡V  qdS )zreadonly_fields[%d]N)Ú_check_readonly_fields_item)r%   rD   rE   )rB   r>   r   r   r&   a  s   z>BaseModelAdminChecks._check_readonly_fields.<locals>.<genexpr>N)rj   r+   rG   rH   rI   r   rJ   rK   )r>   rB   r   )rB   r>   r   r=   X  s    
z+BaseModelAdminChecks._check_readonly_fieldsc             C   s~   t |ƒrg S t||ƒrg S t|j|ƒr*g S y|jj |¡ W n8 tk
rt   tjd||jj	|jjj
f |jdd�gS X g S d S )NzSThe value of '%s' is not a callable, an attribute of '%s', or an attribute of '%s'.z
admin.E035)rB   r$   )r|   ÚhasattrrM   rN   rO   r	   r   r)   rY   rW   r[   )r>   rB   rE   r[   r   r   r   r‹   e  s    
z0BaseModelAdminChecks._check_readonly_fields_itemN)rW   Ú
__module__Ú__qualname__r   r1   rC   r2   r]   r3   r4   rc   r_   ri   r5   r6   r7   r8   rq   r9   rt   ru   r;   r:   r   r€   r‚   r<   r„   r=   r‹   r   r   r   r   r0   ’   s6   + #

%r0   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d%d&„ Zd'd(„ Z‡  ZS ))ÚModelAdminChecksc                s~   t ƒ  |¡|  |¡|  |¡|  |¡|  |¡|  |¡|  |¡|  |¡|  	|¡|  
|¡|  |¡|  |¡|  |¡|  |¡|  |¡•S )N)Úsuperr   Ú_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Ú _check_action_permission_methodsÚ_check_actions_uniqueness)r>   r?   r    )rY   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)rA   rB   r$   N)r+   rŸ   r}   rI   )r>   rB   r   r   r   r‘   “  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)rA   rB   r$   N)r+   r    r}   rI   )r>   rB   r   r   r   r’   œ  s    
z#ModelAdminChecks._check_save_on_topc                sH   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)rA   rB   r$   c             3   s$   | ]\}}ˆ  ˆ |d | ¡V  qdS )zinlines[%d]N)Ú_check_inlines_item)r%   rD   Úitem)rB   r>   r   r   r&   ¬  s   z2ModelAdminChecks._check_inlines.<locals>.<genexpr>N)r+   r¡   rG   rH   rI   r   rJ   rK   )r>   rB   r   )rB   r>   r   r“   ¥  s
    zModelAdminChecks._check_inlinesc             C   sÂ   y|j d |j }W n( tk
r<   tjd| |jdd�gS X ddlm} t||ƒsltjd| |jdd�gS |j	sŠtjd| |jdd�gS t|j	t
jƒs¬td	d
| |dd�S ||j	|jƒ ¡ S dS )z Check one inline model admin. Ú.z*'%s' must inherit from 'InlineModelAdmin'.z
admin.E104)rB   r$   r   )ÚInlineModelAdminz#'%s' must have a 'model' attribute.z
admin.E105za Modelz%s.modelz
admin.E106)rA   rB   r$   N)r�   rW   ÚAttributeErrorr   r)   rY   r{   r¥   r   rM   r
   ZModelrI   rS   r   )r>   rB   Úinliner[   Zinline_labelr¥   r   r   r   r¢   °  s*    


z$ModelAdminChecks._check_inlines_itemc                sH   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)rA   rB   r$   c             3   s$   | ]\}}ˆ  ˆ |d | ¡V  qdS )zlist_display[%d]N)Ú_check_list_display_item)r%   rD   r£   )rB   r>   r   r   r&   Ü  s   z7ModelAdminChecks._check_list_display.<locals>.<genexpr>N)r+   r¨   rG   rH   rI   r   rJ   rK   )r>   rB   r   )rB   r>   r   r”   Ô  s
    z$ModelAdminChecks._check_list_displayc             C   s¶   t |ƒrg S t||ƒrg S y|jj |¡}W n` tk
rŒ   yt|j|ƒ}W n: tk
r†   tj	d|||j
j|jjjf |j
dd�gS X Y nX t|tjƒr²tj	d| |j
dd�gS g S )NzsThe value of '%s' refers to '%s', which is not a callable, an attribute of '%s', or an attribute or method on '%s'.z
admin.E108)rB   r$   z0The value of '%s' must not be a ManyToManyField.z
admin.E109)r|   rŒ   rM   rN   rO   r	   Úgetattrr¦   r   r)   rY   rW   r[   r+   r
   rk   )r>   rB   r£   r[   rL   r   r   r   r©   à  s,    


z)ModelAdminChecks._check_list_display_itemc                sp   ddl m} ˆ jdkrg S tˆ jttfƒs:tddˆ dd�S ˆ jj|jkrltt	 
‡ ‡fdd	„tˆ jƒD ƒ¡ƒS g S )
zK Check that list_display_links is a unique subset of list_display.
        r   )Ú
ModelAdminNza list, a tuple, or NoneÚlist_display_linksz
admin.E110)rA   rB   r$   c             3   s$   | ]\}}ˆ  ˆ |d | ¡V  qdS )zlist_display_links[%d]N)Ú_check_list_display_links_item)r%   rD   rE   )rB   r>   r   r   r&     s   z=ModelAdminChecks._check_list_display_links.<locals>.<genexpr>)r{   r«   r¬   r+   rG   rH   rI   Zget_list_displayÚ__func__r   rJ   rK   )r>   rB   r«   r   )rB   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)rB   r$   )r¨   r   r)   rY   )r>   rB   rE   r[   r   r   r   r­     s    

z/ModelAdminChecks._check_list_display_links_itemc                sH   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)rA   rB   r$   c             3   s$   | ]\}}ˆ  ˆ |d | ¡V  qdS )zlist_filter[%d]N)Ú_check_list_filter_item)r%   rD   r£   )rB   r>   r   r   r&   %  s   z6ModelAdminChecks._check_list_filter.<locals>.<genexpr>)r+   r¯   rG   rH   rI   r   rJ   rK   )r>   rB   r   )rB   r>   r   r–      s
    z#ModelAdminChecks._check_list_filterc          	   C   sî   ddl m}m} t|ƒrft|tjƒsft||ƒs>td||dd�S t	||ƒr`t
jd| |jdd�gS g S n„t|ttfƒr |\}}t||ƒsštd	d
| |dd�S g S nJ|}yt|j|ƒ 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   )ÚFieldListFilterÚ
ListFilterr²   z
admin.E113)rn   rA   rB   r$   z:The value of '%s' must not inherit from 'FieldListFilter'.z
admin.E114)rB   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²   r|   r+   r
   ZFieldr   ro   r   r   r)   rY   rH   rG   r   rM   r   r	   )r>   rB   r£   r[   r±   r²   rL   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)rA   rB   r$   N)r+   r³   r}   rG   rH   rI   )r>   rB   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)rA   rB   r$   N)r+   r´   ÚintrI   )r>   rB   r   r   r   r˜   d  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)rA   rB   r$   N)r+   r¶   rµ   rI   )r>   rB   r   r   r   r™   l  s    z)ModelAdminChecks._check_list_max_show_allc                sH   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)rA   rB   r$   c             3   s$   | ]\}}ˆ  ˆ |d | ¡V  qdS )zlist_editable[%d]N)Ú_check_list_editable_item)r%   rD   r£   )rB   r>   r   r   r&   |  s   z8ModelAdminChecks._check_list_editable.<locals>.<genexpr>N)r+   r·   rG   rH   rI   r   rJ   rK   )r>   rB   r   )rB   r>   r   rš   t  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r‚tjd| |jdd�gS |jd |krÂ|j	sÂ|j	d k	rÂtjd	||jd f |jd
d�gS |j
sätjd||f |jdd�gS g S d S )Nz
admin.E121)rL   rA   rB   r$   zKThe value of '%s' refers to '%s', which is not contained in 'list_display'.z
admin.E122)rB   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)rM   rN   rO   r	   rP   r¨   r   r)   rY   r¬   Úeditable)r>   rB   rE   r[   rL   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 tuplerZ   z
admin.E126)rA   rB   r$   N)r+   rZ   rG   rH   rI   )r>   rB   r   r   r   r›   ²  s    z%ModelAdminChecks._check_search_fieldsc          	   C   s~   |j dkrg S yt|j|j ƒd }W n. ttfk
rR   tjd|j  |jdd�gS X t|t	j
t	jfƒsvtdd|dd	�S g S dS )
zA Check that date_hierarchy refers to DateField or DateTimeField. NéÿÿÿÿzNThe value of 'date_hierarchy' refers to '%s', which does not refer to a Field.z
admin.E127)rB   r$   za DateField or DateTimeFieldÚdate_hierarchyz
admin.E128)rA   rB   r$   )r»   r   rM   r   r	   r   r)   rY   r+   r
   Z	DateFieldr�   rI   )r>   rB   rL   r   r   r   rœ   º  s    
z&ModelAdminChecks._check_date_hierarchyc       	   	   C   sz   |  ¡ }g }xh|D ]`\}}}t|dƒs(qxH|jD ]>}d| }t||ƒs0| tjd|jj||jf |jdd�¡ q0W qW |S )z 
        Actions with an allowed_permission attribute require the ModelAdmin to
        implement a has_<perm>_permission() method for each permission.
        Úallowed_permissionszhas_%s_permissionz/%s must define a %s() method for the %s action.z
admin.E129)rB   r$   )Ú_get_base_actionsrŒ   r¼   r(   r   r)   rY   rW   )	r>   rB   Úactionsr!   Úfuncr‰   Ú_Z
permissionÚmethod_namer   r   r   r�   Ñ  s"    

z1ModelAdminChecks._check_action_permission_methodsc             C   sb   g }t  dd„ | ¡ D ƒ¡}x@| ¡ D ]4\}}|dkr&| tjd|jj|f |jdd�¡ q&W |S )z.Check that every action has a unique __name__.c             s   s   | ]\}}}|V  qd S )Nr   )r%   rÀ   r‰   r   r   r   r&   î  s    z=ModelAdminChecks._check_actions_uniqueness.<locals>.<genexpr>rg   zS__name__ attributes of actions defined in %s must be unique. Name %r is not unique.z
admin.E130)rB   r$   )	ÚcollectionsÚCounterr½   rw   r(   r   r)   rY   rW   )r>   rB   r!   Únamesr‰   Úcountr   r   r   rž   ë  s    z*ModelAdminChecks._check_actions_uniqueness)rW   r�   rŽ   r   r‘   r’   r“   r¢   r”   r©   r•   r­   r–   r°   r—   r˜   r™   rš   r¸   r›   rœ   r�   rž   Ú__classcell__r   r   )rY   r   r�   ~  s(   		$!	32r�   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          	      sH   |j }tƒ  |¡|  ||¡|  ||¡|  |¡|  |¡|  |¡|  |¡•S )N)	Úparent_modelr�   r   Ú_check_relationÚ_check_exclude_of_parent_modelÚ_check_extraÚ_check_max_numÚ_check_min_numÚ_check_formset)r>   Z
inline_objr    rÈ   )rY   r   r   r   ÿ  s    


zInlineModelAdminChecks.checkc                sz   t ƒ  |¡}|rg S |  ||¡r$g S |jd kr2g S t||j|jd�}|j|jkrrtj	d|j|j
jf |jdd�gS g S d S )N)Úfk_namezVCannot exclude the field '%s', because it is the foreign key to the parent model '%s'.z
admin.E201)rB   r$   )r�   r5   rÉ   rl   r   rM   rÏ   r‰   r   r)   rN   r[   rY   )r>   rB   rÈ   r!   Zfk)rY   r   r   rÊ     s    

z5InlineModelAdminChecks._check_exclude_of_parent_modelc          
   C   sX   yt ||j|jd� W n8 tk
rN } ztj|jd |jdd�gS d }~X Y nX g S d S )N)rÏ   r   z
admin.E202)rB   r$   )r   rM   rÏ   Ú
ValueErrorr   r)   ÚargsrY   )r>   rB   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)rA   rB   r$   N)r+   rÓ   rµ   rI   )r>   rB   r   r   r   rË   0  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)rA   rB   r$   )rÔ   r+   rµ   rI   )r>   rB   r   r   r   rÌ   8  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)rA   rB   r$   )rÕ   r+   rµ   rI   )r>   rB   r   r   r   rÍ   B  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)rn   rA   rB   r$   N)r   rÖ   r   ro   )r>   rB   r   r   r   rÎ   L  s    z%InlineModelAdminChecks._check_formset)rW   r�   rŽ   r   rÊ   rÉ   rË   rÌ   rÍ   rÎ   rÆ   r   r   )rY   r   rÇ   ý  s   

rÇ   c             C   s   t jd|| f |j|d�gS )NzThe value of '%s' must be %s.)rB   r$   )r   r)   rY   )rX   rA   rB   r$   r   r   r   rI   U  s    
rI   c             C   s   t jd|| f |j|d�gS )Nz)The value of '%s' must inherit from '%s'.)rB   r$   )r   r)   rY   )rn   rA   rB   r$   r   r   r   ro   _  s    
ro   c             C   s$   t jd|| |jjjf |j|d�gS )NzDThe value of '%s' refers to '%s', which is not an attribute of '%s'.)rB   r$   )r   r)   rM   rN   r[   rY   )rL   rA   rB   r$   r   r   r   rP   i  s
    rP   ))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.db.models.constantsr   Zdjango.db.models.expressionsr   Zdjango.forms.modelsr   r   r   Zdjango.templater   Zdjango.template.backends.djangor   Zdjango.utils.module_loadingr   r   r   r#   r/   r0   r�   rÇ   rI   ro   rP   r   r   r   r   Ú<module>   s:   X   o   X

