diff --git a/src/servala/frontend/templates/frontend/organizations/service_instance_detail.html b/src/servala/frontend/templates/frontend/organizations/service_instance_detail.html
new file mode 100644
index 0000000..7a949f1
--- /dev/null
+++ b/src/servala/frontend/templates/frontend/organizations/service_instance_detail.html
@@ -0,0 +1,54 @@
+{% extends "frontend/base.html" %}
+{% load i18n static %}
+{% block html_title %}
+ {% block page_title %}
+ {{ instance.name }}
+ {% endblock page_title %}
+{% endblock html_title %}
+{% block content %}
+
+
+
+
+
+
{% translate "Details" %}
+
+ - {% translate "Service" %}
+ -
+ {{ instance.context.service_definition.service.name }}
+
+ - {% translate "Service Provider" %}
+ -
+ {{ instance.context.service_offering.provider.name }}
+
+ - {% translate "Control Plane" %}
+ -
+ {{ instance.context.control_plane.name }}
+
+ - {% translate "Created By" %}
+ -
+ {{ instance.created_by }}
+
+ - {% translate "Created At" %}
+ -
+ {{ instance.created_at|date:"SHORT_DATETIME_FORMAT" }}
+
+ - {% translate "Updated At" %}
+ -
+ {{ instance.updated_at|date:"SHORT_DATETIME_FORMAT" }}
+
+ - {% translate "Status" %}
+ -
+ {% if instance.is_deleted %}
+ {% translate "Deleted" %}
+ {% else %}
+ {% translate "Active" %}
+ {% endif %}
+
+
+
+
+
+
+
+{% endblock content %}
diff --git a/src/servala/frontend/urls.py b/src/servala/frontend/urls.py
index f02fd1c..2838dae 100644
--- a/src/servala/frontend/urls.py
+++ b/src/servala/frontend/urls.py
@@ -45,6 +45,11 @@ urlpatterns = [
views.ServiceInstanceListView.as_view(),
name="organization.instances",
),
+ path(
+ "instances//",
+ views.ServiceInstanceDetailView.as_view(),
+ name="organization.instance",
+ ),
]
),
),
diff --git a/src/servala/frontend/views/__init__.py b/src/servala/frontend/views/__init__.py
index f7d9daa..5de38ee 100644
--- a/src/servala/frontend/views/__init__.py
+++ b/src/servala/frontend/views/__init__.py
@@ -7,6 +7,7 @@ from .organization import (
)
from .service import (
ServiceDetailView,
+ ServiceInstanceDetailView,
ServiceInstanceListView,
ServiceListView,
ServiceOfferingDetailView,
@@ -19,6 +20,7 @@ __all__ = [
"OrganizationDashboardView",
"OrganizationUpdateView",
"ServiceDetailView",
+ "ServiceInstanceDetailView",
"ServiceInstanceListView",
"ServiceListView",
"ServiceOfferingDetailView",
diff --git a/src/servala/frontend/views/service.py b/src/servala/frontend/views/service.py
index 380f393..6ee6b1e 100644
--- a/src/servala/frontend/views/service.py
+++ b/src/servala/frontend/views/service.py
@@ -149,6 +149,26 @@ class ServiceOfferingDetailView(OrganizationViewMixin, HtmxViewMixin, DetailView
return self.render_to_response(context)
+class ServiceInstanceDetailView(OrganizationViewMixin, DetailView):
+ """View to display details of a specific service instance."""
+
+ template_name = "frontend/organizations/service_instance_detail.html"
+ context_object_name = "instance"
+ model = ServiceInstance
+ permission_type = "view"
+ slug_field = "name"
+
+ def get_queryset(self):
+ """Return service instance for the current organization."""
+ return ServiceInstance.objects.filter(
+ organization=self.request.organization
+ ).select_related(
+ "context__service_offering__provider",
+ "context__control_plane",
+ "context__service_definition__service",
+ )
+
+
class ServiceInstanceListView(OrganizationViewMixin, ListView):
template_name = "frontend/organizations/service_instances.html"
context_object_name = "instances"