U
    |ev                     @   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   X/var/www/website-v5/atlas_env/lib/python3.8/site-packages/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)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 nd|jkrt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 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)idNzA '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   s     z%check_dependencies.<locals>.<genexpr>z*django.template.context_processors.requestz'django.template.context_processors.request' must be enabled in DjangoTemplates (TEMPLATES) in order to use the admin navigation sidebar.z
admin.W411z7django.contrib.auth.middleware.AuthenticationMiddlewarezv'django.contrib.auth.middleware.AuthenticationMiddleware' must be in MIDDLEWARE in order to use the admin application.z
admin.E408z4django.contrib.messages.middleware.MessageMiddlewarezs'django.contrib.messages.middleware.MessageMiddleware' must be in MIDDLEWARE in order to use the admin application.z
admin.E409z4django.contrib.sessions.middleware.SessionMiddlewarezs'django.contrib.sessions.middleware.SessionMiddleware' must be in MIDDLEWARE in order to use the admin application.zInsert 'django.contrib.sessions.middleware.SessionMiddleware' before 'django.contrib.auth.middleware.AuthenticationMiddleware'.z
admin.E410)hintr&   )r   r   r   is_installedappendr   Errorr   all
isinstancer   enginecontext_processorsr   r   AUTHENTICATION_BACKENDSanyWarning
MIDDLEWARE)	r"   r   r#   Zapp_dependenciesapp_name
error_coder0   Zdjango_templates_instanceZsidebar_enabledr   r   r   check_dependencies7   s    



		   r8   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rM   rH   r   r   
<listcomp>   s     zCBaseModelAdminChecks._check_autocomplete_fields.<locals>.<listcomp>N)r/   rJ   listtuplemust_ber   from_iterable	enumeraterH   rM   r   rR   r   r:      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rtjd|jj jt|jf |jdd	gS |jst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fieldrL   rM   r&   %a foreign key or a many-to-many fieldz
admin.E038rK   NzXAn admin for model "%s" has to be registered to be referenced by %s.autocomplete_fields.z
admin.E039rM   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
   
ForeignKeyrV   
admin_site	_registrygetremote_fieldr   r-   __name__type	__class__search_fields)rH   rM   rQ   labelr[   related_adminr   r   r   rN      sP       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.rI   raw_id_fieldsz
admin.E001rK   c                 3   s$   | ]\}}  |d | V  qdS )zraw_id_fields[%d]N)_check_raw_id_fields_itemrO   rR   r   r   r)     s     z<BaseModelAdminChecks._check_raw_id_fields.<locals>.<genexpr>N)r/   rn   rT   rU   rV   r   rW   rX   rY   r   rR   r   r;   
  s       z)BaseModelAdminChecks._check_raw_id_fieldsc              	   C   s|   z|j j|}W n$ tk
r6   t|||dd Y S X |j|krRt|||ddS |jstt|tj	stt
d||ddS g S dS )zCheck 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.E002rZ   r\   z
admin.E003rK   N)r^   r_   r`   r	   ra   namerb   r/   r
   rc   rV   rH   rM   rQ   rl   r[   r   r   r   ro     s0       
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 )zCheck that `fields` only refer to existing fields, doesn't contain
        duplicates. Check if at most one of `fields` and `fieldsets` is defined.
        NrI   fieldsz
admin.E004rK   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 )rr   N_check_field_spec)r(   rQ   rR   r   r   r)   V  s   z5BaseModelAdminChecks._check_fields.<locals>.<genexpr>)rr   r/   rT   rU   rV   	fieldsetsr   r-   rj   r   lensetr   rW   )rH   rM   rr   r   rR   r   r<   :  s0    

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 )zRCheck that fieldsets is properly formatted and doesn't contain
        duplicates.NrI   ru   z
admin.E007rK   c                 3   s&   | ]\}}  |d | V  qdS )zfieldsets[%d]N)_check_fieldsets_item)r(   rP   fieldsetrM   seen_fieldsrH   r   r   r)   i  s      z8BaseModelAdminChecks._check_fieldsets.<locals>.<genexpr>)ru   r/   rT   rU   rV   r   rW   rX   rY   r   rz   r   r=   \  s    
   z%BaseModelAdminChecks._check_fieldsetsc                    s  t |ttfstd ddS t|dkr:td ddS t |d ts\tdd	  d
dS d|d krtjd  jddgS t |d d ttfstdd  ddS |	t
|d d  t|tt|krt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.rI   z
admin.E008rK      zof length 2z
admin.E009   a dictionary%s[1]z
admin.E010rr   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"]Nrs   )r(   Zfieldset_fieldsrl   rM   rH   r   r   r)     s   z=BaseModelAdminChecks._check_fieldsets_item.<locals>.<genexpr>)r/   rT   rU   rV   rv   dictr   r-   rj   r   r   rw   r   rW   )rH   rM   ry   rl   r{   r   r   r   rx   q  sL       
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_itemrO   r   r   r   r)     s     
z9BaseModelAdminChecks._check_field_spec.<locals>.<genexpr>N)r/   rU   rT   r   rW   rX   r   )rH   rM   rr   rl   r   r   r   rt     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.E013r]   )readonly_fieldsr^   r_   r`   r	   r/   r
   ManyToManyFieldrg   throughauto_createdr   r-   rj   rq   r   r   r   r     s&    




z+BaseModelAdminChecks._check_field_spec_itemc                 C   sb   |j dkrg S t|j ttfs.tdd|ddS t|j tt|j krZtjd|j	ddgS g S dS )	z4Check that exclude is a sequence without duplicates.NrI   excludez
admin.E014rK   z3The value of 'exclude' contains duplicate field(s).z
admin.E015r]   )
r   r/   rT   rU   rV   rv   rw   r   r-   rj   rY   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parentrL   rM   r&   N)r   r   r   must_inherit_fromrY   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.rI   filter_verticalz
admin.E017rK   c                 3   s$   | ]\}}  |d | V  qdS )zfilter_vertical[%d]N_check_filter_itemrO   rR   r   r   r)     s     z>BaseModelAdminChecks._check_filter_vertical.<locals>.<genexpr>N)r/   r   rT   rU   rV   r   rW   rX   rY   r   rR   r   r@     s       z+BaseModelAdminChecks._check_filter_verticalc                    sH   t  jttfs tdd ddS tt fddt jD S dS )z:Check that filter_horizontal is a sequence of field names.rI   filter_horizontalz
admin.E018rK   c                 3   s$   | ]\}}  |d | V  qdS )zfilter_horizontal[%d]Nr   rO   rR   r   r   r)     s     z@BaseModelAdminChecks._check_filter_horizontal.<locals>.<genexpr>N)r/   r   rT   rU   rV   r   rW   rX   rY   r   rR   r   rA     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 )zCheck one item of `filter_vertical` or `filter_horizontal`, i.e.
        check that given field exists and is a ManyToManyField.z
admin.E019rZ   za many-to-many fieldz
admin.E020rK   N)r^   r_   r`   r	   ra   rb   rV   rq   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.E021rK   c                 3   s2   | ]*\}}  |d  |d|  V  qdS )r   zradio_fields["%s"]N)_check_radio_fields_key_check_radio_fields_valuer(   rQ   valrR   r   r   r)   #  s     z;BaseModelAdminChecks._check_radio_fields.<locals>.<genexpr>N)r/   r   r   rV   rT   r   rW   itemsrY   r   rR   r   rB     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 )zCheck 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.E022rZ   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_   r`   r	   ra   r/   r
   rc   choicesr   r-   rj   rq   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 )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-   rj   )rH   rM   r   rl   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_siter/   boolr   r-   rj   rY   r   r   r   rD   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.E026rK   c                 3   s2   | ]*\}}  |d  |d|  V  qdS )r   zprepopulated_fields["%s"]N)_check_prepopulated_fields_key _check_prepopulated_fields_valuer   rR   r   r   r)   k  s       zBBaseModelAdminChecks._check_prepopulated_fields.<locals>.<genexpr>N)r/   r   r   rV   rT   r   rW   r   rY   r   rR   r   rC   b  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 )zCheck 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.E027rZ   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_   r`   r	   ra   r/   r
   DateTimeFieldrc   r   r   r-   rj   rq   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.rI   z
admin.E029rK   c                 3   s(   | ] \}} |d  |f V  qdS )z%s[%r]N)%_check_prepopulated_fields_value_item)r(   rP   Zsubfield_namer   r   r   r)     s     
zHBaseModelAdminChecks._check_prepopulated_fields_value.<locals>.<genexpr>N)r/   rT   rU   rV   r   rW   rX   )rH   rM   r   rl   r   r   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 )zYFor `prepopulated_fields` equal to {"slug": ("title",)},
        `field_name` is "title".z
admin.E030rZ   N)r^   r_   r`   r	   ra   rH   rM   rQ   rl   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.NrI   orderingz
admin.E031rK   c                 3   s$   | ]\}}  |d | V  qdS )zordering[%d]N)_check_ordering_itemrO   rR   r   r   r)     s   z7BaseModelAdminChecks._check_ordering.<locals>.<genexpr>)r   r/   rT   rU   rV   r   rW   rX   rY   r   rR   r   rE     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rg S |dr|dd }|d	krg S z|jj| W n$ tk
r   t|||d
d Y S X 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*   rM   r&   -Npkz
admin.E033rZ   )r/   r   r
   OrderByasc
expressionFrp   rv   r   r   r-   rj   r   
startswithr^   r_   r`   r	   ra   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   rI   r   z
admin.E034rK   c                 3   s$   | ]\}}  |d | V  qdS )zreadonly_fields[%d]N)_check_readonly_fields_itemrO   rR   r   r   r)     s     z>BaseModelAdminChecks._check_readonly_fields.<locals>.<genexpr>N)r   r/   rT   rU   rV   r   rW   rX   rY   r   rR   r   rF     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.E035r]   )r   hasattrr^   r_   r`   r	   r   r-   rj   rh   rl   r   r   r   r   r     s*    

z0BaseModelAdminChecks._check_readonly_fields_itemN)rh   
__module____qualname__r    r:   rN   r;   ro   r<   r=   rx   rt   r   r>   r?   r@   rA   r   rB   r   r   rD   rC   r   r   r   rE   r   rF   r   r   r   r   r   r9      s6   1",	'r9   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_uniquenessrG   rj   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.E101rK   N)r/   r   r   rV   rY   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.E102rK   N)r/   r   r   rV   rY   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.rI   inlinesz
admin.E103rK   c                 3   s$   | ]\}}  |d | V  qdS )zinlines[%d]N)_check_inlines_itemr(   rP   itemrR   r   r   r)   C  s   z2ModelAdminChecks._check_inlines.<locals>.<genexpr>N)r/   r   rT   rU   rV   r   rW   rX   rY   r   rR   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	stjd| |jddgS t|j	t
jst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.E106rK   N)r   rh   AttributeErrorr   r-   rj   r   r   r   r^   r
   ModelrV   rd   r    )rH   rM   inlinerl   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.rI   list_displayz
admin.E107rK   c                 3   s$   | ]\}}  |d | V  qdS )zlist_display[%d]N)_check_list_display_itemr   rR   r   r   r)   x  s   z7ModelAdminChecks._check_list_display.<locals>.<genexpr>N)r/   r   rT   rU   rV   r   rW   rX   rY   r   rR   r   r   o  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rt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_   r`   r	   getattrr   r   r-   rj   rh   rl   r/   r
   r   )rH   rM   r   rl   r[   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 )
zACheck that list_display_links is a unique subset of list_display.r   )
ModelAdminNza list, a tuple, or Nonelist_display_linksz
admin.E110rK   c                 3   s$   | ]\}}  |d | V  qdS )zlist_display_links[%d]N)_check_list_display_links_itemrO   rR   r   r   r)     s     z=ModelAdminChecks._check_list_display_links.<locals>.<genexpr>)r   r   r   r/   rT   rU   rV   get_list_display__func__r   rW   rX   )rH   rM   r   r   rR   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.E111r]   )r   r   r-   rj   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 )NrI   list_filterz
admin.E112rK   c                 3   s$   | ]\}}  |d | V  qdS )zlist_filter[%d]N)_check_list_filter_itemr   rR   r   r   r)     s   z6ModelAdminChecks._check_list_filter.<locals>.<genexpr>)r/   r   rT   rU   rV   r   rW   rX   rY   r   rR   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 nt|ttfr|\}}t||st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   )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   r/   r
   Fieldr   r   r   r   r-   rj   rU   rT   r   r^   r   r	   )rH   rM   r   rl   r   r   r[   list_filter_classr   r   r   r     sT    
   
	

	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.E117rK   N)r/   r   r   rT   rU   rV   rY   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.E118rK   N)r/   r   intrV   rY   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.E119rK   N)r/   r   r   rV   rY   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.rI   list_editablez
admin.E120rK   c                 3   s$   | ]\}}  |d | V  qdS )zlist_editable[%d]N)_check_list_editable_itemr   rR   r   r   r)   ;  s     z8ModelAdminChecks._check_list_editable.<locals>.<genexpr>N)r/   r   rT   rU   rV   r   rW   rX   rY   r   rR   r   r   1  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rtjd| |jddgS |jd |kr|j	s|j	d k	rtjd	||jd f |jd
dgS |j
r|jrtjd||f |jddgS g S d S )Nz
admin.E121rZ   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_   r`   r	   ra   r   r   r-   rj   r   editableprimary_keyrq   r   r   r   r   C  sf       
		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.rI   rk   z
admin.E126rK   N)r/   rk   rT   rU   rV   rY   r   r   r   r   y  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 )
z?Check that date_hierarchy refers to DateField or DateTimeField.NzNThe 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.E128rK   )r   r   r^   r   r	   r   r-   rj   r/   r
   	DateFieldr   rV   )rH   rM   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-   rj   rh   )	rH   rM   actionsr#   funcrp   _
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   rp   r   r   r   r)     s     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-   rj   rh   )rH   rM   r#   namesrp   countr   r   r   r     s     z*ModelAdminChecks._check_actions_uniqueness)rh   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              	      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)rH   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.E201r]   )r   r>   r   r   r   r^   r   rp   r   r-   r_   rl   rj   )rH   rM   r   r#   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.E202r]   )r   r^   r   
ValueErrorr   r-   argsrj   )rH   rM   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.E203rK   N)r/   r  r   rV   rY   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.E204rK   )r  r/   r   rV   rY   r   r   r   r     s
    
z%InlineModelAdminChecks._check_max_numc                 C   s2   |j dkrg S t|j ts*tdd|ddS g S dS )z!Check that min_num is an integer.Nr   min_numz
admin.E205rK   )r  r/   r   rV   rY   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   rY   r   r   r   r     s       z%InlineModelAdminChecks._check_formset)rh   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-   rj   )ri   rL   rM   r&   r   r   r   rV   *  s    
rV   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_   rl   rj   rZ   r   r   r   ra   >  s    ra   ))r   	itertoolsr   django.appsr   django.confr   django.contrib.admin.utilsr   r   r   Z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%   r8   r9   r   r   rV   r   ra   r   r   r   r   <module>   s<   	y    j   <[

