urlpatterns.py 2.5 KB

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