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 @@
-
-
+
+ class="{{ class }} {% if color == "blue" %} bg-blue-700 dark:bg-blue-600 dark:focus:ring-blue-800 dark:hover:bg-blue-700 focus:ring-blue-300 hover:bg-blue-800 text-white {% elif color == "red" %} bg-red-700 dark:bg-red-600 dark:focus:ring-red-900 dark:hover:bg-red-700 focus:ring-red-300 hover:bg-red-800 text-white {% elif color == "gray" %} bg-white border-gray-200 dark:bg-gray-800 dark:border-gray-600 dark:focus:ring-gray-700 dark:hover:bg-gray-700 dark:hover:text-white dark:text-gray-400 focus:ring-gray-100 hover:bg-gray-100 hover:text-blue-700 text-gray-900 border {% elif color == "green" %} bg-green-700 dark:bg-green-600 dark:focus:ring-green-800 dark:hover:bg-green-700 focus:ring-green-300 hover:bg-green-800 text-white {% endif %} focus:outline-none focus:ring-4 font-medium mb-2 me-2 rounded-lg {% if size == "xs" %} px-3 py-2 text-xs {% elif size == "sm" %} px-3 py-2 text-sm {% elif size == "base" %} px-5 py-2.5 text-sm {% elif size == "lg" %} px-5 py-3 text-base {% elif size == "xl" %} px-6 py-3.5 text-base {% endif %} {% if icon %} inline-flex text-center items-center gap-2 {% else %} {% endif %} ">
{{ slot }}
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 %}
+
+
+
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 @@
{% for change in statuschanges %}
- {% if change.timestamp %}{{ change.timestamp | date:"d/m/Y H:i" }}: Changed{% else %}At some point changed{% endif %} status from {{ change.get_old_status_display }} to {{ change.get_new_status_display }}
+ {% if change.timestamp %}{{ change.timestamp | date:"d/m/Y H:i" }}: Changed{% else %}At some point changed{% endif %} status from {{ change.get_old_status_display }} to {{ change.get_new_status_display }} (Edit , Delete )
{% endfor %}
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})