Drop Plan model, add osb ID references

This commit is contained in:
Tobias Kunze 2025-10-02 09:46:05 +02:00
parent f0320fb13b
commit 0a591f352a
5 changed files with 64 additions and 71 deletions

View file

@ -11,7 +11,6 @@ from servala.core.models import (
Organization,
OrganizationMembership,
OrganizationOrigin,
Plan,
Service,
ServiceCategory,
ServiceDefinition,
@ -99,11 +98,6 @@ class ServiceCategoryAdmin(admin.ModelAdmin):
autocomplete_fields = ("parent",)
class PlanInline(admin.TabularInline):
model = Plan
extra = 1
@admin.register(Service)
class ServiceAdmin(admin.ModelAdmin):
list_display = ("name", "category")
@ -230,14 +224,6 @@ class ControlPlaneAdmin(admin.ModelAdmin):
test_kubernetes_connection.short_description = _("Test Kubernetes connection")
@admin.register(Plan)
class PlanAdmin(admin.ModelAdmin):
list_display = ("name", "service_offering", "term")
list_filter = ("service_offering", "term")
search_fields = ("name", "description")
autocomplete_fields = ("service_offering",)
@admin.register(ServiceDefinition)
class ServiceDefinitionAdmin(admin.ModelAdmin):
form = ServiceDefinitionAdminForm
@ -317,7 +303,4 @@ class ServiceOfferingAdmin(admin.ModelAdmin):
list_filter = ("service", "provider")
search_fields = ("description",)
autocomplete_fields = ("service", "provider")
inlines = (
ControlPlaneCRDInline,
PlanInline,
)
inlines = (ControlPlaneCRDInline,)

View file

@ -1,22 +0,0 @@
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("core", "0007_controlplane_user_info_and_more"),
]
operations = [
migrations.AddField(
model_name="organization",
name="osb_guid",
field=models.CharField(
blank=True,
help_text="Open Service Broker GUID, used for organizations created via OSB API",
max_length=100,
null=True,
verbose_name="OSB GUID",
),
),
]

View file

@ -0,0 +1,49 @@
# Generated by Django 5.2.6 on 2025-10-02 07:41
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("core", "0007_controlplane_user_info_and_more"),
]
operations = [
migrations.AddField(
model_name="organization",
name="osb_guid",
field=models.CharField(
blank=True,
help_text="Open Service Broker GUID, used for organizations created via OSB API",
max_length=100,
null=True,
verbose_name="OSB GUID",
),
),
migrations.AddField(
model_name="service",
name="osb_service_id",
field=models.CharField(
blank=True,
help_text="Open Service Broker service ID for API matching",
max_length=100,
null=True,
verbose_name="OSB Service ID",
),
),
migrations.AddField(
model_name="serviceoffering",
name="osb_plan_id",
field=models.CharField(
blank=True,
help_text="Open Service Broker plan ID for API matching",
max_length=100,
null=True,
verbose_name="OSB Plan ID",
),
),
migrations.DeleteModel(
name="Plan",
),
]

View file

@ -9,7 +9,6 @@ from .service import (
CloudProvider,
ControlPlane,
ControlPlaneCRD,
Plan,
Service,
ServiceCategory,
ServiceDefinition,
@ -27,7 +26,6 @@ __all__ = [
"OrganizationMembership",
"OrganizationOrigin",
"OrganizationRole",
"Plan",
"Service",
"ServiceCategory",
"ServiceInstance",

View file

@ -80,6 +80,13 @@ class Service(ServalaModelMixin, models.Model):
"Featured links will be shown on the service list page, all other links will only show on the service and offering detail pages."
),
)
osb_service_id = models.CharField(
max_length=100,
null=True,
blank=True,
verbose_name=_("OSB Service ID"),
help_text=_("Open Service Broker service ID for API matching"),
)
class Meta:
verbose_name = _("Service")
@ -297,35 +304,6 @@ class CloudProvider(ServalaModelMixin, models.Model):
return self.name
class Plan(ServalaModelMixin, models.Model):
"""
Each service offering can have multiple plans, e.g. for different tiers.
"""
name = models.CharField(max_length=100, verbose_name=_("Name"))
description = models.TextField(blank=True, verbose_name=_("Description"))
# TODO schema
features = models.JSONField(verbose_name=_("Features"), null=True, blank=True)
# TODO schema
pricing = models.JSONField(verbose_name=_("Pricing"), null=True, blank=True)
term = models.PositiveIntegerField(
verbose_name=_("Term"), help_text=_("Term in months")
)
service_offering = models.ForeignKey(
to="ServiceOffering",
on_delete=models.PROTECT,
related_name="plans",
verbose_name=_("Service offering"),
)
class Meta:
verbose_name = _("Plan")
verbose_name_plural = _("Plans")
def __str__(self):
return self.name
def validate_api_definition(value):
required_fields = ("group", "version", "kind")
return validate_dict(value, required_fields)
@ -533,6 +511,13 @@ class ServiceOffering(ServalaModelMixin, models.Model):
verbose_name=_("Provider"),
)
description = models.TextField(blank=True, verbose_name=_("Description"))
osb_plan_id = models.CharField(
max_length=100,
null=True,
blank=True,
verbose_name=_("OSB Plan ID"),
help_text=_("Open Service Broker plan ID for API matching"),
)
class Meta:
verbose_name = _("Service offering")