def test_extra_validation(self): class ValidationTestInline(TabularInline): model = ValidationTestInlineModel extra = "hello" class ValidationTestModelAdmin(ModelAdmin): inlines = [ValidationTestInline] self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestInline.extra' should be a integer.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestInline(TabularInline): model = ValidationTestInlineModel extra = 2 class ValidationTestModelAdmin(ModelAdmin): inlines = [ValidationTestInline] validate(ValidationTestModelAdmin, ValidationTestModel)
def test_fk_name_validation(self): class ValidationTestInline(TabularInline): model = ValidationTestInlineModel fk_name = "non_existent_field" class ValidationTestModelAdmin(ModelAdmin): inlines = [ValidationTestInline] self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestInline.fk_name' refers to field 'non_existent_field' that is missing from model 'modeladmin.ValidationTestInlineModel'.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestInline(TabularInline): model = ValidationTestInlineModel fk_name = "parent" class ValidationTestModelAdmin(ModelAdmin): inlines = [ValidationTestInline] validate(ValidationTestModelAdmin, ValidationTestModel)
def test_max_num_validation(self): class ValidationTestInline(TabularInline): model = ValidationTestInlineModel max_num = "hello" class ValidationTestModelAdmin(ModelAdmin): inlines = [ValidationTestInline] self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestInline.max_num' should be an integer or None \(default\).", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestInline(TabularInline): model = ValidationTestInlineModel max_num = 2 class ValidationTestModelAdmin(ModelAdmin): inlines = [ValidationTestInline] validate(ValidationTestModelAdmin, ValidationTestModel)
def test_date_hierarchy_validation(self): class ValidationTestModelAdmin(ModelAdmin): date_hierarchy = 'non_existent_field' self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.date_hierarchy' refers to field 'non_existent_field' that is missing from model 'modeladmin.ValidationTestModel'.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): date_hierarchy = 'name' self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.date_hierarchy is neither an instance of DateField nor DateTimeField.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): date_hierarchy = 'pub_date' validate(ValidationTestModelAdmin, ValidationTestModel)
def test_extra(self): class SongAdmin(admin.ModelAdmin): def awesome_song(self, instance): if instance.title == "Born to Run": return "Best Ever!" return "Status unknown." validate(SongAdmin, Song)
def test_formset_validation(self): class FakeFormSet(object): pass class ValidationTestInline(TabularInline): model = ValidationTestInlineModel formset = FakeFormSet class ValidationTestModelAdmin(ModelAdmin): inlines = [ValidationTestInline] self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestInline.formset' does not inherit from BaseModelFormSet.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class RealModelFormSet(BaseModelFormSet): pass class ValidationTestInline(TabularInline): model = ValidationTestInlineModel formset = RealModelFormSet class ValidationTestModelAdmin(ModelAdmin): inlines = [ValidationTestInline] validate(ValidationTestModelAdmin, ValidationTestModel)
def test_readonly_on_modeladmin(self): class SongAdmin(admin.ModelAdmin): readonly_fields = ("readonly_method_on_modeladmin",) def readonly_method_on_modeladmin(self, obj): pass validate(SongAdmin, Song)
def test_readonly_on_method(self): def my_function(obj): pass class SongAdmin(admin.ModelAdmin): readonly_fields = (my_function,) validate(SongAdmin, Song)
def test_custom_modelforms_with_fields_fieldsets(self): """ # Regression test for #8027: custom ModelForms with fields/fieldsets """ validate(ValidFields, Song) self.assertRaisesMessage(ImproperlyConfigured, "'InvalidFields.fields' refers to field 'spam' that is missing from the form.", validate, InvalidFields, Song)
def test_readonly_and_editable(self): class SongAdmin(admin.ModelAdmin): readonly_fields = ["original_release"] fieldsets = [ (None, { "fields": ["title", "original_release"], }), ] validate(SongAdmin, Song)
def test_radio_fields_validation(self): class ValidationTestModelAdmin(ModelAdmin): radio_fields = () self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.radio_fields' must be a dictionary.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): radio_fields = {"non_existent_field": None} self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.radio_fields' refers to field 'non_existent_field' that is missing from model 'modeladmin.ValidationTestModel'.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): radio_fields = {"name": None} self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.radio_fields\['name'\]' is neither an instance of ForeignKey nor does have choices set.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): radio_fields = {"state": None} self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.radio_fields\['state'\]' is neither admin.HORIZONTAL nor admin.VERTICAL.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): radio_fields = {"state": VERTICAL} validate(ValidationTestModelAdmin, ValidationTestModel)
def test_prepopulated_fields_validation(self): class ValidationTestModelAdmin(ModelAdmin): prepopulated_fields = () self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.prepopulated_fields' must be a dictionary.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): prepopulated_fields = {"non_existent_field": None} self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.prepopulated_fields' refers to field 'non_existent_field' that is missing from model 'modeladmin.ValidationTestModel'.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): prepopulated_fields = {"slug": ("non_existent_field",)} self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.prepopulated_fields\['slug'\]\[0\]' refers to field 'non_existent_field' that is missing from model 'modeladmin.ValidationTestModel'.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): prepopulated_fields = {"users": ("name",)} self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.prepopulated_fields\['users'\]' is either a DateTimeField, ForeignKey or ManyToManyField. This isn't allowed.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): prepopulated_fields = {"slug": ("name",)} validate(ValidationTestModelAdmin, ValidationTestModel)
def test_non_model_first_field(self): """ Regression for ensuring ModelAdmin.field can handle first elem being a non-model field (test fix for UnboundLocalError introduced with r16225). """ class SongForm(forms.ModelForm): extra_data = forms.CharField() class Meta: model = Song class FieldsOnFormOnlyAdmin(admin.ModelAdmin): form = SongForm fields = ['extra_data', 'title'] validate(FieldsOnFormOnlyAdmin, Song)
def test_non_model_fields(self): """ Regression for ensuring ModelAdmin.fields can contain non-model fields that broke with r11737 """ class SongForm(forms.ModelForm): extra_data = forms.CharField() class Meta: model = Song class FieldsOnFormOnlyAdmin(admin.ModelAdmin): form = SongForm fields = ['title', 'extra_data'] validate(FieldsOnFormOnlyAdmin, Song)
def test_explicit_through_override(self): """ Regression test for #12209 -- If the explicitly provided through model is specified as a string, the admin should still be able use Model.m2m_field.through """ class AuthorsInline(admin.TabularInline): model = Book.authors.through class BookAdmin(admin.ModelAdmin): inlines = [AuthorsInline] # If the through model is still a string (and hasn't been resolved to a model) # the validation will fail. validate(BookAdmin, Book)
def register(self, model_or_iterable, admin_class=None, **options): """ Registers the given model(s) with the given admin class. The model(s) should be Model classes, not instances. If an admin class isn't given, it will use ModelAdmin (the default admin options). If keyword arguments are given -- e.g., list_display -- they'll be applied as options to the admin class. If a model is already registered, this will raise AlreadyRegistered. If a model is abstract, this will raise ImproperlyConfigured. """ if not admin_class: admin_class = ModelAdmin # Don't import the humongous validation code unless required if admin_class and settings.DEBUG: from djangocg.contrib.admin.validation import validate else: validate = lambda model, adminclass: None if isinstance(model_or_iterable, ModelBase): model_or_iterable = [model_or_iterable] for model in model_or_iterable: if model._meta.abstract: raise ImproperlyConfigured('The model %s is abstract, so it ' 'cannot be registered with admin.' % model.__name__) if model in self._registry: raise AlreadyRegistered('The model %s is already registered' % model.__name__) # If we got **options then dynamically construct a subclass of # admin_class with those **options. if options: # For reasons I don't quite understand, without a __module__ # the created class appears to "live" in the wrong place, # which causes issues later on. options['__module__'] = __name__ admin_class = type("%sAdmin" % model.__name__, (admin_class,), options) # Validate (which might be a no-op) validate(admin_class, model) # Instantiate the admin class to save in the registry self._registry[model] = admin_class(model, self)
def test_save_on_top_validation(self): class ValidationTestModelAdmin(ModelAdmin): save_on_top = 1 self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.save_on_top' should be a boolean.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): save_on_top = True validate(ValidationTestModelAdmin, ValidationTestModel)
def test_list_per_page_validation(self): class ValidationTestModelAdmin(ModelAdmin): list_per_page = 'hello' self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.list_per_page' should be a integer.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): list_per_page = 100 validate(ValidationTestModelAdmin, ValidationTestModel)
def test_max_show_all_allowed_validation(self): class ValidationTestModelAdmin(ModelAdmin): list_max_show_all = 'hello' self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.list_max_show_all' should be an integer.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): list_max_show_all = 200 validate(ValidationTestModelAdmin, ValidationTestModel)
def test_list_select_related_validation(self): class ValidationTestModelAdmin(ModelAdmin): list_select_related = 1 self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.list_select_related' should be a boolean.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): list_select_related = False validate(ValidationTestModelAdmin, ValidationTestModel)
def test_list_display_links_validation(self): class ValidationTestModelAdmin(ModelAdmin): list_display_links = 10 self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.list_display_links' must be a list or tuple.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): list_display_links = ('non_existent_field',) self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.list_display_links\[0\]' refers to 'non_existent_field' which is not defined in 'list_display'.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): list_display_links = ('name',) self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.list_display_links\[0\]' refers to 'name' which is not defined in 'list_display'.", validate, ValidationTestModelAdmin, ValidationTestModel, ) def a_callable(obj): pass class ValidationTestModelAdmin(ModelAdmin): 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) validate(ValidationTestModelAdmin, ValidationTestModel)
def test_list_display_validation(self): class ValidationTestModelAdmin(ModelAdmin): list_display = 10 self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.list_display' must be a list or tuple.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): list_display = ('non_existent_field',) self.assertRaisesRegexp( ImproperlyConfigured, 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'."), validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): list_display = ('users',) self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.list_display\[0\]', 'users' is a ManyToManyField which is not supported.", validate, ValidationTestModelAdmin, ValidationTestModel, ) def a_callable(obj): pass class ValidationTestModelAdmin(ModelAdmin): def a_method(self, obj): pass list_display = ('name', 'decade_published_in', 'a_method', a_callable) validate(ValidationTestModelAdmin, ValidationTestModel)
def test_filter_horizontal_validation(self): class ValidationTestModelAdmin(ModelAdmin): filter_horizontal = 10 self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.filter_horizontal' must be a list or tuple.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): filter_horizontal = ("non_existent_field",) self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.filter_horizontal' refers to field 'non_existent_field' that is missing from model 'modeladmin.ValidationTestModel'.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): filter_horizontal = ("name",) self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.filter_horizontal\[0\]' must be a ManyToManyField.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): filter_horizontal = ("users",) validate(ValidationTestModelAdmin, ValidationTestModel)
def test_raw_id_fields_validation(self): class ValidationTestModelAdmin(ModelAdmin): raw_id_fields = 10 self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.raw_id_fields' must be a list or tuple.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): raw_id_fields = ('non_existent_field',) self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.raw_id_fields' refers to field 'non_existent_field' that is missing from model 'modeladmin.ValidationTestModel'.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): raw_id_fields = ('name',) self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.raw_id_fields\[0\]', 'name' must be either a ForeignKey or ManyToManyField.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): raw_id_fields = ('users',) validate(ValidationTestModelAdmin, ValidationTestModel)
def test_ordering_validation(self): class ValidationTestModelAdmin(ModelAdmin): ordering = 10 self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.ordering' must be a list or tuple.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): ordering = ('non_existent_field',) self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.ordering\[0\]' refers to field 'non_existent_field' that is missing from model 'modeladmin.ValidationTestModel'.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): ordering = ('?', 'name') self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.ordering' has the random ordering marker '\?', but contains other fields as well. Please either remove '\?' or the other fields.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): ordering = ('?',) validate(ValidationTestModelAdmin, ValidationTestModel) class ValidationTestModelAdmin(ModelAdmin): ordering = ('band__name',) validate(ValidationTestModelAdmin, ValidationTestModel) class ValidationTestModelAdmin(ModelAdmin): ordering = ('name',) validate(ValidationTestModelAdmin, ValidationTestModel)
def test_nested_fieldsets(self): class NestedFieldsetAdmin(admin.ModelAdmin): fieldsets = ( ('Main', {'fields': ('price', ('name', 'subtitle'))}), ) validate(NestedFieldsetAdmin, Book)
def test_list_filter_validation(self): class ValidationTestModelAdmin(ModelAdmin): list_filter = 10 self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.list_filter' must be a list or tuple.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): list_filter = ('non_existent_field',) self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.list_filter\[0\]' refers to 'non_existent_field' which does not refer to a Field.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class RandomClass(object): pass class ValidationTestModelAdmin(ModelAdmin): list_filter = (RandomClass,) self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.list_filter\[0\]' is 'RandomClass' which is not a descendant of ListFilter.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): list_filter = (('is_active', RandomClass),) self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.list_filter\[0\]\[1\]' is 'RandomClass' which is not of type FieldListFilter.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class AwesomeFilter(SimpleListFilter): def get_title(self): return 'awesomeness' def get_choices(self, request): return (('bit', 'A bit awesome'), ('very', 'Very awesome'), ) def get_query_set(self, cl, qs): return qs class ValidationTestModelAdmin(ModelAdmin): list_filter = (('is_active', AwesomeFilter),) self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.list_filter\[0\]\[1\]' is 'AwesomeFilter' which is not of type FieldListFilter.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): list_filter = (BooleanFieldListFilter,) self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.list_filter\[0\]' is 'BooleanFieldListFilter' which is of type FieldListFilter but is not associated with a field name.", validate, ValidationTestModelAdmin, ValidationTestModel, ) # Valid declarations below ----------- class ValidationTestModelAdmin(ModelAdmin): list_filter = ('is_active', AwesomeFilter, ('is_active', BooleanFieldListFilter), 'no') validate(ValidationTestModelAdmin, ValidationTestModel)
def test_fieldsets_with_custom_form_validation(self): class BandAdmin(ModelAdmin): fieldsets = ( ('Band', { 'fields': ('non_existent_field',) }), ) self.assertRaisesRegexp( ImproperlyConfigured, "'BandAdmin.fieldsets\[0\]\[1\]\['fields'\]' refers to field 'non_existent_field' that is missing from the form.", validate, BandAdmin, Band, ) class BandAdmin(ModelAdmin): fieldsets = ( ('Band', { 'fields': ('name',) }), ) validate(BandAdmin, Band) class AdminBandForm(forms.ModelForm): class Meta: model = Band class BandAdmin(ModelAdmin): form = AdminBandForm fieldsets = ( ('Band', { 'fields': ('non_existent_field',) }), ) self.assertRaisesRegexp( ImproperlyConfigured, "'BandAdmin.fieldsets\[0]\[1\]\['fields'\]' refers to field 'non_existent_field' that is missing from the form.", validate, BandAdmin, Band, ) class AdminBandForm(forms.ModelForm): delete = forms.BooleanField() class Meta: model = Band class BandAdmin(ModelAdmin): form = AdminBandForm fieldsets = ( ('Band', { 'fields': ('name', 'bio', 'sign_date', 'delete') }), ) validate(BandAdmin, Band)
def test_fieldsets_validation(self): class ValidationTestModelAdmin(ModelAdmin): fieldsets = 10 self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.fieldsets' must be a list or tuple.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): fieldsets = ({},) self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.fieldsets\[0\]' must be a list or tuple.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): fieldsets = ((),) self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.fieldsets\[0\]' does not have exactly two elements.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): fieldsets = (("General", ()),) self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.fieldsets\[0\]\[1\]' must be a dictionary.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): fieldsets = (("General", {}),) self.assertRaisesRegexp( ImproperlyConfigured, "'fields' key is required in ValidationTestModelAdmin.fieldsets\[0\]\[1\] field options dict.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): fieldsets = (("General", {"fields": ("non_existent_field",)}),) self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.fieldsets\[0\]\[1\]\['fields'\]' refers to field 'non_existent_field' that is missing from the form.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): fieldsets = (("General", {"fields": ("name",)}),) validate(ValidationTestModelAdmin, ValidationTestModel) class ValidationTestModelAdmin(ModelAdmin): fieldsets = (("General", {"fields": ("name",)}),) fields = ["name",] self.assertRaisesRegexp( ImproperlyConfigured, "Both fieldsets and fields are specified in ValidationTestModelAdmin.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): fieldsets = [(None, {'fields': ['name', 'name']})] self.assertRaisesRegexp( ImproperlyConfigured, "There are duplicate field\(s\) in ValidationTestModelAdmin.fieldsets", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): fields = ["name", "name"] self.assertRaisesRegexp( ImproperlyConfigured, "There are duplicate field\(s\) in ValidationTestModelAdmin.fields", validate, ValidationTestModelAdmin, ValidationTestModel, )
def test_inlines_validation(self): class ValidationTestModelAdmin(ModelAdmin): inlines = 10 self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.inlines' must be a list or tuple.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestInline(object): pass class ValidationTestModelAdmin(ModelAdmin): inlines = [ValidationTestInline] self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.inlines\[0\]' does not inherit from BaseModelAdmin.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestInline(TabularInline): pass class ValidationTestModelAdmin(ModelAdmin): inlines = [ValidationTestInline] self.assertRaisesRegexp( ImproperlyConfigured, "'model' is a required attribute of 'ValidationTestModelAdmin.inlines\[0\]'.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class SomethingBad(object): pass class ValidationTestInline(TabularInline): model = SomethingBad class ValidationTestModelAdmin(ModelAdmin): inlines = [ValidationTestInline] self.assertRaisesRegexp( ImproperlyConfigured, "'ValidationTestModelAdmin.inlines\[0\].model' does not inherit from models.Model.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestInline(TabularInline): model = ValidationTestInlineModel class ValidationTestModelAdmin(ModelAdmin): inlines = [ValidationTestInline] validate(ValidationTestModelAdmin, ValidationTestModel)