Defer instance creation to model
Some checks failed
Tests / test (push) Failing after 24s

This commit is contained in:
Tobias Kunze 2025-03-28 13:11:17 +01:00
parent 4e44b283b1
commit 6e644dfe44
2 changed files with 42 additions and 1 deletions

View file

@ -457,3 +457,12 @@ class ServiceInstance(ServalaModelMixin, models.Model):
class urls(urlman.Urls): class urls(urlman.Urls):
base = "{self.organization.urls.instances}{self.name}/" 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,
)

View file

@ -1,7 +1,14 @@
from django.contrib import messages
from django.shortcuts import redirect
from django.utils.functional import cached_property from django.utils.functional import cached_property
from django.views.generic import DetailView, ListView 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.forms.service import ControlPlaneSelectForm, ServiceFilterForm
from servala.frontend.views.mixins import HtmxViewMixin, OrganizationViewMixin from servala.frontend.views.mixins import HtmxViewMixin, OrganizationViewMixin
@ -107,3 +114,28 @@ class ServiceOfferingDetailView(OrganizationViewMixin, HtmxViewMixin, DetailView
context["selected_plane"] = self.selected_plane context["selected_plane"] = self.selected_plane
context["service_form"] = self.get_instance_form() context["service_form"] = self.get_instance_form()
return context 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)