diff --git a/src/servala/core/admin.py b/src/servala/core/admin.py index 0b1b980..073d444 100644 --- a/src/servala/core/admin.py +++ b/src/servala/core/admin.py @@ -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,) diff --git a/src/servala/core/migrations/0008_add_osb_guid_to_organization.py b/src/servala/core/migrations/0008_add_osb_guid_to_organization.py deleted file mode 100644 index 9928854..0000000 --- a/src/servala/core/migrations/0008_add_osb_guid_to_organization.py +++ /dev/null @@ -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", - ), - ), - ] diff --git a/src/servala/core/migrations/0008_organization_osb_guid_service_osb_service_id_and_more.py b/src/servala/core/migrations/0008_organization_osb_guid_service_osb_service_id_and_more.py new file mode 100644 index 0000000..66d20a3 --- /dev/null +++ b/src/servala/core/migrations/0008_organization_osb_guid_service_osb_service_id_and_more.py @@ -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", + ), + ] diff --git a/src/servala/core/models/__init__.py b/src/servala/core/models/__init__.py index 3fb0663..22e8e8a 100644 --- a/src/servala/core/models/__init__.py +++ b/src/servala/core/models/__init__.py @@ -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", diff --git a/src/servala/core/models/service.py b/src/servala/core/models/service.py index 3677cca..43c9023 100644 --- a/src/servala/core/models/service.py +++ b/src/servala/core/models/service.py @@ -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")