diff --git a/src/servala/core/migrations/0008_created_and_updated.py b/src/servala/core/migrations/0008_created_and_updated.py new file mode 100644 index 0000000..9c20f81 --- /dev/null +++ b/src/servala/core/migrations/0008_created_and_updated.py @@ -0,0 +1,134 @@ +# Generated by Django 5.2b1 on 2025-03-26 14:54 + +import django.utils.timezone +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("core", "0007_service_definition"), + ] + + operations = [ + migrations.AddField( + model_name="cloudprovider", + name="created_at", + field=models.DateTimeField( + auto_now_add=True, + default=django.utils.timezone.now, + verbose_name="Created", + ), + preserve_default=False, + ), + migrations.AddField( + model_name="cloudprovider", + name="updated_at", + field=models.DateTimeField(auto_now=True, verbose_name="Last updated"), + ), + migrations.AddField( + model_name="controlplane", + name="created_at", + field=models.DateTimeField( + auto_now_add=True, + default=django.utils.timezone.now, + verbose_name="Created", + ), + preserve_default=False, + ), + migrations.AddField( + model_name="controlplane", + name="updated_at", + field=models.DateTimeField(auto_now=True, verbose_name="Last updated"), + ), + migrations.AddField( + model_name="plan", + name="created_at", + field=models.DateTimeField( + auto_now_add=True, + default=django.utils.timezone.now, + verbose_name="Created", + ), + preserve_default=False, + ), + migrations.AddField( + model_name="plan", + name="updated_at", + field=models.DateTimeField(auto_now=True, verbose_name="Last updated"), + ), + migrations.AddField( + model_name="service", + name="created_at", + field=models.DateTimeField( + auto_now_add=True, + default=django.utils.timezone.now, + verbose_name="Created", + ), + preserve_default=False, + ), + migrations.AddField( + model_name="service", + name="updated_at", + field=models.DateTimeField(auto_now=True, verbose_name="Last updated"), + ), + migrations.AddField( + model_name="servicecategory", + name="created_at", + field=models.DateTimeField( + auto_now_add=True, + default=django.utils.timezone.now, + verbose_name="Created", + ), + preserve_default=False, + ), + migrations.AddField( + model_name="servicecategory", + name="updated_at", + field=models.DateTimeField(auto_now=True, verbose_name="Last updated"), + ), + migrations.AddField( + model_name="servicedefinition", + name="created_at", + field=models.DateTimeField( + auto_now_add=True, + default=django.utils.timezone.now, + verbose_name="Created", + ), + preserve_default=False, + ), + migrations.AddField( + model_name="servicedefinition", + name="updated_at", + field=models.DateTimeField(auto_now=True, verbose_name="Last updated"), + ), + migrations.AddField( + model_name="serviceoffering", + name="created_at", + field=models.DateTimeField( + auto_now_add=True, + default=django.utils.timezone.now, + verbose_name="Created", + ), + preserve_default=False, + ), + migrations.AddField( + model_name="serviceoffering", + name="updated_at", + field=models.DateTimeField(auto_now=True, verbose_name="Last updated"), + ), + migrations.AddField( + model_name="serviceofferingcontrolplane", + name="created_at", + field=models.DateTimeField( + auto_now_add=True, + default=django.utils.timezone.now, + verbose_name="Created", + ), + preserve_default=False, + ), + migrations.AddField( + model_name="serviceofferingcontrolplane", + name="updated_at", + field=models.DateTimeField(auto_now=True, verbose_name="Last updated"), + ), + ] diff --git a/src/servala/core/models/service.py b/src/servala/core/models/service.py index f44e9e6..9bd97b9 100644 --- a/src/servala/core/models/service.py +++ b/src/servala/core/models/service.py @@ -8,8 +8,10 @@ from encrypted_fields.fields import EncryptedJSONField from kubernetes import config from kubernetes.client.rest import ApiException +from servala.core.models.mixins import ServalaModelMixin -class ServiceCategory(models.Model): + +class ServiceCategory(ServalaModelMixin, models.Model): """ Categories for services, e.g. "Databases", "Storage", "Compute". """ @@ -40,7 +42,7 @@ class ServiceCategory(models.Model): return self.name -class Service(models.Model): +class Service(ServalaModelMixin, models.Model): """ A service that can be offered, e.g. "PostgreSQL", "MinIO", "Kubernetes". """ @@ -89,10 +91,11 @@ def validate_api_credentials(value): return validate_dict(value, required_fields) -class ControlPlane(models.Model): +class ControlPlane(ServalaModelMixin, models.Model): """ Note: ControlPlanes are called "Service Provider Zone" in the user-facing frontend. """ + name = models.CharField(max_length=100, verbose_name=_("Name")) description = models.TextField(blank=True, verbose_name=_("Description")) # Either contains the fields "certificate_authority_data", "server" and "token", or is empty @@ -180,7 +183,7 @@ class ControlPlane(models.Model): return False, _("Connection error: {}").format(str(e)) -class CloudProvider(models.Model): +class CloudProvider(ServalaModelMixin, models.Model): """ A cloud provider, e.g. "Exoscale". """ @@ -205,7 +208,7 @@ class CloudProvider(models.Model): return self.name -class Plan(models.Model): +class Plan(ServalaModelMixin, models.Model): """ Each service offering can have multiple plans, e.g. for different tiers. """ @@ -239,7 +242,7 @@ def validate_api_definition(value): return validate_dict(value, required_fields) -class ServiceDefinition(models.Model): +class ServiceDefinition(ServalaModelMixin, models.Model): """ Configuration/service implementation: contains information on which CompositeResourceDefinition (aka XRD) implements a service on a ControlPlane. @@ -282,7 +285,7 @@ class ServiceDefinition(models.Model): return self.name -class ServiceOfferingControlPlane(models.Model): +class ServiceOfferingControlPlane(ServalaModelMixin, models.Model): """ Each combination of ServiceOffering and ControlPlane can have a different ServiceDefinition, which is here modeled as the "through" model. @@ -368,7 +371,7 @@ class ServiceOfferingControlPlane(models.Model): return generate_model_form_class(self.django_model) -class ServiceOffering(models.Model): +class ServiceOffering(ServalaModelMixin, models.Model): """ A service offering, e.g. "PostgreSQL on AWS", "MinIO on GCP". """