From 6e644dfe4414b4faec02e332b847122f9e4225d0 Mon Sep 17 00:00:00 2001 From: Tobias Kunze Date: Fri, 28 Mar 2025 13:11:17 +0100 Subject: [PATCH] Defer instance creation to model --- src/servala/core/models/service.py | 9 +++++++ src/servala/frontend/views/service.py | 34 ++++++++++++++++++++++++++- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/servala/core/models/service.py b/src/servala/core/models/service.py index 301f82c..ef6f9c9 100644 --- a/src/servala/core/models/service.py +++ b/src/servala/core/models/service.py @@ -457,3 +457,12 @@ class ServiceInstance(ServalaModelMixin, models.Model): class urls(urlman.Urls): base = "{self.organization.urls.instances}{self.name}/" + @classmethod + def create_instance(cls, organization, context, created_by, spec_data): + name = spec_data.get("spec.name") + return cls.objects.create( + name=name, + organization=organization, + created_by=created_by, + context=context, + ) diff --git a/src/servala/frontend/views/service.py b/src/servala/frontend/views/service.py index f1a6357..e99e5a8 100644 --- a/src/servala/frontend/views/service.py +++ b/src/servala/frontend/views/service.py @@ -1,7 +1,14 @@ +from django.contrib import messages +from django.shortcuts import redirect from django.utils.functional import cached_property from django.views.generic import DetailView, ListView -from servala.core.models import Service, ServiceOffering, ServiceOfferingControlPlane +from servala.core.models import ( + Service, + ServiceInstance, + ServiceOffering, + ServiceOfferingControlPlane, +) from servala.frontend.forms.service import ControlPlaneSelectForm, ServiceFilterForm from servala.frontend.views.mixins import HtmxViewMixin, OrganizationViewMixin @@ -107,3 +114,28 @@ class ServiceOfferingDetailView(OrganizationViewMixin, HtmxViewMixin, DetailView context["selected_plane"] = self.selected_plane context["service_form"] = self.get_instance_form() return context + + def post(self, request, *args, **kwargs): + self.object = self.get_object() + context = self.get_context_data(object=self.object) + + if not self.context_object: + context["form_error"] = True + return self.render_to_response(context) + + form = self.get_instance_form() + if form.is_valid(): + try: + service_instance = ServiceInstance.create_instance( + organization=self.organization, + context=self.context_object, + created_by=request.user, + spec_data=form.get_nested_data(), + ) + return redirect(service_instance.urls.base) + except Exception as e: + messages.error(self.request, str(e)) + + # If the form is not valid or if the service creation failed, we render it again + context["service_form"] = form + return self.render_to_response(context)