Make it possible to edit and delete status changes
This commit is contained in:
parent
89de85c00d
commit
23b4a7a069
@ -2,7 +2,15 @@ from django import forms
|
|||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
|
|
||||||
from common.utils import safe_getattr
|
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_date_widget = forms.DateInput(attrs={"type": "date"})
|
||||||
custom_datetime_widget = forms.DateTimeInput(
|
custom_datetime_widget = forms.DateTimeInput(
|
||||||
@ -212,3 +220,17 @@ class PlayEventForm(forms.ModelForm):
|
|||||||
"started": custom_date_widget,
|
"started": custom_date_widget,
|
||||||
"ended": 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,
|
||||||
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<c-vars color="blue" size="base" />
|
<c-vars color="blue" size="base" type="button" />
|
||||||
<button type="button"
|
<button type="{{ type }}"
|
||||||
title="{{ title }}"
|
title="{{ title }}"
|
||||||
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 %} ">
|
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 }}
|
{{ slot }}
|
||||||
</button>
|
</button>
|
||||||
|
16
games/templates/gamestatuschange_confirm_delete.html
Normal file
16
games/templates/gamestatuschange_confirm_delete.html
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
<c-layouts.base>
|
||||||
|
{% load static %}
|
||||||
|
<div class="2xl:max-w-screen-2xl xl:max-w-screen-xl md:max-w-screen-md sm:max-w-screen-sm self-center">
|
||||||
|
<form method="post" class="dark:text-white">
|
||||||
|
{% csrf_token %}
|
||||||
|
<div>
|
||||||
|
<p>Are you sure you want to delete this status change?</p>
|
||||||
|
<c-button color="red" type="submit" size="lg" class="w-full">Delete</c-button>
|
||||||
|
<a href="{% url 'view_game' object.game.id %}" class="">
|
||||||
|
<c-button color="gray" class="w-full">Cancel</c-button>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</c-layouts.base>
|
||||||
|
|
7
games/templates/gamestatuschange_list.html
Normal file
7
games/templates/gamestatuschange_list.html
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<c-layouts.base>
|
||||||
|
{% load static %}
|
||||||
|
<div class="2xl:max-w-screen-2xl xl:max-w-screen-xl md:max-w-screen-md sm:max-w-screen-sm self-center">
|
||||||
|
<c-simple-table :columns=["Test"] :rows=data.rows :page_obj=page_obj :elided_page_range=elided_page_range :header_action=data.header_action />
|
||||||
|
</div>
|
||||||
|
</c-layouts.base>
|
||||||
|
|
@ -159,7 +159,7 @@
|
|||||||
<ul class="list-disc list-inside">
|
<ul class="list-disc list-inside">
|
||||||
{% for change in statuschanges %}
|
{% for change in statuschanges %}
|
||||||
<li class="text-slate-500">
|
<li class="text-slate-500">
|
||||||
{% if change.timestamp %}{{ change.timestamp | date:"d/m/Y H:i" }}: Changed{% else %}At some point changed{% endif %} status from <c-gamestatus :status="change.old_status" class="text-white">{{ change.get_old_status_display }}</c-gamestatus> to <c-gamestatus :status="change.new_status" class="text-white">{{ change.get_new_status_display }}</c-gamestatus></li>
|
{% if change.timestamp %}{{ change.timestamp | date:"d/m/Y H:i" }}: Changed{% else %}At some point changed{% endif %} status from <c-gamestatus :status="change.old_status" class="text-white">{{ change.get_old_status_display }}</c-gamestatus> to <c-gamestatus :status="change.new_status" class="text-white">{{ change.get_new_status_display }}</c-gamestatus> (<a href="{% url 'edit_statuschange' change.id %}">Edit</a>, <a href="{% url 'delete_statuschange' change.id %}">Delete</a>)</li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,7 +1,16 @@
|
|||||||
from django.urls import path
|
from django.urls import path
|
||||||
|
|
||||||
from games.api import api
|
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 = [
|
urlpatterns = [
|
||||||
path("", general.index, name="index"),
|
path("", general.index, name="index"),
|
||||||
@ -127,6 +136,26 @@ urlpatterns = [
|
|||||||
),
|
),
|
||||||
path("session/list", session.list_sessions, name="list_sessions"),
|
path("session/list", session.list_sessions, name="list_sessions"),
|
||||||
path("session/search", session.search_sessions, name="search_sessions"),
|
path("session/search", session.search_sessions, name="search_sessions"),
|
||||||
|
path(
|
||||||
|
"statuschange/add",
|
||||||
|
statuschange.AddStatusChangeView.as_view(),
|
||||||
|
name="add_statuschange",
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"statuschange/edit/<int:statuschange_id>",
|
||||||
|
statuschange.EditStatusChangeView.as_view(),
|
||||||
|
name="edit_statuschange",
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"statuschange/delete/<int:pk>",
|
||||||
|
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/", general.stats_alltime, name="stats_alltime"),
|
||||||
path(
|
path(
|
||||||
"stats/<int:year>",
|
"stats/<int:year>",
|
||||||
|
57
games/views/statuschange.py
Normal file
57
games/views/statuschange.py
Normal file
@ -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})
|
Loading…
x
Reference in New Issue
Block a user