121 lines
3.7 KiB
Python
121 lines
3.7 KiB
Python
from django.contrib.auth.decorators import login_required
|
|
from django.http import HttpRequest, HttpResponse
|
|
from django.shortcuts import get_object_or_404, redirect
|
|
from django.urls import reverse
|
|
from django.utils.safestring import SafeText
|
|
|
|
from common.components import (
|
|
A,
|
|
AddForm,
|
|
Button,
|
|
Component,
|
|
CsrfInput,
|
|
Div,
|
|
paginated_table_content,
|
|
)
|
|
from common.layout import render_page
|
|
from common.time import dateformat, local_strftime
|
|
from common.utils import paginate
|
|
from games.forms import GameStatusChangeForm
|
|
from games.models import GameStatusChange
|
|
|
|
|
|
@login_required
|
|
def add_statuschange(request: HttpRequest) -> HttpResponse:
|
|
form = GameStatusChangeForm(request.POST or None)
|
|
if form.is_valid():
|
|
obj = form.save()
|
|
return redirect("games:view_game", game_id=obj.game.id)
|
|
return render_page(
|
|
request, AddForm(form, request=request), title="Add status change"
|
|
)
|
|
|
|
|
|
@login_required
|
|
def edit_statuschange(request: HttpRequest, statuschange_id: int) -> HttpResponse:
|
|
statuschange = get_object_or_404(GameStatusChange, id=statuschange_id)
|
|
form = GameStatusChangeForm(request.POST or None, instance=statuschange)
|
|
if form.is_valid():
|
|
saved = form.save()
|
|
return redirect("games:view_game", game_id=saved.game.id)
|
|
return render_page(
|
|
request, AddForm(form, request=request), title="Edit status change"
|
|
)
|
|
|
|
|
|
@login_required
|
|
def list_statuschanges(request: HttpRequest) -> HttpResponse:
|
|
statuschanges, page_obj, elided_page_range = paginate(
|
|
request, GameStatusChange.objects.select_related("game").all()
|
|
)
|
|
|
|
data = {
|
|
"header_action": None,
|
|
"columns": ["Game", "Old Status", "New Status", "Timestamp"],
|
|
"rows": [
|
|
[
|
|
sc.game.name,
|
|
sc.get_old_status_display() if sc.old_status else "-",
|
|
sc.get_new_status_display(),
|
|
local_strftime(sc.timestamp, dateformat) if sc.timestamp else "-",
|
|
]
|
|
for sc in statuschanges
|
|
],
|
|
}
|
|
content = paginated_table_content(
|
|
data,
|
|
page_obj=page_obj,
|
|
elided_page_range=elided_page_range,
|
|
request=request,
|
|
)
|
|
return render_page(request, content, title="Status changes")
|
|
|
|
|
|
def _delete_statuschange_content(statuschange, request: HttpRequest) -> SafeText:
|
|
inner = Div(
|
|
[],
|
|
[
|
|
Component(
|
|
tag_name="p",
|
|
children=["Are you sure you want to delete this status change?"],
|
|
),
|
|
Button(
|
|
[("class", "w-full")], "Delete", color="red", type="submit", size="lg"
|
|
),
|
|
A(
|
|
[("class", "")],
|
|
Button([("class", "w-full")], "Cancel", color="gray"),
|
|
href=reverse("games:view_game", args=[statuschange.game.id]),
|
|
),
|
|
],
|
|
)
|
|
form = Component(
|
|
tag_name="form",
|
|
attributes=[("method", "post"), ("class", "dark:text-white")],
|
|
children=[CsrfInput(request), inner],
|
|
)
|
|
return Div(
|
|
[
|
|
(
|
|
"class",
|
|
"2xl:max-w-(--breakpoint-2xl) xl:max-w-(--breakpoint-xl) "
|
|
"md:max-w-(--breakpoint-md) sm:max-w-(--breakpoint-sm) self-center",
|
|
)
|
|
],
|
|
[form],
|
|
)
|
|
|
|
|
|
@login_required
|
|
def delete_statuschange(request: HttpRequest, pk: int) -> HttpResponse:
|
|
statuschange = get_object_or_404(GameStatusChange, id=pk)
|
|
if request.method == "POST":
|
|
game_id = statuschange.game.id
|
|
statuschange.delete()
|
|
return redirect("games:view_game", game_id=game_id)
|
|
return render_page(
|
|
request,
|
|
_delete_statuschange_content(statuschange, request),
|
|
title="Delete status change",
|
|
)
|