Skip to content

Commit 2cbe3c6

Browse files
David Gravesdgravitate
David Graves
authored andcommitted
raise ImproperlyConfigured if basename already exists
1 parent 1ae812e commit 2cbe3c6

File tree

2 files changed

+30
-1
lines changed

2 files changed

+30
-1
lines changed

rest_framework/routers.py

+16-1
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,27 @@ def __init__(self):
5252
def register(self, prefix, viewset, basename=None):
5353
if basename is None:
5454
basename = self.get_default_basename(viewset)
55-
self.registry.append((prefix, viewset, basename))
55+
56+
if not self.basename_already_registered(basename):
57+
self.registry.append((prefix, viewset, basename))
5658

5759
# invalidate the urls cache
5860
if hasattr(self, '_urls'):
5961
del self._urls
6062

63+
def basename_already_registered(self, new_basename):
64+
"""
65+
If `basename` is already registered, raise an exception
66+
"""
67+
for route in self.registry:
68+
prefix, viewset, basename = route
69+
if new_basename == basename:
70+
msg = (f'Route with basename "{new_basename}" is already registered. '
71+
f'Please provide a unique basename for viewset "{viewset}"')
72+
raise ImproperlyConfigured(msg)
73+
74+
return False
75+
6176
def get_default_basename(self, viewset):
6277
"""
6378
If `basename` is not specified, attempt to automatically determine

tests/test_routers.py

+14
Original file line numberDiff line numberDiff line change
@@ -481,3 +481,17 @@ def test_basename(self):
481481
initkwargs = match.func.initkwargs
482482

483483
assert initkwargs['basename'] == 'routertestmodel'
484+
485+
486+
class TestDuplicateBasename(URLPatternsTestCase, TestCase):
487+
def test_exception_for_duplicate_basename(self):
488+
class NoteViewSet(viewsets.ModelViewSet):
489+
queryset = RouterTestModel.objects.all()
490+
491+
self.router = SimpleRouter(trailing_slash=False)
492+
self.router.register(r'notes', NoteViewSet)
493+
494+
with pytest.raises(ImproperlyConfigured):
495+
self.router.register(r'notes_duplicate', NoteViewSet)
496+
497+
self.router.register(r'notes_duplicate_2', NoteViewSet, basename='note_duplicate')

0 commit comments

Comments
 (0)