urlpatterns.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. from django.conf.urls import include, url
  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, "parent": parent, "namespace": namespace}
  9. )
  10. def patterns(self, namespace, *new_patterns):
  11. self._patterns.append({"namespace": namespace, "urlpatterns": new_patterns})
  12. def get_child_patterns(self, parent):
  13. prefix = "%s:" % parent if parent else ""
  14. namespace_urlpatterns = self.namespace_patterns.get(parent, [])
  15. for namespace in self._namespaces:
  16. if namespace["parent"] == parent:
  17. prefixed_namespace = prefix + namespace["namespace"]
  18. child_patterns = self.get_child_patterns(prefixed_namespace)
  19. included_patterns = include(
  20. (child_patterns, namespace["namespace"]),
  21. namespace=namespace["namespace"],
  22. )
  23. namespace_urlpatterns.append(url(namespace["path"], included_patterns))
  24. return namespace_urlpatterns
  25. def sum_registered_patters(self):
  26. all_patterns = {}
  27. for urls in self._patterns:
  28. namespace = urls["namespace"]
  29. added_patterns = urls["urlpatterns"]
  30. all_patterns.setdefault(namespace, []).extend(added_patterns)
  31. self.namespace_patterns = all_patterns
  32. def build_root_urlpatterns(self):
  33. root_urlpatterns = []
  34. for namespace in self._namespaces:
  35. if not namespace["parent"]:
  36. child_patterns = self.get_child_patterns(namespace["namespace"])
  37. included_patterns = include(
  38. (child_patterns, namespace["namespace"]),
  39. namespace=namespace["namespace"],
  40. )
  41. root_urlpatterns.append(url(namespace["path"], included_patterns))
  42. return root_urlpatterns
  43. def build_urlpatterns(self):
  44. self.sum_registered_patters()
  45. return self.build_root_urlpatterns()
  46. def __call__(self):
  47. try:
  48. return self._urlpatterns
  49. except AttributeError:
  50. self._urlpatterns = self.build_urlpatterns()
  51. self._namespaces = []
  52. self._patterns = []
  53. return self._urlpatterns
  54. urlpatterns = URLPatterns()