U
    8ÄT_o±  ã                   @   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(   zt | |ƒW S  tk
r"   Y 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-unpacked-wheel-dv63caxw/django/contrib/admin/checks.pyÚ_issubclass   s    r   c              	   C   sL   t | ƒ}|D ]:}zt |ƒ}W n tk
r4   Y qY nX t||ƒr dS q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   s.   ddl m} g }|D ]}| | | ¡¡ q|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}|D ].\}}t |¡s&| tjd| d| d�¡ q&t ¡ D ]}t	|t
ƒr^|j} q|q^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ƒ�s8| tjddd�¡ tdtjƒ�sZ| tjddd�¡ tdtjƒ�s|| tj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
admin.E410)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:   s~    

ÿý

ü
ÿ
þüÿüÿüýýýr0   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 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©ÚselfZ	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.
        ú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©rE   r@   r   r   Ú
<listcomp>¦   s   ÿzCBaseModelAdminChecks._check_autocomplete_fields.<locals>.<listcomp>N)r,   rB   ÚlistÚtupleÚmust_ber   Úfrom_iterableÚ	enumerate©r@   rE   r   rJ   r   r2   Ÿ   s
    þz/BaseModelAdminChecks._check_autocomplete_fieldsc              	   C   sÐ   z|j j |¡}W n$ tk
r6   t|||dd� Y S X |jsZt|tjƒsZt	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©ÚfieldrD   rE   r%   ú%a foreign key or a many-to-many fieldz
admin.E038rC   NzXAn admin for model "%s" has to be registered to be referenced by %s.autocomplete_fields.z
admin.E039©rE   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
   Ú
ForeignKeyrN   Ú
admin_siteÚ	_registryÚgetÚremote_fieldr   r*   Ú__name__ÚtypeÚ	__class__Úsearch_fields)r@   rE   rI   ÚlabelrS   Zrelated_adminr   r   r   rF   «   sF      þþÿùÿþÿùÿ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. rA   Úraw_id_fieldsz
admin.E001rC   c                 3   s$   | ]\}}ˆ  ˆ |d | ¡V  qdS )zraw_id_fields[%d]N)Ú_check_raw_id_fields_itemrG   rJ   r   r   r(   Ý   s   ÿz<BaseModelAdminChecks._check_raw_id_fields.<locals>.<genexpr>N)r,   re   rL   rM   rN   r   rO   rP   rQ   r   rJ   r   r3   Ö   s
    þz)BaseModelAdminChecks._check_raw_id_fieldsc              	   C   sb   z|j j |¡}W n$ tk
r6   t|||dd� Y S X |jsZt|tjƒsZt	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.E002rR   rT   z
admin.E003rC   N)
rV   rW   rX   r	   rY   rZ   r,   r
   r[   rN   ©r@   rE   rI   rd   rS   r   r   r   rf   â   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.
        NrA   Úfieldsz
admin.E004rC   z,Both 'fieldsets' and 'fields' are specified.z
admin.E005rU   z2The value of 'fields' contains duplicate field(s).z
admin.E006c                 3   s   | ]}ˆ  ˆ |d ¡V  qdS )rh   N©Ú_check_field_spec)r'   rI   rJ   r   r   r(     s   ÿz5BaseModelAdminChecks._check_fields.<locals>.<genexpr>)rh   r,   rL   rM   rN   Ú	fieldsetsr   r*   rb   r   ÚlenÚsetr   rO   )r@   rE   rh   r   rJ   r   r4   ñ   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. NrA   rk   z
admin.E007rC   c                 3   s&   | ]\}}ˆ  ˆ |d | ˆ¡V  qdS )zfieldsets[%d]N)Ú_check_fieldsets_item)r'   rH   Úfieldset©rE   Úseen_fieldsr@   r   r   r(     s   ÿz8BaseModelAdminChecks._check_fieldsets.<locals>.<genexpr>)rk   r,   rL   rM   rN   r   rO   rP   rQ   r   rp   r   r5     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. rA   z
admin.E008rC   é   zof length 2z
admin.E009é   úa dictionaryú%s[1]z
admin.E010rh   z3The value of '%s[1]' must contain the key 'fields'.z
admin.E011rU   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"]Nri   )r'   Zfieldset_fields©rd   rE   r@   r   r   r(   >  s   ÿz=BaseModelAdminChecks._check_fieldsets_item.<locals>.<genexpr>)r,   rL   rM   rN   rl   Údictr   r*   rb   r   r   rm   r   rO   )r@   rE   ro   rd   rq   r   rv   r   rn      s4    ýÿýÿ
þ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_itemrG   rv   r   r   r(   I  s   ÿz9BaseModelAdminChecks._check_field_spec.<locals>.<genexpr>N)r,   rM   rL   r   rO   rP   rx   )r@   rE   rh   rd   r   rv   r   rj   C  s
    
þ
z&BaseModelAdminChecks._check_field_specc                 C   sv   ||j krg S z|jj |¡}W n tk
r8   g  Y S X t|tjƒrn|jj	jj
snt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.E013rU   )Úreadonly_fieldsrV   rW   rX   r	   r,   r
   ÚManyToManyFieldr_   ZthroughZauto_createdr   r*   rb   rg   r   r   r   rx   P  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. NrA   Úexcludez
admin.E014rC   z3The value of 'exclude' contains duplicate field(s).z
admin.E015rU   )
r{   r,   rL   rM   rN   rl   rm   r   r*   rb   rQ   r   r   r   r6   l  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©ÚparentrD   rE   r%   N)r   r|   r   Úmust_inherit_fromrQ   r   r   r   r7   ~  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. rA   Úfilter_verticalz
admin.E017rC   c                 3   s$   | ]\}}ˆ  ˆ |d | ¡V  qdS )zfilter_vertical[%d]N©Ú_check_filter_itemrG   rJ   r   r   r(   ‹  s   ÿz>BaseModelAdminChecks._check_filter_vertical.<locals>.<genexpr>N)r,   r€   rL   rM   rN   r   rO   rP   rQ   r   rJ   r   r8   †  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. rA   Úfilter_horizontalz
admin.E018rC   c                 3   s$   | ]\}}ˆ  ˆ |d | ¡V  qdS )zfilter_horizontal[%d]Nr�   rG   rJ   r   r   r(   •  s   ÿz@BaseModelAdminChecks._check_filter_horizontal.<locals>.<genexpr>N)r,   rƒ   rL   rM   rN   r   rO   rP   rQ   r   rJ   r   r9   �  s
    þz-BaseModelAdminChecks._check_filter_horizontalc              	   C   sV   z|j j |¡}W n$ tk
r6   t|||dd� Y S X |jsNt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.E019rR   za many-to-many fieldz
admin.E020rC   N)rV   rW   rX   r	   rY   rZ   rN   rg   r   r   r   r‚   š  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. rt   Úradio_fieldsz
admin.E021rC   c                 3   s2   | ]*\}}ˆ  ˆ |d ¡ˆ ˆ |d| ¡ V  qdS )r„   zradio_fields["%s"]N)Ú_check_radio_fields_keyÚ_check_radio_fields_value©r'   rI   ÚvalrJ   r   r   r(   ­  s   þÿz;BaseModelAdminChecks._check_radio_fields.<locals>.<genexpr>N)r,   r„   rw   rN   rL   r   rO   ÚitemsrQ   r   rJ   r   r:   ¨  s
    ýz(BaseModelAdminChecks._check_radio_fieldsc              	   C   sn   z|j j |¡}W n$ tk
r6   t|||dd� Y S X t|tjƒsf|jsft	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.E022rR   zsThe value of '%s' refers to '%s', which is not an instance of ForeignKey, and does not have a 'choices' definition.z
admin.E023rU   N)rV   rW   rX   r	   rY   r,   r
   r[   Úchoicesr   r*   rb   rg   r   r   r   r…   ³  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.E024rU   N)Údjango.contrib.admin.optionsr‹   rŒ   r   r*   rb   )r@   rE   rˆ   rd   r‹   rŒ   r   r   r   r†   Ê  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.E025rU   )ÚcallableZview_on_siter,   Úboolr   r*   rb   rQ   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. rt   Úprepopulated_fieldsz
admin.E026rC   c                 3   s2   | ]*\}}ˆ  ˆ |d ¡ˆ ˆ |d| ¡ V  qdS )r�   zprepopulated_fields["%s"]N)Ú_check_prepopulated_fields_keyÚ _check_prepopulated_fields_valuer‡   rJ   r   r   r(   ì  s   þÿzBBaseModelAdminChecks._check_prepopulated_fields.<locals>.<genexpr>N)r,   r�   rw   rN   rL   r   rO   r‰   rQ   r   rJ   r   r;   æ  s
    ýz/BaseModelAdminChecks._check_prepopulated_fieldsc              	   C   sr   z|j j |¡}W n$ tk
r6   t|||dd� Y S X t|tjtjtj	fƒrjt
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.E027rR   zyThe value of '%s' refers to '%s', which must not be a DateTimeField, a ForeignKey, a OneToOneField, or a ManyToManyField.z
admin.E028rU   N)rV   rW   rX   r	   rY   r,   r
   ÚDateTimeFieldr[   rz   r   r*   rb   rg   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. rA   z
admin.E029rC   c                 3   s(   | ] \}}ˆ  ˆ|d ˆ |f ¡V  qdS )z%s[%r]N)Ú%_check_prepopulated_fields_value_item)r'   rH   Zsubfield_namerv   r   r   r(     s   ÿzHBaseModelAdminChecks._check_prepopulated_fields_value.<locals>.<genexpr>N)r,   rL   rM   rN   r   rO   rP   )r@   rE   rˆ   rd   r   rv   r   r’     s
    þz5BaseModelAdminChecks._check_prepopulated_fields_valuec              	   C   s@   z|j j |¡ W n$ tk
r6   t|||dd� Y S X g S dS )z[ For `prepopulated_fields` equal to {"slug": ("title",)},
        `field_name` is "title". z
admin.E030rR   N)rV   rW   rX   r	   rY   ©r@   rE   rI   rd   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. NrA   Úorderingz
admin.E031rC   c                 3   s$   | ]\}}ˆ  ˆ |d | ¡V  qdS )zordering[%d]N)Ú_check_ordering_itemrG   rJ   r   r   r(   (  s   ÿz7BaseModelAdminChecks._check_ordering.<locals>.<genexpr>)r–   r,   rL   rM   rN   r   rO   rP   rQ   r   rJ   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 z|jj |¡ W n$ tk
rÜ   t|||d
d� Y S X g S dS )z2 Check that `ordering` refers to existing fields. ú?rs   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)ÚhintrE   r%   ú-NÚpkz
admin.E033rR   )r,   r   r
   ZOrderByZascZ
expressionÚFÚnamerl   r–   r   r*   rb   r   Ú
startswithrV   rW   rX   r	   rY   r•   r   r   r   r—   -  s6    
ûÿ	
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   rA   ry   z
admin.E034rC   c                 3   s$   | ]\}}ˆ  ˆ |d | ¡V  qdS )zreadonly_fields[%d]N)Ú_check_readonly_fields_itemrG   rJ   r   r   r(   Z  s   ÿz>BaseModelAdminChecks._check_readonly_fields.<locals>.<genexpr>N)ry   r,   rL   rM   rN   r   rO   rP   rQ   r   rJ   r   r>   R  s    
þz+BaseModelAdminChecks._check_readonly_fieldsc                 C   s‚   t |ƒrg S t||ƒrg S t|j|ƒr*g S z|jj |¡ W n< tk
rx   tjd||jj	|jjj
f |jdd�g Y 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.E035rU   )rŽ   ÚhasattrrV   rW   rX   r	   r   r*   rb   r`   rd   r•   r   r   r   rŸ   _  s*    
  ÿÿúÿ
z0BaseModelAdminChecks._check_readonly_fields_itemN)r`   Ú
__module__Ú__qualname__r    r2   rF   r3   rf   r4   r5   rn   rj   rx   r6   r7   r8   r9   r‚   r:   r…   r†   r<   r;   r‘   r’   r”   r=   r—   r>   rŸ   r   r   r   r   r1   Œ   s6   + #

%r1   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 r&   )Ú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_uniquenessr?   ©rb   r   r   r    z  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. ú	a booleanÚsave_asz
admin.E101rC   N)r,   rµ   r�   rN   rQ   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. r´   Úsave_on_topz
admin.E102rC   N)r,   r¶   r�   rN   rQ   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. rA   Úinlinesz
admin.E103rC   c                 3   s$   | ]\}}ˆ  ˆ |d | ¡V  qdS )zinlines[%d]N)Ú_check_inlines_item©r'   rH   ÚitemrJ   r   r   r(   ¥  s   ÿz2ModelAdminChecks._check_inlines.<locals>.<genexpr>N)r,   r·   rL   rM   rN   r   rO   rP   rQ   r   rJ   r   r§   Ÿ  s
    þzModelAdminChecks._check_inlinesc                 C   sÆ   z|j d |j }W n, tk
r@   tjd| |jdd�g Y S X ddlm} t||ƒspt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.E104rU   r   )ÚInlineModelAdminz#'%s' must have a 'model' attribute.z
admin.E105za Modelz%s.modelz
admin.E106rC   N)r¡   r`   ÚAttributeErrorr   r*   rb   r�   r¼   r   rV   r
   ZModelrN   r\   r    )r@   rE   Úinlinerd   Zinline_labelr¼   r   r   r   r¸   ª  s6    ýÿ

ýÿýÿ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.
        rA   Úlist_displayz
admin.E107rC   c                 3   s$   | ]\}}ˆ  ˆ |d | ¡V  qdS )zlist_display[%d]N)Ú_check_list_display_itemr¹   rJ   r   r   r(   Õ  s   ÿz7ModelAdminChecks._check_list_display.<locals>.<genexpr>N)r,   r¿   rL   rM   rN   r   rO   rP   rQ   r   rJ   r   r¨   Î  s
    þz$ModelAdminChecks._check_list_displayc                 C   s¾   t |ƒrg S t||ƒrg S z|jj |¡}W nh tk
r”   zt|j|ƒ}W nB tk
rŽ   tj	d|||j
j|jjjf |j
dd�g Y  Y 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.E108rU   z0The value of '%s' must not be a ManyToManyField.z
admin.E109)rŽ   r    rV   rW   rX   r	   Úgetattrr½   r   r*   rb   r`   rd   r,   r
   rz   )r@   rE   rº   rd   rS   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.E110rC   c                 3   s$   | ]\}}ˆ  ˆ |d | ¡V  qdS )zlist_display_links[%d]N)Ú_check_list_display_links_itemrG   rJ   r   r   r(     s   ÿz=ModelAdminChecks._check_list_display_links.<locals>.<genexpr>)r�   rÂ   rÃ   r,   rL   rM   rN   Zget_list_displayÚ__func__r   rO   rP   )r@   rE   rÂ   r   rJ   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.E111rU   )r¿   r   r*   rb   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 )NrA   Úlist_filterz
admin.E112rC   c                 3   s$   | ]\}}ˆ  ˆ |d | ¡V  qdS )zlist_filter[%d]N)Ú_check_list_filter_itemr¹   rJ   r   r   r(     s   ÿz6ModelAdminChecks._check_list_filter.<locals>.<genexpr>)r,   rÆ   rL   rM   rN   r   rO   rP   rQ   r   rJ   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 nN|}zt|j|ƒ W n4 ttfk
rè   t
jd||f |jdd�g Y 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.E113r}   z:The value of '%s' must not inherit from 'FieldListFilter'.z
admin.E114rU   rÉ   ru   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   r   r   r   r*   rb   rM   rL   r   rV   r   r	   )r@   rE   rº   rd   rÈ   rÉ   rS   Zlist_filter_classr   r   r   rÇ   #  s>    	
 ÿ
ýÿ

ýÿ
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.E117rC   N)r,   rÊ   r�   rL   rM   rN   rQ   r   r   r   r«   W  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. ú
an integerÚlist_per_pagez
admin.E118rC   N)r,   rÌ   ÚintrN   rQ   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. rË   Úlist_max_show_allz
admin.E119rC   N)r,   rÎ   rÍ   rN   rQ   r   r   r   r­   g  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. rA   Úlist_editablez
admin.E120rC   c                 3   s$   | ]\}}ˆ  ˆ |d | ¡V  qdS )zlist_editable[%d]N)Ú_check_list_editable_itemr¹   rJ   r   r   r(   v  s   ÿz8ModelAdminChecks._check_list_editable.<locals>.<genexpr>N)r,   rÏ   rL   rM   rN   r   rO   rP   rQ   r   rJ   r   r®   o  s
    þz%ModelAdminChecks._check_list_editablec              	   C   sð   z|j j |¡}W n$ tk
r6   t|||dd� Y S X ||jkr^t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.E121rR   zKThe value of '%s' refers to '%s', which is not contained in 'list_display'.z
admin.E122rU   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)rV   rW   rX   r	   rY   r¿   r   r*   rb   rÃ   Úeditablerg   r   r   r   rÐ   {  sX    
ÿüÿýÿ	ÿ ÿÿúÿ
 ÿûÿ
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. rA   rc   z
admin.E126rC   N)r,   rc   rL   rM   rN   rQ   r   r   r   r¯   ­  s    z%ModelAdminChecks._check_search_fieldsc              	   C   s‚   |j dkrg S zt|j|j ƒd }W n2 ttfk
rV   tjd|j  |jdd�g Y S X t|t	j
t	jfƒszt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.E127rU   za DateField or DateTimeFieldÚdate_hierarchyz
admin.E128rC   )rÓ   r   rV   r   r	   r   r*   rb   r,   r
   Z	DateFieldr“   rN   )r@   rE   rS   r   r   r   r°   µ  s     
ÿüÿ
	z&ModelAdminChecks._check_date_hierarchyc           	   	   C   sr   |  ¡ }g }|D ]\\}}}t|dƒs&q|jD ]>}d| }t||ƒs,| tjd|jj||jf |jdd�¡ q,q|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.E129rU   )Ú_get_base_actionsr    rÔ   r)   r   r*   rb   r`   )	r@   rE   Úactionsr"   Úfuncr�   Ú_Z
permissionÚmethod_namer   r   r   r±   Ì  s(    


ýùÿz1ModelAdminChecks._check_action_permission_methodsc                 C   s^   g }t  dd„ | ¡ D ƒ¡}| ¡ D ]4\}}|dkr$| tjd|jj|f |jdd�¡ q$|S )z.Check that every action has a unique __name__.c                 s   s   | ]\}}}|V  qd S r&   r   )r'   rØ   r�   r   r   r   r(   é  s     z=ModelAdminChecks._check_actions_uniqueness.<locals>.<genexpr>rs   zS__name__ attributes of actions defined in %s must be unique. Name %r is not unique.z
admin.E130rU   )	ÚcollectionsÚCounterrÕ   r‰   r)   r   r*   rb   r`   )r@   rE   r"   Únamesr�   Úcountr   r   r   r²   æ  s    þÿù
	z*ModelAdminChecks._check_actions_uniqueness)r`   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   r³   r   r£   x  s(   		$!	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              	      sH   |j }tƒ  |¡|  ||¡|  ||¡|  |¡|  |¡|  |¡|  |¡•S r&   )	Ú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à   r³   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.E201rU   )r¤   r6   rá   r{   r   rV   rè   r�   r   r*   rW   rd   rb   )r@   rE   rà   r"   Zfkr³   r   r   râ     s(    
 ÿÿúÿz5InlineModelAdminChecks._check_exclude_of_parent_modelc              
   C   s`   zt ||j|jd� W n@ tk
rV } z"tj|jd |jdd�g W Y ¢S d }~X Y nX g S d S )Nrç   r   z
admin.E202rU   )r   rV   rè   Ú
ValueErrorr   r*   Úargsrb   )r@   rE   rà   Úer   r   r   rá   #  s
    0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. rË   Úextraz
admin.E203rC   N)r,   rì   rÍ   rN   rQ   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. NrË   Úmax_numz
admin.E204rC   )rí   r,   rÍ   rN   rQ   r   r   r   rä   3  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. NrË   Úmin_numz
admin.E205rC   )rî   r,   rÍ   rN   rQ   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.E206r}   N)r   rï   r   r   rQ   r   r   r   ræ   G  s    z%InlineModelAdminChecks._check_formset)r`   r¡   r¢   r    râ   rá   rã   rä   rå   ræ   rÞ   r   r   r³   r   rß   ø  s   

rß   c                 C   s   t jd|| f |j|d�gS )NzThe value of '%s' must be %s.rU   ©r   r*   rb   )ra   rD   rE   r%   r   r   r   rN   P  s    
ýÿrN   c                 C   s   t jd|| f |j|d�gS )Nz)The value of '%s' must inherit from '%s'.rU   rð   r}   r   r   r   r   Z  s    
ýÿr   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'.rU   )r   r*   rV   rW   rd   rb   rR   r   r   r   rY   d  s    ÿüÿrY   ))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$   r0   r1   r£   rß   rN   r   rY   r   r   r   r   Ú<module>   s:   R   o   X

