o
    uvXjc±  ã                   @   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mZ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„ 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ÚFÚOrderBy)ÚBaseModelFormÚBaseModelFormSetÚ_get_foreign_key)Úengines)ÚDjangoTemplates)ÚRemovedInDjango30Warning)Úget_func_args)Úimport_stringc                 C   s"   zt | |ƒW S  ty   Y dS w )zX
    issubclass() variant that doesn't raise an exception if cls isn't a
    class.
    F)Ú
issubclassÚ	TypeError)ÚclsÚ	classinfo© r   úX/var/www/html/myproject/venv/lib/python3.10/site-packages/django/contrib/admin/checks.pyÚ_issubclass   s
   ÿr   c              	   C   sF   t | ƒ}|D ]}zt |ƒ}W n	 ty   Y qw 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   )Ú
class_pathÚcandidate_pathsr   ÚpathÚ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_app4   s
   r,   c                  K   s6  t  d¡sg S g }d}|D ]\}}t  |¡s$| tjd| d| d�¡ qt ¡ D ]}t|tƒr5|j	} nq)d}|sE| tjddd�¡ n$d	|j
vrZtd
tjƒrZ| tjddd�¡ d|j
vri| tjddd�¡ tdtjƒsy| tjddd�¡ tdtjƒs‰| tjddd�¡ tdtjƒs™| tjddd�¡ |S )zF
    Check that the admin's dependencies are correctly installed.
    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.E404z7django.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   Úis_installedÚappendr   ÚErrorr   ÚallÚ
isinstancer   ÚengineÚcontext_processorsr#   r   ÚAUTHENTICATION_BACKENDSÚ
MIDDLEWARE)r)   r*   Úapp_dependenciesÚapp_nameÚ
error_coder3   Údjango_templates_instancer   r   r   Úcheck_dependencies<   sp   

ÿý€
þ
üÿ
þüÿüýýý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)Ú_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'   †   s6   ÿþýüûúùø	÷
öõôózBaseModelAdminChecks.checkc                    óD   t ˆ jttfƒstddˆ dd�S tt ‡ ‡fdd„tˆ jƒ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©Ú.0ÚindexÚ
field_name©rS   rL   r   r   Ú
<listcomp>ž   s    ÿÿzCBaseModelAdminChecks._check_autocomplete_fields.<locals>.<listcomp>)r2   rP   ÚlistÚtupleÚmust_ber   Úfrom_iterableÚ	enumerate©rL   rS   r   rY   r   r>   —   ó
   
þz/BaseModelAdminChecks._check_autocomplete_fieldsc              	   C   sÊ   z	|j j |¡}W n ty   t|||dd� Y S w |js,t|tjƒs,t	d||dd�S |j
j |jj ¡}|du rMtjd|jj jt|ƒjf |jdd	�gS |jsctjd
|jjt|ƒjf |jdd	�gS g 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©ÚfieldrR   rS   r-   ú%a foreign key or a many-to-many fieldz
admin.E038rQ   NzXAn admin for model "%s" has to be registered to be referenced by %s.autocomplete_fields.z
admin.E039©rS   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_manyr2   r
   Ú
ForeignKeyr]   Ú
admin_siteÚ	_registryÚgetÚremote_fieldr   r0   Ú__name__ÚtypeÚ	__class__Úsearch_fields)rL   rS   rX   Úlabelrc   Úrelated_adminr   r   r   rT   £   sD   ÿþþÿùÿþÿùÿz4BaseModelAdminChecks._check_autocomplete_fields_itemc                    rN   )z\ Check that `raw_id_fields` only contains field names that are listed
        on the model. rO   Úraw_id_fieldsz
admin.E001rQ   c                 3   ó&   � | ]\}}ˆ  ˆ |d | ¡V  qdS )zraw_id_fields[%d]N)Ú_check_raw_id_fields_itemrU   rY   r   r   Ú	<genexpr>Õ   ó
   € ÿ
ÿz<BaseModelAdminChecks._check_raw_id_fields.<locals>.<genexpr>)r2   rv   r[   r\   r]   r   r^   r_   r`   r   rY   r   r?   Î   ra   z)BaseModelAdminChecks._check_raw_id_fieldsc              	   C   s\   z	|j j |¡}W n ty   t|||dd� Y S w |js,t|tjƒs,t	d||dd�S g 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.E002rb   rd   z
admin.E003rQ   )
rf   rg   rh   r	   ri   rj   r2   r
   rk   r]   ©rL   rS   rX   rt   rc   r   r   r   rx   Ú   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r$tjdˆ jdd�gS t	ˆ j ƒ}t
|ƒt
t|ƒƒkr=t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.
        NrO   Úfieldsz
admin.E004rQ   z,Both 'fieldsets' and 'fields' are specified.z
admin.E005re   z2The value of 'fields' contains duplicate field(s).z
admin.E006c                 3   s   � | ]
}ˆ  ˆ |d ¡V  qdS )r|   N©Ú_check_field_spec)rV   rX   rY   r   r   ry     s
   € ÿ
ÿz5BaseModelAdminChecks._check_fields.<locals>.<genexpr>)r|   r2   r[   r\   r]   Ú	fieldsetsr   r0   rr   r   ÚlenÚsetr   r^   )rL   rS   r|   r   rY   r   r@   é   s,   
ýÿ
ýÿ
þz"BaseModelAdminChecks._check_fieldsc                    sX   ˆ 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 )zT Check that fieldsets is properly formatted and doesn't contain
        duplicates. NrO   r   z
admin.E007rQ   c                 3   s(   � | ]\}}ˆ  ˆ |d | ˆ¡V  qdS )zfieldsets[%d]N)Ú_check_fieldsets_item)rV   rW   Úfieldset©rS   Úseen_fieldsrL   r   r   ry     s
   € ÿ
ÿz8BaseModelAdminChecks._check_fieldsets.<locals>.<genexpr>)r   r2   r[   r\   r]   r   r^   r_   r`   r   r„   r   rA   	  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ƒsUtddˆ  ˆdd�S | 	t
|d d ƒ¡ t|ƒtt|ƒƒkrvt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. rO   z
admin.E008rQ   é   zof length 2z
admin.E009é   úa dictionaryú%s[1]z
admin.E010r|   z3The value of '%s[1]' must contain the key 'fields'.z
admin.E011re   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"]Nr}   )rV   Úfieldset_fields©rt   rS   rL   r   r   ry   6  s
   € ÿ
ÿz=BaseModelAdminChecks._check_fieldsets_item.<locals>.<genexpr>)r2   r[   r\   r]   r€   Údictr   r0   rr   r&   r   r�   r   r^   )rL   rS   rƒ   rt   r…   r   r‹   r   r‚     s4   ýÿýÿ

þz*BaseModelAdminChecks._check_fieldsets_itemc                    s<   t |tƒrtt ‡ ‡‡fdd„t|ƒD ƒ¡ƒS ˆ ˆ|ˆ ¡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   ó*   � | ]\}}ˆ  ˆ|d ˆ |f ¡V  qdS )z%s[%d]N)Ú_check_field_spec_itemrU   r‹   r   r   ry   A  ó
   € ÿ
ÿz9BaseModelAdminChecks._check_field_spec.<locals>.<genexpr>)r2   r\   r[   r   r^   r_   rŽ   )rL   rS   r|   rt   r   r‹   r   r~   ;  s
   

þz&BaseModelAdminChecks._check_field_specc                 C   sp   ||j v rg S z	|jj |¡}W n ty   g  Y S w t|tjƒr6|jj	jj
s6tjd||f |jdd�gS g S )NzvThe value of '%s' cannot include the ManyToManyField '%s', because that field manually specifies a relationship model.z
admin.E013re   )Úreadonly_fieldsrf   rg   rh   r	   r2   r
   ÚManyToManyFieldro   ÚthroughÚauto_createdr   r0   rr   r{   r   r   r   rŽ   H  s&   
ý
ÿþûÿ
z+BaseModelAdminChecks._check_field_spec_itemc                 C   s^   |j du rg S t|j ttfƒstdd|dd�S t|j ƒtt|j ƒƒkr-tjd|j	dd�gS g S )	z6 Check that exclude is a sequence without duplicates. NrO   Úexcludez
admin.E014rQ   z3The value of 'exclude' contains duplicate field(s).z
admin.E015re   )
r”   r2   r[   r\   r]   r€   r�   r   r0   rr   r`   r   r   r   rB   d  s   
ýÿz#BaseModelAdminChecks._check_excludec                 C   ó    t |jtƒstdd|dd�S g S )z+ Check that form subclasses BaseModelForm. r   Úformz
admin.E016©ÚparentrR   rS   r-   )r   r–   r   Úmust_inherit_fromr`   r   r   r   rC   v  s
   ÿz BaseModelAdminChecks._check_formc                    rN   )z: Check that filter_vertical is a sequence of field names. rO   Úfilter_verticalz
admin.E017rQ   c                 3   rw   )zfilter_vertical[%d]N©Ú_check_filter_itemrU   rY   r   r   ry   ƒ  rz   z>BaseModelAdminChecks._check_filter_vertical.<locals>.<genexpr>)r2   rš   r[   r\   r]   r   r^   r_   r`   r   rY   r   rD   ~  ó
   
þz+BaseModelAdminChecks._check_filter_verticalc                    rN   )z< Check that filter_horizontal is a sequence of field names. rO   Úfilter_horizontalz
admin.E018rQ   c                 3   rw   )zfilter_horizontal[%d]Nr›   rU   rY   r   r   ry   �  rz   z@BaseModelAdminChecks._check_filter_horizontal.<locals>.<genexpr>)r2   rž   r[   r\   r]   r   r^   r_   r`   r   rY   r   rE   ˆ  r�   z-BaseModelAdminChecks._check_filter_horizontalc              	   C   sP   z	|j j |¡}W n ty   t|||dd� Y S w |js&td||dd�S g S )z‚ Check one item of `filter_vertical` or `filter_horizontal`, i.e.
        check that given field exists and is a ManyToManyField. z
admin.E019rb   za many-to-many fieldz
admin.E020rQ   )rf   rg   rh   r	   ri   rj   r]   r{   r   r   r   rœ   ’  s   ÿz'BaseModelAdminChecks._check_filter_itemc                    ó@   t ˆ jtƒstddˆ dd�S tt ‡ ‡fdd„ˆ j ¡ D ƒ¡ƒS )z, Check that `radio_fields` is a dictionary. rˆ   Úradio_fieldsz
admin.E021rQ   c                 3   ó4   � | ]\}}ˆ  ˆ |d ¡ˆ ˆ |d| ¡ V  qdS )r    zradio_fields["%s"]N)Ú_check_radio_fields_keyÚ_check_radio_fields_value©rV   rX   ÚvalrY   r   r   ry   ¥  ó   € þÿ
ÿz;BaseModelAdminChecks._check_radio_fields.<locals>.<genexpr>)r2   r    rŒ   r]   r[   r   r^   Úitemsr`   r   rY   r   rF      s
   
ýz(BaseModelAdminChecks._check_radio_fieldsc              	   C   sh   z	|j j |¡}W n ty   t|||dd� Y S w t|tjƒs2|js2t	j
d||f |jdd�gS g 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.E022rb   zsThe value of '%s' refers to '%s', which is not an instance of ForeignKey, and does not have a 'choices' definition.z
admin.E023re   )rf   rg   rh   r	   ri   r2   r
   rk   Úchoicesr   r0   rr   r{   r   r   r   r¢   «  s    ÿÿÿúÿz,BaseModelAdminChecks._check_radio_fields_keyc                 C   s8   ddl m}m} |||fvrtjd| |jdd�gS g 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.E024re   )Údjango.contrib.admin.optionsr©   rª   r   r0   rr   )rL   rS   r¥   rt   r©   rª   r   r   r   r£   Â  s   ýÿz.BaseModelAdminChecks._check_radio_fields_valuec                 C   s.   t |jƒst|jtƒstjd|jdd�gS g S )NzBThe value of 'view_on_site' must be a callable or a boolean value.z
admin.E025re   )ÚcallableÚview_on_siter2   Úboolr   r0   rr   r`   r   r   r   rH   Ò  s   ýÿz,BaseModelAdminChecks._check_view_on_site_urlc                    rŸ   )zZ Check that `prepopulated_fields` is a dictionary containing allowed
        field types. rˆ   Úprepopulated_fieldsz
admin.E026rQ   c                 3   r¡   )r¯   zprepopulated_fields["%s"]N)Ú_check_prepopulated_fields_keyÚ _check_prepopulated_fields_valuer¤   rY   r   r   ry   ä  r¦   zBBaseModelAdminChecks._check_prepopulated_fields.<locals>.<genexpr>)r2   r¯   rŒ   r]   r[   r   r^   r§   r`   r   rY   r   rG   Þ  s
   
ýz/BaseModelAdminChecks._check_prepopulated_fieldsc              	   C   sl   z	|j j |¡}W n ty   t|||dd� Y S w t|tjtjtj	fƒr4t
jd||f |jdd�gS g 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.E027rb   zyThe value of '%s' refers to '%s', which must not be a DateTimeField, a ForeignKey, a OneToOneField, or a ManyToManyField.z
admin.E028re   )rf   rg   rh   r	   ri   r2   r
   ÚDateTimeFieldrk   r‘   r   r0   rr   r{   r   r   r   r°   ê  s   ÿÿüÿ	z3BaseModelAdminChecks._check_prepopulated_fields_keyc                    sB   t |ttfƒstdˆ ˆdd�S tt ‡ ‡‡fdd„t|ƒD ƒ¡ƒS )zf Check a value of `prepopulated_fields` dictionary, i.e. it's an
        iterable of existing fields. rO   z
admin.E029rQ   c                 3   r�   )z%s[%r]N)Ú%_check_prepopulated_fields_value_item)rV   rW   Úsubfield_namer‹   r   r   ry     r�   zHBaseModelAdminChecks._check_prepopulated_fields_value.<locals>.<genexpr>)r2   r[   r\   r]   r   r^   r_   )rL   rS   r¥   rt   r   r‹   r   r±      s
   
þz5BaseModelAdminChecks._check_prepopulated_fields_valuec              	   C   s8   z
|j j |¡ W g S  ty   t|||dd� Y S w )z[ For `prepopulated_fields` equal to {"slug": ("title",)},
        `field_name` is "title". z
admin.E030rb   )rf   rg   rh   r	   ri   ©rL   rS   rX   rt   r   r   r   r³     s   ýÿz:BaseModelAdminChecks._check_prepopulated_fields_value_itemc                    sR   ˆ 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 )z= Check that ordering refers to existing fields or is random. NrO   Úorderingz
admin.E031rQ   c                 3   rw   )zordering[%d]N)Ú_check_ordering_itemrU   rY   r   r   ry      rz   z7BaseModelAdminChecks._check_ordering.<locals>.<genexpr>)r¶   r2   r[   r\   r]   r   r^   r_   r`   r   rY   r   rI     s   

þz$BaseModelAdminChecks._check_orderingc              	   C   sØ   t |ttfƒrt |tƒs| ¡ }t |jtƒr|jj}ng S |dkr3t|jƒdkr3t	j
dd|jdd�gS |dkr9g S t|v r?g S | d¡rJ|dd… }|d	krPg S z
|jj |¡ W g S  tyk   t|||d
d� Y S w )z2 Check 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)ÚhintrS   r-   ú-NÚpkz
admin.E033rb   )r2   r   r   ÚascÚ
expressionr   Únamer€   r¶   r   r0   rr   r   Ú
startswithrf   rg   rh   r	   ri   rµ   r   r   r   r·   %  s8   

ûÿ	
ýÿz)BaseModelAdminChecks._check_ordering_itemc                    sR   ˆ 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 )zA Check that readonly_fields refers to proper attribute or field. r   rO   r�   z
admin.E034rQ   c                 3   rw   )zreadonly_fields[%d]N)Ú_check_readonly_fields_itemrU   rY   r   r   ry   R  rz   z>BaseModelAdminChecks._check_readonly_fields.<locals>.<genexpr>)r�   r2   r[   r\   r]   r   r^   r_   r`   r   rY   r   rJ   J  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 g S  ty@   tjd||jj	|jjj
|jjjf |jdd�g Y S w )NzVThe value of '%s' is not a callable, an attribute of '%s', or an attribute of '%s.%s'.z
admin.E035re   )r¬   Úhasattrrf   rg   rh   r	   r   r0   rr   rp   Ú	app_labelÚobject_namerµ   r   r   r   rÀ   W  s&   
õÿûÿÿz0BaseModelAdminChecks._check_readonly_fields_itemN)rp   Ú
__module__Ú__qualname__r'   r>   rT   r?   rx   r@   rA   r‚   r~   rŽ   rB   rC   rD   rE   rœ   rF   r¢   r£   rH   rG   r°   r±   r³   rI   r·   rJ   rÀ   r   r   r   r   r<   „   s8    + #

%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_uniquenessrK   ©rr   r   r   r'   q  s>   
ÿþýüûúùø	÷
öõôóòñzModelAdminChecks.checkc                 C   r•   )z Check save_as is a boolean. ú	a booleanÚsave_asz
admin.E101rQ   )r2   rØ   r®   r]   r`   r   r   r   rÈ   „  ó
   ÿzModelAdminChecks._check_save_asc                 C   r•   )z! Check save_on_top is a boolean. r×   Úsave_on_topz
admin.E102rQ   )r2   rÚ   r®   r]   r`   r   r   r   rÉ   �  rÙ   z#ModelAdminChecks._check_save_on_topc                    rN   )z' Check all inline model admin classes. rO   Úinlinesz
admin.E103rQ   c                 3   rw   )zinlines[%d]N)Ú_check_inlines_item©rV   rW   ÚitemrY   r   r   ry   œ  rz   z2ModelAdminChecks._check_inlines.<locals>.<genexpr>)r2   rÛ   r[   r\   r]   r   r^   r_   r`   r   rY   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 w ddlm} t||ƒs7tjd| |jdd�gS |j	sFtjd| |jdd�gS t|j	t
jƒsWtd	d
| |dd�S ||j	|jƒ ¡ S )z Check one inline model admin. Ú.z*'%s' must inherit from 'InlineModelAdmin'.z
admin.E104re   r   )ÚInlineModelAdminz#'%s' must have a 'model' attribute.z
admin.E105za Modelz%s.modelz
admin.E106rQ   )rÄ   rp   ÚAttributeErrorr   r0   rr   r«   rà   r   rf   r
   ÚModelr]   rl   r'   )rL   rS   Úinlinert   Úinline_labelrà   r   r   r   rÜ   ¡  s8   ýÿÿ	
ýÿýÿz$ModelAdminChecks._check_inlines_itemc                    rN   )zL Check that list_display only contains fields or usable attributes.
        rO   Úlist_displayz
admin.E107rQ   c                 3   rw   )zlist_display[%d]N)Ú_check_list_display_itemrÝ   rY   r   r   ry   Ì  rz   z7ModelAdminChecks._check_list_display.<locals>.<genexpr>)r2   rå   r[   r\   r]   r   r^   r_   r`   r   rY   r   rË   Å  ra   z$ModelAdminChecks._check_list_displayc                 C   sª   t |ƒrg S t||ƒrg S t|j|ƒr<z	|jj |¡}W n ty'   g  Y S w t|tjƒr:t	j
d| |jdd�gS g S t	j
d|||jj|jjj|jjjf |jdd�gS )Nz0The value of '%s' must not be a ManyToManyField.z
admin.E109re   zvThe value of '%s' refers to '%s', which is not a callable, an attribute of '%s', or an attribute or method on '%s.%s'.z
admin.E108)r¬   rÁ   rf   rg   rh   r	   r2   r
   r‘   r   r0   rr   rp   rÂ   rÃ   )rL   rS   rÞ   rt   rc   r   r   r   ræ   Ñ  s8   
ÿýÿ
þÿùÿ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 r6t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.E110rQ   c                 3   rw   )zlist_display_links[%d]N)Ú_check_list_display_links_itemrU   rY   r   r   ry   ý  rz   z=ModelAdminChecks._check_list_display_links.<locals>.<genexpr>)r«   rç   rè   r2   r[   r\   r]   Úget_list_displayÚ__func__r   r^   r_   )rL   rS   rç   r   rY   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 )NzIThe value of '%s' refers to '%s', which is not defined in 'list_display'.z
admin.E111re   )rå   r   r0   rr   rµ   r   r   r   ré     s   
ÿûÿ
z/ModelAdminChecks._check_list_display_links_itemc                    rN   )NrO   Úlist_filterz
admin.E112rQ   c                 3   rw   )zlist_filter[%d]N)Ú_check_list_filter_itemrÝ   rY   r   r   ry     rz   z6ModelAdminChecks._check_list_filter.<locals>.<genexpr>)r2   rì   r[   r\   r]   r   r^   r_   r`   r   rY   r   rÍ     s
   
þz#ModelAdminChecks._check_list_filterc              	   C   sæ   ddl m}m} t|ƒr2t|tjƒs2t||ƒstd||dd�S t	||ƒr0t
jd| |jdd�gS g S t|ttfƒrN|\}}t||ƒsLtd	d
| |dd�S g S |}z	t|j|ƒ W g S  ttfyr   t
jd||f |jdd�g Y S w )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.E114re   rï   r‰   z
admin.E115zBThe value of '%s' refers to '%s', which does not refer to a Field.z
admin.E116)Údjango.contrib.adminrî   rï   r¬   r2   r
   ÚFieldr   r™   r   r   r0   rr   r\   r[   r   rf   r   r	   )rL   rS   rÞ   rt   rî   rï   rc   Ú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 )zA Check that list_select_related is a boolean, a list or a tuple. za boolean, tuple or listÚlist_select_relatedz
admin.E117rQ   )r2   ró   r®   r[   r\   r]   r`   r   r   r   rÎ   N  s   z+ModelAdminChecks._check_list_select_relatedc                 C   r•   )z) Check that list_per_page is an integer. ú
an integerÚlist_per_pagez
admin.E118rQ   )r2   rõ   Úintr]   r`   r   r   r   rÏ   V  ó   z%ModelAdminChecks._check_list_per_pagec                 C   r•   )z- Check that list_max_show_all is an integer. rô   Úlist_max_show_allz
admin.E119rQ   )r2   rø   rö   r]   r`   r   r   r   rÐ   ^  r÷   z)ModelAdminChecks._check_list_max_show_allc                    rN   )zl Check that list_editable is a sequence of editable fields from
        list_display without first element. rO   Úlist_editablez
admin.E120rQ   c                 3   rw   )zlist_editable[%d]N)Ú_check_list_editable_itemrÝ   rY   r   r   ry   m  rz   z8ModelAdminChecks._check_list_editable.<locals>.<genexpr>)r2   rù   r[   r\   r]   r   r^   r_   r`   r   rY   r   rÑ   f  ra   z%ModelAdminChecks._check_list_editablec              	   C   sê   z	|j j |¡}W n ty   t|||dd� Y S w ||jvr.tjd||f |jdd�gS |j	rB||j	v rBtjd| |jdd�gS |jd |krb|j	sb|j	d urbtjd	||jd f |jd
d�gS |j
sstjd||f |jdd�gS g S )Nz
admin.E121rb   zKThe value of '%s' refers to '%s', which is not contained in 'list_display'.z
admin.E122re   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)rf   rg   rh   r	   ri   rå   r   r0   rr   rè   Úeditabler{   r   r   r   rú   r  sT   ÿ
ÿüÿýÿ	

ÿÿúÿ
ÿûÿ
z*ModelAdminChecks._check_list_editable_itemc                 C   s$   t |jttfƒstdd|dd�S g S )z$ Check search_fields is a sequence. rO   rs   z
admin.E126rQ   )r2   rs   r[   r\   r]   r`   r   r   r   rÒ   ¤  s   z%ModelAdminChecks._check_search_fieldsc              	   C   s|   |j du rg S zt|j|j ƒd }W n ttfy*   tjd|j  |jdd�g Y S w t|t	j
t	jfƒs<tdd|dd	�S g 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.E127re   za DateField or DateTimeFieldÚdate_hierarchyz
admin.E128rQ   )rý   r   rf   r   r	   r   r0   rr   r2   r
   Ú	DateFieldr²   r]   )rL   rS   rc   r   r   r   rÓ   ¬  s"   
ÿüÿÿ
z&ModelAdminChecks._check_date_hierarchyc           	   	   C   sr   |  ¡ }g }|D ].\}}}t|dƒsq|jD ]}d| }t||ƒs5| 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.E129re   )Ú_get_base_actionsrÁ   rÿ   r/   r   r0   rr   rp   )	rL   rS   Úactionsr*   Úfuncr¾   Ú_Ú
permissionÚmethod_namer   r   r   rÔ   Ã  s,   


ýùÿ€ýz1ModelAdminChecks._check_action_permission_methodsc                 C   sD   dd„ |  ¡ D ƒ}t|ƒtt|ƒƒkr tjd|j |jdd�gS g S )z.Check that every action has a unique __name__.c                 S   s   g | ]\}}}|‘qS r   r   )rV   r  r¾   r   r   r   rZ   ß  s    z>ModelAdminChecks._check_actions_uniqueness.<locals>.<listcomp>z<__name__ attributes of actions defined in %s must be unique.z
admin.E130re   )r   r€   r�   r   r0   rr   )rL   rS   Únamesr   r   r   rÕ   Ý  s   ÿüz*ModelAdminChecks._check_actions_uniqueness)rp   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Æ   o  s*    		$!	42rÆ   c                       sX   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	dd„ Z
‡  ZS )ÚInlineModelAdminChecksc                    s`   |   |¡ |j}g tƒ  |¡¢|  ||¡¢|  ||¡¢|  |¡¢|  |¡¢|  |¡¢|  	|¡¢S r=   )
Ú_check_has_add_permissionÚparent_modelrÇ   r'   Ú_check_relationÚ_check_exclude_of_parent_modelÚ_check_extraÚ_check_max_numÚ_check_min_numÚ_check_formset)rL   Ú
inline_objr)   r
  rÖ   r   r   r'   ì  s"   

ÿ
þ
ýüûúùzInlineModelAdminChecks.checkc                    s|   t ƒ  |¡}|r
g S |  ||¡rg S |jd u rg S t||j|jd�}|j|jv r<tj	d|j|j
j|j
jf |jdd�gS g S )N©Úfk_namezYCannot exclude the field '%s', because it is the foreign key to the parent model '%s.%s'.z
admin.E201re   )rÇ   rB   r  r”   r   rf   r  r¾   r   r0   rg   rÂ   rÃ   rr   )rL   rS   r
  r*   ÚfkrÖ   r   r   r  ù  s&   
ÿÿúÿz5InlineModelAdminChecks._check_exclude_of_parent_modelc              
   C   sX   zt ||j|jd� W g S  ty+ } ztj|jd |jdd�gW  Y d }~S d }~ww )Nr  r   z
admin.E202re   )r   rf   r  Ú
ValueErrorr   r0   Úargsrr   )rL   rS   r
  Úer   r   r   r    s   ý&€ÿz&InlineModelAdminChecks._check_relationc                 C   r•   )z! Check that extra is an integer. rô   Úextraz
admin.E203rQ   )r2   r  rö   r]   r`   r   r   r   r    r÷   z#InlineModelAdminChecks._check_extrac                 C   ó.   |j du rg S t|j tƒstdd|dd�S g S )z# Check that max_num is an integer. Nrô   Úmax_numz
admin.E204rQ   )r  r2   rö   r]   r`   r   r   r   r  &  ó
   
z%InlineModelAdminChecks._check_max_numc                 C   r  )z# Check that min_num is an integer. Nrô   Úmin_numz
admin.E205rQ   )r  r2   rö   r]   r`   r   r   r   r  0  r  z%InlineModelAdminChecks._check_min_numc                 C   r•   )z2 Check formset is a subclass of BaseModelFormSet. r   Úformsetz
admin.E206r—   )r   r  r   r™   r`   r   r   r   r  :  r÷   z%InlineModelAdminChecks._check_formsetc                 C   sP   |j }z|j}W n
 ty   Y d S w t|ƒ}d|vr&t d|j t¡ d S d S )NrS   zEUpdate %s.has_add_permission() to accept a positional `obj` argument.)rr   Úhas_add_permissionrá   r   ÚwarningsÚwarnrp   r   )rL   rS   r   r  r  r   r   r   r	  B  s   
ÿÿþÿz0InlineModelAdminChecks._check_has_add_permission)rp   rÄ   rÅ   r'   r  r  r  r  r  r  r	  r  r   r   rÖ   r   r  ê  s    

r  c                 C   ó   t jd|| f |j|d�gS )NzThe value of '%s' must be %s.re   ©r   r0   rr   )rq   rR   rS   r-   r   r   r   r]   Q  ó   
ýÿr]   c                 C   r!  )Nz)The value of '%s' must inherit from '%s'.re   r"  r—   r   r   r   r™   [  r#  r™   c                 C   s,   t jd|| |jjj|jjjf |j|d�gS )NzGThe value of '%s' refers to '%s', which is not an attribute of '%s.%s'.re   )r   r0   rf   rg   rÂ   rÃ   rr   rb   r   r   r   ri   e  s   ÿûÿri   )/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   r   r   Údjango.forms.modelsr   r   r   Údjango.templater   Údjango.template.backends.djangor   Údjango.utils.deprecationr   Údjango.utils.inspectr   Údjango.utils.module_loadingr   r   r#   r,   r;   r<   rÆ   r  r]   r™   ri   r   r   r   r   Ú<module>   s>    H   n  }g

