urlpatterns.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. from django.conf.urls import patterns, url, include
  2. class URLPatterns(object):
  3. def __init__(self):
  4. self._namespaces = []
  5. self._patterns = []
  6. def namespace(self, path, namespace, parent=None):
  7. self._namespaces.append({
  8. 'path': path,
  9. 'parent': parent,
  10. 'namespace': namespace,
  11. })
  12. def patterns(self, namespace, *urlpatterns):
  13. self._patterns.append({
  14. 'namespace': namespace,
  15. 'urlpatterns': patterns('', *urlpatterns),
  16. })
  17. def get_child_patterns(self, parent):
  18. prefix = '%s:' % parent if parent else ''
  19. namespace_urlpatterns = self.namespace_patterns.get(parent, [])
  20. for namespace in self._namespaces:
  21. if namespace['parent'] == parent:
  22. prefixed_namespace = prefix + namespace['namespace']
  23. urlpatterns = self.get_child_patterns(prefixed_namespace)
  24. included_patterns = include(urlpatterns,
  25. namespace=namespace['namespace'])
  26. namespace_urlpatterns += patterns('',
  27. url(namespace['path'], included_patterns)
  28. )
  29. return namespace_urlpatterns
  30. def sum_registered_patters(self):
  31. all_patterns = {}
  32. for urls in self._patterns:
  33. namespace = urls['namespace']
  34. urlpatterns = urls['urlpatterns']
  35. all_patterns.setdefault(namespace, []).extend(urlpatterns)
  36. self.namespace_patterns = all_patterns
  37. def build_root_urlpatterns(self):
  38. root_urlpatterns = []
  39. for namespace in self._namespaces:
  40. if not namespace['parent']:
  41. urlpatterns = self.get_child_patterns(namespace['namespace'])
  42. included_patterns = include(urlpatterns,
  43. namespace=namespace['namespace'])
  44. root_urlpatterns += patterns('',
  45. url(namespace['path'], included_patterns)
  46. )
  47. return root_urlpatterns
  48. def build_urlpatterns(self):
  49. self.sum_registered_patters()
  50. return self.build_root_urlpatterns()
  51. def __call__(self):
  52. try:
  53. return self._urlpatterns
  54. except AttributeError:
  55. self._urlpatterns = self.build_urlpatterns()
  56. self._namespaces = []
  57. self._patterns = []
  58. return self._urlpatterns
  59. urlpatterns = URLPatterns()