teilchensammler/collector/views.py

61 lines
1.7 KiB
Python
Raw Permalink Normal View History

import structlog
2025-03-15 13:26:43 +01:00
from typing import Any
from django.db import transaction
from django.db.models import QuerySet
from django.http import HttpRequest, HttpResponse, HttpResponseRedirect
from django.urls import reverse
from django.views import generic
from django.views.decorators.http import require_http_methods
from .models import Teil
logger = structlog.get_logger(__name__)
2025-03-15 13:26:43 +01:00
DEFAULT_TEILE_NUMBER = 10
class TeileListView(generic.ListView):
template_name = "collector/index.html"
context_object_name = "teile_list"
def get_queryset(self) -> QuerySet:
return Teil.objects.order_by("-modified")
2025-03-15 13:26:43 +01:00
def get_context_data(self, **kwargs) -> dict[str, Any]:
context = super().get_context_data(**kwargs)
context["default_teile_number"] = DEFAULT_TEILE_NUMBER
return context
2025-03-15 13:26:43 +01:00
class IndexView(TeileListView):
def get_queryset(self) -> QuerySet:
return super().get_queryset()[:10]
class DetailView(generic.DetailView):
model = Teil
template_name = "collector/detail.html"
2025-03-15 13:26:43 +01:00
def get_context_data(self, **kwargs) -> dict[str, Any]:
context = super().get_context_data(**kwargs)
context["default_teile_number"] = DEFAULT_TEILE_NUMBER
return context
@require_http_methods(["POST"])
def enter(request: HttpRequest) -> HttpResponse:
try:
# if .create() failed, the transaction is rolled back and we are in a
# clean (database) state to handle exceptions
with transaction.atomic():
teil = Teil.objects.create(name=request.POST["new_name"])
except Exception:
logger.warning("Teil already existed")
else:
logger.info("New Teil entered", teil_id=teil.pk)
2025-03-15 13:26:43 +01:00
return HttpResponseRedirect(reverse("collector:list"))