diff --git a/README.md b/README.md index 07e1764..ba6fdcd 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,7 @@ Then use ``uv`` to install the project and run its commands while you’re devel ```bash uv sync --dev uv run --env-file=.env src/manage.py migrate +uv run --env-file=.env src/manage.py createcachetable uv run --env-file=.env src/manage.py runserver ``` diff --git a/docker/run.sh b/docker/run.sh index f3c7f9a..bab8a08 100644 --- a/docker/run.sh +++ b/docker/run.sh @@ -8,6 +8,7 @@ export XDG_CONFIG_HOME="/app/config" echo "Applying database migrations" uv run src/manage.py migrate +uv run src/manage.py createcachetable echo "Starting Caddy" exec caddy run --config /app/config/caddy/Caddyfile --adapter caddyfile 2>&1 & diff --git a/src/servala/core/crd.py b/src/servala/core/crd.py new file mode 100644 index 0000000..6fc4219 --- /dev/null +++ b/src/servala/core/crd.py @@ -0,0 +1,127 @@ +import re + +from django.core.validators import MaxValueValidator, MinValueValidator, RegexValidator +from django.db import models +from django.forms.models import ModelForm, ModelFormMetaclass +from django.utils.translation import gettext_lazy as _ + + +def generate_django_model(schema, group, version, kind): + """ + Generates a virtual Django model from a Kubernetes CRD's OpenAPI v3 schema. + """ + spec = schema["properties"].get("spec") or {} + # defaults = {"apiVersion": f"{group}/{version}", "kind": kind} + + model_fields = {"__module__": "crd_models"} + model_fields.update(build_object_fields(spec, "spec")) + + meta_class = type("Meta", (), {"app_label": "crd_models"}) + model_fields["Meta"] = meta_class + + # create the model class + model_name = kind + model_class = type(model_name, (models.Model,), model_fields) + return model_class + + +def build_object_fields(schema, name, verbose_name_prefix=None): + required_fields = schema.get("required") or [] + properties = schema.get("properties") or {} + fields = {} + + for field_name, field_schema in properties.items(): + is_required = field_name in required_fields + full_name = f"{name}.{field_name}" + result = get_django_field( + field_schema, + is_required, + field_name, + full_name, + verbose_name_prefix=verbose_name_prefix, + ) + if isinstance(result, dict): + fields.update(result) + else: + fields[full_name] = result + return fields + + +def deslugify(title): + if "_" in title: + title.replace("_", " ") + return title.title() + return re.sub(r"(? +
+{% translate "Please choose your zone." %}
- {% else %} -- {% blocktranslate trimmed with zone=offering.control_planes.all.first.name %} - Your zone will be {{ zone }}. - {% endblocktranslate %} -
- {% endif %} -{% translate "We currently cannot offer this service, sorry!" %}
+ {% else %} + + {% endif %}