89 lines
2.3 KiB
Python
89 lines
2.3 KiB
Python
from typing import Any, Optional
|
|
|
|
from django.core.exceptions import ValidationError
|
|
from django.core.handlers.wsgi import WSGIRequest
|
|
from django.http import Http404, HttpResponse
|
|
from django.shortcuts import render
|
|
|
|
from project.main.models import Person
|
|
from project.main.views.demo_view_base import DemoViewBase
|
|
|
|
CITIES: list[str] = [
|
|
"",
|
|
"Zagreb",
|
|
"Split",
|
|
"Pula",
|
|
"Rijeka",
|
|
"Kozari bok",
|
|
]
|
|
|
|
|
|
def get_person(pk: int) -> Person:
|
|
try:
|
|
return Person.objects.get(pk=pk)
|
|
except Person.DoesNotExist:
|
|
raise Http404("Person not found")
|
|
|
|
|
|
class TableInlineEditView(DemoViewBase):
|
|
template_name = "main/table_inline_edit.html"
|
|
active_section = "table-inline-edit"
|
|
title = "Table Inline Edit"
|
|
|
|
def get_context_data(self, **kwargs) -> dict[str, Any]:
|
|
context_data = super().get_context_data(**kwargs)
|
|
|
|
persons = Person.objects.all()
|
|
|
|
context_data.update(
|
|
{
|
|
"persons": persons,
|
|
}
|
|
)
|
|
return context_data
|
|
|
|
|
|
class TableInlineEditRowView(DemoViewBase):
|
|
template_name = "main/table_inline_table_row.html"
|
|
|
|
def get_context_data(self, **kwargs) -> dict[str, Any]:
|
|
context_data = super().get_context_data(**kwargs)
|
|
|
|
person = get_person(pk=kwargs.get("pk"))
|
|
action = self.request.GET.get("action", "edit")
|
|
|
|
context_data.update(
|
|
{
|
|
"person": person,
|
|
"cities": CITIES,
|
|
"is_editing": action == "edit",
|
|
}
|
|
)
|
|
return context_data
|
|
|
|
def post(self, request: WSGIRequest, *args, **kwargs) -> HttpResponse:
|
|
errors: Optional[dict[str, str]] = None
|
|
|
|
person = get_person(pk=kwargs.get("pk"))
|
|
person.name = request.POST.get("name")
|
|
person.address = request.POST.get("address")
|
|
person.city = request.POST.get("city")
|
|
|
|
try:
|
|
person.clean_fields()
|
|
except ValidationError as ex:
|
|
errors = {key: value[0].message for key, value in ex.error_dict.items()}
|
|
else:
|
|
person.save()
|
|
|
|
return render(
|
|
context={
|
|
"person": person,
|
|
"errors": errors,
|
|
"cities": CITIES,
|
|
"is_editing": errors is not None,
|
|
},
|
|
template_name=self.template_name,
|
|
request=request,
|
|
)
|