From 23b4a7a06909b1a393aa8dabf6cf9d7415f17277 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Kucharczyk?= Date: Sat, 22 Mar 2025 23:45:02 +0100 Subject: [PATCH] Make it possible to edit and delete status changes --- games/forms.py | 24 +++++++- games/templates/cotton/button.html | 6 +- .../gamestatuschange_confirm_delete.html | 16 ++++++ games/templates/gamestatuschange_list.html | 7 +++ games/templates/view_game.html | 2 +- games/urls.py | 31 +++++++++- games/views/statuschange.py | 57 +++++++++++++++++++ 7 files changed, 137 insertions(+), 6 deletions(-) create mode 100644 games/templates/gamestatuschange_confirm_delete.html create mode 100644 games/templates/gamestatuschange_list.html create mode 100644 games/views/statuschange.py diff --git a/games/forms.py b/games/forms.py index 6f16bd2..f718466 100644 --- a/games/forms.py +++ b/games/forms.py @@ -2,7 +2,15 @@ from django import forms from django.urls import reverse from common.utils import safe_getattr -from games.models import Device, Game, Platform, PlayEvent, Purchase, Session +from games.models import ( + Device, + Game, + GameStatusChange, + Platform, + PlayEvent, + Purchase, + Session, +) custom_date_widget = forms.DateInput(attrs={"type": "date"}) custom_datetime_widget = forms.DateTimeInput( @@ -212,3 +220,17 @@ class PlayEventForm(forms.ModelForm): "started": custom_date_widget, "ended": custom_date_widget, } + + +class GameStatusChangeForm(forms.ModelForm): + class Meta: + model = GameStatusChange + fields = [ + "game", + "old_status", + "new_status", + "timestamp", + ] + widgets = { + "timestamp": custom_datetime_widget, + } diff --git a/games/templates/cotton/button.html b/games/templates/cotton/button.html index 22131de..74977f7 100644 --- a/games/templates/cotton/button.html +++ b/games/templates/cotton/button.html @@ -1,6 +1,6 @@ - - diff --git a/games/templates/gamestatuschange_confirm_delete.html b/games/templates/gamestatuschange_confirm_delete.html new file mode 100644 index 0000000..2470369 --- /dev/null +++ b/games/templates/gamestatuschange_confirm_delete.html @@ -0,0 +1,16 @@ + + {% load static %} +
+
+ {% csrf_token %} +
+

Are you sure you want to delete this status change?

+ Delete + + Cancel + +
+
+
+
+ diff --git a/games/templates/gamestatuschange_list.html b/games/templates/gamestatuschange_list.html new file mode 100644 index 0000000..27c5c7d --- /dev/null +++ b/games/templates/gamestatuschange_list.html @@ -0,0 +1,7 @@ + + {% load static %} +
+ +
+
+ \ No newline at end of file diff --git a/games/templates/view_game.html b/games/templates/view_game.html index b54a4e3..52ca8f0 100644 --- a/games/templates/view_game.html +++ b/games/templates/view_game.html @@ -159,7 +159,7 @@ diff --git a/games/urls.py b/games/urls.py index 0781d02..84a472e 100644 --- a/games/urls.py +++ b/games/urls.py @@ -1,7 +1,16 @@ from django.urls import path from games.api import api -from games.views import device, game, general, platform, playevent, purchase, session +from games.views import ( + device, + game, + general, + platform, + playevent, + purchase, + session, + statuschange, +) urlpatterns = [ path("", general.index, name="index"), @@ -127,6 +136,26 @@ urlpatterns = [ ), path("session/list", session.list_sessions, name="list_sessions"), path("session/search", session.search_sessions, name="search_sessions"), + path( + "statuschange/add", + statuschange.AddStatusChangeView.as_view(), + name="add_statuschange", + ), + path( + "statuschange/edit/", + statuschange.EditStatusChangeView.as_view(), + name="edit_statuschange", + ), + path( + "statuschange/delete/", + statuschange.GameStatusChangeDeleteView.as_view(), + name="delete_statuschange", + ), + path( + "statuschange/list", + statuschange.GameStatusChangeListView.as_view(), + name="list_statuschanges", + ), path("stats/", general.stats_alltime, name="stats_alltime"), path( "stats/", diff --git a/games/views/statuschange.py b/games/views/statuschange.py new file mode 100644 index 0000000..c281f91 --- /dev/null +++ b/games/views/statuschange.py @@ -0,0 +1,57 @@ +from django.contrib.auth.mixins import LoginRequiredMixin +from django.shortcuts import get_object_or_404 +from django.urls import reverse_lazy +from django.views.generic import CreateView, DeleteView, ListView, UpdateView + +from games.forms import GameStatusChangeForm +from games.models import GameStatusChange + + +class EditStatusChangeView(LoginRequiredMixin, UpdateView): + model = GameStatusChange + form_class = GameStatusChangeForm + template_name = "add.html" + context_object_name = "form" + + def get_object(self, queryset=None): + return get_object_or_404(GameStatusChange, id=self.kwargs["statuschange_id"]) + + def get_success_url(self): + return reverse_lazy("list_platforms") + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context["title"] = "Edit Platform" + return context + + +class AddStatusChangeView(LoginRequiredMixin, CreateView): + model = GameStatusChange + form_class = GameStatusChangeForm + template_name = "add.html" + + def get_success_url(self): + return reverse_lazy("view_game", kwargs={"pk": self.object.game.id}) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context["title"] = "Add status change" + return context + + +class GameStatusChangeListView(LoginRequiredMixin, ListView): + model = GameStatusChange + template_name = "list_purchases.html" + context_object_name = "status_changes" + paginate_by = 10 + + def get_queryset(self): + return GameStatusChange.objects.select_related("game").all() + + +class GameStatusChangeDeleteView(LoginRequiredMixin, DeleteView): + model = GameStatusChange + template_name = "gamestatuschange_confirm_delete.html" + + def get_success_url(self): + return reverse_lazy("view_game", kwargs={"game_id": self.object.game.id})