a
    ¦Q•hvÂ  ã                   @   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y    Y dS 0 dS )zX
    issubclass() variant that doesn't raise an exception if cls isn't a
    class.
    FN)Ú
issubclassÚ	TypeError)ÚclsZ	classinfo© r   úT/var/www/sistema_ama/venv/lib/python3.9/site-packages/django/contrib/admin/checks.pyÚ_issubclass   s    r   c              	   C   sJ   t | ƒ}|D ]8}zt |ƒ}W n ty2   Y qY n0 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)Úapp_configsÚkwargsr   ÚerrorsÚsiter   r   r   Úcheck_admin_app.   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vrÀtdtjƒrÀ| tjddd�¡ d|jvrÞ| tjddd�¡ tdd„ |D ƒƒ}|�rd|jv�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 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>z   ó    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   Úis_installedÚappendr   ÚErrorr   ÚallÚ
isinstancer   ÚengineÚcontext_processorsr   r   ÚAUTHENTICATION_BACKENDSÚanyÚWarningÚ
MIDDLEWARE)	r"   r   r#   Zapp_dependenciesÚapp_nameÚ
error_coder1   Zdjango_templates_instanceZsidebar_enabledr   r   r   Úcheck_dependencies7   s¼    

ÿýÿ
üÿ
ÿÿþýüÿ	ÿÿüÿÿÿþüÿ	ÿýÿÿýÿÿ÷ÿr9   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 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    ±   s6    ÿþýüûúùø	÷
öõôó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©rN   rI   r   r   Ú
<listcomp>Ð   s   ý
ÿzCBaseModelAdminChecks._check_autocomplete_fields.<locals>.<listcomp>N)r0   rK   ÚlistÚtupleÚmust_ber   Úfrom_iterableÚ	enumerate©rI   rN   r   rS   r   r;   Â   s    üüÿÿz/BaseModelAdminChecks._check_autocomplete_fieldsc              	   C   sÎ   z|j j |¡}W n" ty4   t|||dd� Y S 0 |jsXt|tjƒsXt	d||dd�S |j
j |jj ¡}|du 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©ÚfieldrM   rN   r&   ú%a foreign key or a many-to-many fieldz
admin.E038rL   NzXAn admin for model "%s" has to be registered to be referenced by %s.autocomplete_fields.z
admin.E039©rN   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_manyr0   r
   Ú
ForeignKeyrW   Ú
admin_siteÚ	_registryÚgetÚremote_fieldr   r.   Ú__name__ÚtypeÚ	__class__Úsearch_fields)rI   rN   rR   Úlabelr\   Úrelated_adminr   r   r   rO   Ù   sJ    ÿüþþøÿþþøÿ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 )zZCheck that `raw_id_fields` only contains field names that are listed
        on the model.rJ   Úraw_id_fieldsz
admin.E001rL   c                 3   s$   | ]\}}ˆ  ˆ |d | ¡V  qdS )zraw_id_fields[%d]N)Ú_check_raw_id_fields_itemrP   rS   r   r   r)     s   ý
ÿz<BaseModelAdminChecks._check_raw_id_fields.<locals>.<genexpr>N)r0   ro   rU   rV   rW   r   rX   rY   rZ   r   rS   r   r<   
  s    ÿüÿz)BaseModelAdminChecks._check_raw_id_fieldsc              	   C   sz   z|j j |¡}W n" ty4   t|||dd� Y S 0 |j|krPt|||dd�S |jsrt|tj	ƒsrt
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.E002r[   r]   z
admin.E003rL   N)r_   r`   ra   r	   rb   Únamerc   r0   r
   rd   rW   ©rI   rN   rR   rm   r\   r   r   r   rp     s*    ÿ
üüz.BaseModelAdminChecks._check_raw_id_fields_itemc                    sš   ˆ j du 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.
        NrJ   Úfieldsz
admin.E004rL   z,Both 'fieldsets' and 'fields' are specified.z
admin.E005r^   z2The value of 'fields' contains duplicate field(s).z
admin.E006c                 3   s   | ]}ˆ  ˆ |d ¡V  qdS )rs   N©Ú_check_field_spec)r(   rR   rS   r   r   r)   V  s   ÿz5BaseModelAdminChecks._check_fields.<locals>.<genexpr>)rs   r0   rU   rV   rW   Ú	fieldsetsr   r.   rk   r   ÚlenÚsetr   rX   )rI   rN   rs   r   rS   r   r=   :  s0    
ýÿ
ýÿþÿz"BaseModelAdminChecks._check_fieldsc                    s\   ˆ j du 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 )zRCheck that fieldsets is properly formatted and doesn't contain
        duplicates.NrJ   rv   z
admin.E007rL   c                 3   s&   | ]\}}ˆ  ˆ |d | ˆ¡V  qdS )zfieldsets[%d]N)Ú_check_fieldsets_item)r(   rQ   Úfieldset©rN   Úseen_fieldsrI   r   r   r)   i  s   ýÿz8BaseModelAdminChecks._check_fieldsets.<locals>.<genexpr>)rv   r0   rU   rV   rW   r   rX   rY   rZ   r   r{   r   r>   \  s    
ÿüÿz%BaseModelAdminChecks._check_fieldsetsc                    s  t |ttfƒstdˆ ˆdd�S t|ƒdkr:tdˆ ˆdd�S t |d tƒs\tdd	ˆ  ˆd
d�S d|d v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.rJ   z
admin.E008rL   é   zof length 2z
admin.E009é   úa dictionaryú%s[1]z
admin.E010rs   z3The value of '%s[1]' must contain the key 'fields'.z
admin.E011r^   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"]Nrt   )r(   Zfieldset_fields©rm   rN   rI   r   r   r)   —  s   ÿz=BaseModelAdminChecks._check_fieldsets_item.<locals>.<genexpr>)r0   rU   rV   rW   rw   Údictr   r.   rk   r   r   rx   r   rX   )rI   rN   rz   rm   r|   r   r�   r   ry   q  sF    ÿýÿüýÿ
þÿ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_itemrP   r�   r   r   r)   ¤  s   ýÿz9BaseModelAdminChecks._check_field_spec.<locals>.<genexpr>N)r0   rV   rU   r   rX   rY   rƒ   )rI   rN   rs   rm   r   r�   r   ru   �  s    
üÿ	z&BaseModelAdminChecks._check_field_specc                 C   st   ||j v rg S z|jj |¡}W n ty6   g  Y S 0 t|tjƒrl|jj	jj
slt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.E013r^   )Úreadonly_fieldsr_   r`   ra   r	   r0   r
   ÚManyToManyFieldrh   ÚthroughÚauto_createdr   r.   rk   rr   r   r   r   rƒ   ®  s&    


ÿ
þþûÿ
z+BaseModelAdminChecks._check_field_spec_itemc                 C   sb   |j du 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 )	z4Check that exclude is a sequence without duplicates.NrJ   Úexcludez
admin.E014rL   z3The value of 'exclude' contains duplicate field(s).z
admin.E015r^   )
rˆ   r0   rU   rV   rW   rw   rx   r   r.   rk   rZ   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©ÚparentrM   rN   r&   N)r   r‰   r   Úmust_inherit_fromrZ   r   r   r   r@   à  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 )z8Check that filter_vertical is a sequence of field names.rJ   Úfilter_verticalz
admin.E017rL   c                 3   s$   | ]\}}ˆ  ˆ |d | ¡V  qdS )zfilter_vertical[%d]N©Ú_check_filter_itemrP   rS   r   r   r)   ñ  s   ý
ÿz>BaseModelAdminChecks._check_filter_vertical.<locals>.<genexpr>N)r0   r�   rU   rV   rW   r   rX   rY   rZ   r   rS   r   rA   é  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.rJ   Úfilter_horizontalz
admin.E018rL   c                 3   s$   | ]\}}ˆ  ˆ |d | ¡V  qdS )zfilter_horizontal[%d]NrŽ   rP   rS   r   r   r)     s   ý
ÿz@BaseModelAdminChecks._check_filter_horizontal.<locals>.<genexpr>N)r0   r�   rU   rV   rW   r   rX   rY   rZ   r   rS   r   rB   ù  s    ÿüÿz-BaseModelAdminChecks._check_filter_horizontalc              	   C   sT   z|j j |¡}W n" ty4   t|||dd� Y S 0 |jsLt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.E019r[   za many-to-many fieldz
admin.E020rL   N)r_   r`   ra   r	   rb   rc   rW   rr   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.r   Úradio_fieldsz
admin.E021rL   c                 3   s2   | ]*\}}ˆ  ˆ |d ¡ˆ ˆ |d| ¡ V  qdS )r‘   zradio_fields["%s"]N)Ú_check_radio_fields_keyÚ_check_radio_fields_value©r(   rR   ÚvalrS   r   r   r)   #  s   ü
ÿÿz;BaseModelAdminChecks._check_radio_fields.<locals>.<genexpr>N)r0   r‘   r‚   rW   rU   r   rX   ÚitemsrZ   r   rS   r   rC     s    ÿûÿz(BaseModelAdminChecks._check_radio_fieldsc              	   C   sl   z|j j |¡}W n" ty4   t|||dd� Y S 0 t|tjƒsd|jsdt	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.E022r[   zsThe value of '%s' refers to '%s', which is not an instance of ForeignKey, and does not have a 'choices' definition.z
admin.E023r^   N)r_   r`   ra   r	   rb   r0   r
   rd   Úchoicesr   r.   rk   rr   r   r   r   r’   ,  s     ÿþûÿ
z,BaseModelAdminChecks._check_radio_fields_keyc                 C   s<   ddl m}m} |||fvr4tjd| |jdd�gS g S dS )z3Check type of a value of `radio_fields` dictionary.r   )Ú
HORIZONTALÚVERTICALzDThe value of '%s' must be either admin.HORIZONTAL or admin.VERTICAL.z
admin.E024r^   N)Údjango.contrib.admin.optionsr˜   r™   r   r.   rk   )rI   rN   r•   rm   r˜   r™   r   r   r   r“   D  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.E025r^   )ÚcallableÚview_on_siter0   Úboolr   r.   rk   rZ   r   r   r   rE   U  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 )zXCheck that `prepopulated_fields` is a dictionary containing allowed
        field types.r   Úprepopulated_fieldsz
admin.E026rL   c                 3   s2   | ]*\}}ˆ  ˆ |d ¡ˆ ˆ |d| ¡ V  qdS )rž   zprepopulated_fields["%s"]N)Ú_check_prepopulated_fields_keyÚ _check_prepopulated_fields_valuer”   rS   r   r   r)   k  s   úÿ
ÿýzBBaseModelAdminChecks._check_prepopulated_fields.<locals>.<genexpr>N)r0   rž   r‚   rW   rU   r   rX   r–   rZ   r   rS   r   rD   b  s    ÿùÿz/BaseModelAdminChecks._check_prepopulated_fieldsc              	   C   sp   z|j j |¡}W n" ty4   t|||dd� Y S 0 t|tjtjtj	fƒrht
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.E027r[   zyThe value of '%s' refers to '%s', which must not be a DateTimeField, a ForeignKey, a OneToOneField, or a ManyToManyField.z
admin.E028r^   N)r_   r`   ra   r	   rb   r0   r
   ÚDateTimeFieldrd   r…   r   r.   rk   rr   r   r   r   rŸ   v  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 )zdCheck a value of `prepopulated_fields` dictionary, i.e. it's an
        iterable of existing fields.rJ   z
admin.E029rL   c                 3   s(   | ] \}}ˆ  ˆ|d ˆ |f ¡V  qdS )z%s[%r]N)Ú%_check_prepopulated_fields_value_item)r(   rQ   Zsubfield_namer�   r   r   r)   ™  s   ýÿzHBaseModelAdminChecks._check_prepopulated_fields_value.<locals>.<genexpr>N)r0   rU   rV   rW   r   rX   rY   )rI   rN   r•   rm   r   r�   r   r    ‘  s    üÿz5BaseModelAdminChecks._check_prepopulated_fields_valuec              	   C   s>   z|j j |¡ W n" ty4   t|||dd� Y S 0 g S dS )zYFor `prepopulated_fields` equal to {"slug": ("title",)},
        `field_name` is "title".z
admin.E030r[   N)r_   r`   ra   r	   rb   ©rI   rN   rR   rm   r   r   r   r¢   ¡  s    ÿz:BaseModelAdminChecks._check_prepopulated_fields_value_itemc                    sV   ˆ j du 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.NrJ   Úorderingz
admin.E031rL   c                 3   s$   | ]\}}ˆ  ˆ |d | ¡V  qdS )zordering[%d]N)Ú_check_ordering_itemrP   rS   r   r   r)   º  s   ÿz7BaseModelAdminChecks._check_ordering.<locals>.<genexpr>)r¤   r0   rU   rV   rW   r   rX   rY   rZ   r   rS   r   rF   ®  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|v r„g S | d¡rš|dd… }|d	kr¦g S z|jj |¡ W n" tyÚ   t|||d
d� Y S 0 g S dS )z0Check that `ordering` refers to existing fields.ú?r~   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+   rN   r&   ú-NÚpkz
admin.E033r[   )r0   r   r
   ÚOrderByÚascÚ
expressionÚFrq   rw   r¤   r   r.   rk   r   Ú
startswithr_   r`   ra   r	   rb   r£   r   r   r   r¥   À  s:    
ûÿ	
ÿ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 )	z?Check that readonly_fields refers to proper attribute or field.r   rJ   r„   z
admin.E034rL   c                 3   s$   | ]\}}ˆ  ˆ |d | ¡V  qdS )zreadonly_fields[%d]N)Ú_check_readonly_fields_itemrP   rS   r   r   r)   ò  s   ý
ÿz>BaseModelAdminChecks._check_readonly_fields.<locals>.<genexpr>N)r„   r0   rU   rV   rW   r   rX   rY   rZ   r   rS   r   rG   ç  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yv   tjd||jj	|jjj
f |jdd�g Y S 0 g S d S )NzSThe value of '%s' is not a callable, an attribute of '%s', or an attribute of '%s'.z
admin.E035r^   )r›   Úhasattrr_   r`   ra   r	   r   r.   rk   ri   rm   r£   r   r   r   r®   ú  s*    
ýþ÷ÿ
z0BaseModelAdminChecks._check_readonly_fields_itemN)ri   Ú
__module__Ú__qualname__r    r;   rO   r<   rp   r=   r>   ry   ru   rƒ   r?   r@   rA   rB   r�   rC   r’   r“   rE   rD   rŸ   r    r¢   rF   r¥   rG   r®   r   r   r   r   r:   °   s6   1",	'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d%d&„ Zd'd(„ Z‡  ZS ))ÚModelAdminChecksc                    sœ   g 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_uniquenessrH   ©rk   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.ú	a booleanÚsave_asz
admin.E101rL   N)r0   rÄ   r�   rW   rZ   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.E102rL   N)r0   rÅ   r�   rW   rZ   r   r   r   rµ   2  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.rJ   Úinlinesz
admin.E103rL   c                 3   s$   | ]\}}ˆ  ˆ |d | ¡V  qdS )zinlines[%d]N)Ú_check_inlines_item©r(   rQ   ÚitemrS   r   r   r)   C  s   ÿz2ModelAdminChecks._check_inlines.<locals>.<genexpr>N)r0   rÆ   rU   rV   rW   r   rX   rY   rZ   r   rS   r   r¶   :  s    ÿþÿzModelAdminChecks._check_inlinesc                 C   sÄ   z|j d |j }W n* ty>   tjd| |jdd�g Y S 0 ddlm} t||ƒsnt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.E104r^   r   )ÚInlineModelAdminz#'%s' must have a 'model' attribute.z
admin.E105za Modelz%s.modelz
admin.E106rL   N)r°   ri   ÚAttributeErrorr   r.   rk   rš   rË   r   r_   r
   ÚModelrW   re   r    )rI   rN   Úinlinerm   Zinline_labelrË   r   r   r   rÇ   I  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 )zBCheck that list_display only contains fields or usable attributes.rJ   Úlist_displayz
admin.E107rL   c                 3   s$   | ]\}}ˆ  ˆ |d | ¡V  qdS )zlist_display[%d]N)Ú_check_list_display_itemrÈ   rS   r   r   r)   x  s   ÿz7ModelAdminChecks._check_list_display.<locals>.<genexpr>N)r0   rÏ   rU   rV   rW   r   rX   rY   rZ   r   rS   r   r·   o  s    ÿþÿz$ModelAdminChecks._check_list_displayc                 C   sº   t |ƒrg S t||ƒrg S z|jj |¡}W nd ty�   zt|j|ƒ}W n@ tyŠ   tj	d|||j
j|jjjf |j
dd�g Y  Y S 0 Y n0 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.E108r^   z0The value of '%s' must not be a ManyToManyField.z
admin.E109)r›   r¯   r_   r`   ra   r	   ÚgetattrrÌ   r   r.   rk   ri   rm   r0   r
   r…   )rI   rN   rÉ   rm   r\   r   r   r   rÐ   ~  s<    
üý	õÿýÿz)ModelAdminChecks._check_list_display_itemc                    sp   ddl m} ˆ jdu rg S tˆ jttfƒs:tddˆ dd�S ˆ jj|ju rltt	 
‡ ‡fdd	„tˆ jƒD ƒ¡ƒS g S )
zACheck that list_display_links is a unique subset of list_display.r   )Ú
ModelAdminNza list, a tuple, or NoneÚlist_display_linksz
admin.E110rL   c                 3   s$   | ]\}}ˆ  ˆ |d | ¡V  qdS )zlist_display_links[%d]N)Ú_check_list_display_links_itemrP   rS   r   r   r)   ²  s   ý
ÿz=ModelAdminChecks._check_list_display_links.<locals>.<genexpr>)rš   rÒ   rÓ   r0   rU   rV   rW   Úget_list_displayÚ__func__r   rX   rY   )rI   rN   rÒ   r   rS   r   r¸   ¢  s"    
üüÿz*ModelAdminChecks._check_list_display_linksc                 C   s.   ||j v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.E111r^   )rÏ   r   r.   rk   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 )NrJ   Úlist_filterz
admin.E112rL   c                 3   s$   | ]\}}ˆ  ˆ |d | ¡V  qdS )zlist_filter[%d]N)Ú_check_list_filter_itemrÈ   rS   r   r   r)   Ï  s   ÿz6ModelAdminChecks._check_list_filter.<locals>.<genexpr>)r0   r×   rU   rV   rW   r   rX   rY   rZ   r   rS   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 nL|}zt|j|ƒ W n2 ttfyæ   t
jd||f |jdd�g Y S 0 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.E113rŠ   z:The value of '%s' must not inherit from 'FieldListFilter'.z
admin.E114r^   rÙ   r€   z
admin.E115zBThe value of '%s' refers to '%s', which does not refer to a Field.z
admin.E116N)Údjango.contrib.adminrÙ   rÚ   r›   r0   r
   ÚFieldr   rŒ   r   r   r.   rk   rV   rU   r   r_   r   r	   )rI   rN   rÉ   rm   rÙ   rÚ   r\   Úlist_filter_classr   r   r   rØ   Õ  sN    
ÿ
ÿüÿ	
üÿüÿ
	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 )z?Check that list_select_related is a boolean, a list or a tuple.za boolean, tuple or listÚlist_select_relatedz
admin.E117rL   N)r0   rÞ   r�   rU   rV   rW   rZ   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.ú
an integerÚlist_per_pagez
admin.E118rL   N)r0   rà   ÚintrW   rZ   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.E119rL   N)r0   râ   rá   rW   rZ   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 )zjCheck that list_editable is a sequence of editable fields from
        list_display without first element.rJ   Úlist_editablez
admin.E120rL   c                 3   s$   | ]\}}ˆ  ˆ |d | ¡V  qdS )zlist_editable[%d]N)Ú_check_list_editable_itemrÈ   rS   r   r   r)   ;  s   ý
ÿz8ModelAdminChecks._check_list_editable.<locals>.<genexpr>N)r0   rã   rU   rV   rW   r   rX   rY   rZ   r   rS   r   r½   1  s    ÿüÿz%ModelAdminChecks._check_list_editablec              	   C   sô   z|j j |¡}W n" ty4   t|||dd� Y S 0 ||jvr\tjd||f |jdd�gS |j	r„||j	v r„tjd| |jdd�gS |jd |krÄ|j	sÄ|j	d urÄtjd	||jd f |jd
d�gS |j
rÐ|jrìtjd||f |jdd�gS g S d S )Nz
admin.E121r[   zKThe value of '%s' refers to '%s', which is not contained in 'list_display'.z
admin.E122r^   zMThe value of '%s' cannot be in both 'list_editable' and 'list_display_links'.z
admin.E123r   z~The value of '%s' refers to the first field in 'list_display' ('%s'), which cannot be used unless 'list_display_links' is set.z
admin.E124zJThe value of '%s' refers to '%s', which is not editable through the admin.z
admin.E125)r_   r`   ra   r	   rb   rÏ   r   r.   rk   rÓ   ÚeditableÚprimary_keyrr   r   r   r   rä   C  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.rJ   rl   z
admin.E126rL   N)r0   rl   rU   rV   rW   rZ   r   r   r   r¾   y  s
    ÿz%ModelAdminChecks._check_search_fieldsc              	   C   s€   |j du rg S zt|j|j ƒd }W n0 ttfyT   tjd|j  |jdd�g Y S 0 t|t	j
t	jfƒsxtdd|dd	�S g S dS )
z?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.E127r^   za DateField or DateTimeFieldÚdate_hierarchyz
admin.E128rL   )rè   r   r_   r   r	   r   r.   rk   r0   r
   Ú	DateFieldr¡   rW   )rI   rN   r\   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.E129r^   )Ú_get_base_actionsr¯   rê   r-   r   r.   rk   ri   )	rI   rN   Úactionsr#   Úfuncrq   Ú_Ú
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î   rq   r   r   r   r)   ½  r*   z=ModelAdminChecks._check_actions_uniqueness.<locals>.<genexpr>r~   zS__name__ attributes of actions defined in %s must be unique. Name %r is not unique.z
admin.E130r^   )	ÚcollectionsÚCounterrë   r–   r-   r   r.   rk   ri   )rI   rN   r#   Únamesrq   Úcountr   r   r   rÁ   º  s     þþøÿz*ModelAdminChecks._check_actions_uniqueness)ri   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²     s(   &$;

6
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                    sV   |j }g tƒ  |¡¢|  ||¡¢|  ||¡¢|  |¡¢|  |¡¢|  |¡¢|  |¡¢S r'   )	Úparent_modelr³   r    Ú_check_relationÚ_check_exclude_of_parent_modelÚ_check_extraÚ_check_max_numÚ_check_min_numÚ_check_formset)rI   Z
inline_objr"   r÷   rÂ   r   r   r    Ð  s     
ÿ
þ
ýüûúùzInlineModelAdminChecks.checkc                    sz   t ƒ  |¡}|rg S |  ||¡r$g S |jd u r2g S t||j|jd�}|j|jv 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.E201r^   )r³   r?   rø   rˆ   r   r_   rÿ   rq   r   r.   r`   rm   rk   )rI   rN   r÷   r#   ÚfkrÂ   r   r   rù   Ü  s(    
þþøÿz5InlineModelAdminChecks._check_exclude_of_parent_modelc              
   C   s^   zt ||j|jd� W n> tyT } z&tj|jd |jdd�gW  Y d }~S d }~0 0 g S d S )Nrþ   r   z
admin.E202r^   )r   r_   rÿ   Ú
ValueErrorr   r.   Úargsrk   )rI   rN   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.E203rL   N)r0   r  rá   rW   rZ   r   r   r   rú     s    z#InlineModelAdminChecks._check_extrac                 C   s2   |j du 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.E204rL   )r  r0   rá   rW   rZ   r   r   r   rû     s
    
z%InlineModelAdminChecks._check_max_numc                 C   s2   |j du 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.E205rL   )r  r0   rá   rW   rZ   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 )z0Check formset is a subclass of BaseModelFormSet.r   Úformsetz
admin.E206rŠ   N)r   r  r   rŒ   rZ   r   r   r   rý     s
    ÿz%InlineModelAdminChecks._check_formset)ri   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.r^   ©r   r.   rk   )rj   rM   rN   r&   r   r   r   rW   *  s    
ýÿrW   c                 C   s   t jd|| f |j|d�gS )Nz)The value of '%s' must inherit from '%s'.r^   r  rŠ   r   r   r   rŒ   4  s    
ýÿrŒ   c                 C   s$   t jd|| |jjjf |j|d�gS )Nz?The value of '%s' refers to '%s', which is not a field of '%s'.r^   )r   r.   r_   r`   rm   rk   r[   r   r   r   rb   >  s    ÿüÿrb   ))rñ   Ú	itertoolsr   Údjango.appsr   Údjango.confr   Údjango.contrib.admin.utilsr   r   r   Údjango.corer   Údjango.core.exceptionsr	   Ú	django.dbr
   Údjango.db.models.constantsr   Údjango.db.models.expressionsr   Údjango.forms.modelsr   r   r   Údjango.templater   Údjango.template.backends.djangor   Údjango.utils.module_loadingr   r   r   r%   r9   r:   r²   rö   rW   rŒ   rb   r   r   r   r   Ú<module>   s<   	y    j   <[

