129 lines
4.4 KiB
Python
129 lines
4.4 KiB
Python
from rest_framework import serializers
|
|
from hub.services.models import ServiceOffering, Plan
|
|
from django.utils.html import strip_tags
|
|
|
|
|
|
class ServiceUserSerializer(serializers.Serializer):
|
|
email = serializers.EmailField()
|
|
full_name = serializers.CharField()
|
|
role = serializers.CharField()
|
|
|
|
|
|
class ProvisioningContextSerializer(serializers.Serializer):
|
|
platform = serializers.CharField()
|
|
organization_guid = serializers.CharField()
|
|
space_guid = serializers.CharField()
|
|
organization_name = serializers.CharField()
|
|
organization_display_name = serializers.CharField()
|
|
|
|
|
|
class ProvisioningParametersSerializer(serializers.Serializer):
|
|
users = ServiceUserSerializer(many=True)
|
|
|
|
|
|
class ServiceInstanceProvisioningSerializer(serializers.Serializer):
|
|
service_id = serializers.CharField() # This will now represent the offering_id
|
|
plan_id = serializers.CharField()
|
|
organization_guid = serializers.CharField()
|
|
space_guid = serializers.CharField()
|
|
parameters = ProvisioningParametersSerializer()
|
|
context = ProvisioningContextSerializer()
|
|
|
|
def validate_service_id(self, value):
|
|
"""Validate the service_id which now represents the offering_id"""
|
|
try:
|
|
return ServiceOffering.objects.get(pk=value)
|
|
except ServiceOffering.DoesNotExist:
|
|
raise serializers.ValidationError("Invalid offering_id")
|
|
|
|
def validate_plan_id(self, value):
|
|
try:
|
|
# Get the plan and ensure it belongs to the selected offering
|
|
plan = Plan.objects.get(pk=value)
|
|
offering = self.initial_data.get("service_id")
|
|
if str(plan.offering.id) != offering:
|
|
raise serializers.ValidationError(
|
|
"Plan does not belong to the selected offering"
|
|
)
|
|
return plan
|
|
except Plan.DoesNotExist:
|
|
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):
|
|
id = serializers.SerializerMethodField()
|
|
description = serializers.SerializerMethodField()
|
|
free = serializers.SerializerMethodField()
|
|
bindable = serializers.SerializerMethodField()
|
|
|
|
def get_id(self, obj):
|
|
return str(obj.pk)
|
|
|
|
def get_description(self, obj):
|
|
return strip_tags(obj.description) if obj.description else ""
|
|
|
|
def get_free(self, obj):
|
|
return False
|
|
|
|
def get_bindable(self, obj):
|
|
return False
|
|
|
|
class Meta:
|
|
model = Plan
|
|
fields = ["id", "name", "description", "free", "bindable"]
|
|
|
|
|
|
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)
|