Code

Ticket #19556: url_loader.diff

File url_loader.diff, 1.8 KB (added by mcanix@…, 19 months ago)

Patch to include all urls.py from a namespace package

Line 
1diff --git a/django/conf/urls/__init__.py b/django/conf/urls/__init__.py
2index 04fb1df..e88c8b6 100644
3--- a/django/conf/urls/__init__.py
4+++ b/django/conf/urls/__init__.py
5@@ -4,6 +4,8 @@ from django.core.exceptions import ImproperlyConfigured
6 from django.utils.importlib import import_module
7 from django.utils import six
8 
9+import imp
10+
11 
12 __all__ = ['handler403', 'handler404', 'handler500', 'include', 'patterns', 'url']
13 
14@@ -22,7 +24,26 @@ def include(arg, namespace=None, app_name=None):
15         urlconf_module = arg
16 
17     if isinstance(urlconf_module, six.string_types):
18-        urlconf_module = import_module(urlconf_module)
19+        # Attempt to search the namespace packages for all URL modules and append the urlpatterns to the last module found
20+        if namespace:
21+            try:
22+               ns_module = import_module(namespace)
23+                package_list = ns_module.__path__
24+               
25+                urlpatterns = []
26+
27+               for path in package_list:
28+                   # Search the path for the module name, unpack the find_module tuple and load said module
29+                   tmp_module = imp.load_module(arg, *imp.find_module(arg, [path]))
30+                    urlconf_module = tmp_module
31+                                                                                                                                                                                      urlpatterns += tmp_module.urlpatterns   
32+                                                                                                                                                                               
33+                 urlconf_module.urlpatterns = urlpatterns                           
34+             except Exception as ex:
35+                 raise ImproperlyConfigured('Cannot import namespace for a dynamic url configuration: %s' % (ex))
36+        else:
37+            urlconf_module = import_module(urlconf_module)
38+
39     patterns = getattr(urlconf_module, 'urlpatterns', urlconf_module)
40 
41     # Make sure we can iterate through the patterns (without this, some