osb catalog

This commit is contained in:
Tobias Brunner 2025-01-31 15:46:22 +01:00
parent 81e55a2134
commit ff4eb0a9ba
No known key found for this signature in database
2 changed files with 89 additions and 1 deletions

View file

@ -1,5 +1,6 @@
from rest_framework import serializers from rest_framework import serializers
from hub.services.models import ServiceOffering, Plan from hub.services.models import ServiceOffering, Plan
from django.utils.html import strip_tags
class ServiceUserSerializer(serializers.Serializer): class ServiceUserSerializer(serializers.Serializer):
@ -47,3 +48,70 @@ class ServiceInstanceProvisioningSerializer(serializers.Serializer):
return plan return plan
except Plan.DoesNotExist: except Plan.DoesNotExist:
raise serializers.ValidationError("Invalid plan_id") raise serializers.ValidationError("Invalid plan_id")
class CostSerializer(serializers.Serializer):
amount = serializers.DecimalField(max_digits=10, decimal_places=2)
unit = serializers.CharField()
class PlanMetadataSerializer(serializers.Serializer):
bullets = serializers.ListField(child=serializers.CharField(), required=False)
costs = CostSerializer(many=True, required=False)
class PlanSerializer(serializers.ModelSerializer):
description = serializers.SerializerMethodField()
def get_description(self, obj):
return strip_tags(obj.description) if obj.description else ""
class Meta:
model = Plan
fields = ["id", "name", "description"]
class ServiceOfferingMetadataSerializer(serializers.Serializer):
displayName = serializers.CharField()
providerDisplayName = serializers.CharField()
longDescription = serializers.SerializerMethodField()
imageUrl = serializers.URLField(required=False)
def get_longDescription(self, obj):
return strip_tags(obj["longDescription"]) if obj.get("longDescription") else ""
class ServiceOfferingSerializer(serializers.ModelSerializer):
id = serializers.SerializerMethodField()
name = serializers.SerializerMethodField()
description = serializers.SerializerMethodField()
plans = PlanSerializer(many=True)
bindable = serializers.BooleanField(default=True)
metadata = serializers.SerializerMethodField()
class Meta:
model = ServiceOffering
fields = ["id", "name", "description", "plans", "bindable", "metadata"]
def get_id(self, obj):
return str(obj.pk)
def get_name(self, obj):
return f"{obj.service.name}-{obj.cloud_provider.name}".lower().replace(" ", "-")
def get_description(self, obj):
return strip_tags(obj.description) if obj.description else ""
def get_metadata(self, obj):
return ServiceOfferingMetadataSerializer(
{
"displayName": obj.service.name,
"providerDisplayName": obj.cloud_provider.name,
"longDescription": obj.description,
"imageUrl": obj.service.logo.url if obj.service.logo else None,
}
).data
class CatalogSerializer(serializers.Serializer):
services = ServiceOfferingSerializer(many=True)

View file

@ -6,7 +6,7 @@ from django.shortcuts import get_object_or_404
from hub.services.models import ServiceOffering, Lead from hub.services.models import ServiceOffering, Lead
from hub.services.odoo import OdooAPI from hub.services.odoo import OdooAPI
from .models import ServiceInstance, ServiceBrokerUser from .models import ServiceInstance, ServiceBrokerUser
from .serializers import ServiceInstanceProvisioningSerializer from .serializers import ServiceInstanceProvisioningSerializer, CatalogSerializer
from .authentication import ServiceBrokerAuthentication from .authentication import ServiceBrokerAuthentication
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -15,6 +15,26 @@ logger = logging.getLogger(__name__)
class ServiceBrokerViewSet(viewsets.ViewSet): class ServiceBrokerViewSet(viewsets.ViewSet):
authentication_classes = [ServiceBrokerAuthentication] authentication_classes = [ServiceBrokerAuthentication]
@action(detail=False, methods=["get"], url_path="catalog")
def get_catalog(self, request):
"""
Return the catalog of services available to the authenticated user.
"""
# Get broker user and their allowed offerings
broker_user = get_object_or_404(ServiceBrokerUser, user=request.user)
offerings = broker_user.allowed_offerings.prefetch_related(
"plans",
"plans__prices",
"plans__prices__currency",
"plans__prices__term",
"service",
"cloud_provider",
).all()
# Serialize the catalog
serializer = CatalogSerializer({"services": offerings})
return Response(serializer.data)
def _create_lead_from_provision_data(self, offering, plan, parameters, context): def _create_lead_from_provision_data(self, offering, plan, parameters, context):
"""Create a lead in Odoo from provisioning data""" """Create a lead in Odoo from provisioning data"""
# Get the first user from parameters as the main contact # Get the first user from parameters as the main contact