This commit is contained in:
2026-10-30 14:48:57 -04:00
parent 06cfb9367d
commit 0e342734a6
7 changed files with 118 additions and 29 deletions
+57
View File
@@ -7,6 +7,30 @@ from ldap3.core.exceptions import LDAPInvalidDnError
from ldap3.utils.dn import parse_dn
SERVICE_LINKS = {
"Discourse · community forums": {
"url": "https://discourse.eom.dev/",
"favicon": "https://discourse.eom.dev/uploads/default/optimized/1X/_129430568242d1b7f853bb13ebea28b3f6af4e7_2_32x32.png",
},
"Gitea · Git hosting": {
"url": "https://gitea.eom.dev/",
"favicon": "https://gitea.eom.dev/assets/img/favicon.svg",
},
"Matrix · community chat": {
"url": "https://element.eom.dev/",
"favicon": "https://element.eom.dev/vector-icons/144.5a63bf2.png",
},
"Mastodon · social networking": {
"url": "https://mastodon.eom.dev/",
"favicon": "https://mastodon.eom.dev/packs/assets/favicon-48x48-DMnduFKh.png",
},
"PeerTube · video sharing": {
"url": "https://peertube.eom.dev/",
"favicon": "https://peertube.eom.dev/client/assets/images/favicon.png",
},
}
def validate_service_groups(value, paid_levels):
if not isinstance(value, dict):
raise ImproperlyConfigured("Membership service groups must be an object mapping levels to lists of LDAP group DNs.")
@@ -51,6 +75,8 @@ def service_names(level, service_groups):
for dn in service_groups.get(str(level), []):
# Show only a group's common name, never its directory hierarchy.
common_name = next((value for attribute, value, _separator in parse_dn(dn) if attribute.casefold() == "cn"), "")
if common_name.casefold() == "dex users":
continue
if not common_name:
name = "Additional community service"
else:
@@ -61,3 +87,34 @@ def service_names(level, service_groups):
if name not in names:
names.append(name)
return names
def service_access_catalog(tiers, service_groups):
"""List each advertised service once, with the levels that include it."""
level_labels = {0: "Open Lab"}
level_labels.update({tier["level"]: tier["label"] for tier in tiers.values()})
levels = sorted(level_labels)
service_levels = {}
for level in levels:
for name in service_names(level, service_groups):
service_levels.setdefault(name, []).append(level)
catalog = []
for name, included_levels in service_levels.items():
if included_levels == levels:
access = "Every membership level"
else:
ranges = []
start = previous = included_levels[0]
for level in included_levels[1:]:
if level != previous + 1:
ranges.append((start, previous))
start = level
previous = level
ranges.append((start, previous))
access = ", ".join(
level_labels[first] if first == last else f"{level_labels[first]}–{level_labels[last]}"
for first, last in ranges
)
catalog.append({"name": name, "access": access, **SERVICE_LINKS.get(name, {})})
return catalog