urlpatterns.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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 subpatterns(self, namespace):
  19. prefix = '%s:' % namespace if namespace else ''
  20. urlpatterns = self.namespace_patterns.get(namespace, [])
  21. for subspace in self._namespaces:
  22. if subspace['parent'] == namespace:
  23. subspace_name = prefix + subspace['namespace']
  24. namespace_patterns = self.subpatterns(subspace_name)
  25. included = include(namespace_patterns,
  26. namespace=subspace['namespace'])
  27. urlpatterns += patterns('',
  28. url(subspace['path'], included)
  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_urlpatterns(self):
  39. self.sum_registered_patters()
  40. urlpatterns = []
  41. for namespace in self._namespaces:
  42. if not namespace['parent']:
  43. namespace_patterns = self.subpatterns(namespace['namespace'])
  44. included = include(namespace_patterns,
  45. namespace=namespace['namespace'])
  46. urlpatterns += patterns('',
  47. url(namespace['path'], included)
  48. )
  49. return urlpatterns
  50. def __call__(self):
  51. try:
  52. return self._urlpatterns
  53. except AttributeError:
  54. self._urlpatterns = self.build_urlpatterns()
  55. self._namespaces = []
  56. self._patterns = []
  57. return self._urlpatterns