o
    [h*                     @   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 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)NotRegistered)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 w )zX
    issubclass() variant that doesn't raise an exception if cls isn't a
    class.
    F)
issubclass	TypeError)clsZ	classinfo r   /home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/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   )Z
class_pathZcandidate_pathsr   pathZcandidate_clsr   r   r   _contains_subclass   s   
r   c                 K   s.   ddl m} g }|D ]
}|||  q
|S )Nr   	all_sites)django.contrib.admin.sitesr   extendcheck)Zapp_configskwargsr   errorssiter   r   r   check_admin_app/   s
   r%   c            	      K   sx  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} nq/d}|sK|tjd	d
d n>d|jvr`tdtjr`|tjddd d|jvro|tjddd tdd |D }|rd|jvr|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 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>{   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   engineZcontext_processorsr   r   ZAUTHENTICATION_BACKENDSanyWarningZ
MIDDLEWARE)	r"   r   r#   Zapp_dependenciesZapp_nameZ
error_coder0   Zdjango_templates_instanceZsidebar_enabledr   r   r   check_dependencies8   s   



		r3   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                    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r(   index
field_namerI   rC   r   r   
<listcomp>   s    
zCBaseModelAdminChecks._check_autocomplete_fields.<locals>.<listcomp>)r/   rF   listtuplemust_ber   from_iterable	enumeraterC   rI   r   rN   r   r5      s   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 z
|j
|jj }W n tyS   tjd|jj jt|jf |jddg Y S w |jsjt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fieldrH   rI   r&   %a foreign key or a many-to-many fieldz
admin.E038rG   zXAn admin for model "%s" has to be registered to be referenced by %s.autocomplete_fields.z
admin.E039rI   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   
ForeignKeyrR   
admin_siteZget_model_adminremote_fieldr   r	   r-   __name__type	__class__search_fields)rC   rI   rM   labelrW   Zrelated_adminr   r   r   rJ      sP   
z4BaseModelAdminChecks._check_autocomplete_fields_itemc                    rD   )zZCheck that `raw_id_fields` only contains field names that are listed
        on the model.rE   raw_id_fieldsz
admin.E001rG   c                 3   &    | ]\}}  |d | V  qdS )zraw_id_fields[%d]N)_check_raw_id_fields_itemrK   rN   r   r   r)         

z<BaseModelAdminChecks._check_raw_id_fields.<locals>.<genexpr>)r/   rg   rP   rQ   rR   r   rS   rT   rU   r   rN   r   r6        z)BaseModelAdminChecks._check_raw_id_fieldsc              	   C   sv   z	|j j|}W n ty   t|||dd Y S w |j|kr(t|||ddS |js9t|tj	s9t
d||ddS g 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.E002rV   rX   z
admin.E003rG   )rZ   r[   r\   r
   r]   namer^   r/   r   r_   rR   rC   rI   rM   rf   rW   r   r   r   ri     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 )zCheck that `fields` only refer to existing fields, doesn't contain
        duplicates. Check if at most one of `fields` and `fieldsets` is defined.
        NrE   fieldsz
admin.E004rG   z,Both 'fieldsets' and 'fields' are specified.z
admin.E005rY   z2The value of 'fields' contains duplicate field(s).z
admin.E006c                 3   s    | ]
}  |d V  qdS )rn   N_check_field_spec)r(   rM   rN   r   r   r)   Y  s
    
z5BaseModelAdminChecks._check_fields.<locals>.<genexpr>)rn   r/   rP   rQ   rR   	fieldsetsr	   r-   rd   r   lensetr   rS   )rC   rI   rn   r   rN   r   r7   =  s0   

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 )zRCheck that fieldsets is properly formatted and doesn't contain
        duplicates.NrE   rq   z
admin.E007rG   c                 3   s(    | ]\}}  |d | V  qdS )zfieldsets[%d]N)_check_fieldsets_item)r(   rL   fieldsetrI   seen_fieldsrC   r   r   r)   l  s    
z8BaseModelAdminChecks._check_fieldsets.<locals>.<genexpr>)rq   r/   rP   rQ   rR   r   rS   rT   rU   r   rv   r   r8   _  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.rE   z
admin.E008rG      zof length 2z
admin.E009   a dictionary%s[1]z
admin.E010rn   z3The value of '%s[1]' must contain the key 'fields'.z
admin.E011rY   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"]Nro   )r(   Zfieldset_fieldsrf   rI   rC   r   r   r)     s
    
z=BaseModelAdminChecks._check_fieldsets_item.<locals>.<genexpr>)r/   rP   rQ   rR   rr   dictr	   r-   rd   r    r   rs   r   rS   )rC   rI   ru   rf   rw   r   r|   r   rt   t  sF   
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_itemrK   r|   r   r   r)         
z9BaseModelAdminChecks._check_field_spec.<locals>.<genexpr>)r/   rQ   rP   r   rS   rT   r   )rC   rI   rn   rf   r   r|   r   rp     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.
admin.E013rY   )readonly_fieldsrZ   r[   r\   r
   r/   r   ManyToManyFieldra   throughauto_createdr	   r-   rd   rm   r   r   r   r     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 )	z4Check that exclude is a sequence without duplicates.NrE   excludez
admin.E014rG   z3The value of 'exclude' contains duplicate field(s).z
admin.E015rY   )
r   r/   rP   rQ   rR   rr   rs   r	   r-   rd   rU   r   r   r   r9     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parentrH   rI   r&   )r   r   r   must_inherit_fromrU   r   r   r   r:     s
   z BaseModelAdminChecks._check_formc                    rD   )z8Check that filter_vertical is a sequence of field names.rE   filter_verticalz
admin.E017rG   c                 3   rh   )zfilter_vertical[%d]N_check_filter_itemrK   rN   r   r   r)     rj   z>BaseModelAdminChecks._check_filter_vertical.<locals>.<genexpr>)r/   r   rP   rQ   rR   r   rS   rT   rU   r   rN   r   r;        z+BaseModelAdminChecks._check_filter_verticalc                    rD   )z:Check that filter_horizontal is a sequence of field names.rE   filter_horizontalz
admin.E018rG   c                 3   rh   )zfilter_horizontal[%d]Nr   rK   rN   r   r   r)     rj   z@BaseModelAdminChecks._check_filter_horizontal.<locals>.<genexpr>)r/   r   rP   rQ   rR   r   rS   rT   rU   r   rN   r   r<     r   z-BaseModelAdminChecks._check_filter_horizontalc              	   C   s   z	|j j|}W n ty   t|||dd Y S w |jr$t|tjr,t	d||ddS |j
jjjsCtjd| d| d|jd	d
gS g S )zCheck one item of `filter_vertical` or `filter_horizontal`, i.e.
        check that given field exists and is a ManyToManyField.z
admin.E019rV   za many-to-many fieldz
admin.E020rG   The value of 'z&' cannot include the ManyToManyField 'z>', because that field manually specifies a relationship model.r   rY   )rZ   r[   r\   r
   r]   r^   r/   r   ZManyToManyRelrR   ra   r   r   r	   r-   rd   rm   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.rz   radio_fieldsz
admin.E021rG   c                 3   4    | ]\}}  |d  |d|  V  qdS )r   zradio_fields["%s"]N)_check_radio_fields_key_check_radio_fields_valuer(   rM   valrN   r   r   r)   0  s    

z;BaseModelAdminChecks._check_radio_fields.<locals>.<genexpr>)r/   r   r}   rR   rP   r   rS   itemsrU   r   rN   r   r=   (  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 )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.E022rV   zsThe value of '%s' refers to '%s', which is not an instance of ForeignKey, and does not have a 'choices' definition.z
admin.E023rY   )rZ   r[   r\   r
   r]   r/   r   r_   choicesr	   r-   rd   rm   r   r   r   r   9  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 )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.E024rY   )django.contrib.admin.optionsr   r   r	   r-   rd   )rC   rI   r   rf   r   r   r   r   r   r   Q  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.E025rY   )callableZview_on_siter/   boolr	   r-   rd   rU   r   r   r   r?   b  s   	z,BaseModelAdminChecks._check_view_on_site_urlc                    r   )zXCheck that `prepopulated_fields` is a dictionary containing allowed
        field types.rz   prepopulated_fieldsz
admin.E026rG   c                 3   r   )r   zprepopulated_fields["%s"]N)_check_prepopulated_fields_key _check_prepopulated_fields_valuer   rN   r   r   r)   x  s    

zBBaseModelAdminChecks._check_prepopulated_fields.<locals>.<genexpr>)r/   r   r}   rR   rP   r   rS   r   rU   r   rN   r   r>   o  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 )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.E027rV   zyThe value of '%s' refers to '%s', which must not be a DateTimeField, a ForeignKey, a OneToOneField, or a ManyToManyField.z
admin.E028rY   )rZ   r[   r\   r
   r]   r/   r   DateTimeFieldr_   r   r	   r-   rd   rm   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 )zdCheck a value of `prepopulated_fields` dictionary, i.e. it's an
        iterable of existing fields.rE   z
admin.E029rG   c                 3   r~   )z%s[%r]N)%_check_prepopulated_fields_value_item)r(   rL   Zsubfield_namer|   r   r   r)     r   zHBaseModelAdminChecks._check_prepopulated_fields_value.<locals>.<genexpr>)r/   rP   rQ   rR   r   rS   rT   )rC   rI   r   rf   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 )zYFor `prepopulated_fields` equal to {"slug": ("title",)},
        `field_name` is "title".z
admin.E030rV   )rZ   r[   r\   r
   r]   rC   rI   rM   rf   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.NrE   orderingz
admin.E031rG   c                 3   rh   )zordering[%d]N)_check_ordering_itemrK   rN   r   r   r)     
    
z7BaseModelAdminChecks._check_ordering.<locals>.<genexpr>)r   r/   rP   rQ   rR   r   rS   rT   rU   r   rN   r   r@     s   
z$BaseModelAdminChecks._check_orderingc              	   C   s   t |ttjfr t |tjs| }t |jtjr|jj}ng S |dkr6t|j	dkr6t
jdd|jddgS |dkr<g S t|v rBg S |d}|dkrMg S z
|jj| W g S  tyh   t|||d	d
 Y S w )z0Check that `ordering` refers to existing fields.?ry   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*   rI   r&   -pkz
admin.E033rV   )r/   r   r   ZOrderByasc
expressionFrl   rr   r   r	   r-   rd   r   removeprefixrZ   r[   r\   r
   r]   r   r   r   r   r     s:   
	

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 )z?Check that readonly_fields refers to proper attribute or field.r   rE   r   z
admin.E034rG   c                 3   rh   )zreadonly_fields[%d]N)_check_readonly_fields_itemrK   rN   r   r   r)     rj   z>BaseModelAdminChecks._check_readonly_fields.<locals>.<genexpr>)r   r/   rP   rQ   rR   r   rS   rT   rU   r   rN   r   rA     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
f |jddg Y S w )NziThe value of '%s' refers to '%s', which is not a callable, an attribute of '%s', or an attribute of '%s'.z
admin.E035rY   )r   hasattrrZ   r[   r\   r
   r	   r-   rd   rb   rf   r   r   r   r   r     s.   
z0BaseModelAdminChecks._check_readonly_fields_itemN)rb   
__module____qualname__r!   r5   rJ   r6   ri   r7   r8   rt   rp   r   r9   r:   r;   r<   r   r=   r   r   r?   r>   r   r   r   r@   r   rA   r   r   r   r   r   r4      s8    3",	&r4   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  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_actionsrB   rd   r   r   r!   $  s:   
	
zModelAdminChecks.checkc                 C   r   )zCheck save_as is a boolean.	a booleansave_asz
admin.E101rG   )r/   r   r   rR   rU   r   r   r   r   6     zModelAdminChecks._check_save_asc                 C   r   )zCheck save_on_top is a boolean.r   save_on_topz
admin.E102rG   )r/   r   r   rR   rU   r   r   r   r   >  r   z#ModelAdminChecks._check_save_on_topc                    rD   )z%Check all inline model admin classes.rE   inlinesz
admin.E103rG   c                 3   rh   )zinlines[%d]N)_check_inlines_itemr(   rL   itemrN   r   r   r)   O  r   z2ModelAdminChecks._check_inlines.<locals>.<genexpr>)r/   r   rP   rQ   rR   r   rS   rT   rU   r   rN   r   r   F     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.E104rY   r   )InlineModelAdminz#'%s' must have a 'model' attribute.z
admin.E105za Modelz%s.modelz
admin.E106rG   )r   rb   AttributeErrorr	   r-   rd   r   r   r   rZ   r   ZModelrR   r`   r!   )rC   rI   inlinerf   Zinline_labelr   r   r   r   r   U  s<   	
z$ModelAdminChecks._check_inlines_itemc                    rD   )zBCheck that list_display only contains fields or usable attributes.rE   list_displayz
admin.E107rG   c                 3   rh   )zlist_display[%d]N)_check_list_display_itemr   rN   r   r   r)     r   z7ModelAdminChecks._check_list_display.<locals>.<genexpr>)r/   r   rP   rQ   rR   r   rS   rT   rU   r   rN   r   r   {  r   z$ModelAdminChecks._check_list_displayc                 C   s  t |rg S t||rg S z	|jj|}W nQ tyg   zt|j|}W n? tyd   z
t|j|d }W n+ tt	fya   t
jd| d| d|jj d|jjj d	|jddg Y  Y  Y S w Y nw Y nw t|d	d
rt|js|jst|dd r|jjjrt
jd| d|jddgS g S )Nr   z' refers to 'z,', which is not a callable or attribute of 'z)', or an attribute, method, or field on 'z'.z
admin.E108rY   Zis_relationFrelz<' must not be a many-to-many field or a reverse foreign key.z
admin.E109)r   r   rZ   r[   r\   r
   getattrr   r   r   r	   r-   rd   rb   rf   r^   Zone_to_manyr   rW   Zmany_to_one)rC   rI   r   rf   rW   r   r   r   r     sZ   



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 )
zACheck that list_display_links is a unique subset of list_display.r   )
ModelAdminNza list, a tuple, or Nonelist_display_linksz
admin.E110rG   c                 3   rh   )zlist_display_links[%d]N)_check_list_display_links_itemrK   rN   r   r   r)     rj   z=ModelAdminChecks._check_list_display_links.<locals>.<genexpr>)r   r   r   r/   rP   rQ   rR   Zget_list_display__func__r   rS   rT   )rC   rI   r   r   rN   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.E111rY   )r   r	   r-   rd   r   r   r   r   r     s   
	z/ModelAdminChecks._check_list_display_links_itemc                    rD   )NrE   list_filterz
admin.E112rG   c                 3   rh   )zlist_filter[%d]N)_check_list_filter_itemr   rN   r   r   r)     r   z6ModelAdminChecks._check_list_filter.<locals>.<genexpr>)r/   r   rP   rQ   rR   r   rS   rT   rU   r   rN   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   )FieldListFilter
ListFilterr   z
admin.E113r   z:The value of '%s' must not inherit from 'FieldListFilter'.z
admin.E114rY   r   r{   z
admin.E115zBThe value of '%s' refers to '%s', which does not refer to a Field.z
admin.E116)Zdjango.contrib.adminr   r   r   r/   r   Fieldr   r   r   r	   r-   rd   rQ   rP   r   rZ   r   r
   )rC   rI   r   rf   r   r   rW   Zlist_filter_classr   r   r   r     sP   

	
z(ModelAdminChecks._check_list_filter_itemc                 C   s&   t |jtttfstdd|ddS g 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.E117rG   )r/   r   r   rP   rQ   rR   rU   r   r   r   r     s   z+ModelAdminChecks._check_list_select_relatedc                 C   r   )z'Check that list_per_page is an integer.
an integerlist_per_pagez
admin.E118rG   )r/   r   intrR   rU   r   r   r   r   +  
   z%ModelAdminChecks._check_list_per_pagec                 C   r   )z+Check that list_max_show_all is an integer.r   list_max_show_allz
admin.E119rG   )r/   r   r   rR   rU   r   r   r   r   5  r   z)ModelAdminChecks._check_list_max_show_allc                    rD   )zjCheck that list_editable is a sequence of editable fields from
        list_display without first element.rE   list_editablez
admin.E120rG   c                 3   rh   )zlist_editable[%d]N)_check_list_editable_itemr   rN   r   r   r)   I  rj   z8ModelAdminChecks._check_list_editable.<locals>.<genexpr>)r/   r   rP   rQ   rR   r   rS   rT   rU   r   rN   r   r   ?  rk   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
rh|jrvtjd||f |jddgS g S )Nz
admin.E121rV   zKThe value of '%s' refers to '%s', which is not contained in 'list_display'.z
admin.E122rY   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)rZ   r[   r\   r
   r]   r   r	   r-   rd   r   editableZprimary_keyrm   r   r   r   r   Q  s^   


		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.rE   re   z
admin.E126rG   )r/   re   rP   rQ   rR   rU   r   r   r   r     s
   z%ModelAdminChecks._check_search_fieldsc              	   C   sv   |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 | dvr9t	dd|d	d
S g S )z?Check that date_hierarchy refers to DateField or DateTimeField.Nr   zNThe value of 'date_hierarchy' refers to '%s', which does not refer to a Field.z
admin.E127rY   >   Z	DateFieldr   za DateField or DateTimeFielddate_hierarchyz
admin.E128rG   )
r   r   rZ   r   r
   r	   r-   rd   Zget_internal_typerR   )rC   rI   rW   r   r   r   r     s,   

z&ModelAdminChecks._check_date_hierarchyc              	   C   s   g }|  }|D ].\}}}t|dsq|jD ]}d| }t||s5|tjd|jj||jf |jdd qqt	dd |D }	|	
 D ]\}}
|
dkr_|tjd	|jj|f |jd
d qE|S )Nallowed_permissionszhas_%s_permissionz/%s must define a %s() method for the %s action.z
admin.E129rY   c                 s   s    | ]\}}}|V  qd S r'   r   )r(   _rl   r   r   r   r)     s    z2ModelAdminChecks._check_actions.<locals>.<genexpr>ry   zS__name__ attributes of actions defined in %s must be unique. Name %r is not unique.z
admin.E130)Z_get_base_actionsr   r   r,   r	   r-   rd   rb   collectionsCounterr   )rC   rI   r#   actionsfuncrl   r   Z
permissionmethod_namenamescountr   r   r   r     sL   


zModelAdminChecks._check_actions)rb   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)rC   Z
inline_objr"   r   r   r   r   r!     s    


zInlineModelAdminChecks.checkc                    sv   t  |}|r
g S | ||rg S |jd u rg S t||j|jd}|j|jv r9tj	d|j|j
jf |jddgS g S )Nfk_namezVCannot exclude the field '%s', because it is the foreign key to the parent model '%s'.z
admin.E201rY   )r   r9   r   r   r   rZ   r   rl   r	   r-   r[   rf   rd   )rC   rI   r   r#   Z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.E202rY   )r   rZ   r   
ValueErrorr	   r-   argsrd   )rC   rI   r   er   r   r   r     s   &z&InlineModelAdminChecks._check_relationc                 C   r   )zCheck that extra is an integer.r   extraz
admin.E203rG   )r/   r   r   rR   rU   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.E204rG   )r  r/   r   rR   rU   r   r   r   r     
   
z%InlineModelAdminChecks._check_max_numc                 C   r  )z!Check that min_num is an integer.Nr   min_numz
admin.E205rG   )r  r/   r   rR   rU   r   r   r   r     r  z%InlineModelAdminChecks._check_min_numc                 C   r   )z0Check formset is a subclass of BaseModelFormSet.r   formsetz
admin.E206r   )r   r  r   r   rU   r   r   r   r   (  r   z%InlineModelAdminChecks._check_formset)rb   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.rY   r	   r-   rd   )rc   rH   rI   r&   r   r   r   rR   3     
rR   c                 C   r  )Nz)The value of '%s' must inherit from '%s'.rY   r  r   r   r   r   r   =  r  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'.rY   )r	   r-   rZ   r[   rf   rd   rV   r   r   r   r]   G  s   r]   )+r   	itertoolsr   Zdjango.appsr   Zdjango.confr   Zdjango.contrib.admin.exceptionsr   Zdjango.contrib.admin.utilsr   r   r   Zdjango.corer	   Zdjango.core.exceptionsr
   Z	django.dbr   Zdjango.db.models.constantsr   Zdjango.db.models.expressionsr   Zdjango.forms.modelsr   r   r   Zdjango.templater   Zdjango.template.backends.djangor   Zdjango.utils.module_loadingr   r   r   r%   r3   r4   r   r   rR   r   r]   r   r   r   r   <module>   s@    	y    v   8[

