
    k"g*                     .   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 Z!d Z"d Z#d Z$ G d d      Z% G d de%      Z& G d de%      Z'd Z(d Z)d Z*y)    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                 :    	 t        | |      S # t        $ r Y yw xY w)zX
    issubclass() variant that doesn't raise an exception if cls isn't a
    class.
    F)
issubclass	TypeError)cls	classinfos     T/var/www/html/djangosite/lib/python3.12/site-packages/django/contrib/admin/checks.py_issubclassr      s&    
#y)) s    	c                 z    t        |       }|D ]  }	 t        |      }t        ||      s y y# t        $ r Y +w xY w)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_clss        r   _contains_subclassr"      sT    
 

#C 	)$/M }c*   		s   .	::c                 d    ddl m} g }|D ]"  }|j                  |j                  |              $ |S )Nr   	all_sites)django.contrib.admin.sitesr%   extendcheck)app_configskwargsr%   errorssites        r   check_admin_appr-   /   s3    4F /djj-./M    c                     ddl m} t        j                  d      sg S g }d}|D ]G  \  }}t        j                  |      r|j	                  t        j                  d|z  d|z               I t        j                         D ]   }t        |t              s|j                  } n d}|s'|j	                  t        j                  d	d
             nd|j                  vr@t        dt        j                        r&|j	                  t        j                  dd             d|j                  vr&|j	                  t        j                  dd             t!        d |D              }|r4d|j                  vr&|j	                  t        j"                  dd             t        dt        j$                        s&|j	                  t        j                  dd             t        dt        j$                        s&|j	                  t        j                  dd             t        dt        j$                        s'|j	                  t        j                  ddd              |S )!zF
    Check that the admin's dependencies are correctly installed.
    r   r$   zdjango.contrib.admin))zdjango.contrib.contenttypesi  )zdjango.contrib.authi  )zdjango.contrib.messagesi  zE'%s' must be in INSTALLED_APPS in order to use the admin application.z	admin.E%d)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              3   4   K   | ]  }|j                     y wN)enable_nav_sidebar).0r,   s     r   	<genexpr>z%check_dependencies.<locals>.<genexpr>{   s     L$d55Ls   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)hintr0   )r&   r%   r   is_installedappendr
   Errorr   all
isinstancer   enginecontext_processorsr"   r   AUTHENTICATION_BACKENDSanyWarning
MIDDLEWARE)	r*   r%   r+   app_dependenciesapp_name
error_coder<   django_templates_instancesidebar_enableds	            r   check_dependenciesrG   8   s\    534	F
 !1 *  *MM#%-."Z/ ++- )fo.(.%)
 %)!$LL  		
 :,??@";00
 MMJ $	 B,??@ MM- $	 L)LL<,??@ MM* $	 A8CVCV 	LLJ	
 >@S@S 	LLJ	
 >@S@S 	LLJQ
  
	
 Mr.   c                       e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)BaseModelAdminChecksc                    g | j                  |      | j                  |      | j                  |      | j                  |      | j	                  |      | j                  |      | j                  |      | j                  |      | j                  |      | j                  |      | j                  |      | j                  |      | j                  |      S r2   )_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*   s      r   r(   zBaseModelAdminChecks.check   s   
,,Y7
&&y1
 	*
 ""9-	

   +
 i(
 ((3
 **95
 %%i0
 ,,Y7
 )))4
 !!),
 ((3
 	
r.   c                    t        |j                  t        t        f      st	        dd|d      S t        t        j                  t        |j                        D cg c]  \  }}| j                  ||d|z         c}}            S c c}}w )zV
        Check that `autocomplete_fields` is a list or tuple of model fields.
        a list or tupleautocomplete_fieldsz
admin.E036optionobjr0   zautocomplete_fields[%d])	r;   r\   listtuplemust_ber   from_iterable	enumerate_check_autocomplete_fields_item)rX   r_   index
field_names       r   rK   z/BaseModelAdminChecks._check_autocomplete_fields   s     #11D%=A!,	  ##
 2;3;R;R1S	 .E: <<-F-N	 	s    Bc           	         	 |j                   j                  j                  |      }|j                  s)t	        |t
        j                        st        d||d      S 	 |j                  j                  |j                  j                         }|j                  sPt        j                  |j                  j                  dt!        |      j                  d|j                  d      gS g S # t"        $ r^ t        j                  d|j                  j                   j                  d	t!        |      j                  d|j                  d
      gcY S w xY w# t$        $ r t'        |||d      cY S w xY w)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.
        %a foreign key or a many-to-many fieldz
admin.E038r]   z9 must define "search_fields", because it's referenced by z.autocomplete_fields.z
admin.E040r_   r0   zAn admin for model "z+" has to be registered to be referenced by z
admin.E039z
admin.E037fieldr^   r_   r0   )model_meta	get_fieldmany_to_manyr;   r   
ForeignKeyrb   
admin_siteget_model_adminremote_fieldsearch_fieldsr
   r9   	__class____name__typer   r   refer_to_missing_field)rX   r_   rg   labelrl   related_admins         r   re   z4BaseModelAdminChecks._check_autocomplete_fields_item   sP   +	IIOO--j9E %%j@Q@Q.R; #	  # > >u?Q?Q?W?W X %22 !. 7 7 @ @ $S	 2 2	 !$+	  I7 ! LL "..44== I..	  MM'	  ! 	) CL 	s$   %E /C* *A$EEE/.E/c                      t        j                  t        t        f      st	        ddd      S t        t        j                   fdt        j                        D                    S )zZCheck that `raw_id_fields` only contains field names that are listed
        on the model.r[   raw_id_fieldsz
admin.E001r]   c              3   P   K   | ]  \  }}j                  |d |z          yw)zraw_id_fields[%d]N)_check_raw_id_fields_itemr4   rf   rg   r_   rX   s      r   r5   z<BaseModelAdminChecks._check_raw_id_fields.<locals>.<genexpr>  s7      $ *z 22Z)<u)D$   #&)r;   r}   r`   ra   rb   r   rc   rd   rX   r_   s   ``r   rL   z)BaseModelAdminChecks._check_raw_id_fields  sf     #++dE];!/s|  ## $ .7s7H7H-I	$  r.   c                 4   	 |j                   j                  j                  |      }|j                  |k7  rt	        |||d      S |j
                  s)t        |t        j                        st        d||d      S g S # t        $ r t	        |||d      cY S w xY w)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.E002rk   ri   z
admin.E003r]   )rm   rn   ro   namery   rp   r;   r   rq   rb   r   rX   r_   rg   rz   rl   s        r   r   z.BaseModelAdminChecks._check_raw_id_fields_item  s    
	IIOO--j9E zzZ'-$ #	  %%j@Q@Q.R; #	  	+ ! 	) CL 	s   %A< <BBc                     j                   g S t        j                   t        t        f      st	        ddd      S j
                  r#t        j                  dj                  d      gS t        j                         }t        |      t        t        |            k7  r#t        j                  dj                  d	      gS t        t        j                   f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.
        r[   fieldsz
admin.E004r]   z,Both 'fieldsets' and 'fields' are specified.z
admin.E005rj   z2The value of 'fields' contains duplicate field(s).z
admin.E006c              3   D   K   | ]  }j                  |d         yw)r   N_check_field_spec)r4   rg   r_   rX   s     r   r5   z5BaseModelAdminChecks._check_fields.<locals>.<genexpr>Y  s(        &&sJA s    )r   r;   r`   ra   rb   	fieldsetsr
   r9   rv   r   lensetr   rc   )rX   r_   r   s   `` r   rM   z"BaseModelAdminChecks._check_fields=  s    
 ::ICJJu6,X3<XX]]B#  $v;#c&k**H#    "%**  
 	
r.   c                      j                   g S t        j                   t        t        f      st	        ddd      S g t        t        j                   fdt        j                         D                    S )zRCheck that fieldsets is properly formatted and doesn't contain
        duplicates.r[   r   z
admin.E007r]   c              3   R   K   | ]  \  }}j                  |d |z           yw)zfieldsets[%d]N)_check_fieldsets_item)r4   rf   fieldsetr_   seen_fieldsrX   s      r   r5   z8BaseModelAdminChecks._check_fieldsets.<locals>.<genexpr>l  s8      $ (x ..X'>$s   $')r   r;   r`   ra   rb   r   rc   rd   )rX   r_   r   s   ``@r   rN   z%BaseModelAdminChecks._check_fieldsets_  sv     == ICMMD%=9!+3<  K## $ ,5S]]+C	$  r.   c                     t        |t        t        f      st        dd      S t	        |      dk7  rt        dd      S t        |d   t
              st        dd	z  d
      S d|d   vr&t        j                  dz  j                  d      gS t        |d   d   t        t        f      st        ddz  d      S |j                  t        |d   d                t	        |      t	        t        |            k7  r&t        j                  dz  j                  d      gS t        t        j                   f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.r[   z
admin.E008r]      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.E011rj   z%s[1]['fields']z(There are duplicate field(s) in '%s[1]'.z
admin.E012c              3   J   K   | ]  }j                  |d z          yw)z%s[1]["fields"]Nr   )r4   fieldset_fieldsrz   r_   rX   s     r   r5   z=BaseModelAdminChecks._check_fieldsets_item.<locals>.<genexpr>  s/       # &&sO=NQV=VW s    #)r;   r`   ra   rb   r   dictr
   r9   rv   r'   r   r   r   rc   )rX   r_   r   rz   r   s   `` ` r   r   z*BaseModelAdminChecks._check_fieldsets_itemt  sg    (T5M2,UUU]a=CLQQHQK.wCL  Xa[(IEQ#  HQK1D%=A!(50	  	78A;x#89:{s3{#344>F#    '/{8'<  
 	
r.   c                      t        |t              r2t        t        j                   fdt        |      D                    S  j                  |      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   T   K   | ]  \  }}j                  |d |fz         ! yw)z%s[%d]N)_check_field_spec_item)r4   rf   rg   rz   r_   rX   s      r   r5   z9BaseModelAdminChecks._check_field_spec.<locals>.<genexpr>  s:      $ *z //ZUEN)B$s   %()r;   ra   r`   r   rc   rd   r   )rX   r_   r   rz   s   `` `r   r   z&BaseModelAdminChecks._check_field_spec  sU    
 fe$## $ .7v->	$   ..sFEBBr.   c                 p   ||j                   v rg S 	 |j                  j                  j                  |      }t	        |t
        j                        rT|j                  j                  j                  j                  s*t        j                  d|d|d|j                  d      gS g S # t        $ r g cY S w xY w)NThe value of '&' cannot include the ManyToManyField '>', because that field manually specifies a relationship model.
admin.E013rj   )readonly_fieldsrm   rn   ro   r;   r   ManyToManyFieldrt   throughauto_createdr
   r9   rv   r   r   s        r   r   z+BaseModelAdminChecks._check_field_spec_item  s    ,,, I		11*= uf&<&<=!..66<<II  6;JH !$+  I' %  	s   %B' 'B54B5c                 .   |j                   g S t        |j                   t        t        f      st	        dd|d      S t        |j                         t        t        |j                               kD  r#t        j                  d|j                  d      gS g S )z4Check that exclude is a sequence without duplicates.r[   excludez
admin.E014r]   z3The value of 'exclude' contains duplicate field(s).z
admin.E015rj   )
r   r;   r`   ra   rb   r   r   r
   r9   rv   r   s     r   rO   z#BaseModelAdminChecks._check_exclude  s     ;;ICKK$7!)  C$4 55I#  Ir.   c                 X    t        |j                  t              st        dd|d      S g S )z)Check that form subclasses BaseModelForm.r   formz
admin.E016parentr^   r_   r0   )r   r   r   must_inherit_fromr   s     r   rP   z BaseModelAdminChecks._check_form  s-    388]3$&v3<  Ir.   c                      t        j                  t        t        f      st	        ddd      S t        t        j                   fdt        j                        D                    S )z8Check that filter_vertical is a sequence of field names.r[   filter_verticalz
admin.E017r]   c              3   P   K   | ]  \  }}j                  |d |z          yw)zfilter_vertical[%d]N_check_filter_itemr   s      r   r5   z>BaseModelAdminChecks._check_filter_vertical.<locals>.<genexpr>  s7      $ *z ++Z)>)F$r   )r;   r   r`   ra   rb   r   rc   rd   r   s   ``r   rQ   z+BaseModelAdminChecks._check_filter_vertical  se    #--e}=!*;  ## $ .7s7J7J-K	$  r.   c                      t        j                  t        t        f      st	        ddd      S t        t        j                   fdt        j                        D                    S )z:Check that filter_horizontal is a sequence of field names.r[   filter_horizontalz
admin.E018r]   c              3   P   K   | ]  \  }}j                  |d |z          yw)zfilter_horizontal[%d]Nr   r   s      r   r5   z@BaseModelAdminChecks._check_filter_horizontal.<locals>.<genexpr>  s7      $ *z ++Z)@5)H$r   )r;   r   r`   ra   rb   r   rc   rd   r   s   ``r   rR   z-BaseModelAdminChecks._check_filter_horizontal  se    #//$?!*=3<  ## $ .7s7L7L-M	$  r.   c                    	 |j                   j                  j                  |      }|j                  rt	        |t
        j                        rt        d||d      S |j                  j                  j                  j                  s*t        j                  d| d| d|j                  d      gS g S # t        $ r t        |||d	
      cY S w xY w)zCheck one item of `filter_vertical` or `filter_horizontal`, i.e.
        check that given field exists and is a ManyToManyField.za many-to-many fieldz
admin.E020r]   r   r   r   r   rj   z
admin.E019rk   )rm   rn   ro   rp   r;   r   ManyToManyRelrb   rt   r   r   r
   r9   rv   r   ry   r   s        r   r   z'BaseModelAdminChecks._check_filter_item  s    	IIOO--j9E %%E6;O;O)P*5cl  ''//55BBLL( 0&< (./  MM'  	) ! 	) CL 	s   %B2 2CCc                      t        j                  t              st        ddd      S t	        t        j                   fdj                  j                         D                    S )z*Check that `radio_fields` is a dictionary.r   radio_fieldsz
admin.E021r]   c              3   x   K   | ]1  \  }}j                  |d       j                  |d|z        z    3 yw)r   zradio_fields["%s"]N)_check_radio_fields_key_check_radio_fields_valuer4   rg   valr_   rX   s      r   r5   z;BaseModelAdminChecks._check_radio_fields.<locals>.<genexpr>0  sN      $
 (
C	 00j.Q44S"6"C$   7:)r;   r   r   rb   r`   r   rc   itemsr   s   ``r   rS   z(BaseModelAdminChecks._check_radio_fields(  sd    #**D1~3<  ## $
 ,/+;+;+A+A+C$  r.   c                 .   	 |j                   j                  j                  |      }t        |t        j
                        s6|j                  s*t        j                  d|d|d|j                  d      gS g S # t        $ r t        |||d      cY S w xY w)zCheck that a key of `radio_fields` dictionary is name of existing
        field and that the field is a ForeignKey or has `choices` defined.r   ' refers to 'zT', which is not an instance of ForeignKey, and does not have a 'choices' definition.z
admin.E023rj   z
admin.E022rk   )rm   rn   ro   r;   r   rq   choicesr
   r9   rv   r   ry   r   s        r   r   z,BaseModelAdminChecks._check_radio_fields_key9  s    	IIOO--j9E uf&7&78EMMLL */
<  MM'  	! ! 	) CL 	s   %A9 9BBc                 n    ddl m}m} |||fvr&t        j                  d|z  |j
                  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.E024rj   )django.contrib.admin.optionsr   r   r
   r9   rv   )rX   r_   r   rz   r   r   s         r   r   z.BaseModelAdminChecks._check_radio_fields_valueQ  sI     	Fz8,,&(-.#	  Ir.   c                     t        |j                        s=t        |j                  t              s#t	        j
                  d|j                  d      gS g S )NzBThe value of 'view_on_site' must be a callable or a boolean value.z
admin.E025rj   )callableview_on_siter;   boolr
   r9   rv   r   s     r   rU   z,BaseModelAdminChecks._check_view_on_site_urlb  sK    (()*S=M=Mt2T#	  Ir.   c                      t        j                  t              st        ddd      S t	        t        j                   fdj                  j                         D                    S )zXCheck that `prepopulated_fields` is a dictionary containing allowed
        field types.r   prepopulated_fieldsz
admin.E026r]   c              3   x   K   | ]1  \  }}j                  |d       j                  |d|z        z    3 yw)r   zprepopulated_fields["%s"]N)_check_prepopulated_fields_key _check_prepopulated_fields_valuer   s      r   r5   zBBaseModelAdminChecks._check_prepopulated_fields.<locals>.<genexpr>x  sT      $ (
C 77Z)> ;;S"=
"J$r   )r;   r   r   rb   r`   r   rc   r   r   s   ``r   rT   z/BaseModelAdminChecks._check_prepopulated_fieldso  sg     #1148'<#,  ## $ ,/+B+B+H+H+J$ 
 
r.   c                 T   	 |j                   j                  j                  |      }t        |t        j
                  t        j                  t        j                  f      r*t        j                  d|d|d|j                  d      gS g S # t        $ r t        |||d      cY S w xY w)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.
        r   r   zZ', which must not be a DateTimeField, a ForeignKey, a OneToOneField, or a ManyToManyField.z
admin.E028rj   z
admin.E027rk   )rm   rn   ro   r;   r   DateTimeFieldrq   r   r
   r9   rv   r   ry   r   s        r   r   z3BaseModelAdminChecks._check_prepopulated_fields_key  s    
	IIOO--j9E ,,f.?.?AWAWX LL /4ZA  MM'  	% ! 	) CL 	s   %B B'&B'c                      t        |t        t        f      st        dd      S t        t	        j
                   fdt        |      D                    S )zdCheck a value of `prepopulated_fields` dictionary, i.e. it's an
        iterable of existing fields.r[   z
admin.E029r]   c           	   3   V   K   | ]   \  }}j                  |d |d       " yw)[]N)%_check_prepopulated_fields_value_item)r4   rf   subfield_namerz   r_   rX   s      r   r5   zHBaseModelAdminChecks._check_prepopulated_fields_value.<locals>.<genexpr>  s6      $ -} >>]u,E$s   &))r;   r`   ra   rb   r   rc   rd   )rX   r_   r   rz   s   `` `r   r   z5BaseModelAdminChecks._check_prepopulated_fields_value  sS     #e}-,UUU## $ 1:#	$  r.   c                     	 |j                   j                  j                  |       g S # t        $ r t	        |||d      cY S w xY w)zYFor `prepopulated_fields` equal to {"slug": ("title",)},
        `field_name` is "title".z
admin.E030rk   )rm   rn   ro   r   ry   rX   r_   rg   rz   s       r   r   z:BaseModelAdminChecks._check_prepopulated_fields_value_item  sK    	IIOO%%j1 I ! 	) CL 	s   %) AAc                      j                   g S t        j                   t        t        f      st	        ddd      S t        t        j                   fdt        j                         D                    S )z;Check that ordering refers to existing fields or is random.r[   orderingz
admin.E031r]   c              3   P   K   | ]  \  }}j                  |d |z          yw)zordering[%d]N)_check_ordering_itemr   s      r   r5   z7BaseModelAdminChecks._check_ordering.<locals>.<genexpr>  s2      $)z --c:~PU?UV$r   )r   r;   r`   ra   rb   r   rc   rd   r   s   ``r   rV   z$BaseModelAdminChecks._check_ordering  so     <<ICLL4-8!*#,  ## $-6s||-D$  r.   c                 p   t        |t        t        j                  f      rgt        |t        j                        s|j	                         }t        |j
                  t        j                        r|j
                  j                  }ng S |dk(  r<t        |j                        dk7  r$t        j                  dd|j                  d      gS |dk(  rg S t        |v rg S |j                  d      }|dk(  rg S 	 |j                  j                   j#                  |       g S # t$        $ r t'        |||d	
      cY S w xY w)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)r6   r_   r0   -pkz
admin.E033rk   )r;   r   r   OrderByasc
expressionFr   r   r   r
   r9   rv   r   removeprefixrm   rn   ro   r   ry   r   s       r   r   z)BaseModelAdminChecks._check_ordering_item  s   j:v~~">?j&..9'^^-
*//:'2277
	S\\!2a!79M#  3I:% I#005JT!			))*5 	 % -$U s   3%D D54D5c                      j                   dk(  rg S t        j                   t        t        f      st	        ddd      S t        t        j                   fdt        j                         D                    S )z?Check that readonly_fields refers to proper attribute or field. r[   r   z
admin.E034r]   c              3   P   K   | ]  \  }}j                  |d |z          yw)zreadonly_fields[%d]N)_check_readonly_fields_itemr   s      r   r5   z>BaseModelAdminChecks._check_readonly_fields.<locals>.<genexpr>  s7      $ *z 44Z)>)F$r   )r   r;   r`   ra   rb   r   rc   rd   r   s   ``r   rW   z+BaseModelAdminChecks._check_readonly_fields  sz     "$IC//$?!*;  ## $ .7s7J7J-K	$  r.   c                    t        |      rg S t        ||      rg S t        |j                  |      rg S 	 |j                  j                  j	                  |       g S # t
        $ re t        j                  d|d|d|j                  j                  d|j                  j                  j                  d	|j                  d      gcY S w xY w)Nr   r   z-', which is not a callable, an attribute of 'z', or an attribute of ''.z
admin.E035rj   )r   hasattrrm   rn   ro   r   r
   r9   rv   rw   rz   r   s       r   r   z0BaseModelAdminChecks._check_readonly_fields_item  s    JIS*%ISYY
+I		))*5" 	! % LL "&MM22IIOO11  MM' s   %A A+C
	C
N)rw   
__module____qualname__r(   rK   re   rL   r   rM   rN   r   r   r   rO   rP   rQ   rR   r   rS   r   r   rU   rT   r   r   r   rV   r   rW   r   r   r.   r   rI   rI      s    
".1f$< 
D**
XC"<(  8"0"(6 $$L&r.   rI   c                        e Zd Z fdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Z xZS )ModelAdminChecksc                    g t         |   |      | j                  |      | j                  |      | j	                  |      | j                  |      | j                  |      | j                  |      | j                  |      | j                  |      | j                  |      | j                  |      | j                  |      | j                  |      | j                  |      S r2   )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_actions)rX   rY   r*   rv   s      r   r(   zModelAdminChecks.check$  s-   
W]9%
  +
 $$Y/
   +	

 %%i0
 ++I6
 $$Y/
 ,,Y7
 &&y1
 **95
 &&y1
 &&y1
 ''	2
   +
 	
r.   c                 X    t        |j                  t              st        dd|d      S g S )zCheck save_as is a boolean.	a booleansave_asz
admin.E101r]   )r;   r  r   rb   r   s     r   r   zModelAdminChecks._check_save_as6  s(     #++t,;yclSSIr.   c                 X    t        |j                  t              st        dd|d      S g S )zCheck save_on_top is a boolean.r  save_on_topz
admin.E102r]   )r;   r  r   rb   r   s     r   r   z#ModelAdminChecks._check_save_on_top>  s(     #//40;}#,WWIr.   c                      t        j                  t        t        f      st	        ddd      S t        t        j                   fdt        j                        D                    S )z%Check all inline model admin classes.r[   inlinesz
admin.E103r]   c              3   P   K   | ]  \  }}j                  |d |z          yw)zinlines[%d]N)_check_inlines_itemr4   rf   itemr_   rX   s      r   r5   z2ModelAdminChecks._check_inlines.<locals>.<genexpr>O  s1      $#t ,,S$8MN$r   )r;   r  r`   ra   rb   r   rc   rd   r   s   ``r   r   zModelAdminChecks._check_inlinesF  s`     #++e}5!)  ## $'0'=$  r.   c                 <   	 |j                   dz   |j                  z   }ddlm} t        ||      s&t        j                  d|z  |j
                  d      gS |j                  s&t        j                  d|z  |j
                  d      gS t        |j                  t        j                        st        d	d
|z  |d      S  ||j                  |j                        j                         S # t        $ r) t        j                  d|z  |j
                  d      gcY S w xY w)zCheck one inline model admin..z*'%s' must inherit from 'InlineModelAdmin'.z
admin.E104rj   r   )InlineModelAdminz#'%s' must have a 'model' attribute.z
admin.E105za Modelz%s.modelz
admin.E106r]   )r   rw   AttributeErrorr
   r9   rv   r   r  r   rm   r   Modelrb   rr   r(   )rX   r_   inlinerz   inline_labelr  s         r   r
  z$ModelAdminChecks._check_inlines_itemU  s   		!,,s2V__DL 	B6#34@<O#  9LH#  V\\6<<8*|";  #))S^^4::<<A  	@3F# 	s   C) )/DDc                      t        j                  t        t        f      st	        ddd      S t        t        j                   fdt        j                        D                    S )zBCheck that list_display only contains fields or usable attributes.r[   list_displayz
admin.E107r]   c              3   P   K   | ]  \  }}j                  |d |z          yw)zlist_display[%d]N)_check_list_display_itemr  s      r   r5   z7ModelAdminChecks._check_list_display.<locals>.<genexpr>  s3      $#t 11#t=ORW=WX$r   )r;   r  r`   ra   rb   r   rc   rd   r   s   ``r   r   z$ModelAdminChecks._check_list_display{  sd     #**T5M:!.cl  ## $'01A1A'B$  r.   c                    t        |      rg S t        ||      rg S 	 |j                  j                  j	                  |      }t        |d	d
      r|j                  s9|j                   s-t        |dd       rG|j"                  j$                  j&                  r't        j                  d| d|j                  d      gS g S # t
        $ r 	 t        |j                  |      }n# t        $ r 	 t        |j                  |      d   }n{# t
        t        f$ ri t        j                  d| d| d|j                  j                   d|j                  j                  j                   d	|j                  d      gcY cY cY S w xY wY nw xY wY Dw xY w)Nr   r   z,', which is not a callable or attribute of 'z)', or an attribute, method, or field on 'r   z
admin.E108rj   is_relationFrelz<' must not be a many-to-many field or a reverse foreign key.z
admin.E109)r   r   rm   rn   ro   r   getattrr  r	   r   r
   r9   rv   rw   rz   rp   one_to_manyr  rl   many_to_one)rX   r_   r  rz   rl   s        r   r  z)ModelAdminChecks._check_list_display_item  s|   D>IS$I	IIOO--d3E& E=%0##u'8'8eUD)eiioo.I.I$UG ,+ ,#	  	; ! 			40! 0DA"EE)+;< 
,UG= G;;>==;Q;Q:R S  #		 5 56b: !$+	 	
 	s`   %B= =	FCF	F (DF A1E:3F 5F9E::F =F?F  FFc                 J    ddl m} j                  g S t        j                  t        t
        f      st        ddd      S j                  j                  |j                  u r;t	        t        j                   fdt        j                        D                    S g S )zACheck that list_display_links is a unique subset of list_display.r   )
ModelAdminza list, a tuple, or Nonelist_display_linksz
admin.E110r]   c              3   P   K   | ]  \  }}j                  |d |z          yw)zlist_display_links[%d]N)_check_list_display_links_itemr   s      r   r5   z=ModelAdminChecks._check_list_display_links.<locals>.<genexpr>  s7      $ *z 77Z)AE)I$r   )r   r   r!  r;   r`   ra   rb   get_list_display__func__r   rc   rd   )rX   r_   r   s   `` r   r   z*ModelAdminChecks._check_list_display_links  s    ;!!)IC22T5MB*+	  !!**j.I.II## $ .7s7M7M-N	$   	r.   c                 v    ||j                   vr*t        j                  d|d|d|j                  d      gS g S )Nr   r   z*', which is not defined in 'list_display'.z
admin.E111rj   )r  r
   r9   rv   r   s       r   r#  z/ModelAdminChecks._check_list_display_links_item  sA    S---).
<#	  Ir.   c                      t        j                  t        t        f      st	        ddd      S t        t        j                   fdt        j                        D                    S )Nr[   list_filterz
admin.E112r]   c              3   P   K   | ]  \  }}j                  |d |z          yw)zlist_filter[%d]N)_check_list_filter_itemr  s      r   r5   z6ModelAdminChecks._check_list_filter.<locals>.<genexpr>  s3      $#t 00d<MPU<UV$r   )r;   r(  r`   ra   rb   r   rc   rd   r   s   ``r   r   z#ModelAdminChecks._check_list_filter  s^    #//D%=9!-S\  ## $'0'A$  r.   c                 $   ddl m}m} t        |      rit	        |t
        j                        sOt        ||      st        d||d      S t        ||      r&t        j                  d|z  |j                  d      gS g S t	        |t        t        f      r%|\  }}t        ||      st        d	d
|z  |d      S g S |}	 t        |j                   |       g S # t"        t$        f$ r- t        j                  d|d|d|j                  d      gcY S w xY 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.E114rj   r,  r   z
admin.E115r   r   z#', which does not refer to a Field.z
admin.E116)django.contrib.adminr,  r-  r   r;   r   Fieldr   r   r   r
   r9   rv   ra   r`   r	   rm   r   r   )rX   r_   r  rz   r,  r-  rl   list_filter_classs           r   r*  z(ModelAdminChecks._check_list_filter_item  s$    	ED>*T6<<"@tZ0('3<  D/2LLT MM'	  	udm,'+$E$0/B(,"U?#	  	 E$SYY6 	 %&78 LL$)52MM'	 s   ;C 9DDc                 n    t        |j                  t        t        t        f      st        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.E117r]   )r;   r2  r   r`   ra   rb   r   s     r   r   z+ModelAdminChecks._check_list_select_related  s;     #11D$3FG*,	  Ir.   c                 X    t        |j                  t              st        dd|d      S g S )z'Check that list_per_page is an integer.
an integerlist_per_pagez
admin.E118r]   )r;   r5  intrb   r   s     r   r   z%ModelAdminChecks._check_list_per_page+  s1     #++S1_#,  Ir.   c                 X    t        |j                  t              st        dd|d      S g S )z+Check that list_max_show_all is an integer.r4  list_max_show_allz
admin.E119r]   )r;   r8  r6  rb   r   s     r   r   z)ModelAdminChecks._check_list_max_show_all5  s2     #//5%8cl  Ir.   c                      t        j                  t        t        f      st	        ddd      S t        t        j                   fdt        j                        D                    S )zjCheck that list_editable is a sequence of editable fields from
        list_display without first element.r[   list_editablez
admin.E120r]   c              3   P   K   | ]  \  }}j                  |d |z          yw)zlist_editable[%d]N)_check_list_editable_itemr  s      r   r5   z8ModelAdminChecks._check_list_editable.<locals>.<genexpr>I  s7      $ $t 22T#6#>$r   )r;   r:  r`   ra   rb   r   rc   rd   r   s   ``r   r   z%ModelAdminChecks._check_list_editable?  sf     #++dE];!/s|  ## $ (11B1B'C	$  r.   c                    	 |j                   j                  j                  |      }||j                  vr*t	        j
                  d|d|d|j                  d      gS |j                  r4||j                  v r&t	        j
                  d|z  |j                  d      gS |j                  d   |k(  rO|j                  sC|j                  7t	        j
                  d|d	|j                  d   d
|j                  d      gS |j                  r|j                  r*t	        j
                  d|d|d|j                  d      gS g S # t        $ r t        |||d      cY S w xY w)Nr   r   z,', which is not contained in 'list_display'.z
admin.E122rj   zMThe value of '%s' cannot be in both 'list_editable' and 'list_display_links'.z
admin.E123r   z0' refers to the first field in 'list_display' ('z<'), which cannot be used unless 'list_display_links' is set.z
admin.E124z+', which is not editable through the admin.z
admin.E125z
admin.E121rk   )rm   rn   ro   r  r
   r9   rv   r!  editableprimary_keyr   ry   r   s        r   r<  z*ModelAdminChecks._check_list_editable_itemQ  so   3	IIOO--j9E !1!11LL:?MMM'	  ''J#:P:P,PLL02<=MM'	    #z1..**6 LL #()9)9!)<>  MM'  ^^u'8'8LL05zCMM'	  	c ! 	) CL 	s   %E EEc                 d    t        |j                  t        t        f      st	        dd|d      S g S )z"Check search_fields is a sequence.r[   ru   z
admin.E126r]   )r;   ru   r`   ra   rb   r   s     r   r   z%ModelAdminChecks._check_search_fields  s5     #++dE];!/s|  Ir.   c                 6   |j                   g S 	 t        |j                  |j                         d   }|j                         dvrt	        dd|d      S g S # t
        t        f$ r3 t        j                  d|j                   z  |j                  d	      gcY S w xY w)
z?Check that date_hierarchy refers to DateField or DateTimeField.r  >   	DateFieldr   za DateField or DateTimeFielddate_hierarchyz
admin.E128r]   zNThe value of 'date_hierarchy' refers to '%s', which does not refer to a Field.z
admin.E127rj   )
rC  r	   rm   get_internal_typerb   r   r   r
   r9   rv   )rX   r_   rl   s      r   r   z&ModelAdminChecks._check_date_hierarchy  s     %I,SYY8J8JKBO **,4RR"6/'	  I% %&78 LL57:7I7IJMM'	 s   #A ?BBc                 \   g }|j                         }|D ]  \  }}}t        |d      s|j                  D ]l  }d|z  }t        ||      r|j                  t	        j
                  |j                  j                  d|d|j                  d|j                  d             n  t        j                  d |D              }	|	j                         D ]W  \  }}
|
d	kD  s|j                  t	        j
                  d
|j                  j                  d|d|j                  d             Y |S )Nallowed_permissionszhas_%s_permissionz must define a z() method for the z action.z
admin.E129rj   c              3   (   K   | ]
  \  }}}|  y wr2   r   )r4   _r   s      r   r5   z2ModelAdminChecks._check_actions.<locals>.<genexpr>  s     #CZQaD#Cs   r   z*__name__ attributes of actions defined in z must be unique. Name z is not unique.z
admin.E130)_get_base_actionsr   rF  r8   r
   r9   rv   rw   collectionsCounterr   )rX   r_   r+   actionsfuncr   rH  
permissionmethod_namenamescounts              r   r  zModelAdminChecks._check_actions  s   '') % 	MD$4!67"66 
1J>sK0MM !$ 6 6 + $	 !$+		& ###C7#CC ;;= 	KD%qyLL  MM22 	  MM'		 r.   )rw   r   r   r(   r   r   r   r
  r   r  r   r#  r   r*  r   r   r   r   r<  r   r   r  __classcell__rv   s   @r   r   r   #  sf    
$$=L$L29v$4l8(r.   r   c                   F     e Zd Z fdZ fdZd Zd Zd Zd Zd Z	 xZ
S )InlineModelAdminChecksc                    |j                   }g t        | 	  |      | j                  ||      | j	                  ||      | j                  |      | j                  |      | j                  |      | j                  |      S r2   )	parent_modelr   r(   _check_relation_check_exclude_of_parent_model_check_extra_check_max_num_check_min_num_check_formset)rX   
inline_objr*   rW  rv   s       r   r(   zInlineModelAdminChecks.check  s    !..
W]:&
!!*l;
 00\J
 z*	

   ,
   ,
   ,
 	
r.   c                 v   t         |   |      }|rg S | j                  ||      rg S |j                  g S t	        ||j
                  |j                        }|j                  |j                  v rHt        j                  d|j                  d|j                  j                  d|j                  d      gS g S )Nfk_namezCannot exclude the field 'z6', because it is the foreign key to the parent model 'r   z
admin.E201rj   )r   rO   rX  r   r   rm   ra  r   r
   r9   rn   rz   rv   )rX   r_   rW  r+   fkrv   s        r   rY  z5InlineModelAdminChecks._check_exclude_of_parent_model  s     ',I \2I;;IlCIIs{{K77ckk! $**00	 #	  Ir.   c                     	 t        ||j                  |j                         g S # t        $ r:}t	        j
                  |j                  d   |j                  d      gcY d }~S d }~ww xY w)Nr`  r   z
admin.E202rj   )r   rm   ra  
ValueErrorr
   r9   argsrv   )rX   r_   rW  es       r   rX  z&InlineModelAdminChecks._check_relation  sX    	\399ckkJ I  	QLL,OPP	Qs   "& 	A)/A$A)$A)c                 X    t        |j                  t              st        dd|d      S g S )zCheck that extra is an integer.r4  extraz
admin.E203r]   )r;   rh  r6  rb   r   s     r   rZ  z#InlineModelAdminChecks._check_extra  s(     #))S)<S\RRIr.   c                 t    |j                   g S t        |j                   t              st        dd|d      S g S )z!Check that max_num is an integer.r4  max_numz
admin.E204r]   )rj  r;   r6  rb   r   s     r   r[  z%InlineModelAdminChecks._check_max_num  7     ;;ICKK-<	s|TTIr.   c                 t    |j                   g S t        |j                   t              st        dd|d      S g S )z!Check that min_num is an integer.r4  min_numz
admin.E205r]   )rm  r;   r6  rb   r   s     r   r\  z%InlineModelAdminChecks._check_min_num  rk  r.   c                 X    t        |j                  t              st        dd|d      S g S )z0Check formset is a subclass of BaseModelFormSet.r   formsetz
admin.E206r   )r   ro  r   r   r   s     r   r]  z%InlineModelAdminChecks._check_formset(  s0     3;;(89$))  Ir.   )rw   r   r   r(   rY  rX  rZ  r[  r\  r]  rR  rS  s   @r   rU  rU    s&    

>r.   rU  c                 V    t        j                  d|d| d|j                  |      gS )Nr   z
' must be r  rj   r
   r9   rv   )rx   r^   r_   r0   s       r   rb   rb   3  s*    /5t<	
 r.   c                 V    t        j                  d|d| d|j                  |      gS )Nr   z' must inherit from 'r   rj   rq  r   s       r   r   r   =  s*    ;A6J	
 r.   c           	          t        j                  d|d| d|j                  j                  j                  d|j
                  |      gS )Nr   r   z', which is not a field of 'r   rj   )r
   r9   rm   rn   rz   rv   rk   s       r   ry   ry   G  s<    uciioo335		
 r.   )+rJ  	itertoolsr   django.appsr   django.confr   django.contrib.admin.exceptionsr   django.contrib.admin.utilsr   r   r	   django.corer
   django.core.exceptionsr   	django.dbr   django.db.models.constantsr   django.db.models.expressionsr   django.forms.modelsr   r   r   django.templater   django.template.backends.djangor   django.utils.module_loadingr   r   r"   r-   rG   rI   r   rU  rb   r   ry   r   r.   r   <module>r     s         9 V V  4  1 3 Q Q # ; 5"vro	 o	dr+ rjX1 Xvr.   