Coverage for src/lexigram/admin/settings/settings.py: 33%

36 statements  

« prev     ^ index     » next       coverage.py v7.15.4, created at 2026-08-21 14:56 +0800

1from __future__ import annotations 

2 

3 

4class AdminSettings: 

5 """Settings helper.""" 

6 

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 } 

36 

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) 

42 

43 path = f"/admin/{name}" 

44 if action: 

45 path = f"{path}/{action}" 

46 return path 

47 

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 

53 

54 name = base_name.lower() 

55 

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 } 

83 

84 if name in irregular_plurals: 

85 return irregular_plurals[name] 

86 

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" 

102 

103 

104def get_admin_settings() -> AdminSettings: 

105 return AdminSettings()