From 8ed6b588fd27ad8edc608bc95cd6cba182525bd0 Mon Sep 17 00:00:00 2001 From: colons Date: Sat, 13 Apr 2024 19:30:26 +0100 Subject: [PATCH] Back the member modification view with a form. --- nkdsu/apps/vote/views/profiles.py | 32 +++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/nkdsu/apps/vote/views/profiles.py b/nkdsu/apps/vote/views/profiles.py index a0043998..65bc1832 100644 --- a/nkdsu/apps/vote/views/profiles.py +++ b/nkdsu/apps/vote/views/profiles.py @@ -1,5 +1,6 @@ from typing import Any, Optional +from django.conf import settings from django.contrib import messages from django.contrib.auth import get_user_model from django.contrib.auth.base_user import AbstractBaseUser @@ -7,7 +8,7 @@ from django.contrib.auth.models import User as DjangoUser from django.core.exceptions import ValidationError from django.db.models import Q, QuerySet -from django.forms import ModelForm, TextInput +from django.forms import BooleanField, IntegerField, ModelForm, TextInput from django.http import HttpRequest, HttpResponse, HttpResponseNotAllowed from django.shortcuts import get_object_or_404, redirect from django.urls import reverse, reverse_lazy @@ -199,4 +200,31 @@ def get_context_data(self, **kwargs) -> dict[str, Any]: class UserTrackListModifyMembersView(ModifyUserTrackList): - pass + fields = [] + + def get_form_class(self) -> type[ModelForm]: + form = super().get_form_class() + playlist = list(self.get_object().playlist()) + + return type( + 'MembersForm', + (form,), + { + **{f'index_{t.pk}': IntegerField() for t in playlist}, + **{f'remove_{t.pk}': BooleanField(required=False) for t in playlist}, + }, + ) + + def form_valid(self, form: ModelForm) -> HttpResponse: + raise RuntimeError(form.cleaned_data) + + def form_invalid(self, form: ModelForm) -> HttpResponse: + messages.warning( + self.request, + ( + str(form.errors) + if settings.DEBUG + else 'reordering invalid; perhaps the tracks in this list changed while you had the page loaded?' + ), + ) + return redirect(form.instance.get_absolute_url())