diff --git a/src/servala/frontend/urls.py b/src/servala/frontend/urls.py index 2838dae..64c84bf 100644 --- a/src/servala/frontend/urls.py +++ b/src/servala/frontend/urls.py @@ -50,6 +50,11 @@ urlpatterns = [ views.ServiceInstanceDetailView.as_view(), name="organization.instance", ), + path( + "instances//update/", + views.ServiceInstanceUpdateView.as_view(), + name="organization.instance.update", + ), ] ), ), diff --git a/src/servala/frontend/views/__init__.py b/src/servala/frontend/views/__init__.py index 5de38ee..d13d4d5 100644 --- a/src/servala/frontend/views/__init__.py +++ b/src/servala/frontend/views/__init__.py @@ -9,6 +9,7 @@ from .service import ( ServiceDetailView, ServiceInstanceDetailView, ServiceInstanceListView, + ServiceInstanceUpdateView, ServiceListView, ServiceOfferingDetailView, ) @@ -22,6 +23,7 @@ __all__ = [ "ServiceDetailView", "ServiceInstanceDetailView", "ServiceInstanceListView", + "ServiceInstanceUpdateView", "ServiceListView", "ServiceOfferingDetailView", "ProfileView", diff --git a/src/servala/frontend/views/service.py b/src/servala/frontend/views/service.py index b6ecc42..ab4fa0e 100644 --- a/src/servala/frontend/views/service.py +++ b/src/servala/frontend/views/service.py @@ -2,6 +2,7 @@ from django.contrib import messages from django.core.exceptions import ValidationError from django.shortcuts import redirect from django.utils.functional import cached_property +from django.utils.translation import gettext_lazy as _ from django.views.generic import DetailView, ListView from servala.core.crd import deslugify @@ -105,6 +106,8 @@ class ServiceOfferingDetailView(OrganizationViewMixin, HtmxViewMixin, DetailView ).first() def get_instance_form(self): + if not self.context_object: + return None return self.context_object.model_form_class( data=self.request.POST if self.request.method == "POST" else None, initial={ @@ -130,6 +133,10 @@ class ServiceOfferingDetailView(OrganizationViewMixin, HtmxViewMixin, DetailView return self.render_to_response(context) form = self.get_instance_form() + if not form: # Should not happen if context_object is valid, but as a safeguard + messages.error(self.request, _("Could not initialize service form.")) + return self.render_to_response(context) + if form.is_valid(): try: service_instance = ServiceInstance.create_instance( @@ -143,7 +150,9 @@ class ServiceOfferingDetailView(OrganizationViewMixin, HtmxViewMixin, DetailView except ValidationError as e: messages.error(self.request, e.message or str(e)) except Exception as e: - messages.error(self.request, str(e)) + messages.error( + self.request, _("Error creating instance: {}").format(str(e)) + ) # If the form is not valid or if the service creation failed, we render it again context["service_form"] = form