diff --git a/src/servala/core/forms.py b/src/servala/core/forms.py
index d44ce35..baa85fb 100644
--- a/src/servala/core/forms.py
+++ b/src/servala/core/forms.py
@@ -7,7 +7,7 @@ from servala.core.models import ControlPlane, ServiceDefinition
CONTROL_PLANE_USER_INFO_SCHEMA = {
"type": "object",
"properties": {
- "cname": {
+ "CNAME Record": {
"title": "CNAME Record",
"type": "string",
},
diff --git a/src/servala/core/migrations/0006_add_controlplane_user_info.py b/src/servala/core/migrations/0006_add_controlplane_user_info.py
deleted file mode 100644
index 0d4936c..0000000
--- a/src/servala/core/migrations/0006_add_controlplane_user_info.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# 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/migrations/0007_controlplane_user_info_and_more.py b/src/servala/core/migrations/0007_controlplane_user_info_and_more.py
new file mode 100644
index 0000000..5dda2ed
--- /dev/null
+++ b/src/servala/core/migrations/0007_controlplane_user_info_and_more.py
@@ -0,0 +1,43 @@
+# Generated by Django 5.2.6 on 2025-09-08 07:14
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("core", "0006_remove_service_instance_soft_delete"),
+ ]
+
+ 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",
+ ),
+ ),
+ migrations.AlterField(
+ model_name="cloudprovider",
+ name="external_links",
+ field=models.JSONField(
+ blank=True,
+ help_text='JSON array of link objects: {"url": "…", "title": "…"}. ',
+ null=True,
+ verbose_name="External links",
+ ),
+ ),
+ migrations.AlterField(
+ model_name="service",
+ name="external_links",
+ field=models.JSONField(
+ blank=True,
+ help_text='JSON array of link objects: {"url": "…", "title": "…", "featured": false}. Featured links will be shown on the service list page, all other links will only show on the service and offering detail pages.',
+ null=True,
+ verbose_name="External links",
+ ),
+ ),
+ ]
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 4027ec5..337893a 100644
--- a/src/servala/frontend/templates/frontend/organizations/service_instance_detail.html
+++ b/src/servala/frontend/templates/frontend/organizations/service_instance_detail.html
@@ -102,27 +102,7 @@
{% endif %}
- {% if instance.context.control_plane.user_info %}
-
-
-
-
-
-
- {% for key, value in instance.context.control_plane.user_info.items %}
-
- | {{ key }} |
- {{ value }} |
-
- {% endfor %}
-
-
-
-
-
- {% endif %}
+ {% include "includes/control_plane_user_info.html" with control_plane=instance.context.control_plane %}
{% if instance.spec and spec_fieldsets %}
diff --git a/src/servala/frontend/templates/frontend/organizations/service_offering_detail.html b/src/servala/frontend/templates/frontend/organizations/service_offering_detail.html
index dd35cce..7f3863e 100644
--- a/src/servala/frontend/templates/frontend/organizations/service_offering_detail.html
+++ b/src/servala/frontend/templates/frontend/organizations/service_offering_detail.html
@@ -8,26 +8,8 @@
{% endblock page_title %}
{% endblock html_title %}
{% partialdef control-plane-info %}
-{% if selected_plane and selected_plane.user_info %}
-
-
-
-
-
-
- {% for key, value in selected_plane.user_info.items %}
-
- | {{ key }} |
- {{ value }} |
-
- {% endfor %}
-
-
-
-
-
+{% if selected_plane %}
+ {% include "includes/control_plane_user_info.html" with control_plane=selected_plane %}
{% endif %}
{% endpartialdef %}
{% partialdef service-form %}
diff --git a/src/servala/frontend/templates/includes/control_plane_user_info.html b/src/servala/frontend/templates/includes/control_plane_user_info.html
new file mode 100644
index 0000000..b9ffe99
--- /dev/null
+++ b/src/servala/frontend/templates/includes/control_plane_user_info.html
@@ -0,0 +1,26 @@
+{% load i18n %}
+{% comment %}
+Reusable snippet for displaying ControlPlane user_info
+Usage: {% include "includes/control_plane_user_info.html" with control_plane=control_plane_object %}
+{% endcomment %}
+{% if control_plane.user_info %}
+
+
+
+
+
+
+ {% for key, value in control_plane.user_info.items %}
+
+ | {{ key }} |
+ {{ value }} |
+
+ {% endfor %}
+
+
+
+
+
+{% endif %}