"""The views of the users app."""
from __future__ import annotations
from typing import TYPE_CHECKING
from django.http import Http404
from django.shortcuts import render
from django.views.decorators.cache import cache_control
from MangAdventure.jsonld import breadcrumbs
from .models import Group
if TYPE_CHECKING: # pragma: no cover
from django.http import HttpRequest, HttpResponse
[docs]@cache_control(public=True, max_age=7200)
def all_groups(request: HttpRequest) -> HttpResponse:
"""
View that serves a page with all the groups.
:param request: The original request.
:return: A response with the rendered ``all_groups.html`` template.
"""
uri = request.build_absolute_uri(request.path)
crumbs = breadcrumbs([('Groups', uri)])
groups = Group.objects.defer('manager')
return render(request, 'all_groups.html', {
'groups': list(groups),
'breadcrumbs': crumbs
})
[docs]@cache_control(public=True, max_age=7200)
def group(request: HttpRequest, g_id: int) -> HttpResponse:
"""
View that serves a single group's page.
:param request: The original request.
:param g_id: The ID of the group.
:return: A response with the rendered ``group.html`` template.
:raises Http404: If the group does not exist.
"""
if g_id == 0:
raise Http404('Group ID cannot be 0')
try:
_group = Group.objects.get(id=g_id)
except Group.DoesNotExist as e:
raise Http404 from e
members = _group.members \
.prefetch_related('roles') \
.order_by('name').distinct()
url = request.path
p_url = url.rsplit('/', 2)[0] + '/'
crumbs = breadcrumbs([
('Groups', request.build_absolute_uri(p_url)),
(_group.name, request.build_absolute_uri(url))
])
return render(request, 'group.html', {
'group': _group,
'members': list(members),
'breadcrumbs': crumbs
})
__all__ = ['all_groups', 'group']