diff --git a/src/servala/core/admin.py b/src/servala/core/admin.py index 149635c..0b1b980 100644 --- a/src/servala/core/admin.py +++ b/src/servala/core/admin.py @@ -191,6 +191,15 @@ class ControlPlaneAdmin(admin.ModelAdmin): ), }, ), + ( + _("User Information"), + { + "fields": ("user_info",), + "description": _( + "Key-value information displayed to users when selecting this control plane." + ), + }, + ), ) def get_exclude(self, request, obj=None): diff --git a/src/servala/core/forms.py b/src/servala/core/forms.py index 1fece41..d44ce35 100644 --- a/src/servala/core/forms.py +++ b/src/servala/core/forms.py @@ -1,8 +1,20 @@ from django import forms from django.utils.translation import gettext_lazy as _ +from django_jsonform.widgets import JSONFormWidget from servala.core.models import ControlPlane, ServiceDefinition +CONTROL_PLANE_USER_INFO_SCHEMA = { + "type": "object", + "properties": { + "cname": { + "title": "CNAME Record", + "type": "string", + }, + }, + "additionalProperties": {"type": "string"}, +} + class ControlPlaneAdminForm(forms.ModelForm): certificate_authority_data = forms.CharField( @@ -23,6 +35,7 @@ class ControlPlaneAdminForm(forms.ModelForm): class Meta: model = ControlPlane fields = "__all__" + widgets = {"user_info": JSONFormWidget(schema=CONTROL_PLANE_USER_INFO_SCHEMA)} def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) diff --git a/src/servala/core/migrations/0006_add_controlplane_user_info.py b/src/servala/core/migrations/0006_add_controlplane_user_info.py new file mode 100644 index 0000000..0d4936c --- /dev/null +++ b/src/servala/core/migrations/0006_add_controlplane_user_info.py @@ -0,0 +1,23 @@ +# Generated by Django 5.2.4 on 2025-09-04 11:29 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("core", "0005_organization_sale_order_fields"), + ] + + operations = [ + migrations.AddField( + model_name="controlplane", + name="user_info", + field=models.JSONField( + blank=True, + help_text="Key-value information displayed to users when selecting this control plane", + null=True, + verbose_name="User Information", + ), + ), + ] diff --git a/src/servala/core/models/service.py b/src/servala/core/models/service.py index 6944750..3677cca 100644 --- a/src/servala/core/models/service.py +++ b/src/servala/core/models/service.py @@ -144,6 +144,14 @@ class ControlPlane(ServalaModelMixin, models.Model): related_name="control_planes", verbose_name=_("Cloud provider"), ) + user_info = models.JSONField( + null=True, + blank=True, + verbose_name=_("User Information"), + help_text=_( + "Key-value information displayed to users when selecting this control plane" + ), + ) class Meta: verbose_name = _("Control plane") diff --git a/src/servala/frontend/templates/frontend/organizations/service_instance_detail.html b/src/servala/frontend/templates/frontend/organizations/service_instance_detail.html index a12efcf..4027ec5 100644 --- a/src/servala/frontend/templates/frontend/organizations/service_instance_detail.html +++ b/src/servala/frontend/templates/frontend/organizations/service_instance_detail.html @@ -58,8 +58,8 @@ - {% if instance.status_conditions %} -
| {{ key }} | +{{ value }} | +
|---|
| {{ key }} | +{{ value }} | +
|---|
{{ offering.description|urlize }}
+{% translate "We currently cannot offer this service, sorry!" %}
- {% else %} - - {% endif %} - {% if service.external_links %} -{{ offering.description|urlize }}
+{% translate "We currently cannot offer this service, sorry!" %}
+ {% else %} + + {% endif %} + {% if service.external_links %} +