raise ImproperlyConfigured if basename already exists

This commit is contained in:
David Graves 2022-03-30 23:31:10 -05:00 committed by David Graves
parent 1ae812ea20
commit 2cbe3c61be
2 changed files with 30 additions and 1 deletions

View File

@ -52,12 +52,27 @@ class BaseRouter:
def register(self, prefix, viewset, basename=None):
if basename is None:
basename = self.get_default_basename(viewset)
self.registry.append((prefix, viewset, basename))
if not self.basename_already_registered(basename):
self.registry.append((prefix, viewset, basename))
# invalidate the urls cache
if hasattr(self, '_urls'):
del self._urls
def basename_already_registered(self, new_basename):
"""
If `basename` is already registered, raise an exception
"""
for route in self.registry:
prefix, viewset, basename = route
if new_basename == basename:
msg = (f'Route with basename "{new_basename}" is already registered. '
f'Please provide a unique basename for viewset "{viewset}"')
raise ImproperlyConfigured(msg)
return False
def get_default_basename(self, viewset):
"""
If `basename` is not specified, attempt to automatically determine

View File

@ -481,3 +481,17 @@ class TestViewInitkwargs(URLPatternsTestCase, TestCase):
initkwargs = match.func.initkwargs
assert initkwargs['basename'] == 'routertestmodel'
class TestDuplicateBasename(URLPatternsTestCase, TestCase):
def test_exception_for_duplicate_basename(self):
class NoteViewSet(viewsets.ModelViewSet):
queryset = RouterTestModel.objects.all()
self.router = SimpleRouter(trailing_slash=False)
self.router.register(r'notes', NoteViewSet)
with pytest.raises(ImproperlyConfigured):
self.router.register(r'notes_duplicate', NoteViewSet)
self.router.register(r'notes_duplicate_2', NoteViewSet, basename='note_duplicate')