
    Gwgv                     "   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 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)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     R/var/www/horilla/myenv/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>z   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)hintr/   )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_dependenciesrF   7   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 r1   )_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objr/   zautocomplete_fields[%d])	r:   r[   listtuplemust_ber   from_iterable	enumerate_check_autocomplete_fields_item)rW   r^   index
field_names       r   rJ   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                         }|[t        j                  d|j                  j                   j                  dt        |      j                  d|j                   d      gS |j"                  sPt        j                  |j                   j                  d	t        |      j                  d|j                   d
      gS g S # 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\   zAn admin for model "z+" has to be registered to be referenced by z.autocomplete_fields.z
admin.E039r^   r/   z9 must define "search_fields", because it's referenced by z
admin.E040z
admin.E037fieldr]   r^   r/   )model_meta	get_fieldmany_to_manyr:   r   
ForeignKeyra   
admin_site	_registrygetremote_fieldr	   r8   __name__type	__class__search_fieldsr
   refer_to_missing_field)rW   r^   rf   labelrk   related_admins         r   rd   z4BaseModelAdminChecks._check_autocomplete_fields_item   sJ   )	IIOO--j9E %%j@Q@Q.R; #	   NN44889K9K9Q9QRM$LL "..44== I..	  MM'	  #00LL *33<< I..	  MM'	  IO ! 	) CL 	s   %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.rZ   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r3   re   rf   r^   rW   s      r   r4   z<BaseModelAdminChecks._check_raw_id_fields.<locals>.<genexpr>  s7      $ *z 22Z)<u)D$   #&)r:   r}   r_   r`   ra   r   rb   rc   rW   r^   s   ``r   rK   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.E002rj   rh   z
admin.E003r\   )rl   rm   rn   namery   ro   r:   r   rp   ra   r
   rW   r^   rf   rz   rk   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.
        rZ   fieldsz
admin.E004r\   z,Both 'fieldsets' and 'fields' are specified.z
admin.E005ri   z2The value of 'fields' contains duplicate field(s).z
admin.E006c              3   D   K   | ]  }j                  |d         yw)r   N_check_field_spec)r3   rf   r^   rW   s     r   r4   z5BaseModelAdminChecks._check_fields.<locals>.<genexpr>V  s(        &&sJA s    )r   r:   r_   r`   ra   	fieldsetsr	   r8   rw   r   lensetr   rb   )rW   r^   r   s   `` r   rL   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.rZ   r   z
admin.E007r\   c              3   R   K   | ]  \  }}j                  |d |z           yw)zfieldsets[%d]N)_check_fieldsets_item)r3   re   fieldsetr^   seen_fieldsrW   s      r   r4   z8BaseModelAdminChecks._check_fieldsets.<locals>.<genexpr>i  s8      $ (x ..X'>$s   $')r   r:   r_   r`   ra   r   rb   rc   )rW   r^   r   s   ``@r   rM   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.rZ   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.E011ri   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   )r3   fieldset_fieldsrz   r^   rW   s     r   r4   z=BaseModelAdminChecks._check_fieldsets_item.<locals>.<genexpr>  s/       # &&sO=NQV=VW s    #)r:   r_   r`   ra   r   dictr	   r8   rw   r&   r   r   r   rb   )rW   r^   r   rz   r   s   `` ` r   r   z*BaseModelAdminChecks._check_fieldsets_itemq  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)r3   re   rf   rz   r^   rW   s      r   r4   z9BaseModelAdminChecks._check_field_spec.<locals>.<genexpr>  s:      $ *z //ZUEN)B$s   %()r:   r`   r_   r   rb   rc   r   )rW   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 'z&' cannot include the ManyToManyField 'z>', because that field manually specifies a relationship model.z
admin.E013ri   )readonly_fieldsrl   rm   rn   r:   r   ManyToManyFieldrt   throughauto_createdr	   r8   rw   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.rZ   excludez
admin.E014r\   z3The value of 'exclude' contains duplicate field(s).z
admin.E015ri   )
r   r:   r_   r`   ra   r   r   r	   r8   rw   r   s     r   rN   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^   r/   )r   r   r   must_inherit_fromr   s     r   rO   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.rZ   filter_verticalz
admin.E017r\   c              3   P   K   | ]  \  }}j                  |d |z          yw)zfilter_vertical[%d]N_check_filter_itemr   s      r   r4   z>BaseModelAdminChecks._check_filter_vertical.<locals>.<genexpr>  s7      $ *z ++Z)>)F$r   )r:   r   r_   r`   ra   r   rb   rc   r   s   ``r   rP   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.rZ   filter_horizontalz
admin.E018r\   c              3   P   K   | ]  \  }}j                  |d |z          yw)zfilter_horizontal[%d]Nr   r   s      r   r4   z@BaseModelAdminChecks._check_filter_horizontal.<locals>.<genexpr>  s7      $ *z ++Z)@5)H$r   )r:   r   r_   r`   ra   r   rb   rc   r   s   ``r   rQ   z-BaseModelAdminChecks._check_filter_horizontal  se    #//$?!*=3<  ## $ .7s7L7L-M	$  r-   c                     	 |j                   j                  j                  |      }|j                  st	        d||d      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\   z
admin.E019rj   )rl   rm   rn   ro   ra   r
   ry   r   s        r   r   z'BaseModelAdminChecks._check_filter_item	  sn    	IIOO--j9E %%*5cl  	 ! 	) CL 	s   %A AA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r3   rf   valr^   rW   s      r   r4   z;BaseModelAdminChecks._check_radio_fields.<locals>.<genexpr>#  sN      $
 (
C	 00j.Q44S"6"C$   7:)r:   r   r   ra   r_   r   rb   itemsr   s   ``r   rR   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.E023ri   z
admin.E022rj   )rl   rm   rn   r:   r   rp   choicesr	   r8   rw   r
   ry   r   s        r   r   z,BaseModelAdminChecks._check_radio_fields_key,  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.E024ri   )django.contrib.admin.optionsr   r   r	   r8   rw   )rW   r^   r   rz   r   r   s         r   r   z.BaseModelAdminChecks._check_radio_fields_valueD  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.E025ri   )callableview_on_siter:   boolr	   r8   rw   r   s     r   rT   z,BaseModelAdminChecks._check_view_on_site_urlU  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   r4   zBBaseModelAdminChecks._check_prepopulated_fields.<locals>.<genexpr>k  sT      $ (
C 77Z)> ;;S"=
"J$r   )r:   r   r   ra   r_   r   rb   r   r   s   ``r   rS   z/BaseModelAdminChecks._check_prepopulated_fieldsb  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.E028ri   z
admin.E027rj   )rl   rm   rn   r:   r   DateTimeFieldrp   r   r	   r8   rw   r
   ry   r   s        r   r   z3BaseModelAdminChecks._check_prepopulated_fields_keyv  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.rZ   z
admin.E029r\   c           	   3   V   K   | ]   \  }}j                  |d |d       " yw)[]N)%_check_prepopulated_fields_value_item)r3   re   subfield_namerz   r^   rW   s      r   r4   zHBaseModelAdminChecks._check_prepopulated_fields_value.<locals>.<genexpr>  s6      $ -} >>]u,E$s   &))r:   r_   r`   ra   r   rb   rc   )rW   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.E030rj   )rl   rm   rn   r
   ry   rW   r^   rf   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.rZ   orderingz
admin.E031r\   c              3   P   K   | ]  \  }}j                  |d |z          yw)zordering[%d]N)_check_ordering_itemr   s      r   r4   z7BaseModelAdminChecks._check_ordering.<locals>.<genexpr>  s2      $)z --c:~PU?UV$r   )r   r:   r_   r`   ra   r   rb   rc   r   s   ``r   rU   z$BaseModelAdminChecks._check_ordering  so     <<ICLL4-8!*#,  ## $-6s||-D$  r-   c                 z   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      r|d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)r5   r^   r/   -Npkz
admin.E033rj   )r:   r   r   OrderByasc
expressionFr   r   r   r	   r8   rw   r   
startswithrl   rm   rn   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$$S)'^
T!			))*5 	 % -$U s   8%D D:9D: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. rZ   r   z
admin.E034r\   c              3   P   K   | ]  \  }}j                  |d |z          yw)zreadonly_fields[%d]N)_check_readonly_fields_itemr   s      r   r4   z>BaseModelAdminChecks._check_readonly_fields.<locals>.<genexpr>  s7      $ *z 44Z)>)F$r   )r   r:   r_   r`   ra   r   rb   rc   r   s   ``r   rV   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
        $ rb t        j                  d|d|j                  j                  d|j                  j                  j                  d|j                  d      gcY S w xY w)Nr   z&' is not a callable, an attribute of 'z', or an attribute of ''.z
admin.E035ri   )r   hasattrrl   rm   rn   r
   r	   r8   rw   ru   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)ru   
__module____qualname__r'   rJ   rd   rK   r   rL   rM   r   r   r   rN   rO   rP   rQ   r   rR   r   r   rT   rS   r   r   r   rU   r   rV   r   r   r-   r   rH   rH      s    
"./b$< 
D**
XC"<(  $"0"(6 $%N&r-   rH   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d Z xZS )ModelAdminChecksc                    g t         |   |      | j                  |      | j                  |      | j	                  |      | j                  |      | j                  |      | j                  |      | j                  |      | j                  |      | j                  |      | j                  |      | j                  |      | j                  |      | j                  |      | j                  |      S r1   )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_uniqueness)rW   rX   r)   rw   s      r   r'   zModelAdminChecks.check  sB   
W]9%
  +
 $$Y/
   +	

 %%i0
 ++I6
 $$Y/
 ,,Y7
 &&y1
 **95
 &&y1
 &&y1
 ''	2
 229=
 ++I6
 	
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   ra   r   s     r   r   zModelAdminChecks._check_save_as*  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   ra   r   s     r   r   z#ModelAdminChecks._check_save_on_top2  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.rZ   inlinesz
admin.E103r\   c              3   P   K   | ]  \  }}j                  |d |z          yw)zinlines[%d]N)_check_inlines_itemr3   re   itemr^   rW   s      r   r4   z2ModelAdminChecks._check_inlines.<locals>.<genexpr>C  s1      $#t ,,S$8MN$r   )r:   r  r_   r`   ra   r   rb   rc   r   s   ``r   r   zModelAdminChecks._check_inlines:  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.E104ri   r   )InlineModelAdminz#'%s' must have a 'model' attribute.z
admin.E105za Modelz%s.modelz
admin.E106r\   )r   ru   AttributeErrorr	   r8   rw   r   r  r   rl   r   Modelra   rq   r'   )rW   r^   inlinerz   inline_labelr  s         r   r  z$ModelAdminChecks._check_inlines_itemI  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.rZ   list_displayz
admin.E107r\   c              3   P   K   | ]  \  }}j                  |d |z          yw)zlist_display[%d]N)_check_list_display_itemr  s      r   r4   z7ModelAdminChecks._check_list_display.<locals>.<genexpr>x  s3      $#t 11#t=ORW=WX$r   )r:   r  r_   r`   ra   r   rb   rc   r   s   ``r   r   z$ModelAdminChecks._check_list_displayo  sd     #**T5M:!.cl  ## $'01A1A'B$  r-   c                 <   t        |      rg S t        ||      rg S 	 |j                  j                  j	                  |      }t        |t        j                        r&t        j                  d|z  |j                  d	      gS g S # t
        $ r 	 t        |j                  |      }ns# t        $ rg t        j                  d|d|d|j                  j                  d|j                  j                  j                  d	|j                  d      gcY cY S w xY wY w xY w)
Nr   r   z-', which is not a callable, an attribute of 'z!', or an attribute or method on 'r   z
admin.E108ri   z0The value of '%s' must not be a ManyToManyField.z
admin.E109)r   r   rl   rm   rn   r
   getattrr  r	   r8   rw   ru   rz   r:   r   r   )rW   r^   r	  rz   rk   s        r   r  z)ModelAdminChecks._check_list_display_item~  s   D>IS$I	IIOO--d3E( eV334FN#  	7 ! 			40! LL
 " MM22IIOO11  MM'  	s6   %B 	DB%$D%A+DDDDD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   r4   z=ModelAdminChecks._check_list_display_links.<locals>.<genexpr>  s7      $ *z 77Z)AE)I$r   )r   r  r  r:   r_   r`   ra   get_list_display__func__r   rb   rc   )rW   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.E111ri   )r  r	   r8   rw   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 )NrZ   list_filterz
admin.E112r\   c              3   P   K   | ]  \  }}j                  |d |z          yw)zlist_filter[%d]N)_check_list_filter_itemr  s      r   r4   z6ModelAdminChecks._check_list_filter.<locals>.<genexpr>  s3      $#t 00d<MPU<UV$r   )r:   r   r_   r`   ra   r   rb   rc   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.E114ri   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	   r8   rw   r`   r_   r   rl   r   r
   )rW   r^   r	  rz   r$  r%  rk   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:   r*  r   r_   r`   ra   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:   r-  intra   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.r,  list_max_show_allz
admin.E119r\   )r:   r0  r.  ra   r   s     r   r   z)ModelAdminChecks._check_list_max_show_all'  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.rZ   list_editablez
admin.E120r\   c              3   P   K   | ]  \  }}j                  |d |z          yw)zlist_editable[%d]N)_check_list_editable_itemr  s      r   r4   z8ModelAdminChecks._check_list_editable.<locals>.<genexpr>;  s7      $ $t 22T#6#>$r   )r:   r2  r_   r`   ra   r   rb   rc   r   s   ``r   r   z%ModelAdminChecks._check_list_editable1  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.E122ri   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.E121rj   )rl   rm   rn   r  r	   r8   rw   r  editableprimary_keyr
   ry   r   s        r   r4  z*ModelAdminChecks._check_list_editable_itemC  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.rZ   rx   z
admin.E126r\   )r:   rx   r_   r`   ra   r   s     r   r   z%ModelAdminChecks._check_search_fieldsy  s5     #++dE];!/s|  Ir-   c                 f   |j                   g S 	 t        |j                  |j                         d   }t        |t        j
                  t        j                  f      s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.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.E127ri   )r;  r   rl   r:   r   	DateFieldr   ra   r   r
   r	   r8   rw   )rW   r^   rk   s      r   r   z&ModelAdminChecks._check_date_hierarchy  s     %I,SYY8J8JKBO "%&*:*:F<P<P)QR"6/'	  I% %&78 LL57:7I7IJMM'	 s   #A. .?B0/B0c                 P   |j                         }g }|D ]  \  }}}t        |d      s|j                  D ]l  }d|z  }t        ||      r|j                  t	        j
                  |j                  j                  d|d|j                  d|j                  d             n  |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 must define a z() method for the z action.z
admin.E129ri   )_get_base_actionsr   r>  r7   r	   r8   rw   ru   )	rW   r^   actionsr*   funcr   _
permissionmethod_names	            r   r   z1ModelAdminChecks._check_action_permission_methods  s    
 '')$ 	MD$4!67"66 
1J>sK0MM !$ 6 6 + $	 !$+		$ r-   c           
      2   g }t        j                  d |j                         D              }|j                         D ]W  \  }}|dkD  s|j	                  t        j                  d|j                  j                  d|d|j                  d             Y |S )z.Check that every action has a unique __name__.c              3   (   K   | ]
  \  }}}|  y wr1   r   )r3   rB  r   s      r   r4   z=ModelAdminChecks._check_actions_uniqueness.<locals>.<genexpr>  s     #SZQaD#Ss   r   z*__name__ attributes of actions defined in z must be unique. Name z is not unique.z
admin.E130ri   )	collectionsCounterr?  r   r7   r	   r8   rw   ru   )rW   r^   r*   namesr   counts         r   r   z*ModelAdminChecks._check_actions_uniqueness  s    ###S3;P;P;R#SS ;;= 	KD%qyLL  MM22 	  MM'		 r-   )ru   r   r   r'   r   r   r   r  r   r  r   r  r   r"  r   r   r   r   r4  r   r   r   r   __classcell__rw   s   @r   r   r     sk    
&$=L"H29v$4l86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 r1   )	parent_modelr   r'   _check_relation_check_exclude_of_parent_model_check_extra_check_max_num_check_min_num_check_formset)rW   
inline_objr)   rP  rw   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.E201ri   )r   rN   rQ  r   r   rl   rZ  r   r	   r8   rm   rz   rw   )rW   r^   rP  r*   fkrw   s        r   rR  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)NrY  r   z
admin.E202ri   )r   rl   rZ  
ValueErrorr	   r8   argsrw   )rW   r^   rP  es       r   rQ  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.r,  extraz
admin.E203r\   )r:   ra  r.  ra   r   s     r   rS  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.r,  max_numz
admin.E204r\   )rc  r:   r.  ra   r   s     r   rT  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.r,  min_numz
admin.E205r\   )rf  r:   r.  ra   r   s     r   rU  z%InlineModelAdminChecks._check_min_num  rd  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   rh  r   r   r   s     r   rV  z%InlineModelAdminChecks._check_formset  s0     3;;(89$))  Ir-   )ru   r   r   r'   rR  rQ  rS  rT  rU  rV  rK  rL  s   @r   rN  rN    s&    

>r-   rN  c                 V    t        j                  d|d| d|j                  |      gS )Nr   z
' must be r  ri   r	   r8   rw   )rv   r]   r^   r/   s       r   ra   ra   *  s*    /5t<	
 r-   c                 V    t        j                  d|d| d|j                  |      gS )Nr   z' must inherit from 'r   ri   rj  r   s       r   r   r   4  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   ri   )r	   r8   rl   rm   rz   rw   rj   s       r   ry   ry   >  s<    uciioo335		
 r-   ))rG  	itertoolsr   django.appsr   django.confr   django.contrib.admin.utilsr   r   r   django.corer	   django.core.exceptionsr
   	django.dbr   django.db.models.constantsr   django.db.models.expressionsr   django.forms.modelsr   r   r   django.templater   django.template.backends.djangor   django.utils.module_loadingr   r   r!   r,   rF   rH   r   rN  ra   r   ry   r   r-   r   <module>rz     s         V V  4  1 3 Q Q # ; 5"vrc	 c	Lv+ vrX1 Xvr-   