68 lines
1.8 KiB
Python
68 lines
1.8 KiB
Python
from __future__ import annotations
|
|
|
|
from django.contrib.auth.decorators import login_required
|
|
from django.db.models import Q
|
|
from django.http import Http404
|
|
from django.shortcuts import render
|
|
from django.utils import timezone
|
|
|
|
from apps.access.models import AccessRequest
|
|
|
|
|
|
@login_required(login_url="/accounts/login/")
|
|
def dashboard(request):
|
|
now = timezone.now()
|
|
access_qs = (
|
|
AccessRequest.objects.select_related("server")
|
|
.filter(
|
|
requester=request.user,
|
|
status=AccessRequest.Status.APPROVED,
|
|
)
|
|
.filter(Q(expires_at__isnull=True) | Q(expires_at__gt=now))
|
|
.order_by("-requested_at")
|
|
)
|
|
|
|
seen = set()
|
|
servers = []
|
|
for access in access_qs:
|
|
if access.server_id in seen:
|
|
continue
|
|
seen.add(access.server_id)
|
|
servers.append(
|
|
{
|
|
"server": access.server,
|
|
"expires_at": access.expires_at,
|
|
"last_accessed": None,
|
|
}
|
|
)
|
|
|
|
context = {
|
|
"servers": servers,
|
|
}
|
|
return render(request, "servers/dashboard.html", context)
|
|
|
|
|
|
@login_required(login_url="/accounts/login/")
|
|
def detail(request, server_id: int):
|
|
now = timezone.now()
|
|
access = (
|
|
AccessRequest.objects.select_related("server")
|
|
.filter(
|
|
requester=request.user,
|
|
server_id=server_id,
|
|
status=AccessRequest.Status.APPROVED,
|
|
)
|
|
.filter(Q(expires_at__isnull=True) | Q(expires_at__gt=now))
|
|
.order_by("-requested_at")
|
|
.first()
|
|
)
|
|
if not access:
|
|
raise Http404("Server not found")
|
|
|
|
context = {
|
|
"server": access.server,
|
|
"expires_at": access.expires_at,
|
|
"last_accessed": None,
|
|
}
|
|
return render(request, "servers/detail.html", context)
|