diff --git a/src/servala/core/models/service.py b/src/servala/core/models/service.py index 43c9023..846b24e 100644 --- a/src/servala/core/models/service.py +++ b/src/servala/core/models/service.py @@ -578,7 +578,7 @@ class ServiceInstance(ServalaModelMixin, models.Model): } class urls(urlman.Urls): - base = "{self.organization.urls.instances}{self.name}/" + base = "{self.organization.urls.instances}{self.name}-{self.pk}/" update = "{base}update/" delete = "{base}delete/" diff --git a/src/servala/frontend/templates/frontend/organizations/dashboard.html b/src/servala/frontend/templates/frontend/organizations/dashboard.html index b58b720..167c806 100644 --- a/src/servala/frontend/templates/frontend/organizations/dashboard.html +++ b/src/servala/frontend/templates/frontend/organizations/dashboard.html @@ -96,7 +96,7 @@ {% for instance in service_instances %} - {{ instance.name }} @@ -117,13 +117,13 @@
- {% if instance.has_change_permission %} - diff --git a/src/servala/frontend/views/service.py b/src/servala/frontend/views/service.py index 6a58a0f..a8f917c 100644 --- a/src/servala/frontend/views/service.py +++ b/src/servala/frontend/views/service.py @@ -1,6 +1,6 @@ from django.contrib import messages from django.core.exceptions import ValidationError -from django.http import HttpResponse +from django.http import HttpResponse, Http404 from django.shortcuts import redirect from django.utils.functional import cached_property from django.utils.translation import gettext_lazy as _ @@ -178,7 +178,7 @@ class ServiceOfferingDetailView(OrganizationViewMixin, HtmxViewMixin, DetailView class ServiceInstanceMixin: model = ServiceInstance context_object_name = "instance" - slug_field = "name" + pk_url_kwarg = "slug" def dispatch(self, *args, **kwargs): self._has_warned = False @@ -195,7 +195,25 @@ class ServiceInstanceMixin: ) def get_object(self, **kwargs): - instance = super().get_object(**kwargs) + queryset = kwargs.get("queryset") or self.get_queryset() + + # Get the slug from URL (format: "my-instance-123") + slug = self.kwargs.get(self.pk_url_kwarg) + if slug is None: + raise Http404("No slug provided in URL") + + # Extract pk from the slug (everything after the last dash) + try: + pk_str = slug.rsplit("-", 1)[-1] + pk = int(pk_str) + except (ValueError, IndexError): + raise Http404(f"Invalid slug format: {slug}") + + try: + instance = queryset.get(pk=pk) + except ServiceInstance.DoesNotExist: + raise Http404("Service instance not found") + if not instance.kubernetes_object and not self._has_warned: messages.warning( self.request,