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 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,
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
<c-vars color="blue" size="base" />
|
||||
<button type="button"
|
||||
<c-vars color="blue" size="base" type="button" />
|
||||
<button type="{{ type }}"
|
||||
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 }}
|
||||
</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">
|
||||
{% for change in statuschanges %}
|
||||
<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 %}
|
||||
</ul>
|
||||
</div>
|
||||
|
@ -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/<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/<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