urlpatterns.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. from django.urls import include, path
  2. class URLPatterns:
  3. def __init__(self):
  4. self.namespace_patterns = None
  5. self._namespaces = []
  6. self._patterns = []
  7. self._urlpatterns = None
  8. def namespace(self, url_path, namespace, parent=None):
  9. self._namespaces.append(
  10. {"path": url_path, "parent": parent, "namespace": namespace}
  11. )
  12. def patterns(self, namespace, *new_patterns):
  13. self._patterns.append({"namespace": namespace, "urlpatterns": new_patterns})
  14. def single_pattern(self, url_path, namespace, parent, view):
  15. self.namespace(url_path, namespace, parent)
  16. self.patterns(":".join((parent, namespace)), path("", view, name="index"))
  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. child_patterns = self.get_child_patterns(prefixed_namespace)
  24. included_patterns = include(
  25. (child_patterns, namespace["namespace"]),
  26. namespace=namespace["namespace"],
  27. )
  28. namespace_urlpatterns.append(path(namespace["path"], included_patterns))
  29. return namespace_urlpatterns
  30. def sum_registered_patters(self):
  31. all_patterns = {}
  32. for urls in self._patterns:
  33. namespace = urls["namespace"]
  34. added_patterns = urls["urlpatterns"]
  35. all_patterns.setdefault(namespace, []).extend(added_patterns)
  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. child_patterns = self.get_child_patterns(namespace["namespace"])
  42. included_patterns = include(
  43. (child_patterns, namespace["namespace"]),
  44. namespace=namespace["namespace"],
  45. )
  46. root_urlpatterns.append(path(namespace["path"], included_patterns))
  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. if self._urlpatterns:
  53. return self._urlpatterns
  54. self._urlpatterns = self.build_urlpatterns()
  55. self._namespaces = []
  56. self._patterns = []
  57. return self._urlpatterns
  58. urlpatterns = URLPatterns()