File tree 2 files changed +30
-1
lines changed
2 files changed +30
-1
lines changed Original file line number Diff line number Diff line change @@ -52,12 +52,27 @@ def __init__(self):
52
52
def register (self , prefix , viewset , basename = None ):
53
53
if basename is None :
54
54
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 ))
56
58
57
59
# invalidate the urls cache
58
60
if hasattr (self , '_urls' ):
59
61
del self ._urls
60
62
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
+
61
76
def get_default_basename (self , viewset ):
62
77
"""
63
78
If `basename` is not specified, attempt to automatically determine
Original file line number Diff line number Diff line change @@ -481,3 +481,17 @@ def test_basename(self):
481
481
initkwargs = match .func .initkwargs
482
482
483
483
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' )
You can’t perform that action at this time.
0 commit comments