From 172bdd7261ec4422d1ab85bbeec6902edff75253 Mon Sep 17 00:00:00 2001 From: Tobias Kunze Date: Fri, 28 Mar 2025 12:43:21 +0100 Subject: [PATCH] Start offering page with visible form --- src/servala/frontend/forms/service.py | 4 ++- src/servala/frontend/views/service.py | 48 ++++++++++++++++++--------- 2 files changed, 35 insertions(+), 17 deletions(-) diff --git a/src/servala/frontend/forms/service.py b/src/servala/frontend/forms/service.py index afef88c..3b7a547 100644 --- a/src/servala/frontend/forms/service.py +++ b/src/servala/frontend/forms/service.py @@ -25,7 +25,9 @@ class ServiceFilterForm(forms.Form): class ControlPlaneSelectForm(forms.Form): control_plane = forms.ModelChoiceField( - queryset=ControlPlane.objects.none(), label=_("Service Provider Zone") + queryset=ControlPlane.objects.none(), + label=_("Service Provider Zone"), + empty_label=None, ) def __init__(self, *args, planes=None, **kwargs): diff --git a/src/servala/frontend/views/service.py b/src/servala/frontend/views/service.py index 00b7edd..f1a6357 100644 --- a/src/servala/frontend/views/service.py +++ b/src/servala/frontend/views/service.py @@ -68,26 +68,42 @@ class ServiceOfferingDetailView(OrganizationViewMixin, HtmxViewMixin, DetailView data = None if "control_plane" in self.request.GET: data = self.request.GET + elif self.request.method == "POST" and self.context_object: + data = {"control_plane": self.context_object.control_plane_id} return ControlPlaneSelectForm(data=data, planes=self.planes) + @cached_property + def selected_plane(self): + if self.select_form.data and self.select_form.is_valid(): + return self.select_form.cleaned_data["control_plane"] + field = self.select_form.fields["control_plane"] + return field.initial or field.queryset.first() + + @cached_property + def context_object(self): + if self.request.method == "POST": + return ServiceOfferingControlPlane.objects.filter( + pk=self.request.POST.get("context"), + # Make sure we don’t use a malicious ID + control_plane__in=self.planes, + ).first() + return ServiceOfferingControlPlane.objects.filter( + control_plane=self.selected_plane, service_offering=self.object + ).first() + + def get_instance_form(self): + return self.context_object.model_form_class( + data=self.request.POST if self.request.method == "POST" else None, + initial={ + "organization": self.request.organization, + "context": self.context_object, + }, + ) + def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context["select_form"] = self.select_form context["has_control_planes"] = self.planes.exists() - if "control_plane" in self.request.GET: - if self.select_form.is_valid(): - context["selected_plane"] = self.select_form.cleaned_data[ - "control_plane" - ] - try: - so_cp = ServiceOfferingControlPlane.objects.filter( - control_plane=self.select_form.cleaned_data["control_plane"], - service_offering=self.object, - ).first() - if not so_cp: - context["form_error"] = True - except Exception: - context["form_error"] = True - else: - context["service_form"] = so_cp.model_form_class() + context["selected_plane"] = self.selected_plane + context["service_form"] = self.get_instance_form() return context