Start offering page with visible form

This commit is contained in:
Tobias Kunze 2025-03-28 12:43:21 +01:00
parent 8a1f72b317
commit 172bdd7261
2 changed files with 35 additions and 17 deletions

View file

@ -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):

View file

@ -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 dont 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