Coverage for /Users/davegaeddert/Development/dropseed/plain/plain-staff/plain/staff/views/registry.py: 38%
74 statements
« prev ^ index » next coverage.py v7.6.1, created at 2024-10-16 22:04 -0500
« prev ^ index » next coverage.py v7.6.1, created at 2024-10-16 22:04 -0500
1from plain.urls import path, reverse_lazy
4class StaffViewRegistry:
5 def __init__(self):
6 # View classes that will be added to the admin automatically
7 self.registered_views = set()
8 self.registered_dashboards = set()
10 def register_view(self, view=None):
11 def inner(view):
12 self.registered_views.add(view)
13 # TODO do this somewhere else...
14 # self.registered_views = set(self.registered_views, key=lambda v: v.title)
15 return view
17 if callable(view):
18 return inner(view)
19 else:
20 return inner
22 def register_dashboard(self, view=None):
23 def inner(view):
24 self.registered_dashboards.add(view)
25 return view
27 if callable(view):
28 return inner(view)
29 else:
30 return inner
32 def register_viewset(self, viewset=None):
33 def inner(viewset):
34 for view in viewset.get_views():
35 self.register_view(view)
36 return viewset
38 if callable(viewset):
39 return inner(viewset)
40 else:
41 return inner
43 def get_nav_sections(self):
44 # class NavItem:
45 # def __init__(self, view, children):
46 # self.view = view
47 # self.children = children
49 sections = {}
51 for view in self.registered_views:
52 section = view.get_nav_section()
53 if not section:
54 continue
55 if section not in sections:
56 sections[section] = []
57 sections[section].append(view)
59 # Sort each section by title
60 for section in sections.values():
61 section.sort(key=lambda v: v.get_title())
63 # Sort sections dictionary by key
64 sections = dict(sorted(sections.items()))
66 return sections
68 # root_nav_items = []
70 # for view in sorted_views:
71 # if view.parent_view_class:
72 # continue
73 # children = [x for x in sorted_views if x.parent_view_class == view]
74 # root_nav_items.append(NavItem(view, children))
76 # return root_nav_items
78 def get_urls(self):
79 urlpatterns = []
81 paths_seen = set()
83 def add_view_path(view, _path):
84 if _path in paths_seen:
85 raise ValueError(f"Path {_path} already registered")
86 paths_seen.add(_path)
87 if not _path.endswith("/"):
88 _path += "/"
89 urlpatterns.append(path(_path, view, name=view.view_name()))
91 for view in self.registered_views:
92 add_view_path(view, f"p/{view.get_path()}")
94 for view in self.registered_dashboards:
95 add_view_path(view, f"dashboards/{view.get_path()}")
97 return urlpatterns
99 def get_searchable_views(self):
100 views = [
101 view
102 for view in self.registered_views
103 if getattr(view, "allow_global_search", False)
104 ]
105 views.sort(key=lambda v: v.get_title())
106 return views
108 def get_model_detail_url(self, instance):
109 from plain.staff.views.base import URL_NAMESPACE
110 from plain.staff.views.models import StaffModelDetailView
112 if not instance.pk:
113 # Has to actually be in the db
114 return
116 for view in self.registered_views:
117 if not issubclass(view, StaffModelDetailView):
118 continue
120 if view.model == instance.__class__:
121 return reverse_lazy(
122 f"{URL_NAMESPACE}:{view.view_name()}",
123 kwargs={"pk": instance.pk},
124 )
127registry = StaffViewRegistry()
128register_view = registry.register_view
129register_dashboard = registry.register_dashboard
130register_viewset = registry.register_viewset
131get_model_detail_url = registry.get_model_detail_url