From 5a08fcad6b17b48511b1ea9706fd0ebf80b33098 Mon Sep 17 00:00:00 2001 From: Tobias Kunze Date: Sun, 16 Mar 2025 09:44:30 +0100 Subject: [PATCH] Various small model fixes --- src/servala/core/migrations/0001_initial.py | 235 ++++++++++++-------- src/servala/core/models/service.py | 35 +-- 2 files changed, 167 insertions(+), 103 deletions(-) diff --git a/src/servala/core/migrations/0001_initial.py b/src/servala/core/migrations/0001_initial.py index f5e5295..583f43d 100644 --- a/src/servala/core/migrations/0001_initial.py +++ b/src/servala/core/migrations/0001_initial.py @@ -1,95 +1,19 @@ -# Generated by Django 5.2b1 on 2025-03-16 08:05 +# Generated by Django 5.2b1 on 2025-03-16 08:44 import django.db.models.deletion from django.conf import settings from django.db import migrations, models +import servala.core.models.user + class Migration(migrations.Migration): initial = True - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] + dependencies = [] operations = [ - migrations.CreateModel( - name="BillingEntity", - fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("name", models.CharField(max_length=100, verbose_name="Name")), - ( - "description", - models.TextField(blank=True, verbose_name="Description"), - ), - ( - "erp_reference", - models.CharField( - blank=True, max_length=100, verbose_name="ERP reference" - ), - ), - ], - ), - migrations.CreateModel( - name="CloudProvider", - fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("name", models.CharField(max_length=100, verbose_name="Name")), - ( - "description", - models.TextField(blank=True, verbose_name="Description"), - ), - ( - "logo", - models.ImageField( - blank=True, - null=True, - upload_to="public/service_providers", - verbose_name="Logo", - ), - ), - ( - "external_links", - models.JSONField(blank=True, verbose_name="External links"), - ), - ], - ), - migrations.CreateModel( - name="OrganizationOrigin", - fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("name", models.CharField(max_length=100, verbose_name="Name")), - ( - "description", - models.TextField(blank=True, verbose_name="Description"), - ), - ], - ), migrations.CreateModel( name="User", fields=[ @@ -151,7 +75,101 @@ class Migration(migrations.Migration): ), ], options={ - "abstract": False, + "verbose_name": "User", + "verbose_name_plural": "Users", + }, + managers=[ + ("objects", servala.core.models.user.UserManager()), + ], + ), + migrations.CreateModel( + name="BillingEntity", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("name", models.CharField(max_length=100, verbose_name="Name")), + ( + "description", + models.TextField(blank=True, verbose_name="Description"), + ), + ( + "erp_reference", + models.CharField( + blank=True, max_length=100, verbose_name="ERP reference" + ), + ), + ], + options={ + "verbose_name": "Billing entity", + "verbose_name_plural": "Billing entities", + }, + ), + migrations.CreateModel( + name="CloudProvider", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("name", models.CharField(max_length=100, verbose_name="Name")), + ( + "description", + models.TextField(blank=True, verbose_name="Description"), + ), + ( + "logo", + models.ImageField( + blank=True, + null=True, + upload_to="public/service_providers", + verbose_name="Logo", + ), + ), + ( + "external_links", + models.JSONField( + blank=True, null=True, verbose_name="External links" + ), + ), + ], + options={ + "verbose_name": "Cloud provider", + "verbose_name_plural": "Cloud providers", + }, + ), + migrations.CreateModel( + name="OrganizationOrigin", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("name", models.CharField(max_length=100, verbose_name="Name")), + ( + "description", + models.TextField(blank=True, verbose_name="Description"), + ), + ], + options={ + "verbose_name": "Organization origin", + "verbose_name_plural": "Organization origins", }, ), migrations.CreateModel( @@ -186,6 +204,10 @@ class Migration(migrations.Migration): ), ), ], + options={ + "verbose_name": "Control plane", + "verbose_name_plural": "Control planes", + }, ), migrations.CreateModel( name="Organization", @@ -210,6 +232,10 @@ class Migration(migrations.Migration): ), ), ], + options={ + "verbose_name": "Organization", + "verbose_name_plural": "Organizations", + }, ), migrations.CreateModel( name="OrganizationMembership", @@ -259,6 +285,10 @@ class Migration(migrations.Migration): ), ), ], + options={ + "verbose_name": "Organization membership", + "verbose_name_plural": "Organization memberships", + }, ), migrations.AddField( model_name="organization", @@ -318,6 +348,10 @@ class Migration(migrations.Migration): ), ), ], + options={ + "verbose_name": "Service category", + "verbose_name_plural": "Service categories", + }, ), migrations.CreateModel( name="Service", @@ -347,7 +381,9 @@ class Migration(migrations.Migration): ), ( "external_links", - models.JSONField(blank=True, verbose_name="External links"), + models.JSONField( + blank=True, null=True, verbose_name="External links" + ), ), ( "category", @@ -359,6 +395,10 @@ class Migration(migrations.Migration): ), ), ], + options={ + "verbose_name": "Service", + "verbose_name_plural": "Services", + }, ), migrations.CreateModel( name="ServiceOffering", @@ -381,7 +421,7 @@ class Migration(migrations.Migration): models.ManyToManyField( related_name="offerings", to="core.controlplane", - verbose_name="Control plane", + verbose_name="Control planes", ), ), ( @@ -390,7 +430,7 @@ class Migration(migrations.Migration): on_delete=django.db.models.deletion.PROTECT, related_name="offerings", to="core.cloudprovider", - verbose_name="Providers", + verbose_name="Provider", ), ), ( @@ -399,10 +439,14 @@ class Migration(migrations.Migration): on_delete=django.db.models.deletion.PROTECT, related_name="offerings", to="core.service", - verbose_name="Services", + verbose_name="Service", ), ), ], + options={ + "verbose_name": "Service offering", + "verbose_name_plural": "Service offerings", + }, ), migrations.CreateModel( name="Plan", @@ -421,9 +465,20 @@ class Migration(migrations.Migration): "description", models.TextField(blank=True, verbose_name="Description"), ), - ("features", models.JSONField(verbose_name="Features")), - ("pricing", models.JSONField(verbose_name="Pricing")), - ("term", models.DurationField(verbose_name="Term")), + ( + "features", + models.JSONField(blank=True, null=True, verbose_name="Features"), + ), + ( + "pricing", + models.JSONField(blank=True, null=True, verbose_name="Pricing"), + ), + ( + "term", + models.PositiveIntegerField( + help_text="Term in months", verbose_name="Term" + ), + ), ( "service_offering", models.ForeignKey( @@ -434,5 +489,9 @@ class Migration(migrations.Migration): ), ), ], + options={ + "verbose_name": "Plan", + "verbose_name_plural": "Plans", + }, ), ] diff --git a/src/servala/core/models/service.py b/src/servala/core/models/service.py index 7cf2edf..acf366b 100644 --- a/src/servala/core/models/service.py +++ b/src/servala/core/models/service.py @@ -39,19 +39,20 @@ class Service(models.Model): """ name = models.CharField(max_length=100, verbose_name=_("Name")) - description = models.TextField(blank=True, verbose_name=_("Description")) - logo = models.ImageField( - upload_to="public/services", blank=True, null=True, verbose_name=_("Logo") - ) - # TODO schema - external_links = models.JSONField(blank=True, verbose_name=_("External links")) - category = models.ForeignKey( to="ServiceCategory", on_delete=models.PROTECT, related_name="services", verbose_name=_("Category"), ) + description = models.TextField(blank=True, verbose_name=_("Description")) + logo = models.ImageField( + upload_to="public/services", blank=True, null=True, verbose_name=_("Logo") + ) + # TODO schema + external_links = models.JSONField( + null=True, blank=True, verbose_name=_("External links") + ) class Meta: verbose_name = _("Service") @@ -96,7 +97,9 @@ class CloudProvider(models.Model): null=True, verbose_name=_("Logo"), ) - external_links = models.JSONField(blank=True, verbose_name=_("External links")) + external_links = models.JSONField( + null=True, blank=True, verbose_name=_("External links") + ) class Meta: verbose_name = _("Cloud provider") @@ -114,10 +117,12 @@ class Plan(models.Model): name = models.CharField(max_length=100, verbose_name=_("Name")) description = models.TextField(blank=True, verbose_name=_("Description")) # TODO schema - features = models.JSONField(verbose_name=_("Features")) + features = models.JSONField(verbose_name=_("Features"), null=True, blank=True) # TODO schema - pricing = models.JSONField(verbose_name=_("Pricing")) - term = models.DurationField(verbose_name=_("Term")) + pricing = models.JSONField(verbose_name=_("Pricing"), null=True, blank=True) + term = models.PositiveIntegerField( + verbose_name=_("Term"), help_text=_("Term in months") + ) service_offering = models.ForeignKey( to="ServiceOffering", on_delete=models.PROTECT, @@ -138,24 +143,24 @@ class ServiceOffering(models.Model): A service offering, e.g. "PostgreSQL on AWS", "MinIO on GCP". """ - description = models.TextField(blank=True, verbose_name=_("Description")) service = models.ForeignKey( to="Service", on_delete=models.PROTECT, related_name="offerings", - verbose_name=_("Services"), + verbose_name=_("Service"), ) provider = models.ForeignKey( to="CloudProvider", on_delete=models.PROTECT, related_name="offerings", - verbose_name=_("Providers"), + verbose_name=_("Provider"), ) control_plane = models.ManyToManyField( to="ControlPlane", related_name="offerings", - verbose_name=_("Control plane"), + verbose_name=_("Control planes"), ) + description = models.TextField(blank=True, verbose_name=_("Description")) class Meta: verbose_name = _("Service offering")