diff --git a/src/servala/core/models/service.py b/src/servala/core/models/service.py index 9648ba4..330e077 100644 --- a/src/servala/core/models/service.py +++ b/src/servala/core/models/service.py @@ -298,3 +298,8 @@ class ServiceOffering(models.Model): class Meta: verbose_name = _("Service offering") verbose_name_plural = _("Service offerings") + + def __str__(self): + return _("{service_name} at {provider_name}").format( + service_name=self.service.name, provider_name=self.provider.name + ) diff --git a/src/servala/frontend/templates/frontend/organizations/service_detail.html b/src/servala/frontend/templates/frontend/organizations/service_detail.html index 674a714..c3962eb 100644 --- a/src/servala/frontend/templates/frontend/organizations/service_detail.html +++ b/src/servala/frontend/templates/frontend/organizations/service_detail.html @@ -51,7 +51,7 @@ {% empty %} diff --git a/src/servala/frontend/templates/frontend/organizations/service_offering_detail.html b/src/servala/frontend/templates/frontend/organizations/service_offering_detail.html new file mode 100644 index 0000000..1ed9a12 --- /dev/null +++ b/src/servala/frontend/templates/frontend/organizations/service_offering_detail.html @@ -0,0 +1,40 @@ +{% extends "frontend/base.html" %} +{% load i18n %} +{% load static %} +{% block html_title %} + {% block page_title %} + {{ offering }} + {% endblock page_title %} +{% endblock html_title %} +{% block content %} +
+
+
+ {% if service.logo %} + {{ service.name }} + {% endif %} +
+

{{ offering }}

+ {{ offering.service.category }} +
+
+
+
+ {% if offering.control_planes.all.count > 1 %} +

{% translate "Please choose your zone." %}

+ {% else %} +

+ {% blocktranslate trimmed with zone=offering.control_planes.all.first.name %} + Your zone will be {{ zone }}. + {% endblocktranslate %} +

+ {% endif %} +
+
+
+
+{% endblock content %} diff --git a/src/servala/frontend/urls.py b/src/servala/frontend/urls.py index 96d33dc..d6c7c3a 100644 --- a/src/servala/frontend/urls.py +++ b/src/servala/frontend/urls.py @@ -28,7 +28,12 @@ urlpatterns = [ path( "services//", views.ServiceDetailView.as_view(), - name="organization.services", + name="organization.service", + ), + path( + "services//offering//", + views.ServiceOfferingDetailView.as_view(), + name="organization.offering", ), path( "", diff --git a/src/servala/frontend/views/__init__.py b/src/servala/frontend/views/__init__.py index dcd8d9e..1a180a1 100644 --- a/src/servala/frontend/views/__init__.py +++ b/src/servala/frontend/views/__init__.py @@ -5,7 +5,7 @@ from .organization import ( OrganizationDashboardView, OrganizationUpdateView, ) -from .service import ServiceDetailView, ServiceListView +from .service import ServiceDetailView, ServiceListView, ServiceOfferingDetailView __all__ = [ "IndexView", @@ -15,5 +15,6 @@ __all__ = [ "OrganizationUpdateView", "ServiceDetailView", "ServiceListView", + "ServiceOfferingDetailView", "ProfileView", ] diff --git a/src/servala/frontend/views/service.py b/src/servala/frontend/views/service.py index 5eac7e2..f5c33f0 100644 --- a/src/servala/frontend/views/service.py +++ b/src/servala/frontend/views/service.py @@ -1,7 +1,7 @@ from django.utils.functional import cached_property from django.views.generic import DetailView, ListView -from servala.core.models import Service +from servala.core.models import Service, ServiceOffering from servala.frontend.forms.service import ServiceFilterForm from servala.frontend.views.mixins import OrganizationViewMixin @@ -32,8 +32,6 @@ class ServiceListView(OrganizationViewMixin, ListView): class ServiceDetailView(OrganizationViewMixin, DetailView): - """View to display details of a specific service and its offerings.""" - template_name = "frontend/organizations/service_detail.html" context_object_name = "service" model = Service @@ -46,5 +44,13 @@ class ServiceDetailView(OrganizationViewMixin, DetailView): ) -class ServiceOfferingDetailView: - pass +class ServiceOfferingDetailView(OrganizationViewMixin, DetailView): + template_name = "frontend/organizations/service_offering_detail.html" + context_object_name = "offering" + model = ServiceOffering + permission_type = "view" + + def get_queryset(self): + return ServiceOffering.objects.all().select_related( + "service", "service__category", "provider" + )