From 2f607f8271bb5b8303a7ed9b1e414b28287521ae Mon Sep 17 00:00:00 2001 From: Tobias Kunze Date: Fri, 28 Mar 2025 12:53:10 +0100 Subject: [PATCH] Proper django field duplication --- src/servala/core/crd.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/servala/core/crd.py b/src/servala/core/crd.py index b66fef8..27952ed 100644 --- a/src/servala/core/crd.py +++ b/src/servala/core/crd.py @@ -9,6 +9,21 @@ from django.utils.translation import gettext_lazy as _ from servala.core.models import ServiceInstance +def duplicate_field(field_name, model): + # Get the field from the model + field = model._meta.get_field(field_name) + + # Create a new field with the same attributes + new_field = type(field).__new__(type(field)) + new_field.__dict__.update(field.__dict__) + + # Ensure the field is not linked to the original model + new_field.model = None + new_field.auto_created = False + + return new_field + + def generate_django_model(schema, group, version, kind): """ Generates a virtual Django model from a Kubernetes CRD's OpenAPI v3 schema. @@ -17,8 +32,8 @@ def generate_django_model(schema, group, version, kind): # defaults = {"apiVersion": f"{group}/{version}", "kind": kind} model_fields = {"__module__": "crd_models"} - for field in ("name", "organization", "context"): - model_fields[field] = ServiceInstance._meta.get_field(field) + for field_name in ("name", "organization", "context"): + model_fields[field_name] = duplicate_field(field_name, ServiceInstance) model_fields.update(build_object_fields(spec, "spec")) meta_class = type("Meta", (), {"app_label": "crd_models"})