B
    ¢0H[µ¤  ã               @   sö   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mZ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ƒZG dd„ deƒZG dd„ deƒZ dd„ Z!dd„ Z"dd„ Z#dS )é    )Úchain)Úapps)Úsettings)ÚNotRelationFieldÚflattenÚget_fields_from_path)Úchecks)ÚFieldDoesNotExist)Úmodels)Ú
LOOKUP_SEP)Ú
CombinableÚFÚOrderBy)ÚBaseModelFormÚBaseModelFormSetÚ_get_foreign_key)ÚEnginec             K   s2   ddl m} g }x|D ]}| | | ¡¡ qW |S )Nr   )Ú	all_sites)Zdjango.contrib.admin.sitesr   ÚextendÚcheck)Zapp_configsÚkwargsr   ÚerrorsÚsite© r   ú_C:\Users\HIRONO~1\AppData\Local\Temp\pip-install-6bm3nxem\django\django\contrib\admin\checks.pyÚcheck_admin_app   s
    
r   c              K   sx   g }t  d¡s&tjddd�}| |¡ yt ¡ }W n tk
rF   Y n.X d|jkrtdt	j
krttjddd�}| |¡ |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   Zget_defaultÚ	ExceptionZcontext_processorsr   ZAUTHENTICATION_BACKENDS)r   r   Z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d3d4„ Zd5d6„ Zd7S )8ÚBaseModelAdminChecksc             K   sØ   g }|  |  |¡¡ |  |  |¡¡ |  |  |¡¡ |  |  |¡¡ |  |  |¡¡ |  |  |¡¡ |  |  |¡¡ |  |  |¡¡ |  |  	|¡¡ |  |  
|¡¡ |  |  |¡¡ |  |  |¡¡ |  |  |¡¡ |S )N)r   Ú_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   r   D   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 | ]\}}ˆ  ˆ ˆ j|d | ¡‘qS )zautocomplete_fields[%d])Ú_check_autocomplete_fields_itemÚmodel)Ú.0ÚindexÚ
field_name)r3   r/   r   r   ú
<listcomp>]   s   zCBaseModelAdminChecks._check_autocomplete_fields.<locals>.<listcomp>N)Ú
isinstancer1   ÚlistÚtupleÚmust_ber   Úfrom_iterableÚ	enumerate)r/   r3   r   )r3   r/   r   r"   U   s
    z/BaseModelAdminChecks._check_autocomplete_fieldsc          
   C   sÌ   y|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)Úfieldr2   r5   r3   r   z%a foreign key or a many-to-many fieldz
admin.E038)r2   r3   r   NzXAn admin for model "%s" has to be registered to be referenced by %s.autocomplete_fields.z
admin.E039)r3   r   zR%s must define "search_fields", because it's referenced by %s.autocomplete_fields.z
admin.E040)Ú_metaÚ	get_fieldr	   Úrefer_to_missing_fieldÚmany_to_manyr:   r
   Ú
ForeignKeyr=   Ú
admin_siteÚ	_registryÚgetÚremote_fieldr5   r   r   Ú__name__ÚtypeÚ	__class__Úsearch_fields)r/   r3   r5   r8   Úlabelr@   Zrelated_adminr   r   r   r4   a   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)r2   r3   r   c             3   s(   | ] \}}ˆ  ˆ ˆ j|d | ¡V  qdS )zraw_id_fields[%d]N)Ú_check_raw_id_fields_itemr5   )r6   r7   r8   )r3   r/   r   r   ú	<genexpr>”   s   z<BaseModelAdminChecks._check_raw_id_fields.<locals>.<genexpr>N)r:   rO   r;   r<   r=   r   r>   r?   )r/   r3   r   )r3   r/   r   r#   Œ   s
    z)BaseModelAdminChecks._check_raw_id_fieldsc          
   C   s^   y|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)r@   r2   r5   r3   r   z%a foreign key or a many-to-many fieldz
admin.E003)r2   r3   r   N)	rA   rB   r	   rC   rD   r:   r
   rE   r=   )r/   r3   r5   r8   rN   r@   r   r   r   rP   ˜   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)r2   r3   r   z,Both 'fieldsets' and 'fields' are specified.z
admin.E005)r3   r   z2The value of 'fields' contains duplicate field(s).z
admin.E006c             3   s    | ]}ˆ  ˆ ˆ j|d ¡V  qdS )rR   N)Ú_check_field_specr5   )r6   r8   )r3   r/   r   r   rQ   Å   s   z5BaseModelAdminChecks._check_fields.<locals>.<genexpr>)rR   r:   r;   r<   r=   Ú	fieldsetsr   r   rL   r   ÚlenÚsetr   r>   )r/   r3   rR   r   )r3   r/   r   r$   ©   s$    



z"BaseModelAdminChecks._check_fieldsc                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 )zT Check that fieldsets is properly formatted and doesn't contain
        duplicates. Nza list or tuplerT   z
admin.E007)r2   r3   r   c             3   s(   | ] \}}ˆ  ˆ ˆ j|d | ¡V  qdS )zfieldsets[%d]N)Ú_check_fieldsets_itemr5   )r6   r7   Úfieldset)r3   r/   r   r   rQ   Ó   s   z8BaseModelAdminChecks._check_fieldsets.<locals>.<genexpr>)rT   r:   r;   r<   r=   r   r>   r?   )r/   r3   r   )r3   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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)r2   r3   r   é   zof length 2z
admin.E009é   za dictionaryz%s[1]z
admin.E010rR   z3The value of '%s[1]' must contain the key 'fields'.z
admin.E011)r3   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)rS   )r6   Zfieldset_fields)rN   r5   r3   r/   r   r   rQ   ö   s   z=BaseModelAdminChecks._check_fieldsets_item.<locals>.<genexpr>)r:   r;   r<   r=   rU   Údictr   r   rL   r   rV   r   r>   )r/   r3   r5   rX   rN   rR   r   )rN   r5   r3   r/   r   rW   ×   s,    

z*BaseModelAdminChecks._check_fieldsets_itemc                sD   t |tƒr0t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)r6   r7   r8   )rN   r5   r3   r/   r   r   rQ     s   z9BaseModelAdminChecks._check_field_spec.<locals>.<genexpr>N)r:   r<   r;   r   r>   r?   r\   )r/   r3   r5   rR   rN   r   )rN   r5   r3   r/   r   rS   ú   s
    
z&BaseModelAdminChecks._check_field_specc             C   sp   ||j krg S y|j |¡}W n tk
r2   g S X t|tjƒrh|jjjj	sht
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)r3   r   )Úreadonly_fieldsrA   rB   r	   r:   r
   ÚManyToManyFieldrI   ZthroughZauto_createdr   r   rL   )r/   r3   r5   r8   rN   r@   r   r   r   r\     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)r2   r3   r   z3The value of 'exclude' contains duplicate field(s).z
admin.E015)r3   r   )
r_   r:   r;   r<   r=   rU   rV   r   r   rL   )r/   r3   r   r   r   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)Úparentr2   r3   r   N)Ú
issubclassr`   r   Úmust_inherit_from)r/   r3   r   r   r   r'   5  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)r2   r3   r   c             3   s(   | ] \}}ˆ  ˆ ˆ j|d | ¡V  qdS )zfilter_vertical[%d]N)Ú_check_filter_itemr5   )r6   r7   r8   )r3   r/   r   r   rQ   C  s   z>BaseModelAdminChecks._check_filter_vertical.<locals>.<genexpr>N)r:   rd   r;   r<   r=   r   r>   r?   )r/   r3   r   )r3   r/   r   r(   =  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)r2   r3   r   c             3   s(   | ] \}}ˆ  ˆ ˆ j|d | ¡V  qdS )zfilter_horizontal[%d]N)re   r5   )r6   r7   r8   )r3   r/   r   r   rQ   M  s   z@BaseModelAdminChecks._check_filter_horizontal.<locals>.<genexpr>N)r:   rf   r;   r<   r=   r   r>   r?   )r/   r3   r   )r3   r/   r   r)   G  s
    z-BaseModelAdminChecks._check_filter_horizontalc          
   C   sR   y|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@   r2   r5   r3   r   za many-to-many fieldz
admin.E020)r2   r3   r   N)rA   rB   r	   rC   rD   r=   )r/   r3   r5   r8   rN   r@   r   r   r   re   Q  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)r2   r3   r   c             3   s6   | ].\}}ˆ  ˆ ˆ j|d ¡ˆ ˆ |d| ¡ V  qdS )rg   zradio_fields["%s"]N)Ú_check_radio_fields_keyr5   Ú_check_radio_fields_value)r6   r8   Úval)r3   r/   r   r   rQ   f  s   z;BaseModelAdminChecks._check_radio_fields.<locals>.<genexpr>N)r:   rg   r[   r=   r;   r   r>   Úitems)r/   r3   r   )r3   r/   r   r*   `  s
    z(BaseModelAdminChecks._check_radio_fieldsc          
   C   sj   y|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)r@   r2   r5   r3   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)r3   r   N)rA   rB   r	   rC   r:   r
   rE   Úchoicesr   r   rL   )r/   r3   r5   r8   rN   r@   r   r   r   rh   k  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)r3   r   N)Údjango.contrib.admin.optionsrm   rn   r   r   rL   )r/   r3   rj   rN   rm   rn   r   r   r   ri   ƒ  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)r3   r   )ÚcallableZview_on_siter:   Úboolr   r   rL   )r/   r3   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)r2   r3   r   c          	   3   s:   | ]2\}}ˆ  ˆ ˆ j|d ¡ˆ ˆ ˆ j|d| ¡ V  qdS )rr   zprepopulated_fields["%s"]N)Ú_check_prepopulated_fields_keyr5   Ú _check_prepopulated_fields_value)r6   r8   rj   )r3   r/   r   r   rQ   ¦  s   zBBaseModelAdminChecks._check_prepopulated_fields.<locals>.<genexpr>N)r:   rr   r[   r=   r;   r   r>   rk   )r/   r3   r   )r3   r/   r   r+   Ÿ  s
    z/BaseModelAdminChecks._check_prepopulated_fieldsc          
   C   sn   y|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@   r2   r5   r3   r   zyThe value of '%s' refers to '%s', which must not be a DateTimeField, a ForeignKey, a OneToOneField, or a ManyToManyField.z
admin.E028)r3   r   N)rA   rB   r	   rC   r:   r
   ÚDateTimeFieldrE   r^   r   r   rL   )r/   r3   r5   r8   rN   r@   r   r   r   rs   «  s    
z3BaseModelAdminChecks._check_prepopulated_fields_keyc                sH   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)r2   r3   r   c          	   3   s*   | ]"\}}ˆ  ˆˆ|d ˆ |f ¡V  qdS )z%s[%r]N)Ú%_check_prepopulated_fields_value_item)r6   r7   Zsubfield_name)rN   r5   r3   r/   r   r   rQ   Ê  s   zHBaseModelAdminChecks._check_prepopulated_fields_value.<locals>.<genexpr>N)r:   r;   r<   r=   r   r>   r?   )r/   r3   r5   rj   rN   r   )rN   r5   r3   r/   r   rt   Â  s
    z5BaseModelAdminChecks._check_prepopulated_fields_valuec          
   C   s<   y|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@   r2   r5   r3   r   N)rA   rB   r	   rC   )r/   r3   r5   r8   rN   r   r   r   rv   Î  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)r2   r3   r   c             3   s(   | ] \}}ˆ  ˆ ˆ j|d | ¡V  qdS )zordering[%d]N)Ú_check_ordering_itemr5   )r6   r7   r8   )r3   r/   r   r   rQ   ã  s   z7BaseModelAdminChecks._check_ordering.<locals>.<genexpr>)rw   r:   r;   r<   r=   r   r>   r?   )r/   r3   r   )r3   r/   r   r-   Ù  s    
z$BaseModelAdminChecks._check_orderingc          
   C   sÜ   t |ttfƒr:t |tƒs | ¡ }t |jtƒr6|jj}ng S |dkrft|jƒdkrft	j
dd|jdd�gS |dkrrg S t|kr~g S | d¡r”|dd… }|d	kr g S y|j |¡ W n" tk
rÒ   t||||d
d�S X g S dS )z2 Check that `ordering` refers to existing fields. ú?rZ   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hintr3   r   ú-NÚpkz
admin.E033)r@   r2   r5   r3   r   )r:   r   r   ZascZ
expressionr   ÚnamerU   rw   r   r   rL   r   Ú
startswithrA   rB   r	   rC   )r/   r3   r5   r8   rN   r   r   r   rx   ç  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 tupler]   z
admin.E034)r2   r3   r   c             3   s(   | ] \}}ˆ  ˆ ˆ j|d | ¡V  qdS )zreadonly_fields[%d]N)Ú_check_readonly_fields_itemr5   )r6   r7   r8   )r3   r/   r   r   rQ     s   z>BaseModelAdminChecks._check_readonly_fields.<locals>.<genexpr>N)r]   r:   r;   r<   r=   r   r>   r?   )r/   r3   r   )r3   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 |¡ 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)r3   r   )rp   ÚhasattrrA   rB   r	   r   r   rL   rJ   Ú	app_labelÚobject_name)r/   r3   r5   r8   rN   r   r   r   r~     s    

z0BaseModelAdminChecks._check_readonly_fields_itemN)rJ   Ú
__module__Ú__qualname__r   r"   r4   r#   rP   r$   r%   rW   rS   r\   r&   r'   r(   r)   re   r*   rh   ri   r,   r+   rs   rt   rv   r-   rx   r.   r~   r   r   r   r   r!   B   s6   + #

%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 ƒ  |¡}| |  |¡¡ | |  |¡¡ | |  |¡¡ | |  |¡¡ | |  |¡¡ | |  |¡¡ | |  	|¡¡ | |  
|¡¡ | |  |¡¡ | |  |¡¡ | |  |¡¡ | |  |¡¡ |S )N)Úsuperr   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/   r0   r   r   )rL   r   r   r   3  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)r2   r3   r   N)r:   r’   rq   r=   )r/   r3   r   r   r   r†   C  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)r2   r3   r   N)r:   r“   rq   r=   )r/   r3   r   r   r   r‡   L  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)r2   r3   r   c             3   s(   | ] \}}ˆ  ˆ ˆ j|d | ¡V  qdS )zinlines[%d]N)Ú_check_inlines_itemr5   )r6   r7   Úitem)r3   r/   r   r   rQ   \  s   z2ModelAdminChecks._check_inlines.<locals>.<genexpr>N)r:   r”   r;   r<   r=   r   r>   r?   )r/   r3   r   )r3   r/   r   rˆ   U  s
    zModelAdminChecks._check_inlinesc             C   s’   |j d |j }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
ƒs~td	d
| |dd�S |||jƒ ¡ S dS )z Check one inline model admin. Ú.r   )ÚInlineModelAdminz*'%s' must inherit from 'InlineModelAdmin'.z
admin.E104)r3   r   z#'%s' must have a 'model' attribute.z
admin.E105za Modelz%s.modelz
admin.E106)r2   r3   r   N)r‚   rJ   ro   r˜   rb   r   r   rL   r5   r
   ZModelr=   rF   r   )r/   r3   r5   ÚinlinerN   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)r2   r3   r   c             3   s(   | ] \}}ˆ  ˆ ˆ j|d | ¡V  qdS )zlist_display[%d]N)Ú_check_list_display_itemr5   )r6   r7   r–   )r3   r/   r   r   rQ   ƒ  s   z7ModelAdminChecks._check_list_display.<locals>.<genexpr>N)r:   rš   r;   r<   r=   r   r>   r?   )r/   r3   r   )r3   r/   r   r‰   {  s
    z$ModelAdminChecks._check_list_displayc             C   s,  t |ƒrg S t||ƒrg S t||ƒrÒy|j |¡}W n< tk
rp   yt||ƒ}W n tk
rj   d }Y nX Y nX |d kr¨tjd|||j	j
|jj|jjf |j	dd�gS t|tjƒrÌtjd| |j	dd�gS g S nVy|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)r3   r   z0The value of '%s' must not be a ManyToManyField.z
admin.E109)rp   r   rA   rB   r	   ÚgetattrÚAttributeErrorr   r   rL   rJ   r€   r�   r:   r
   r^   )r/   r3   r5   r–   rN   r@   r   r   r   r›   ‡  sB    



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)r2   r3   r   c             3   s$   | ]\}}ˆ  ˆ |d | ¡V  qdS )zlist_display_links[%d]N)Ú_check_list_display_links_item)r6   r7   r8   )r3   r/   r   r   rQ   Ê  s   z=ModelAdminChecks._check_list_display_links.<locals>.<genexpr>)ro   rž   rŸ   r:   r;   r<   r=   Zget_list_displayÚ__func__r   r>   r?   )r/   r3   rž   r   )r3   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)r3   r   )rš   r   r   rL   )r/   r3   r8   rN   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)r2   r3   r   c             3   s(   | ] \}}ˆ  ˆ ˆ j|d | ¡V  qdS )zlist_filter[%d]N)Ú_check_list_filter_itemr5   )r6   r7   r–   )r3   r/   r   r   rQ   â  s   z6ModelAdminChecks._check_list_filter.<locals>.<genexpr>)r:   r¢   r;   r<   r=   r   r>   r?   )r/   r3   r   )r3   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 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)ra   r2   r3   r   z:The value of '%s' must not inherit from 'FieldListFilter'.z
admin.E114)r3   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¥   rp   r:   r
   ZFieldrb   rc   r   r   rL   r<   r;   r   r   r	   )	r/   r3   r5   r–   rN   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)r2   r3   r   N)r:   r¦   rq   r;   r<   r=   )r/   r3   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)r2   r3   r   N)r:   r§   Úintr=   )r/   r3   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)r2   r3   r   N)r:   r©   r¨   r=   )r/   r3   r   r   r   rŽ   *  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)r2   r3   r   c             3   s(   | ] \}}ˆ  ˆ ˆ j|d | ¡V  qdS )zlist_editable[%d]N)Ú_check_list_editable_itemr5   )r6   r7   r–   )r3   r/   r   r   rQ   :  s   z8ModelAdminChecks._check_list_editable.<locals>.<genexpr>N)r:   rª   r;   r<   r=   r   r>   r?   )r/   r3   r   )r3   r/   r   r�   2  s
    z%ModelAdminChecks._check_list_editablec          
   C   sì   y|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)r@   r2   r5   r3   r   zKThe value of '%s' refers to '%s', which is not contained in 'list_display'.z
admin.E122)r3   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)
rA   rB   r	   rC   rš   r   r   rL   rŸ   Úeditable)r/   r3   r5   r8   rN   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 tuplerM   z
admin.E126)r2   r3   r   N)r:   rM   r;   r<   r=   )r/   r3   r   r   r   r�   p  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)r3   r   za DateField or DateTimeFieldÚdate_hierarchyz
admin.E128)r2   r3   r   )r®   r   r5   r   r	   r   r   rL   r:   r
   Z	DateFieldru   r=   )r/   r3   r@   r   r   r   r‘   x  s    
z&ModelAdminChecks._check_date_hierarchy)rJ   r‚   rƒ   r   r†   r‡   rˆ   r•   r‰   r›   rŠ   r    r‹   r£   rŒ   r�   rŽ   r�   r«   r�   r‘   Ú__classcell__r   r   )rL   r   r„   1  s$   		7	4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                sz   t ƒ  |¡}|j}| |  ||¡¡ | |  ||¡¡ | |  |¡¡ | |  |¡¡ | |  |¡¡ | |  	|¡¡ |S )N)
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±   )rL   r   r   r   ’  s    zInlineModelAdminChecks.checkc                s€   t ƒ  |¡}|rg S |  ||¡r$g S |jd kr2g S t||j|jd�}|j|jkrxt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)r3   r   )r…   r&   r²   r_   r   r5   r¸   r|   r   r   rA   r€   r�   rL   )r/   r3   r±   r   Zfk)rL   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)r3   r   )r   r5   r¸   Ú
ValueErrorr   r   ÚargsrL   )r/   r3   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)r2   r3   r   N)r:   r¼   r¨   r=   )r/   r3   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)r2   r3   r   )r½   r:   r¨   r=   )r/   r3   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)r2   r3   r   )r¾   r:   r¨   r=   )r/   r3   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)ra   r2   r3   r   N)rb   r¿   r   rc   )r/   r3   r   r   r   r·   Þ  s    z%InlineModelAdminChecks._check_formset)rJ   r‚   rƒ   r   r³   r²   r´   rµ   r¶   r·   r¯   r   r   )rL   r   r°   �  s   

r°   c             C   s   t jd|| f |j|d�gS )NzThe value of '%s' must be %s.)r3   r   )r   r   rL   )rK   r2   r3   r   r   r   r   r=   ç  s    
r=   c             C   s   t jd|| f |j|d�gS )Nz)The value of '%s' must inherit from '%s'.)r3   r   )r   r   rL   )ra   r2   r3   r   r   r   r   rc   ñ  s    
rc   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'.)r3   r   )r   r   rA   r€   r�   rL   )r@   r2   r5   r3   r   r   r   r   rC   û  s
    rC   N)$Ú	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   r   r   Zdjango.forms.modelsr   r   r   Zdjango.template.enginer   r   r    r!   r„   r°   r=   rc   rC   r   r   r   r   Ú<module>   s.   '   r  aW

