Mark fields as required only if parent also required
This commit is contained in:
parent
8b63d78633
commit
eedb90b2d3
1 changed files with 16 additions and 5 deletions
|
@ -37,7 +37,7 @@ def generate_django_model(schema, group, version, kind):
|
||||||
# resourceRef object
|
# resourceRef object
|
||||||
spec = schema["properties"].get("spec") or {}
|
spec = schema["properties"].get("spec") or {}
|
||||||
spec["properties"].pop("resourceRef", None)
|
spec["properties"].pop("resourceRef", None)
|
||||||
model_fields.update(build_object_fields(spec, "spec"))
|
model_fields.update(build_object_fields(spec, "spec", parent_required=True))
|
||||||
|
|
||||||
meta_class = type("Meta", (), {"app_label": "crd_models"})
|
meta_class = type("Meta", (), {"app_label": "crd_models"})
|
||||||
model_fields["Meta"] = meta_class
|
model_fields["Meta"] = meta_class
|
||||||
|
@ -48,13 +48,13 @@ def generate_django_model(schema, group, version, kind):
|
||||||
return model_class
|
return model_class
|
||||||
|
|
||||||
|
|
||||||
def build_object_fields(schema, name, verbose_name_prefix=None):
|
def build_object_fields(schema, name, verbose_name_prefix=None, parent_required=False):
|
||||||
required_fields = schema.get("required") or []
|
required_fields = schema.get("required") or []
|
||||||
properties = schema.get("properties") or {}
|
properties = schema.get("properties") or {}
|
||||||
fields = {}
|
fields = {}
|
||||||
|
|
||||||
for field_name, field_schema in properties.items():
|
for field_name, field_schema in properties.items():
|
||||||
is_required = field_name in required_fields
|
is_required = field_name in required_fields and parent_required
|
||||||
full_name = f"{name}.{field_name}"
|
full_name = f"{name}.{field_name}"
|
||||||
result = get_django_field(
|
result = get_django_field(
|
||||||
field_schema,
|
field_schema,
|
||||||
|
@ -85,8 +85,9 @@ def get_django_field(
|
||||||
verbose_name_prefix = verbose_name_prefix or ""
|
verbose_name_prefix = verbose_name_prefix or ""
|
||||||
verbose_name = f"{verbose_name_prefix} {deslugify(field_name)}".strip()
|
verbose_name = f"{verbose_name_prefix} {deslugify(field_name)}".strip()
|
||||||
|
|
||||||
|
# Pass down the requirement status from parent to child fields
|
||||||
kwargs = {
|
kwargs = {
|
||||||
"blank": not is_required,
|
"blank": not is_required, # All fields are optional by default
|
||||||
"null": not is_required,
|
"null": not is_required,
|
||||||
"help_text": field_schema.get("description"),
|
"help_text": field_schema.get("description"),
|
||||||
"validators": [],
|
"validators": [],
|
||||||
|
@ -118,8 +119,12 @@ def get_django_field(
|
||||||
elif field_type == "boolean":
|
elif field_type == "boolean":
|
||||||
return models.BooleanField(**kwargs)
|
return models.BooleanField(**kwargs)
|
||||||
elif field_type == "object":
|
elif field_type == "object":
|
||||||
|
# Here we pass down the requirement status to nested objects
|
||||||
return build_object_fields(
|
return build_object_fields(
|
||||||
field_schema, full_name, verbose_name_prefix=f"{verbose_name}:"
|
field_schema,
|
||||||
|
full_name,
|
||||||
|
verbose_name_prefix=f"{verbose_name}:",
|
||||||
|
parent_required=is_required,
|
||||||
)
|
)
|
||||||
elif field_type == "array":
|
elif field_type == "array":
|
||||||
# TODO: handle items / validate items, build multi-select input
|
# TODO: handle items / validate items, build multi-select input
|
||||||
|
@ -163,6 +168,12 @@ class CrdModelFormMixin:
|
||||||
current = current[part]
|
current = current[part]
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
def clean(self):
|
||||||
|
cleaned_data = super().clean()
|
||||||
|
# TODO implement custom validation logic
|
||||||
|
# nested_data = self.get_nested_data()
|
||||||
|
return cleaned_data
|
||||||
|
|
||||||
|
|
||||||
def generate_model_form_class(model):
|
def generate_model_form_class(model):
|
||||||
meta_attrs = {
|
meta_attrs = {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue