diff options
| author | Tom Christie | 2014-01-13 07:34:58 -0800 |
|---|---|---|
| committer | Tom Christie | 2014-01-13 07:34:58 -0800 |
| commit | 4ab97843e8ebdb037110e09d9e2a7cd45e61a406 (patch) | |
| tree | 937cf83b484a45794b7f942fb6a1c9a78f46f669 /rest_framework | |
| parent | a90796c0f0d9db1a7d9bfaca8fbdfed22435c628 (diff) | |
| parent | 899381575a6038f550a064261ed5c6ba0655211b (diff) | |
| download | django-rest-framework-4ab97843e8ebdb037110e09d9e2a7cd45e61a406.tar.bz2 | |
Merge pull request #1333 from bodylabs/2.4.0+lookup_regex
Let viewsets specify their regex
Diffstat (limited to 'rest_framework')
| -rw-r--r-- | rest_framework/routers.py | 17 | ||||
| -rw-r--r-- | rest_framework/tests/test_routers.py | 23 |
2 files changed, 33 insertions, 7 deletions
diff --git a/rest_framework/routers.py b/rest_framework/routers.py index 740d58f0..df1233fd 100644 --- a/rest_framework/routers.py +++ b/rest_framework/routers.py @@ -219,13 +219,18 @@ class SimpleRouter(BaseRouter): https://github.com/alanjds/drf-nested-routers """ - if self.trailing_slash: - base_regex = '(?P<{lookup_prefix}{lookup_field}>[^/]+)' - else: - # Don't consume `.json` style suffixes - base_regex = '(?P<{lookup_prefix}{lookup_field}>[^/.]+)' + base_regex = '(?P<{lookup_prefix}{lookup_field}>{lookup_value})' lookup_field = getattr(viewset, 'lookup_field', 'pk') - return base_regex.format(lookup_field=lookup_field, lookup_prefix=lookup_prefix) + try: + lookup_value = viewset.lookup_value_regex + except AttributeError: + # Don't consume `.json` style suffixes + lookup_value = '[^/.]+' + return base_regex.format( + lookup_prefix=lookup_prefix, + lookup_field=lookup_field, + lookup_value=lookup_value + ) def get_urls(self): """ diff --git a/rest_framework/tests/test_routers.py b/rest_framework/tests/test_routers.py index 1c34648f..e41da57f 100644 --- a/rest_framework/tests/test_routers.py +++ b/rest_framework/tests/test_routers.py @@ -121,6 +121,27 @@ class TestCustomLookupFields(TestCase): ) +class TestLookupValueRegex(TestCase): + """ + Ensure the router honors lookup_value_regex when applied + to the viewset. + """ + def setUp(self): + class NoteViewSet(viewsets.ModelViewSet): + queryset = RouterTestModel.objects.all() + lookup_field = 'uuid' + lookup_value_regex = '[0-9a-f]{32}' + + self.router = SimpleRouter() + self.router.register(r'notes', NoteViewSet) + self.urls = self.router.urls + + def test_urls_limited_by_lookup_value_regex(self): + expected = ['^notes/$', '^notes/(?P<uuid>[0-9a-f]{32})/$'] + for idx in range(len(expected)): + self.assertEqual(expected[idx], self.urls[idx].regex.pattern) + + class TestTrailingSlashIncluded(TestCase): def setUp(self): class NoteViewSet(viewsets.ModelViewSet): @@ -131,7 +152,7 @@ class TestTrailingSlashIncluded(TestCase): self.urls = self.router.urls def test_urls_have_trailing_slash_by_default(self): - expected = ['^notes/$', '^notes/(?P<pk>[^/]+)/$'] + expected = ['^notes/$', '^notes/(?P<pk>[^/.]+)/$'] for idx in range(len(expected)): self.assertEqual(expected[idx], self.urls[idx].regex.pattern) |
