
    hn                     "   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     ^/var/www/html/ranktracker/api/venv/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,   2   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             |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>m   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
admin.E410)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_dependenciesrE   :   s;    534	F
 !1 *  *MM&,,!)*+  ++- )fo.(.%)
 %)!$fll 	
 	 :0CCD"#NPXPpPpqMM&,,F  	  B0CCDMM&,,)  	  L)LL L0CC!DMM&..&  	  WYaYlYlmfllF
 	
 TV^ViVijfllF
 	
 TV^ViVijfllF
 	
 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])	r9   rZ   listtuplemust_ber   from_iterable	enumerate_check_autocomplete_fields_item)rV   r]   index
field_names       r   rI   z/BaseModelAdminChecks._check_autocomplete_fields   s     #11D%=A,5JPSXdee++)233J3J)K-%E: 44S*F_bgFgh-    -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_manyr9   r   
ForeignKeyr`   
admin_site	_registrygetremote_fieldr	   r7   __name__type	__class__search_fieldsr
   refer_to_missing_field)rV   r]   re   labelrj   related_admins         r   rc   z4BaseModelAdminChecks._check_autocomplete_fields_item   sF   #	IIOO--j9E %%j@Q@Q.R; cl   NN44889K9K9Q9QRM$LL "..44== I..
  MM'
 
 #00LL *33<< I..
  MM'
 
 IC ! 	d)
5cVbcc	d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 )z\ Check that `raw_id_fields` only contains field names that are listed
        on the model. rY   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   rd   re   r]   rV   s      r   r4   z<BaseModelAdminChecks._check_raw_id_fields.<locals>.<genexpr>   s3      ,%E: ..sJ@SV[@[\,   #&)r9   r|   r^   r_   r`   r   ra   rb   rV   r]   s   ``r   rJ   z)BaseModelAdminChecks._check_raw_id_fields   s^     #++dE];,_#R^__++ ,)233D3D)E,   r-   c                     	 |j                   j                  j                  |      }|j                  s)t	        |t
        j                        st        d||d      S g S # t        $ r t        |||d      cY S w xY w)z Check an item of `raw_id_fields`, i.e. check that field named
        `field_name` exists in model `model` and is a ForeignKey or a
        ManyToManyField. rg   z
admin.E003r[   z
admin.E002ri   )
rk   rl   rm   rn   r9   r   ro   r`   r
   rx   rV   r]   re   ry   rj   s        r   r~   z.BaseModelAdminChecks._check_raw_id_fields_item   sw    
	IIOO--j9E %%j@Q@Q.RFuZ]bnoo	 ! 	d)
5cVbcc	ds   %A A98A9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 )z Check that `fields` only refer to existing fields, doesn't contain
        duplicates. Check if at most one of `fields` and `fieldsets` is defined.
        rY   fieldsz
admin.E004r[   z,Both 'fieldsets' and 'fields' are specified.z
admin.E005rh   z2The value of 'fields' contains duplicate field(s).z
admin.E006c              3   D   K   | ]  }j                  |d         yw)r   N_check_field_spec)r3   re   r]   rV   s     r   r4   z5BaseModelAdminChecks._check_fields.<locals>.<genexpr>  s(      (
 ""3
H=(
s    )r   r9   r^   r_   r`   	fieldsetsr	   r7   rv   r   lensetr   ra   )rV   r]   r   s   `` r   rK   z"BaseModelAdminChecks._check_fields   s    
 ::ICJJu6,X3<XX]]B#  $v;#c&k**H#  E'' (
!jj(
 
  	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 )zT Check that fieldsets is properly formatted and doesn't contain
        duplicates. rY   r   z
admin.E007r[   c              3   R   K   | ]  \  }}j                  |d |z           yw)zfieldsets[%d]N)_check_fieldsets_item)r3   rd   fieldsetr]   seen_fieldsrV   s      r   r4   z8BaseModelAdminChecks._check_fieldsets.<locals>.<genexpr>  s4      ,#E8 **3/E:QS^_,s   $')r   r9   r^   r_   r`   r   ra   rb   )rV   r]   r   s   ``@r   rL   z%BaseModelAdminChecks._check_fieldsets  sm     == ICMMD%=9,[cl[[K++ ,'0'?,   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. rY   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.E011rh   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_fieldsry   r]   rV   s     r   r4   z=BaseModelAdminChecks._check_fieldsets_item.<locals>.<genexpr>>  s.      (
 ""39JU9RS(
s    #)r9   r^   r_   r`   r   dictr	   r7   rv   r&   r   r   r   ra   )rV   r]   r   ry   r   s   `` ` r   r   z*BaseModelAdminChecks._check_fieldsets_item   sY    (T5M2,UUU]a=CLQQHQK.>'E/s|\\Xa[(IEQ#  HQK1D%=A,5F5NTW\hii78A;x#89:{s3{#344>F#  E'' (
#+A;x#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   rd   re   ry   r]   rV   s      r   r4   z9BaseModelAdminChecks._check_field_spec.<locals>.<genexpr>I  s6      ,%E: ++CXPU=VW,s   %()r9   r_   r^   r   ra   rb   r   )rV   r]   r   ry   s   `` `r   r   z&BaseModelAdminChecks._check_field_specC  sR    
 fe$++ ,)26):,   
 ..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.E013rh   )readonly_fieldsrk   rl   rm   r9   r   ManyToManyFieldrs   throughauto_createdr	   r7   rv   r
   r   s        r   r   z+BaseModelAdminChecks._check_field_spec_itemP  s    ,,, I		11*= uf&<&<=!..66<<II  %j2 !$+  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 )z6 Check that exclude is a sequence without duplicates. rY   excludez
admin.E014r[   z3The value of 'exclude' contains duplicate field(s).z
admin.E015rh   )
r   r9   r^   r_   r`   r   r   r	   r7   rv   r   s     r   rM   z#BaseModelAdminChecks._check_excludel  s     ;;ICKK$7,YCLYY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   rN   z BaseModelAdminChecks._check_form~  s-    388]3$OF),? ? Ir-   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_vertical is a sequence of field names. rY   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>  s3      ,%E: ''Z9NQV9VW,r   )r9   r   r^   r_   r`   r   ra   rb   r   s   ``r   rO   z+BaseModelAdminChecks._check_filter_vertical  s]    #--e}=,5FCT`aa++ ,)233F3F)G,   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. rY   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>  s3      ,%E: ''Z9PSX9XY,r   )r9   r   r^   r_   r`   r   ra   rb   r   s   ``r   rP   z-BaseModelAdminChecks._check_filter_horizontal  s]    #//$?,5HcVbcc++ ,)233H3H)I,   r-   c                     	 |j                   j                  j                  |      }|j                  st	        d||d      S g S # t
        $ r t        |||d      cY S w xY w)z Check 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.E019ri   )rk   rl   rm   rn   r`   r
   rx   r   s        r   r   z'BaseModelAdminChecks._check_filter_item  sg    	IIOO--j9E %%5eQ]^^	 ! 	d)
5cVbcc	d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   re   valr]   rV   s      r   r4   z;BaseModelAdminChecks._check_radio_fields.<locals>.<genexpr>  sM      , $J ,,S*nM..sC9MPZ9Z[\,   7:)r9   r   r   r`   r^   r   ra   itemsr   s   ``r   rQ   z(BaseModelAdminChecks._check_radio_fields  s\    #**D1>.cl[[++ , (+'7'7'='='?,   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)z Check that a key of `radio_fields` dictionary is name of existing
        field and that the field is a ForeignKey or has `choices` defined. r   ' refers to 'zT', which is not an instance of ForeignKey, and does not have a 'choices' definition.z
admin.E023rh   z
admin.E022ri   )rk   rl   rm   r9   r   ro   choicesr	   r7   rv   r
   rx   r   s        r   r   z,BaseModelAdminChecks._check_radio_fields_key  s    	IIOO--j9E uf&7&78EMMLL ":  MM'	 	 	 ! 	d)
5cVbcc	d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 )z5 Check type of a value of `radio_fields` dictionary. r   )
HORIZONTALVERTICALzDThe value of '%s' must be either admin.HORIZONTAL or admin.VERTICAL.z
admin.E024rh   )django.contrib.admin.optionsr   r   r	   r7   rv   )rV   r]   r   ry   r   r   s         r   r   z.BaseModelAdminChecks._check_radio_fields_value  sE     	Fz8,,Z]bb#  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.E025rh   )callableview_on_siter9   boolr	   r7   rv   r   s     r   rS   z,BaseModelAdminChecks._check_view_on_site_url  sI    (()*S=M=Mt2TX#  Ir-   c                      t        j                  t              st        ddd      S t	        t        j                   fdj                  j                         D                    S )zZ Check 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>  sN      , $J 33CEZ[55c3@[^h@hij,r   )r9   r   r   r`   r^   r   ra   r   r   s   ``r   rR   z/BaseModelAdminChecks._check_prepopulated_fields  s`     #1148>2GSUabb++ , (+'>'>'D'D'F,   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)z Check a key of `prepopulated_fields` dictionary, i.e. check that it
        is a name of existing field and the field is one of the allowed types.
        r   r   zZ', which must not be a DateTimeField, a ForeignKey, a OneToOneField, or a ManyToManyField.z
admin.E028rh   z
admin.E027ri   )rk   rl   rm   r9   r   DateTimeFieldro   r   r	   r7   rv   r
   rx   r   s        r   r   z3BaseModelAdminChecks._check_prepopulated_fields_key  s    
	IIOO--j9E %&"6"68I8I6KaKa!bcLLRWYceMM'	  	 ! 	d)
5cVbcc	ds   %B B'&B'c                      t        |t        t        f      st        dd      S t        t	        j
                   fdt        |      D                    S )zf Check a value of `prepopulated_fields` dictionary, i.e. it's an
        iterable of existing fields. rY   z
admin.E029r[   c           	   3   V   K   | ]   \  }}j                  |d |d       " yw)[]N)%_check_prepopulated_fields_value_item)r3   rd   subfield_namery   r]   rV   s      r   r4   zHBaseModelAdminChecks._check_prepopulated_fields_value.<locals>.<genexpr>  s3      ,(E= ::3[`bgOhi,s   &))r9   r^   r_   r`   r   ra   rb   )rV   r]   r   ry   s   `` `r   r   z5BaseModelAdminChecks._check_prepopulated_fields_value  sP     #e}-,UUU++ ,,5cN,   r-   c                     	 |j                   j                  j                  |       g S # t        $ r t	        |||d      cY S w xY w)z[ For `prepopulated_fields` equal to {"slug": ("title",)},
        `field_name` is "title". z
admin.E030ri   )rk   rl   rm   r
   rx   rV   r]   re   ry   s       r   r   z:BaseModelAdminChecks._check_prepopulated_fields_value_item  sI    	IIOO%%j1 I ! 	d)
5cVbcc	d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. rY   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>(  s1      ,%E: ))#z>E;QR,r   )r   r9   r^   r_   r`   r   ra   rb   r   s   ``r   rT   z$BaseModelAdminChecks._check_ordering  sh     <<ICLL4-8,ZS\ZZ++ ,)23<<)@,   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)z2 Check that `ordering` refers to existing fields. ?r   z^The value of 'ordering' has the random ordering marker '?', but contains other fields as well.z2Either remove the "?", or remove the other fields.z
admin.E032)hintr]   r/   -Npkz
admin.E033ri   )r9   r   r   OrderByasc
expressionFnamer   r   r	   r7   rv   r   
startswithrk   rl   rm   r
   rx   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 	 % h-JuRUZfggh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 )zA Check that readonly_fields refers to proper attribute or field.  rY   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>Z  s3      ,%E: 00jBWZ_B_`,r   )r   r9   r^   r_   r`   r   ra   rb   r   s   ``r   rU   z+BaseModelAdminChecks._check_readonly_fieldsR  sr     "$IC//$?,5FCT`aa++ ,)233F3F)G,   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.E035rh   )r   hasattrrk   rl   rm   r
   r	   r7   rv   rt   ry   r   s       r   r   z0BaseModelAdminChecks._check_readonly_fields_item_  s    JIS*%ISYY
+I		))*5 	 % 
LL "3==#9#9399??;P;P  MM'	 	
s   %A A(CCN)rt   
__module____qualname__r'   rI   rc   rJ   r~   rK   rL   r   r   r   rM   rN   rO   rP   r   rQ   r   r   rS   rR   r   r   r   rT   r   rU   r   r   r-   r   rG   rG      s    
"
)V
@!FC8$	. 

,
	#Jr-   rG   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)rV   rW   r)   rv   s      r   r'   zModelAdminChecks.checkz  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[   )r9   r  r   r`   r   s     r   r   zModelAdminChecks._check_save_as  s/     #++t,;y"|5 5 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[   )r9   r  r   r`   r   s     r   r   z#ModelAdminChecks._check_save_on_top  s/     #//40;}"|5 5 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. rY   inlinesz
admin.E103r[   c              3   P   K   | ]  \  }}j                  |d |z          yw)zinlines[%d]N)_check_inlines_itemr3   rd   itemr]   rV   s      r   r4   z2ModelAdminChecks._check_inlines.<locals>.<genexpr>  s1      ,E4 ((dME4IJ,r   )r9   r  r^   r_   r`   r   ra   rb   r   s   ``r   r   zModelAdminChecks._check_inlines  sY     #++e}5,YCLYY++ ,#,S[[#9,   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.E104rh   r   )InlineModelAdminz#'%s' must have a 'model' attribute.z
admin.E105za Modelz%s.modelz
admin.E106r[   )r   rt   AttributeErrorr	   r7   rv   r   r  r   rk   r   Modelr`   rp   r'   )rV   r]   inlinery   inline_labelr  s         r   r  z$ModelAdminChecks._check_inlines_item  s   		!,,s2V__DL 	B6#34@<O#  9LH#  V\\6<<89Z,-FCT`aa#))S^^4::<<=  	@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 )zL Check that list_display only contains fields or usable attributes.
        rY   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>  s2      ,E4 --c49Ke9ST,r   )r9   r  r^   r_   r`   r   ra   rb   r   s   ``r   r   z$ModelAdminChecks._check_list_display  s^     #**T5M:,^Q]^^++ ,#,S-=-=#>,   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.E108rh   z0The value of '%s' must not be a ManyToManyField.z
admin.E109)r   r   rk   rl   rm   r
   getattrr  r	   r7   rv   rt   ry   r9   r   r   )rV   r]   r	  ry   rj   s        r   r  z)ModelAdminChecks._check_list_display_item  s    D>IS$I	IIOO--d3E" eV334FN#  	1 ! 			40! LL "4)?)?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 )zK Check 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>  s3      ,%E: 33CE]`eEef,r   )r   r  r  r9   r^   r_   r`   get_list_display__func__r   ra   rb   )rV   r]   r  s   `` r   r   z*ModelAdminChecks._check_list_display_links  s     	<!!)IC22T5MB5>RX[`lmm!!**j.I.II++ ,)233I3I)J,    	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.E111rh   )r  r	   r7   rv   r   s       r   r  z/ModelAdminChecks._check_list_display_links_item  sC    S---z #  Ir-   c                      t        j                  t        t        f      st	        ddd      S t        t        j                   fdt        j                        D                    S )NrY   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>  s2      ,E4 ,,S$8IE8QR,r   )r9   r   r^   r_   r`   r   ra   rb   r   s   ``r   r   z#ModelAdminChecks._check_list_filter  sX    #//D%=9,]P\]]++ ,#,S__#=,   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.E114rh   r$  r   z
admin.E115r   r   z#', which does not refer to a Field.z
admin.E116)django.contrib.adminr$  r%  r   r9   r   Fieldr   r   r   r	   r7   rv   r_   r^   r   rk   r   r
   )rV   r]   r	  ry   r$  r%  rj   list_filter_classs           r   r"  z(ModelAdminChecks._check_list_filter_item#  s    	ED>*T6<<"@tZ0(U-0\C C D/2LLTW\\MM'  	udm,'+$E$0/B(0A'TY/_bgstt	 E$SYY6 	 %&78 LL`eglmMM' s   ;C 9DDc                 n    t        |j                  t        t        t        f      st        dd|d      S g S )zA Check that list_select_related is a boolean, a list or a tuple. za boolean, tuple or listlist_select_relatedz
admin.E117r[   )r9   r*  r   r^   r_   r`   r   s     r   r   z+ModelAdminChecks._check_list_select_relatedV  s5     #11D$3FG5>SY\amnn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[   )r9   r-  intr`   r   s     r   r   z%ModelAdminChecks._check_list_per_page^  s*     #++S1<S\ZZ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[   )r9   r0  r.  r`   r   s     r   r   z)ModelAdminChecks._check_list_max_show_allf  s,     #//5<0CQ]^^Ir-   c                      t        j                  t        t        f      st	        ddd      S t        t        j                   fdt        j                        D                    S )zl Check that list_editable is a sequence of editable fields from
        list_display without first element. rY   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>u  s3      ,E4 ..sD:MPU:UV,r   )r9   r2  r^   r_   r`   r   ra   rb   r   s   ``r   r   z%ModelAdminChecks._check_list_editablen  s^     #++dE];,_#R^__++ ,#,S->->#?,   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                  s*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.E122rh   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.E121ri   )rk   rl   rm   r  r	   r7   rv   r  editabler
   rx   r   s        r   r4  z*ModelAdminChecks._check_list_editable_itemz  s_   /	IIOO--j9E !1!11LL:?MMM'	  ''J#:P:P,PLLgjttMM'  ""1%3C<R<R**6LL "3#3#3A#6  MM'	 	 ^^LL!:  MM'  	[ ! 	d)
5cVbcc	ds   %D8 8EEc                 d    t        |j                  t        t        f      st	        dd|d      S g S )z$ Check search_fields is a sequence. rY   rw   z
admin.E126r[   )r9   rw   r^   r_   r`   r   s     r   r   z%ModelAdminChecks._check_search_fields  s0     #++dE];,_#R^__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)	zA 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.E127rh   )r:  r   rk   r9   r   	DateFieldr   r`   r   r
   r	   r7   rv   )rV   r]   rj   s      r   r   z&ModelAdminChecks._check_date_hierarchy  s     %I,SYY8J8JKBO "%&*:*:F<P<P)QR"#AJZ`chtuu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.E129rh   )_get_base_actionsr   r=  r6   r	   r7   rv   rt   )	rV   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   rA  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.E130rh   )	collectionsCounterr>  r   r6   r	   r7   rv   rt   )rV   r]   r*   namesr   counts         r   r   z*ModelAdminChecks._check_actions_uniqueness  s    ###S3;P;P;R#SS ;;= 
	KD%qyfll ..
 # 
	 r-   )rt   r   r   r'   r   r   r   r  r   r  r   r  r   r"  r   r   r   r   r4  r   r   r   r   __classcell__rv   s   @r   r   r   x  sk    
&	"=H
B"1f
0d.4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)rV   
inline_objr)   rO  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.E201rh   )r   rM   rP  r   r   rk   rY  r   r	   r7   rl   ry   rv   )rV   r]   rO  r*   fkrv   s        r   rQ  z5InlineModelAdminChecks._check_exclude_of_parent_model  s     ',I \2I;;IlCIIs{{K77ckk! !3!3!9!9 #	 	 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)NrX  r   z
admin.E202rh   )r   rk   rY  
ValueErrorr	   r7   argsrv   )rV   r]   rO  es       r   rP  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[   )r9   r`  r.  r`   r   s     r   rR  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[   )rb  r9   r.  r`   r   s     r   rS  z%InlineModelAdminChecks._check_max_num2  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[   )re  r9   r.  r`   r   s     r   rT  z%InlineModelAdminChecks._check_min_num<  rc  r-   c                 X    t        |j                  t              st        dd|d      S g S )z2 Check formset is a subclass of BaseModelFormSet. r   formsetz
admin.E206r   )r   rg  r   r   r   s     r   rU  z%InlineModelAdminChecks._check_formsetF  s,     3;;(89$,>yVY^jkkIr-   )rt   r   r   r'   rQ  rP  rR  rS  rT  rU  rJ  rK  s   @r   rM  rM    s&    

:r-   rM  c                 V    t        j                  d|d| d|j                  |      gS )Nr   z
' must be r  rh   r	   r7   rv   )ru   r\   r]   r/   s       r   r`   r`   O  s*    /5t<	
 r-   c                 V    t        j                  d|d| d|j                  |      gS )Nr   z' must inherit from 'r   rh   ri  r   s       r   r   r   Y  s*    ;A6J	
 r-   c           	          t        j                  d|d| d|j                  j                  j                  d|j
                  |      gS )Nr   r   z!', which is not an attribute of 'r   rh   )r	   r7   rk   rl   ry   rv   ri   s       r   rx   rx   c  s<    uciioo&;&;=		
 r-   ))rF  	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,   rE   rG   r   rM  r`   r   rx   r   r-   r   <module>ry     s           4  1 3  $ ; 5"Odi iX|+ |~U1 Upr-   