def test_custom_get_form_with_fieldsets(self): """ Ensure that the fieldsets validation is skipped when the ModelAdmin.get_form() method is overridden. Refs #19445. """ validate(ValidFormFieldsets, Song)
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_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 ValidationTestModelAdmin(ModelAdmin): list_filter = ('is_active',) 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 '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_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_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 'ValidationTestInlineModel'.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestInline(TabularInline): model = ValidationTestInlineModel fk_name = "parent" class ValidationTestModelAdmin(ModelAdmin): inlines = [ValidationTestInline] validate(ValidationTestModelAdmin, ValidationTestModel)
def test_list_filter_validation(self): class ValidationTestModelAdmin(ModelAdmin): list_filter = 10 self.assertRaisesErrorWithMessage( ImproperlyConfigured, "'ValidationTestModelAdmin.list_filter' must be a list or tuple.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): list_filter = ('non_existent_field',) self.assertRaisesErrorWithMessage( ImproperlyConfigured, "'ValidationTestModelAdmin.list_filter[0]' refers to field 'non_existent_field' that is missing from model 'ValidationTestModel'.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): list_filter = ('is_active',) 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_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_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_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 FieldsOnFormOnlyAdmin(admin.ModelAdmin): form = SongForm fields = ['title', 'extra_data'] validate(FieldsOnFormOnlyAdmin, Song)
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 django.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__) # Ignore the registration if the model has been # swapped out. if not model._meta.swapped: # 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_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 '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 '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_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 '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 register(self, model_or_iterable, admin_class=None, **options): """ Registers the given model(s) with this 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 not admin_class: admin_class = HierarchicalModelAdmin elif not issubclass(admin_class, HierarchicalModelAdmin): raise ImproperlyConfigured('You may only register HierarchicalAdmin subclasses' 'with InstitutionAdmin!') # Don't import the humongous validation code unless required if admin_class and settings.DEBUG: from django.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 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. attrs = {} attrs['__module__'] = __name__ attrs['parent_admin'] = self attrs.update(options or {}) # 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("%sHierarchicalAdmin" % model.__name__, (admin_class,), attrs) # 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.admin_site)
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_fieldsets_with_custom_form_validation(self): 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',) }), ) six.assertRaisesRegex(self, 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_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_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_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_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 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_save_as_validation(self): class ValidationTestModelAdmin(ModelAdmin): save_as = 1 self.assertRaisesErrorWithMessage( ImproperlyConfigured, "'ValidationTestModelAdmin.save_as' should be a boolean.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): save_as = True validate(ValidationTestModelAdmin, ValidationTestModel)
def test_save_as_validation(self): class ValidationTestModelAdmin(ModelAdmin): save_as = 1 six.assertRaisesRegex(self, ImproperlyConfigured, "'ValidationTestModelAdmin.save_as' should be a boolean.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): save_as = True 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_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, "ValidationTestModelAdmin.list_display\[0\], '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_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, "ValidationTestModelAdmin.list_display\[0\], '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, ) class ValidationTestModelAdmin(ModelAdmin): list_display = ('name',) 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 '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 '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 six.assertRaisesRegex( self, ImproperlyConfigured, "'ValidationTestModelAdmin.ordering' must be a list or tuple.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): ordering = ('non_existent_field', ) six.assertRaisesRegex( self, 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') six.assertRaisesRegex( self, 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_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 app_list(request): """ Builds an admin drop-down menu by getting all models and passing them to the context variable (apps) Source: http://smotko.si/navbar-in-django-admin/ The original script, derived from Django's index view, displays all models, but it should skip the inlines, so we need to chek if the model is in the admin.site._registy dict """ user = request.user app_dict = {} admin_class = ModelAdmin # apps to be excluded from the navigation IGNORE_MODELS = ( 'sessions', 'admin', 'contenttypes', 'sites', 'south', ) for model in get_models(): # excluding the inline models if model in site._registry: validate(admin_class, model) model_admin = admin_class(model, None) app_label = model._meta.app_label if app_label in IGNORE_MODELS: continue has_module_perms = user.has_module_perms(app_label) if has_module_perms: perms = model_admin.get_model_perms(request) if True in perms.values(): model_dict = { 'name': capfirst(model._meta.verbose_name_plural), 'admin_url': mark_safe('%s/%s/' % (app_label, model.__name__.lower())), } if app_label in app_dict: app_dict[app_label]['models'].append(model_dict) else: app_dict[app_label] = { 'name': app_label.title(), 'app_url': app_label + '/', 'has_module_perms': has_module_perms, 'models': [model_dict], } app_list = app_dict.values() app_list.sort(key=lambda x: x['name']) for app in app_list: app['models'].sort(key=lambda x: x['name']) return {'apps': app_list}
def test_nested_fields(self): class NestedFieldsAdmin(admin.ModelAdmin): fields = ('price', ('name', 'subtitle')) validate(NestedFieldsAdmin, Book)
def test_custom_modelforms_with_fields_fieldsets(self): """ # Regression test for #8027: custom ModelForms with fields/fieldsets """ validate(ValidFields, Song)
def test_inlines_validation(self): class ValidationTestModelAdmin(ModelAdmin): inlines = 10 six.assertRaisesRegex( self, ImproperlyConfigured, "'ValidationTestModelAdmin.inlines' must be a list or tuple.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestInline(object): pass class ValidationTestModelAdmin(ModelAdmin): inlines = [ValidationTestInline] six.assertRaisesRegex( self, ImproperlyConfigured, "'ValidationTestModelAdmin.inlines\[0\]' does not inherit from BaseModelAdmin.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestInline(TabularInline): pass class ValidationTestModelAdmin(ModelAdmin): inlines = [ValidationTestInline] six.assertRaisesRegex( self, 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] six.assertRaisesRegex( self, 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)
def test_fieldsets_validation(self): class ValidationTestModelAdmin(ModelAdmin): fieldsets = 10 self.assertRaisesErrorWithMessage( ImproperlyConfigured, "'ValidationTestModelAdmin.fieldsets' must be a list or tuple.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): fieldsets = ({},) self.assertRaisesErrorWithMessage( ImproperlyConfigured, "'ValidationTestModelAdmin.fieldsets[0]' must be a list or tuple.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): fieldsets = ((),) self.assertRaisesErrorWithMessage( ImproperlyConfigured, "'ValidationTestModelAdmin.fieldsets[0]' does not have exactly two elements.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): fieldsets = (("General", ()),) self.assertRaisesErrorWithMessage( ImproperlyConfigured, "'ValidationTestModelAdmin.fieldsets[0][1]' must be a dictionary.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): fieldsets = (("General", {}),) self.assertRaisesErrorWithMessage( 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.assertRaisesErrorWithMessage( 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.assertRaisesErrorWithMessage( ImproperlyConfigured, "Both fieldsets and fields are specified in ValidationTestModelAdmin.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): fieldsets = [(None, {'fields': ['name', 'name']})] self.assertRaisesErrorWithMessage( ImproperlyConfigured, "There are duplicate field(s) in ValidationTestModelAdmin.fieldsets", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): fields = ["name", "name"] self.assertRaisesErrorWithMessage( ImproperlyConfigured, "There are duplicate field(s) in ValidationTestModelAdmin.fields", validate, ValidationTestModelAdmin, ValidationTestModel, )
def test_fieldsets_validation(self): class ValidationTestModelAdmin(ModelAdmin): fieldsets = 10 six.assertRaisesRegex( self, ImproperlyConfigured, "'ValidationTestModelAdmin.fieldsets' must be a list or tuple.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): fieldsets = ({}, ) six.assertRaisesRegex( self, ImproperlyConfigured, "'ValidationTestModelAdmin.fieldsets\[0\]' must be a list or tuple.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): fieldsets = ((), ) six.assertRaisesRegex( self, ImproperlyConfigured, "'ValidationTestModelAdmin.fieldsets\[0\]' does not have exactly two elements.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): fieldsets = (("General", ()), ) six.assertRaisesRegex( self, ImproperlyConfigured, "'ValidationTestModelAdmin.fieldsets\[0\]\[1\]' must be a dictionary.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): fieldsets = (("General", {}), ) six.assertRaisesRegex( self, ImproperlyConfigured, "'fields' key is required in ValidationTestModelAdmin.fieldsets\[0\]\[1\] field options dict.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): fieldsets = (("General", {"fields": ("name", )}), ) validate(ValidationTestModelAdmin, ValidationTestModel) class ValidationTestModelAdmin(ModelAdmin): fieldsets = (("General", {"fields": ("name", )}), ) fields = [ "name", ] six.assertRaisesRegex( self, ImproperlyConfigured, "Both fieldsets and fields are specified in ValidationTestModelAdmin.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): fieldsets = [(None, {'fields': ['name', 'name']})] six.assertRaisesRegex( self, ImproperlyConfigured, "There are duplicate field\(s\) in ValidationTestModelAdmin.fieldsets", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): fields = ["name", "name"] six.assertRaisesRegex( self, ImproperlyConfigured, "There are duplicate field\(s\) in ValidationTestModelAdmin.fields", validate, ValidationTestModelAdmin, ValidationTestModel, )
def test_list_filter_validation(self): class ValidationTestModelAdmin(ModelAdmin): list_filter = 10 six.assertRaisesRegex( self, ImproperlyConfigured, "'ValidationTestModelAdmin.list_filter' must be a list or tuple.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): list_filter = ('non_existent_field', ) six.assertRaisesRegex( self, 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, ) six.assertRaisesRegex( self, 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), ) six.assertRaisesRegex( self, 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_queryset(self, cl, qs): return qs class ValidationTestModelAdmin(ModelAdmin): list_filter = (('is_active', AwesomeFilter), ) six.assertRaisesRegex( self, ImproperlyConfigured, "'ValidationTestModelAdmin.list_filter\[0\]\[1\]' is 'AwesomeFilter' which is not of type FieldListFilter.", validate, ValidationTestModelAdmin, ValidationTestModel, ) class ValidationTestModelAdmin(ModelAdmin): list_filter = (BooleanFieldListFilter, ) six.assertRaisesRegex( self, 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_readonly(self): class SongAdmin(admin.ModelAdmin): readonly_fields = ("title", ) validate(SongAdmin, Song)
def test_readonly_method_on_model(self): class SongAdmin(admin.ModelAdmin): readonly_fields = ("readonly_method_on_model", ) validate(SongAdmin, Song)
def test_readonly_lambda(self): class SongAdmin(admin.ModelAdmin): readonly_fields = (lambda obj: "test", ) validate(SongAdmin, Song)