Coverage for src / lexigram / admin / settings / settings.py: 17%
36 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-08-13 22:14 +0800
« prev ^ index » next coverage.py v7.13.5, created at 2026-08-13 22:14 +0800
1from __future__ import annotations
4class AdminSettings:
5 """Settings helper."""
7 _RESOURCE_MAPPINGS = {
8 "UserResource": "users",
9 "AuditLogResource": "audit_logs",
10 "PermissionResource": "permissions",
11 "RoleResource": "roles",
12 "SettingResource": "settings",
13 "GroupResource": "groups",
14 "OrganizationResource": "organizations",
15 "ApiKeyResource": "api_keys",
16 "WebhookResource": "webhooks",
17 "NotificationResource": "notifications",
18 "ReportResource": "reports",
19 "DashboardResource": "dashboards",
20 "LogResource": "logs",
21 "EventResource": "events",
22 "TaskResource": "tasks",
23 "JobResource": "jobs",
24 "QueueResource": "queues",
25 "MetricResource": "metrics",
26 "HealthResource": "health",
27 "StatusResource": "status",
28 "ConfigResource": "config",
29 "ProfileResource": "profiles",
30 "SessionResource": "sessions",
31 "TokenResource": "tokens",
32 "AuthResource": "auth",
33 "LoginResource": "login",
34 "LogoutResource": "logout",
35 }
37 def build_htmx_path(self, resource_name: str, action: str | None = None) -> str:
38 if resource_name in self._RESOURCE_MAPPINGS:
39 name = self._RESOURCE_MAPPINGS[resource_name]
40 else:
41 name = self._pluralize_resource_name(resource_name)
43 path = f"/admin/{name}"
44 if action:
45 path = f"{path}/{action}"
46 return path
48 def _pluralize_resource_name(self, resource_name: str) -> str:
49 if resource_name.endswith("Resource"):
50 base_name = resource_name[:-8]
51 else:
52 base_name = resource_name
54 name = base_name.lower()
56 irregular_plurals = {
57 "child": "children",
58 "person": "people",
59 "man": "men",
60 "woman": "women",
61 "tooth": "teeth",
62 "foot": "feet",
63 "mouse": "mice",
64 "goose": "geese",
65 "ox": "oxen",
66 "leaf": "leaves",
67 "knife": "knives",
68 "wife": "wives",
69 "life": "lives",
70 "elf": "elves",
71 "loaf": "loaves",
72 "potato": "potatoes",
73 "tomato": "tomatoes",
74 "hero": "heroes",
75 "memo": "memos",
76 "photo": "photos",
77 "piano": "pianos",
78 "halo": "halos",
79 "studio": "studios",
80 "video": "videos",
81 "zoo": "zoos",
82 }
84 if name in irregular_plurals:
85 return irregular_plurals[name]
87 if name.endswith("ies"):
88 return name
89 if name.endswith("es"):
90 return name
91 if name.endswith("s"):
92 return name
93 if name.endswith("y") and len(name) > 1 and name[-2] not in "aeiou":
94 return name[:-1] + "ies"
95 if name.endswith(("ch", "sh", "x", "z", "s")):
96 return name + "es"
97 if name.endswith("f") and len(name) > 1:
98 return name[:-1] + "ves"
99 if name.endswith("fe") and len(name) > 2:
100 return name[:-2] + "ves"
101 return name + "s"
104def get_admin_settings() -> AdminSettings:
105 return AdminSettings()