2026-08-12 01:30:05 +02:00
|
|
|
from django.contrib.auth.decorators import login_required
|
|
|
|
|
from django.http import HttpRequest, HttpResponse, HttpResponseForbidden, HttpResponseNotFound
|
|
|
|
|
from django.shortcuts import render
|
|
|
|
|
|
|
|
|
|
from coulomb_social.apps.core.principal import build_principal
|
|
|
|
|
|
2026-08-12 01:56:30 +02:00
|
|
|
from .content import load_space_page
|
2026-08-12 01:30:05 +02:00
|
|
|
from .services import get_space_for_member, spaces_for_member
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
|
def space_detail(request: HttpRequest, slug: str) -> HttpResponse:
|
|
|
|
|
principal = build_principal(request, authz_resource_id="space_detail")
|
|
|
|
|
if not principal["authz_allow"]:
|
|
|
|
|
return HttpResponseForbidden(
|
|
|
|
|
f"Not authorized to view spaces ({principal['authz_reason']})."
|
|
|
|
|
)
|
|
|
|
|
member = principal.get("member")
|
|
|
|
|
space = get_space_for_member(member, slug)
|
|
|
|
|
if space is None:
|
|
|
|
|
return HttpResponseNotFound("Space not found.")
|
2026-08-12 01:56:30 +02:00
|
|
|
|
|
|
|
|
page = request.GET.get("page") or "index"
|
|
|
|
|
rendered = load_space_page(space, page)
|
2026-08-12 01:30:05 +02:00
|
|
|
return render(
|
|
|
|
|
request,
|
|
|
|
|
"spaces/detail.html",
|
|
|
|
|
{
|
|
|
|
|
"principal": principal,
|
|
|
|
|
"display_name": principal["display_name"],
|
|
|
|
|
"space": space,
|
2026-08-12 01:56:30 +02:00
|
|
|
"page": rendered,
|
2026-08-12 01:30:05 +02:00
|
|
|
},
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def list_spaces_context(member) -> dict:
|
|
|
|
|
return {"spaces": list(spaces_for_member(member))}
|