2013-07-30 01:19:04 +08:00
from __future__ import unicode_literals
2011-10-14 05:34:56 +08:00
2010-11-02 13:09:16 +08:00
from datetime import date
2013-07-01 20:22:27 +08:00
import unittest
2010-11-02 13:09:16 +08:00
from django import forms
from django . conf import settings
2011-05-03 18:44:23 +08:00
from django . contrib . admin . options import ( ModelAdmin , TabularInline ,
2012-08-15 16:46:31 +08:00
HORIZONTAL , VERTICAL )
2010-11-02 13:09:16 +08:00
from django . contrib . admin . sites import AdminSite
from django . contrib . admin . widgets import AdminDateWidget , AdminRadioSelect
2011-05-03 18:44:23 +08:00
from django . contrib . admin import ( SimpleListFilter ,
BooleanFieldListFilter )
2010-11-02 13:09:16 +08:00
from django . core . exceptions import ImproperlyConfigured
from django . forms . models import BaseModelFormSet
from django . forms . widgets import Select
from django . test import TestCase
2013-10-14 21:14:17 +08:00
from django . test . utils import str_prefix , override_settings
2013-07-01 20:22:27 +08:00
from django . utils import six
2010-11-02 13:09:16 +08:00
2011-10-14 05:34:56 +08:00
from . models import Band , Concert , ValidationTestModel , ValidationTestInlineModel
2010-11-02 13:09:16 +08:00
2011-10-07 08:41:25 +08:00
class MockRequest ( object ) :
pass
2012-08-15 16:46:31 +08:00
2011-10-07 08:41:25 +08:00
class MockSuperUser ( object ) :
def has_perm ( self , perm ) :
return True
request = MockRequest ( )
request . user = MockSuperUser ( )
2010-11-02 13:09:16 +08:00
class ModelAdminTests ( TestCase ) :
def setUp ( self ) :
self . band = Band . objects . create (
name = ' The Doors ' ,
bio = ' ' ,
sign_date = date ( 1965 , 1 , 1 ) ,
)
self . site = AdminSite ( )
# form/fields/fieldsets interaction ##############################
def test_default_fields ( self ) :
ma = ModelAdmin ( Band , self . site )
2012-08-15 16:46:31 +08:00
self . assertEqual ( list ( ma . get_form ( request ) . base_fields ) ,
2010-11-02 13:09:16 +08:00
[ ' name ' , ' bio ' , ' sign_date ' ] )
2013-07-31 13:52:11 +08:00
self . assertEqual ( list ( ma . get_fields ( request ) ) ,
[ ' name ' , ' bio ' , ' sign_date ' ] )
self . assertEqual ( list ( ma . get_fields ( request , self . band ) ) ,
[ ' name ' , ' bio ' , ' sign_date ' ] )
2010-11-02 13:09:16 +08:00
def test_default_fieldsets ( self ) :
# fieldsets_add and fieldsets_change should return a special data structure that
# is used in the templates. They should generate the "right thing" whether we
# have specified a custom form, the fields argument, or nothing at all.
#
# Here's the default case. There are no custom form_add/form_change methods,
# no fields argument, and no fieldsets argument.
ma = ModelAdmin ( Band , self . site )
self . assertEqual ( ma . get_fieldsets ( request ) ,
[ ( None , { ' fields ' : [ ' name ' , ' bio ' , ' sign_date ' ] } ) ] )
self . assertEqual ( ma . get_fieldsets ( request , self . band ) ,
[ ( None , { ' fields ' : [ ' name ' , ' bio ' , ' sign_date ' ] } ) ] )
2013-04-17 02:49:22 +08:00
def test_get_fieldsets ( self ) :
# Test that get_fieldsets is called when figuring out form fields.
# Refs #18681.
class BandAdmin ( ModelAdmin ) :
def get_fieldsets ( self , request , obj = None ) :
return [ ( None , { ' fields ' : [ ' name ' , ' bio ' ] } ) ]
ma = BandAdmin ( Band , self . site )
form = ma . get_form ( None )
self . assertEqual ( form . _meta . fields , [ ' name ' , ' bio ' ] )
class InlineBandAdmin ( TabularInline ) :
model = Concert
fk_name = ' main_band '
can_delete = False
def get_fieldsets ( self , request , obj = None ) :
return [ ( None , { ' fields ' : [ ' day ' , ' transport ' ] } ) ]
ma = InlineBandAdmin ( Band , self . site )
form = ma . get_formset ( None ) . form
self . assertEqual ( form . _meta . fields , [ ' day ' , ' transport ' ] )
2013-09-26 05:00:51 +08:00
def test_lookup_allowed_allows_nonexistent_lookup ( self ) :
"""
Ensure that a lookup_allowed allows a parameter
whose field lookup doesn ' t exist.
Refs #21129.
"""
class BandAdmin ( ModelAdmin ) :
fields = [ ' name ' ]
ma = BandAdmin ( Band , self . site )
self . assertTrue ( ma . lookup_allowed ( ' name__nonexistent ' , ' test_value ' ) )
2010-11-02 13:09:16 +08:00
def test_field_arguments ( self ) :
# If we specify the fields argument, fieldsets_add and fielsets_change should
# just stick the fields into a formsets structure and return it.
class BandAdmin ( ModelAdmin ) :
2013-03-08 22:15:23 +08:00
fields = [ ' name ' ]
2010-11-02 13:09:16 +08:00
ma = BandAdmin ( Band , self . site )
2013-07-31 13:52:11 +08:00
self . assertEqual ( list ( ma . get_fields ( request ) ) , [ ' name ' ] )
self . assertEqual ( list ( ma . get_fields ( request , self . band ) ) , [ ' name ' ] )
2012-08-15 16:46:31 +08:00
self . assertEqual ( ma . get_fieldsets ( request ) ,
2010-11-02 13:09:16 +08:00
[ ( None , { ' fields ' : [ ' name ' ] } ) ] )
self . assertEqual ( ma . get_fieldsets ( request , self . band ) ,
[ ( None , { ' fields ' : [ ' name ' ] } ) ] )
def test_field_arguments_restricted_on_form ( self ) :
# If we specify fields or fieldsets, it should exclude fields on the Form class
# to the fields specified. This may cause errors to be raised in the db layer if
# required model fields arent in fields/fieldsets, but that's preferable to
# ghost errors where you have a field in your Form class that isn't being
# displayed because you forgot to add it to fields/fieldsets
# Using `fields`.
class BandAdmin ( ModelAdmin ) :
fields = [ ' name ' ]
ma = BandAdmin ( Band , self . site )
2012-08-15 16:46:31 +08:00
self . assertEqual ( list ( ma . get_form ( request ) . base_fields ) , [ ' name ' ] )
self . assertEqual ( list ( ma . get_form ( request , self . band ) . base_fields ) ,
2010-11-02 13:09:16 +08:00
[ ' name ' ] )
# Using `fieldsets`.
class BandAdmin ( ModelAdmin ) :
fieldsets = [ ( None , { ' fields ' : [ ' name ' ] } ) ]
ma = BandAdmin ( Band , self . site )
2012-08-15 16:46:31 +08:00
self . assertEqual ( list ( ma . get_form ( request ) . base_fields ) , [ ' name ' ] )
self . assertEqual ( list ( ma . get_form ( request , self . band ) . base_fields ) ,
2010-11-02 13:09:16 +08:00
[ ' name ' ] )
# Using `exclude`.
class BandAdmin ( ModelAdmin ) :
exclude = [ ' bio ' ]
ma = BandAdmin ( Band , self . site )
2012-08-15 16:46:31 +08:00
self . assertEqual ( list ( ma . get_form ( request ) . base_fields ) ,
2010-11-02 13:09:16 +08:00
[ ' name ' , ' sign_date ' ] )
# You can also pass a tuple to `exclude`.
class BandAdmin ( ModelAdmin ) :
exclude = ( ' bio ' , )
ma = BandAdmin ( Band , self . site )
2012-08-15 16:46:31 +08:00
self . assertEqual ( list ( ma . get_form ( request ) . base_fields ) ,
2010-11-02 13:09:16 +08:00
[ ' name ' , ' sign_date ' ] )
# Using `fields` and `exclude`.
class BandAdmin ( ModelAdmin ) :
fields = [ ' name ' , ' bio ' ]
exclude = [ ' bio ' ]
ma = BandAdmin ( Band , self . site )
2012-08-15 16:46:31 +08:00
self . assertEqual ( list ( ma . get_form ( request ) . base_fields ) ,
2010-11-02 13:09:16 +08:00
[ ' name ' ] )
2011-08-12 22:14:49 +08:00
def test_custom_form_meta_exclude_with_readonly ( self ) :
"""
Ensure that the custom ModelForm ' s `Meta.exclude` is respected when
used in conjunction with ` ModelAdmin . readonly_fields ` and when no
` ModelAdmin . exclude ` is defined .
Refs #14496.
"""
# First, with `ModelAdmin` -----------------------
class AdminBandForm ( forms . ModelForm ) :
class Meta :
model = Band
exclude = [ ' bio ' ]
class BandAdmin ( ModelAdmin ) :
readonly_fields = [ ' name ' ]
form = AdminBandForm
ma = BandAdmin ( Band , self . site )
2012-08-15 16:46:31 +08:00
self . assertEqual ( list ( ma . get_form ( request ) . base_fields ) ,
[ ' sign_date ' ] )
2011-08-12 22:14:49 +08:00
# Then, with `InlineModelAdmin` -----------------
class AdminConcertForm ( forms . ModelForm ) :
class Meta :
model = Concert
exclude = [ ' day ' ]
class ConcertInline ( TabularInline ) :
readonly_fields = [ ' transport ' ]
form = AdminConcertForm
fk_name = ' main_band '
model = Concert
class BandAdmin ( ModelAdmin ) :
inlines = [
ConcertInline
]
ma = BandAdmin ( Band , self . site )
self . assertEqual (
2013-09-04 09:01:45 +08:00
list ( list ( ma . get_formsets_with_inlines ( request ) ) [ 0 ] [ 0 ] ( ) . forms [ 0 ] . fields ) ,
2012-08-15 16:46:31 +08:00
[ ' main_band ' , ' opening_band ' , ' id ' , ' DELETE ' ] )
2011-08-12 22:14:49 +08:00
def test_custom_form_meta_exclude ( self ) :
"""
Ensure that the custom ModelForm ' s `Meta.exclude` is overridden if
` ModelAdmin . exclude ` or ` InlineModelAdmin . exclude ` are defined .
Refs #14496.
"""
# First, with `ModelAdmin` -----------------------
class AdminBandForm ( forms . ModelForm ) :
class Meta :
model = Band
exclude = [ ' bio ' ]
class BandAdmin ( ModelAdmin ) :
exclude = [ ' name ' ]
form = AdminBandForm
ma = BandAdmin ( Band , self . site )
2012-08-15 16:46:31 +08:00
self . assertEqual ( list ( ma . get_form ( request ) . base_fields ) ,
[ ' bio ' , ' sign_date ' ] )
2011-08-12 22:14:49 +08:00
# Then, with `InlineModelAdmin` -----------------
class AdminConcertForm ( forms . ModelForm ) :
class Meta :
model = Concert
exclude = [ ' day ' ]
class ConcertInline ( TabularInline ) :
exclude = [ ' transport ' ]
form = AdminConcertForm
fk_name = ' main_band '
model = Concert
class BandAdmin ( ModelAdmin ) :
inlines = [
ConcertInline
]
ma = BandAdmin ( Band , self . site )
self . assertEqual (
2013-09-04 09:01:45 +08:00
list ( list ( ma . get_formsets_with_inlines ( request ) ) [ 0 ] [ 0 ] ( ) . forms [ 0 ] . fields ) ,
2012-08-15 16:46:31 +08:00
[ ' main_band ' , ' opening_band ' , ' day ' , ' id ' , ' DELETE ' ] )
2011-08-12 22:14:49 +08:00
2010-11-02 13:09:16 +08:00
def test_custom_form_validation ( self ) :
# If we specify a form, it should use it allowing custom validation to work
# properly. This won't, however, break any of the admin widgets or media.
class AdminBandForm ( forms . ModelForm ) :
delete = forms . BooleanField ( )
class BandAdmin ( ModelAdmin ) :
form = AdminBandForm
ma = BandAdmin ( Band , self . site )
2012-08-15 16:46:31 +08:00
self . assertEqual ( list ( ma . get_form ( request ) . base_fields ) ,
2010-11-02 13:09:16 +08:00
[ ' name ' , ' bio ' , ' sign_date ' , ' delete ' ] )
self . assertEqual (
type ( ma . get_form ( request ) . base_fields [ ' sign_date ' ] . widget ) ,
AdminDateWidget )
2011-06-17 03:56:22 +08:00
def test_form_exclude_kwarg_override ( self ) :
"""
Ensure that the ` exclude ` kwarg passed to ` ModelAdmin . get_form ( ) `
overrides all other declarations . Refs #8999.
"""
class AdminBandForm ( forms . ModelForm ) :
class Meta :
model = Band
exclude = [ ' name ' ]
class BandAdmin ( ModelAdmin ) :
2012-08-15 16:46:31 +08:00
exclude = [ ' sign_date ' ]
2011-06-17 03:56:22 +08:00
form = AdminBandForm
def get_form ( self , request , obj = None , * * kwargs ) :
kwargs [ ' exclude ' ] = [ ' bio ' ]
return super ( BandAdmin , self ) . get_form ( request , obj , * * kwargs )
ma = BandAdmin ( Band , self . site )
2012-08-15 16:46:31 +08:00
self . assertEqual ( list ( ma . get_form ( request ) . base_fields ) ,
[ ' name ' , ' sign_date ' ] )
2011-06-17 03:56:22 +08:00
def test_formset_exclude_kwarg_override ( self ) :
"""
Ensure that the ` exclude ` kwarg passed to ` InlineModelAdmin . get_formset ( ) `
overrides all other declarations . Refs #8999.
"""
class AdminConcertForm ( forms . ModelForm ) :
class Meta :
model = Concert
exclude = [ ' day ' ]
class ConcertInline ( TabularInline ) :
exclude = [ ' transport ' ]
form = AdminConcertForm
fk_name = ' main_band '
model = Concert
def get_formset ( self , request , obj = None , * * kwargs ) :
kwargs [ ' exclude ' ] = [ ' opening_band ' ]
return super ( ConcertInline , self ) . get_formset ( request , obj , * * kwargs )
class BandAdmin ( ModelAdmin ) :
inlines = [
ConcertInline
]
ma = BandAdmin ( Band , self . site )
self . assertEqual (
2013-09-04 09:01:45 +08:00
list ( list ( ma . get_formsets_with_inlines ( request ) ) [ 0 ] [ 0 ] ( ) . forms [ 0 ] . fields ) ,
2012-08-15 16:46:31 +08:00
[ ' main_band ' , ' day ' , ' transport ' , ' id ' , ' DELETE ' ] )
2011-06-17 03:56:22 +08:00
2010-11-02 13:09:16 +08:00
def test_queryset_override ( self ) :
# If we need to override the queryset of a ModelChoiceField in our custom form
# make sure that RelatedFieldWidgetWrapper doesn't mess that up.
band2 = Band ( name = ' The Beatles ' , bio = ' ' , sign_date = date ( 1962 , 1 , 1 ) )
band2 . save ( )
class ConcertAdmin ( ModelAdmin ) :
pass
ma = ConcertAdmin ( Concert , self . site )
form = ma . get_form ( request ) ( )
2012-02-01 04:36:11 +08:00
self . assertHTMLEqual ( str ( form [ " main_band " ] ) ,
2010-11-02 13:09:16 +08:00
' <select name= " main_band " id= " id_main_band " > \n '
' <option value= " " selected= " selected " >---------</option> \n '
' <option value= " %d " >The Beatles</option> \n '
2011-03-04 08:01:56 +08:00
' <option value= " %d " >The Doors</option> \n '
' </select> ' % ( band2 . id , self . band . id ) )
2010-11-02 13:09:16 +08:00
class AdminConcertForm ( forms . ModelForm ) :
2013-02-22 05:56:55 +08:00
pass
2010-11-02 13:09:16 +08:00
def __init__ ( self , * args , * * kwargs ) :
super ( AdminConcertForm , self ) . __init__ ( * args , * * kwargs )
self . fields [ " main_band " ] . queryset = Band . objects . filter ( name = ' The Doors ' )
class ConcertAdmin ( ModelAdmin ) :
form = AdminConcertForm
ma = ConcertAdmin ( Concert , self . site )
form = ma . get_form ( request ) ( )
2012-02-01 04:36:11 +08:00
self . assertHTMLEqual ( str ( form [ " main_band " ] ) ,
2010-11-02 13:09:16 +08:00
' <select name= " main_band " id= " id_main_band " > \n '
' <option value= " " selected= " selected " >---------</option> \n '
' <option value= " %d " >The Doors</option> \n '
' </select> ' % self . band . id )
2011-07-04 01:56:33 +08:00
def test_regression_for_ticket_15820 ( self ) :
"""
Ensure that ` obj ` is passed from ` InlineModelAdmin . get_fieldsets ( ) ` to
` InlineModelAdmin . get_formset ( ) ` .
"""
class CustomConcertForm ( forms . ModelForm ) :
class Meta :
model = Concert
fields = [ ' day ' ]
class ConcertInline ( TabularInline ) :
model = Concert
fk_name = ' main_band '
def get_formset ( self , request , obj = None , * * kwargs ) :
if obj :
kwargs [ ' form ' ] = CustomConcertForm
return super ( ConcertInline , self ) . get_formset ( request , obj , * * kwargs )
class BandAdmin ( ModelAdmin ) :
inlines = [
ConcertInline
]
2013-10-19 20:31:38 +08:00
Concert . objects . create ( main_band = self . band , opening_band = self . band , day = 1 )
2011-07-04 01:56:33 +08:00
ma = BandAdmin ( Band , self . site )
2011-10-07 08:41:25 +08:00
inline_instances = ma . get_inline_instances ( request )
fieldsets = list ( inline_instances [ 0 ] . get_fieldsets ( request ) )
2011-07-04 01:56:33 +08:00
self . assertEqual ( fieldsets [ 0 ] [ 1 ] [ ' fields ' ] , [ ' main_band ' , ' opening_band ' , ' day ' , ' transport ' ] )
2011-10-07 08:41:25 +08:00
fieldsets = list ( inline_instances [ 0 ] . get_fieldsets ( request , inline_instances [ 0 ] . model ) )
2011-07-04 01:56:33 +08:00
self . assertEqual ( fieldsets [ 0 ] [ 1 ] [ ' fields ' ] , [ ' day ' ] )
2010-11-02 13:09:16 +08:00
# radio_fields behavior ###########################################
def test_default_foreign_key_widget ( self ) :
# First, without any radio_fields specified, the widgets for ForeignKey
# and fields with choices specified ought to be a basic Select widget.
# ForeignKey widgets in the admin are wrapped with RelatedFieldWidgetWrapper so
# they need to be handled properly when type checking. For Select fields, all of
# the choices lists have a first entry of dashes.
cma = ModelAdmin ( Concert , self . site )
cmafa = cma . get_form ( request )
self . assertEqual ( type ( cmafa . base_fields [ ' main_band ' ] . widget . widget ) ,
Select )
self . assertEqual (
list ( cmafa . base_fields [ ' main_band ' ] . widget . choices ) ,
2012-06-08 00:08:47 +08:00
[ ( ' ' , ' --------- ' ) , ( self . band . id , ' The Doors ' ) ] )
2010-11-02 13:09:16 +08:00
self . assertEqual (
type ( cmafa . base_fields [ ' opening_band ' ] . widget . widget ) , Select )
self . assertEqual (
list ( cmafa . base_fields [ ' opening_band ' ] . widget . choices ) ,
2012-06-08 00:08:47 +08:00
[ ( ' ' , ' --------- ' ) , ( self . band . id , ' The Doors ' ) ] )
2010-11-02 13:09:16 +08:00
self . assertEqual ( type ( cmafa . base_fields [ ' day ' ] . widget ) , Select )
self . assertEqual ( list ( cmafa . base_fields [ ' day ' ] . widget . choices ) ,
[ ( ' ' , ' --------- ' ) , ( 1 , ' Fri ' ) , ( 2 , ' Sat ' ) ] )
self . assertEqual ( type ( cmafa . base_fields [ ' transport ' ] . widget ) ,
Select )
self . assertEqual (
list ( cmafa . base_fields [ ' transport ' ] . widget . choices ) ,
[ ( ' ' , ' --------- ' ) , ( 1 , ' Plane ' ) , ( 2 , ' Train ' ) , ( 3 , ' Bus ' ) ] )
def test_foreign_key_as_radio_field ( self ) :
# Now specify all the fields as radio_fields. Widgets should now be
# RadioSelect, and the choices list should have a first entry of 'None' if
# blank=True for the model field. Finally, the widget should have the
# 'radiolist' attr, and 'inline' as well if the field is specified HORIZONTAL.
class ConcertAdmin ( ModelAdmin ) :
radio_fields = {
' main_band ' : HORIZONTAL ,
' opening_band ' : VERTICAL ,
' day ' : VERTICAL ,
' transport ' : HORIZONTAL ,
}
cma = ConcertAdmin ( Concert , self . site )
cmafa = cma . get_form ( request )
self . assertEqual ( type ( cmafa . base_fields [ ' main_band ' ] . widget . widget ) ,
AdminRadioSelect )
self . assertEqual ( cmafa . base_fields [ ' main_band ' ] . widget . attrs ,
{ ' class ' : ' radiolist inline ' } )
self . assertEqual ( list ( cmafa . base_fields [ ' main_band ' ] . widget . choices ) ,
2012-06-08 00:08:47 +08:00
[ ( self . band . id , ' The Doors ' ) ] )
2010-11-02 13:09:16 +08:00
self . assertEqual (
type ( cmafa . base_fields [ ' opening_band ' ] . widget . widget ) ,
AdminRadioSelect )
self . assertEqual ( cmafa . base_fields [ ' opening_band ' ] . widget . attrs ,
{ ' class ' : ' radiolist ' } )
self . assertEqual (
list ( cmafa . base_fields [ ' opening_band ' ] . widget . choices ) ,
2012-06-08 00:08:47 +08:00
[ ( ' ' , ' None ' ) , ( self . band . id , ' The Doors ' ) ] )
2010-11-02 13:09:16 +08:00
self . assertEqual ( type ( cmafa . base_fields [ ' day ' ] . widget ) ,
AdminRadioSelect )
self . assertEqual ( cmafa . base_fields [ ' day ' ] . widget . attrs ,
{ ' class ' : ' radiolist ' } )
self . assertEqual ( list ( cmafa . base_fields [ ' day ' ] . widget . choices ) ,
[ ( 1 , ' Fri ' ) , ( 2 , ' Sat ' ) ] )
self . assertEqual ( type ( cmafa . base_fields [ ' transport ' ] . widget ) ,
AdminRadioSelect )
self . assertEqual ( cmafa . base_fields [ ' transport ' ] . widget . attrs ,
{ ' class ' : ' radiolist inline ' } )
self . assertEqual ( list ( cmafa . base_fields [ ' transport ' ] . widget . choices ) ,
2012-06-08 00:08:47 +08:00
[ ( ' ' , ' None ' ) , ( 1 , ' Plane ' ) , ( 2 , ' Train ' ) , ( 3 , ' Bus ' ) ] )
2010-11-02 13:09:16 +08:00
class AdminConcertForm ( forms . ModelForm ) :
class Meta :
model = Concert
exclude = ( ' transport ' , )
class ConcertAdmin ( ModelAdmin ) :
form = AdminConcertForm
ma = ConcertAdmin ( Concert , self . site )
2012-08-15 16:46:31 +08:00
self . assertEqual ( list ( ma . get_form ( request ) . base_fields ) ,
2010-11-02 13:09:16 +08:00
[ ' main_band ' , ' opening_band ' , ' day ' ] )
class AdminConcertForm ( forms . ModelForm ) :
extra = forms . CharField ( )
class Meta :
model = Concert
fields = [ ' extra ' , ' transport ' ]
class ConcertAdmin ( ModelAdmin ) :
form = AdminConcertForm
ma = ConcertAdmin ( Concert , self . site )
2012-08-15 16:46:31 +08:00
self . assertEqual ( list ( ma . get_form ( request ) . base_fields ) ,
2010-11-02 13:09:16 +08:00
[ ' extra ' , ' transport ' ] )
class ConcertInline ( TabularInline ) :
form = AdminConcertForm
model = Concert
fk_name = ' main_band '
can_delete = True
class BandAdmin ( ModelAdmin ) :
inlines = [
ConcertInline
]
ma = BandAdmin ( Band , self . site )
self . assertEqual (
2013-09-04 09:01:45 +08:00
list ( list ( ma . get_formsets_with_inlines ( request ) ) [ 0 ] [ 0 ] ( ) . forms [ 0 ] . fields ) ,
2010-11-02 13:09:16 +08:00
[ ' extra ' , ' transport ' , ' id ' , ' DELETE ' , ' main_band ' ] )
class ValidationTests ( unittest . TestCase ) :
def test_validation_only_runs_in_debug ( self ) :
# Ensure validation only runs when DEBUG = True
2013-10-14 21:14:17 +08:00
with override_settings ( DEBUG = True ) :
2010-11-02 13:09:16 +08:00
class ValidationTestModelAdmin ( ModelAdmin ) :
raw_id_fields = 10
site = AdminSite ( )
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
" ' ValidationTestModelAdmin.raw_id_fields ' must be a list or tuple. " ,
site . register ,
ValidationTestModel ,
ValidationTestModelAdmin ,
)
2013-10-14 21:14:17 +08:00
with override_settings ( DEBUG = False ) :
site = AdminSite ( )
site . register ( ValidationTestModel , ValidationTestModelAdmin )
2010-11-02 13:09:16 +08:00
def test_raw_id_fields_validation ( self ) :
class ValidationTestModelAdmin ( ModelAdmin ) :
raw_id_fields = 10
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
" ' ValidationTestModelAdmin.raw_id_fields ' must be a list or tuple. " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestModelAdmin ( ModelAdmin ) :
raw_id_fields = ( ' non_existent_field ' , )
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
2011-06-27 00:52:31 +08:00
" ' ValidationTestModelAdmin.raw_id_fields ' refers to field ' non_existent_field ' that is missing from model ' modeladmin.ValidationTestModel ' . " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestModelAdmin ( ModelAdmin ) :
raw_id_fields = ( ' name ' , )
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
" ' ValidationTestModelAdmin.raw_id_fields \ [0 \ ] ' , ' name ' must be either a ForeignKey or ManyToManyField. " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestModelAdmin ( ModelAdmin ) :
raw_id_fields = ( ' users ' , )
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ( ValidationTestModel )
2010-11-02 13:09:16 +08:00
def test_fieldsets_validation ( self ) :
class ValidationTestModelAdmin ( ModelAdmin ) :
fieldsets = 10
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
" ' ValidationTestModelAdmin.fieldsets ' must be a list or tuple. " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestModelAdmin ( ModelAdmin ) :
fieldsets = ( { } , )
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
" ' ValidationTestModelAdmin.fieldsets \ [0 \ ] ' must be a list or tuple. " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestModelAdmin ( ModelAdmin ) :
fieldsets = ( ( ) , )
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
" ' ValidationTestModelAdmin.fieldsets \ [0 \ ] ' does not have exactly two elements. " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestModelAdmin ( ModelAdmin ) :
fieldsets = ( ( " General " , ( ) ) , )
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
" ' ValidationTestModelAdmin.fieldsets \ [0 \ ] \ [1 \ ] ' must be a dictionary. " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestModelAdmin ( ModelAdmin ) :
fieldsets = ( ( " General " , { } ) , )
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
" ' fields ' key is required in ValidationTestModelAdmin.fieldsets \ [0 \ ] \ [1 \ ] field options dict. " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestModelAdmin ( ModelAdmin ) :
fieldsets = ( ( " General " , { " fields " : ( " name " , ) } ) , )
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ( ValidationTestModel )
2010-11-02 13:09:16 +08:00
class ValidationTestModelAdmin ( ModelAdmin ) :
fieldsets = ( ( " General " , { " fields " : ( " name " , ) } ) , )
2013-10-27 03:15:03 +08:00
fields = [ " name " ]
2010-11-02 13:09:16 +08:00
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
" Both fieldsets and fields are specified in ValidationTestModelAdmin. " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestModelAdmin ( ModelAdmin ) :
fieldsets = [ ( None , { ' fields ' : [ ' name ' , ' name ' ] } ) ]
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
" There are duplicate field \ (s \ ) in ValidationTestModelAdmin.fieldsets " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestModelAdmin ( ModelAdmin ) :
fields = [ " name " , " name " ]
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
" There are duplicate field \ (s \ ) in ValidationTestModelAdmin.fields " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
def test_form_validation ( self ) :
class FakeForm ( object ) :
pass
class ValidationTestModelAdmin ( ModelAdmin ) :
form = FakeForm
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
" ValidationTestModelAdmin.form does not inherit from BaseModelForm. " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
def test_fieldsets_with_custom_form_validation ( self ) :
class BandAdmin ( ModelAdmin ) :
fieldsets = (
( ' Band ' , {
' fields ' : ( ' name ' , )
} ) ,
)
2013-02-23 23:10:32 +08:00
BandAdmin . validate ( Band )
2010-11-02 13:09:16 +08:00
class AdminBandForm ( forms . ModelForm ) :
delete = forms . BooleanField ( )
class BandAdmin ( ModelAdmin ) :
form = AdminBandForm
fieldsets = (
( ' Band ' , {
' fields ' : ( ' name ' , ' bio ' , ' sign_date ' , ' delete ' )
} ) ,
)
2013-02-23 23:10:32 +08:00
BandAdmin . validate ( Band )
2010-11-02 13:09:16 +08:00
def test_filter_vertical_validation ( self ) :
class ValidationTestModelAdmin ( ModelAdmin ) :
filter_vertical = 10
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
" ' ValidationTestModelAdmin.filter_vertical ' must be a list or tuple. " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestModelAdmin ( ModelAdmin ) :
filter_vertical = ( " non_existent_field " , )
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
2011-06-27 00:52:31 +08:00
" ' ValidationTestModelAdmin.filter_vertical ' refers to field ' non_existent_field ' that is missing from model ' modeladmin.ValidationTestModel ' . " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestModelAdmin ( ModelAdmin ) :
filter_vertical = ( " name " , )
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
" ' ValidationTestModelAdmin.filter_vertical \ [0 \ ] ' must be a ManyToManyField. " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestModelAdmin ( ModelAdmin ) :
filter_vertical = ( " users " , )
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ( ValidationTestModel )
2010-11-02 13:09:16 +08:00
def test_filter_horizontal_validation ( self ) :
class ValidationTestModelAdmin ( ModelAdmin ) :
filter_horizontal = 10
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
" ' ValidationTestModelAdmin.filter_horizontal ' must be a list or tuple. " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestModelAdmin ( ModelAdmin ) :
filter_horizontal = ( " non_existent_field " , )
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
2011-06-27 00:52:31 +08:00
" ' ValidationTestModelAdmin.filter_horizontal ' refers to field ' non_existent_field ' that is missing from model ' modeladmin.ValidationTestModel ' . " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestModelAdmin ( ModelAdmin ) :
filter_horizontal = ( " name " , )
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
" ' ValidationTestModelAdmin.filter_horizontal \ [0 \ ] ' must be a ManyToManyField. " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestModelAdmin ( ModelAdmin ) :
filter_horizontal = ( " users " , )
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ( ValidationTestModel )
2010-11-02 13:09:16 +08:00
def test_radio_fields_validation ( self ) :
class ValidationTestModelAdmin ( ModelAdmin ) :
radio_fields = ( )
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
" ' ValidationTestModelAdmin.radio_fields ' must be a dictionary. " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestModelAdmin ( ModelAdmin ) :
radio_fields = { " non_existent_field " : None }
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
2011-06-27 00:52:31 +08:00
" ' ValidationTestModelAdmin.radio_fields ' refers to field ' non_existent_field ' that is missing from model ' modeladmin.ValidationTestModel ' . " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestModelAdmin ( ModelAdmin ) :
radio_fields = { " name " : None }
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
" ' ValidationTestModelAdmin.radio_fields \ [ ' name ' \ ] ' is neither an instance of ForeignKey nor does have choices set. " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestModelAdmin ( ModelAdmin ) :
radio_fields = { " state " : None }
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
" ' ValidationTestModelAdmin.radio_fields \ [ ' state ' \ ] ' is neither admin.HORIZONTAL nor admin.VERTICAL. " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestModelAdmin ( ModelAdmin ) :
radio_fields = { " state " : VERTICAL }
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ( ValidationTestModel )
2010-11-02 13:09:16 +08:00
def test_prepopulated_fields_validation ( self ) :
class ValidationTestModelAdmin ( ModelAdmin ) :
prepopulated_fields = ( )
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
" ' ValidationTestModelAdmin.prepopulated_fields ' must be a dictionary. " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestModelAdmin ( ModelAdmin ) :
prepopulated_fields = { " non_existent_field " : None }
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
2011-06-27 00:52:31 +08:00
" ' ValidationTestModelAdmin.prepopulated_fields ' refers to field ' non_existent_field ' that is missing from model ' modeladmin.ValidationTestModel ' . " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestModelAdmin ( ModelAdmin ) :
prepopulated_fields = { " slug " : ( " non_existent_field " , ) }
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
2011-06-27 00:52:31 +08:00
" ' ValidationTestModelAdmin.prepopulated_fields \ [ ' slug ' \ ] \ [0 \ ] ' refers to field ' non_existent_field ' that is missing from model ' modeladmin.ValidationTestModel ' . " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestModelAdmin ( ModelAdmin ) :
prepopulated_fields = { " users " : ( " name " , ) }
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
" ' ValidationTestModelAdmin.prepopulated_fields \ [ ' users ' \ ] ' is either a DateTimeField, ForeignKey or ManyToManyField. This isn ' t allowed. " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestModelAdmin ( ModelAdmin ) :
prepopulated_fields = { " slug " : ( " name " , ) }
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ( ValidationTestModel )
2010-11-02 13:09:16 +08:00
def test_list_display_validation ( self ) :
class ValidationTestModelAdmin ( ModelAdmin ) :
list_display = 10
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
" ' ValidationTestModelAdmin.list_display ' must be a list or tuple. " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestModelAdmin ( ModelAdmin ) :
list_display = ( ' non_existent_field ' , )
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
2012-06-08 00:08:47 +08:00
str_prefix ( " ValidationTestModelAdmin.list_display \ [0 \ ], %(_)s ' non_existent_field ' is not a callable or an attribute of ' ValidationTestModelAdmin ' or found in the model ' ValidationTestModel ' . " ) ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestModelAdmin ( ModelAdmin ) :
list_display = ( ' users ' , )
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
" ' ValidationTestModelAdmin.list_display \ [0 \ ] ' , ' users ' is a ManyToManyField which is not supported. " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
2011-02-22 03:15:02 +08:00
def a_callable ( obj ) :
pass
2010-11-02 13:09:16 +08:00
class ValidationTestModelAdmin ( ModelAdmin ) :
2011-02-22 03:15:02 +08:00
def a_method ( self , obj ) :
pass
list_display = ( ' name ' , ' decade_published_in ' , ' a_method ' , a_callable )
2010-11-02 13:09:16 +08:00
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ( ValidationTestModel )
2010-11-02 13:09:16 +08:00
def test_list_display_links_validation ( self ) :
class ValidationTestModelAdmin ( ModelAdmin ) :
list_display_links = 10
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
" ' ValidationTestModelAdmin.list_display_links ' must be a list or tuple. " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestModelAdmin ( ModelAdmin ) :
list_display_links = ( ' non_existent_field ' , )
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
2011-02-22 03:15:02 +08:00
" ' ValidationTestModelAdmin.list_display_links \ [0 \ ] ' refers to ' non_existent_field ' which is not defined in ' list_display ' . " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestModelAdmin ( ModelAdmin ) :
list_display_links = ( ' name ' , )
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
2011-02-22 03:15:02 +08:00
" ' ValidationTestModelAdmin.list_display_links \ [0 \ ] ' refers to ' name ' which is not defined in ' list_display ' . " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
2011-02-22 03:15:02 +08:00
def a_callable ( obj ) :
pass
2010-11-02 13:09:16 +08:00
class ValidationTestModelAdmin ( ModelAdmin ) :
2011-02-22 03:15:02 +08:00
def a_method ( self , obj ) :
pass
list_display = ( ' name ' , ' decade_published_in ' , ' a_method ' , a_callable )
list_display_links = ( ' name ' , ' decade_published_in ' , ' a_method ' , a_callable )
2010-11-02 13:09:16 +08:00
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ( ValidationTestModel )
2010-11-02 13:09:16 +08:00
2013-09-07 02:25:13 +08:00
class ValidationTestModelAdmin ( ModelAdmin ) :
list_display_links = None
ValidationTestModelAdmin . validate ( ValidationTestModel )
2010-11-02 13:09:16 +08:00
def test_list_filter_validation ( self ) :
class ValidationTestModelAdmin ( ModelAdmin ) :
list_filter = 10
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
" ' ValidationTestModelAdmin.list_filter ' must be a list or tuple. " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestModelAdmin ( ModelAdmin ) :
list_filter = ( ' non_existent_field ' , )
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
2010-11-22 03:29:15 +08:00
" ' ValidationTestModelAdmin.list_filter \ [0 \ ] ' refers to ' non_existent_field ' which does not refer to a Field. " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
2011-05-03 18:44:23 +08:00
class RandomClass ( object ) :
pass
class ValidationTestModelAdmin ( ModelAdmin ) :
list_filter = ( RandomClass , )
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2011-05-03 18:44:23 +08:00
ImproperlyConfigured ,
" ' ValidationTestModelAdmin.list_filter \ [0 \ ] ' is ' RandomClass ' which is not a descendant of ListFilter. " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2011-05-03 18:44:23 +08:00
ValidationTestModel ,
)
class ValidationTestModelAdmin ( ModelAdmin ) :
list_filter = ( ( ' is_active ' , RandomClass ) , )
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2011-05-03 18:44:23 +08:00
ImproperlyConfigured ,
" ' ValidationTestModelAdmin.list_filter \ [0 \ ] \ [1 \ ] ' is ' RandomClass ' which is not of type FieldListFilter. " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2011-05-03 18:44:23 +08:00
ValidationTestModel ,
)
class AwesomeFilter ( SimpleListFilter ) :
def get_title ( self ) :
return ' awesomeness '
2013-10-22 18:21:07 +08:00
2011-05-03 18:44:23 +08:00
def get_choices ( self , request ) :
return ( ( ' bit ' , ' A bit awesome ' ) , ( ' very ' , ' Very awesome ' ) , )
2013-10-22 18:21:07 +08:00
2013-03-08 22:15:23 +08:00
def get_queryset ( self , cl , qs ) :
2011-05-03 18:44:23 +08:00
return qs
class ValidationTestModelAdmin ( ModelAdmin ) :
list_filter = ( ( ' is_active ' , AwesomeFilter ) , )
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2011-05-03 18:44:23 +08:00
ImproperlyConfigured ,
" ' ValidationTestModelAdmin.list_filter \ [0 \ ] \ [1 \ ] ' is ' AwesomeFilter ' which is not of type FieldListFilter. " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2011-05-03 18:44:23 +08:00
ValidationTestModel ,
)
class ValidationTestModelAdmin ( ModelAdmin ) :
list_filter = ( BooleanFieldListFilter , )
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2011-05-03 18:44:23 +08:00
ImproperlyConfigured ,
" ' ValidationTestModelAdmin.list_filter \ [0 \ ] ' is ' BooleanFieldListFilter ' which is of type FieldListFilter but is not associated with a field name. " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2011-05-03 18:44:23 +08:00
ValidationTestModel ,
)
# Valid declarations below -----------
2010-11-02 13:09:16 +08:00
class ValidationTestModelAdmin ( ModelAdmin ) :
2011-05-24 17:17:55 +08:00
list_filter = ( ' is_active ' , AwesomeFilter , ( ' is_active ' , BooleanFieldListFilter ) , ' no ' )
2010-11-02 13:09:16 +08:00
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ( ValidationTestModel )
2010-11-02 13:09:16 +08:00
def test_list_per_page_validation ( self ) :
class ValidationTestModelAdmin ( ModelAdmin ) :
list_per_page = ' hello '
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
2013-02-23 23:10:32 +08:00
" ' ValidationTestModelAdmin.list_per_page ' should be a int. " ,
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestModelAdmin ( ModelAdmin ) :
list_per_page = 100
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ( ValidationTestModel )
2010-11-02 13:09:16 +08:00
2011-09-08 21:25:00 +08:00
def test_max_show_all_allowed_validation ( self ) :
class ValidationTestModelAdmin ( ModelAdmin ) :
list_max_show_all = ' hello '
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2011-09-08 21:25:00 +08:00
ImproperlyConfigured ,
2013-02-23 23:10:32 +08:00
" ' ValidationTestModelAdmin.list_max_show_all ' should be a int. " ,
ValidationTestModelAdmin . validate ,
2011-09-08 21:25:00 +08:00
ValidationTestModel ,
)
class ValidationTestModelAdmin ( ModelAdmin ) :
list_max_show_all = 200
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ( ValidationTestModel )
2011-09-08 21:25:00 +08:00
2010-11-02 13:09:16 +08:00
def test_search_fields_validation ( self ) :
class ValidationTestModelAdmin ( ModelAdmin ) :
search_fields = 10
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
" ' ValidationTestModelAdmin.search_fields ' must be a list or tuple. " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
def test_date_hierarchy_validation ( self ) :
class ValidationTestModelAdmin ( ModelAdmin ) :
date_hierarchy = ' non_existent_field '
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
2011-06-27 00:52:31 +08:00
" ' ValidationTestModelAdmin.date_hierarchy ' refers to field ' non_existent_field ' that is missing from model ' modeladmin.ValidationTestModel ' . " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestModelAdmin ( ModelAdmin ) :
date_hierarchy = ' name '
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
" ' ValidationTestModelAdmin.date_hierarchy is neither an instance of DateField nor DateTimeField. " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestModelAdmin ( ModelAdmin ) :
date_hierarchy = ' pub_date '
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ( ValidationTestModel )
2010-11-02 13:09:16 +08:00
def test_ordering_validation ( self ) :
class ValidationTestModelAdmin ( ModelAdmin ) :
ordering = 10
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
" ' ValidationTestModelAdmin.ordering ' must be a list or tuple. " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestModelAdmin ( ModelAdmin ) :
ordering = ( ' non_existent_field ' , )
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
2011-06-27 00:52:31 +08:00
" ' ValidationTestModelAdmin.ordering \ [0 \ ] ' refers to field ' non_existent_field ' that is missing from model ' modeladmin.ValidationTestModel ' . " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestModelAdmin ( ModelAdmin ) :
ordering = ( ' ? ' , ' name ' )
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
" ' ValidationTestModelAdmin.ordering ' has the random ordering marker ' \ ? ' , but contains other fields as well. Please either remove ' \ ? ' or the other fields. " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestModelAdmin ( ModelAdmin ) :
ordering = ( ' ? ' , )
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ( ValidationTestModel )
2010-11-02 13:09:16 +08:00
class ValidationTestModelAdmin ( ModelAdmin ) :
ordering = ( ' band__name ' , )
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ( ValidationTestModel )
2010-11-02 13:09:16 +08:00
class ValidationTestModelAdmin ( ModelAdmin ) :
ordering = ( ' name ' , )
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ( ValidationTestModel )
2010-11-02 13:09:16 +08:00
def test_list_select_related_validation ( self ) :
class ValidationTestModelAdmin ( ModelAdmin ) :
list_select_related = 1
2013-06-05 05:35:11 +08:00
six . assertRaisesRegex (
self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
2013-06-05 05:35:11 +08:00
" ' ValidationTestModelAdmin.list_select_related ' should be either a "
" bool, a tuple or a list " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestModelAdmin ( ModelAdmin ) :
list_select_related = False
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ( ValidationTestModel )
2010-11-02 13:09:16 +08:00
def test_save_as_validation ( self ) :
class ValidationTestModelAdmin ( ModelAdmin ) :
save_as = 1
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
2013-02-23 23:10:32 +08:00
" ' ValidationTestModelAdmin.save_as ' should be a bool. " ,
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestModelAdmin ( ModelAdmin ) :
save_as = True
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ( ValidationTestModel )
2010-11-02 13:09:16 +08:00
def test_save_on_top_validation ( self ) :
class ValidationTestModelAdmin ( ModelAdmin ) :
save_on_top = 1
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
2013-02-23 23:10:32 +08:00
" ' ValidationTestModelAdmin.save_on_top ' should be a bool. " ,
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestModelAdmin ( ModelAdmin ) :
save_on_top = True
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ( ValidationTestModel )
2010-11-02 13:09:16 +08:00
def test_inlines_validation ( self ) :
class ValidationTestModelAdmin ( ModelAdmin ) :
inlines = 10
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
" ' ValidationTestModelAdmin.inlines ' must be a list or tuple. " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestInline ( object ) :
pass
class ValidationTestModelAdmin ( ModelAdmin ) :
inlines = [ ValidationTestInline ]
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
" ' ValidationTestModelAdmin.inlines \ [0 \ ] ' does not inherit from BaseModelAdmin. " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestInline ( TabularInline ) :
pass
class ValidationTestModelAdmin ( ModelAdmin ) :
inlines = [ ValidationTestInline ]
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
" ' model ' is a required attribute of ' ValidationTestModelAdmin.inlines \ [0 \ ] ' . " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class SomethingBad ( object ) :
pass
class ValidationTestInline ( TabularInline ) :
model = SomethingBad
class ValidationTestModelAdmin ( ModelAdmin ) :
inlines = [ ValidationTestInline ]
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
" ' ValidationTestModelAdmin.inlines \ [0 \ ].model ' does not inherit from models.Model. " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestInline ( TabularInline ) :
model = ValidationTestInlineModel
class ValidationTestModelAdmin ( ModelAdmin ) :
inlines = [ ValidationTestInline ]
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ( ValidationTestModel )
2010-11-02 13:09:16 +08:00
def test_fields_validation ( self ) :
class ValidationTestInline ( TabularInline ) :
model = ValidationTestInlineModel
fields = 10
class ValidationTestModelAdmin ( ModelAdmin ) :
inlines = [ ValidationTestInline ]
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
" ' ValidationTestInline.fields ' must be a list or tuple. " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
def test_fk_name_validation ( self ) :
class ValidationTestInline ( TabularInline ) :
model = ValidationTestInlineModel
fk_name = " non_existent_field "
class ValidationTestModelAdmin ( ModelAdmin ) :
inlines = [ ValidationTestInline ]
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
2011-06-27 00:52:31 +08:00
" ' ValidationTestInline.fk_name ' refers to field ' non_existent_field ' that is missing from model ' modeladmin.ValidationTestInlineModel ' . " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestInline ( TabularInline ) :
model = ValidationTestInlineModel
fk_name = " parent "
class ValidationTestModelAdmin ( ModelAdmin ) :
inlines = [ ValidationTestInline ]
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ( ValidationTestModel )
2010-11-02 13:09:16 +08:00
def test_extra_validation ( self ) :
class ValidationTestInline ( TabularInline ) :
model = ValidationTestInlineModel
extra = " hello "
class ValidationTestModelAdmin ( ModelAdmin ) :
inlines = [ ValidationTestInline ]
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
2013-02-23 23:10:32 +08:00
" ' ValidationTestInline.extra ' should be a int. " ,
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestInline ( TabularInline ) :
model = ValidationTestInlineModel
extra = 2
class ValidationTestModelAdmin ( ModelAdmin ) :
inlines = [ ValidationTestInline ]
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ( ValidationTestModel )
2010-11-02 13:09:16 +08:00
def test_max_num_validation ( self ) :
class ValidationTestInline ( TabularInline ) :
model = ValidationTestInlineModel
max_num = " hello "
class ValidationTestModelAdmin ( ModelAdmin ) :
inlines = [ ValidationTestInline ]
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
2013-02-23 23:10:32 +08:00
" ' ValidationTestInline.max_num ' should be a int. " ,
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class ValidationTestInline ( TabularInline ) :
model = ValidationTestInlineModel
max_num = 2
class ValidationTestModelAdmin ( ModelAdmin ) :
inlines = [ ValidationTestInline ]
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ( ValidationTestModel )
2010-11-02 13:09:16 +08:00
def test_formset_validation ( self ) :
class FakeFormSet ( object ) :
pass
class ValidationTestInline ( TabularInline ) :
model = ValidationTestInlineModel
formset = FakeFormSet
class ValidationTestModelAdmin ( ModelAdmin ) :
inlines = [ ValidationTestInline ]
2012-09-08 01:17:09 +08:00
six . assertRaisesRegex ( self ,
2010-11-02 13:09:16 +08:00
ImproperlyConfigured ,
" ' ValidationTestInline.formset ' does not inherit from BaseModelFormSet. " ,
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ,
2010-11-02 13:09:16 +08:00
ValidationTestModel ,
)
class RealModelFormSet ( BaseModelFormSet ) :
pass
class ValidationTestInline ( TabularInline ) :
model = ValidationTestInlineModel
formset = RealModelFormSet
class ValidationTestModelAdmin ( ModelAdmin ) :
inlines = [ ValidationTestInline ]
2013-02-23 23:10:32 +08:00
ValidationTestModelAdmin . validate ( ValidationTestModel )