Apply duck-typing for model-like classes within ChooserViewset

* allow any class to pass through resolve_model_string, not just models
* use BlanketPermissionPolicy if model_class is not a real model
pull/10862/head
Matt Westcott 2023-08-08 00:35:25 +01:00 zatwierdzone przez Matt Westcott
rodzic e40b0b1fd0
commit 2dcfdedc37
3 zmienionych plików z 5 dodań i 3 usunięć

Wyświetl plik

@ -9,6 +9,7 @@ from django.core.exceptions import (
PermissionDenied,
)
from django.core.paginator import InvalidPage, Paginator
from django.db.models import Model
from django.forms.models import modelform_factory
from django.http import Http404
from django.template.loader import render_to_string
@ -296,7 +297,7 @@ class CreationFormMixin(ModelLookupMixin, PreserveURLParametersMixin):
def get_permission_policy(self):
if self.permission_policy:
return self.permission_policy
elif self.model_class:
elif issubclass(self.model_class, Model):
return ModelPermissionPolicy(self.model_class)
else:
return BlanketPermissionPolicy(None)

Wyświetl plik

@ -82,7 +82,7 @@ def resolve_model_string(model_string, default_app=None):
return apps.get_model(app_label, model_name)
elif isinstance(model_string, type) and issubclass(model_string, Model):
elif isinstance(model_string, type):
return model_string
else:

Wyświetl plik

@ -520,7 +520,8 @@ class TestResolveModelString(TestCase):
self.assertRaises(ValueError, resolve_model_string, "Page")
def test_resolve_from_class_that_isnt_a_model(self):
self.assertRaises(ValueError, resolve_model_string, object)
model = resolve_model_string(object)
self.assertEqual(model, object)
def test_resolve_from_bad_type(self):
self.assertRaises(ValueError, resolve_model_string, resolve_model_string)