Members
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user