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"