mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	[2.0.x] Fixed #28663 -- Add a check for likely incorrectly migrated django.urls.path() routes.
Backport of 998c9dd599 from master
			
			
This commit is contained in:
		| @@ -256,7 +256,16 @@ class RoutePattern(CheckURLMixin): | |||||||
|         return None |         return None | ||||||
|  |  | ||||||
|     def check(self): |     def check(self): | ||||||
|         return self._check_pattern_startswith_slash() |         warnings = self._check_pattern_startswith_slash() | ||||||
|  |         route = self._route | ||||||
|  |         if '(?P<' in route or route.startswith('^') or route.endswith('$'): | ||||||
|  |             warnings.append(Warning( | ||||||
|  |                 "Your URL pattern {} has a route that contains '(?P<', begins " | ||||||
|  |                 "with a '^', or ends with a '$'. This was likely an oversight " | ||||||
|  |                 "when migrating to django.urls.path().".format(self.describe()), | ||||||
|  |                 id='2_0.W001', | ||||||
|  |             )) | ||||||
|  |         return warnings | ||||||
|  |  | ||||||
|     def _compile(self, route): |     def _compile(self, route): | ||||||
|         return re.compile(_route_to_regex(route, self._is_endpoint)[0]) |         return re.compile(_route_to_regex(route, self._is_endpoint)[0]) | ||||||
|   | |||||||
| @@ -98,7 +98,9 @@ Backwards compatibility | |||||||
| Compatibility checks warn of potential problems that might occur after | Compatibility checks warn of potential problems that might occur after | ||||||
| upgrading Django. | upgrading Django. | ||||||
|  |  | ||||||
| Currently, there aren't any of these checks. | * **2_0.W001**: Your URL pattern ``<pattern>`` has a ``route`` that contains | ||||||
|  |   ``(?P<``, begins with a ``^``, or ends with a ``$``. This was likely an | ||||||
|  |   oversight when migrating from ``url()`` to :func:`~django.urls.path`. | ||||||
|  |  | ||||||
| Caches | Caches | ||||||
| ------ | ------ | ||||||
|   | |||||||
| @@ -135,6 +135,36 @@ class CheckUrlConfigTests(SimpleTestCase): | |||||||
|         self.assertEqual(result, []) |         self.assertEqual(result, []) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class UpdatedToPathTests(SimpleTestCase): | ||||||
|  |  | ||||||
|  |     @override_settings(ROOT_URLCONF='check_framework.urls.path_compatibility.contains_re_named_group') | ||||||
|  |     def test_contains_re_named_group(self): | ||||||
|  |         result = check_url_config(None) | ||||||
|  |         self.assertEqual(len(result), 1) | ||||||
|  |         warning = result[0] | ||||||
|  |         self.assertEqual(warning.id, '2_0.W001') | ||||||
|  |         expected_msg = "Your URL pattern '(?P<named-group>\\d+)' has a route" | ||||||
|  |         self.assertIn(expected_msg, warning.msg) | ||||||
|  |  | ||||||
|  |     @override_settings(ROOT_URLCONF='check_framework.urls.path_compatibility.beginning_with_caret') | ||||||
|  |     def test_beginning_with_caret(self): | ||||||
|  |         result = check_url_config(None) | ||||||
|  |         self.assertEqual(len(result), 1) | ||||||
|  |         warning = result[0] | ||||||
|  |         self.assertEqual(warning.id, '2_0.W001') | ||||||
|  |         expected_msg = "Your URL pattern '^beginning-with-caret' has a route" | ||||||
|  |         self.assertIn(expected_msg, warning.msg) | ||||||
|  |  | ||||||
|  |     @override_settings(ROOT_URLCONF='check_framework.urls.path_compatibility.ending_with_dollar') | ||||||
|  |     def test_ending_with_dollar(self): | ||||||
|  |         result = check_url_config(None) | ||||||
|  |         self.assertEqual(len(result), 1) | ||||||
|  |         warning = result[0] | ||||||
|  |         self.assertEqual(warning.id, '2_0.W001') | ||||||
|  |         expected_msg = "Your URL pattern 'ending-with-dollar$' has a route" | ||||||
|  |         self.assertIn(expected_msg, warning.msg) | ||||||
|  |  | ||||||
|  |  | ||||||
| class CheckURLSettingsTests(SimpleTestCase): | class CheckURLSettingsTests(SimpleTestCase): | ||||||
|  |  | ||||||
|     @override_settings(STATIC_URL='a/', MEDIA_URL='b/') |     @override_settings(STATIC_URL='a/', MEDIA_URL='b/') | ||||||
|   | |||||||
| @@ -0,0 +1,5 @@ | |||||||
|  | from django.urls import path | ||||||
|  |  | ||||||
|  | urlpatterns = [ | ||||||
|  |     path('^beginning-with-caret', lambda x: x), | ||||||
|  | ] | ||||||
| @@ -0,0 +1,5 @@ | |||||||
|  | from django.urls import path | ||||||
|  |  | ||||||
|  | urlpatterns = [ | ||||||
|  |     path('(?P<named-group>\d+)', lambda x: x), | ||||||
|  | ] | ||||||
| @@ -0,0 +1,5 @@ | |||||||
|  | from django.urls import path | ||||||
|  |  | ||||||
|  | urlpatterns = [ | ||||||
|  |     path('ending-with-dollar$', lambda x: x), | ||||||
|  | ] | ||||||
		Reference in New Issue
	
	Block a user