Initialize Django project #8

Merged
rixx merged 34 commits from 1-initialize-project into main 2025-03-16 09:09:26 +00:00
2 changed files with 167 additions and 103 deletions
Showing only changes of commit 5a08fcad6b - Show all commits

View file

@ -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 import django.db.models.deletion
from django.conf import settings from django.conf import settings
from django.db import migrations, models from django.db import migrations, models
import servala.core.models.user
class Migration(migrations.Migration): class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ dependencies = []
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [ 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( migrations.CreateModel(
name="User", name="User",
fields=[ fields=[
@ -151,7 +75,101 @@ class Migration(migrations.Migration):
), ),
], ],
options={ 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( migrations.CreateModel(
@ -186,6 +204,10 @@ class Migration(migrations.Migration):
), ),
), ),
], ],
options={
"verbose_name": "Control plane",
"verbose_name_plural": "Control planes",
},
), ),
migrations.CreateModel( migrations.CreateModel(
name="Organization", name="Organization",
@ -210,6 +232,10 @@ class Migration(migrations.Migration):
), ),
), ),
], ],
options={
"verbose_name": "Organization",
"verbose_name_plural": "Organizations",
},
), ),
migrations.CreateModel( migrations.CreateModel(
name="OrganizationMembership", name="OrganizationMembership",
@ -259,6 +285,10 @@ class Migration(migrations.Migration):
), ),
), ),
], ],
options={
"verbose_name": "Organization membership",
"verbose_name_plural": "Organization memberships",
},
), ),
migrations.AddField( migrations.AddField(
model_name="organization", model_name="organization",
@ -318,6 +348,10 @@ class Migration(migrations.Migration):
), ),
), ),
], ],
options={
"verbose_name": "Service category",
"verbose_name_plural": "Service categories",
},
), ),
migrations.CreateModel( migrations.CreateModel(
name="Service", name="Service",
@ -347,7 +381,9 @@ class Migration(migrations.Migration):
), ),
( (
"external_links", "external_links",
models.JSONField(blank=True, verbose_name="External links"), models.JSONField(
blank=True, null=True, verbose_name="External links"
),
), ),
( (
"category", "category",
@ -359,6 +395,10 @@ class Migration(migrations.Migration):
), ),
), ),
], ],
options={
"verbose_name": "Service",
"verbose_name_plural": "Services",
},
), ),
migrations.CreateModel( migrations.CreateModel(
name="ServiceOffering", name="ServiceOffering",
@ -381,7 +421,7 @@ class Migration(migrations.Migration):
models.ManyToManyField( models.ManyToManyField(
related_name="offerings", related_name="offerings",
to="core.controlplane", 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, on_delete=django.db.models.deletion.PROTECT,
related_name="offerings", related_name="offerings",
to="core.cloudprovider", to="core.cloudprovider",
verbose_name="Providers", verbose_name="Provider",
), ),
), ),
( (
@ -399,10 +439,14 @@ class Migration(migrations.Migration):
on_delete=django.db.models.deletion.PROTECT, on_delete=django.db.models.deletion.PROTECT,
related_name="offerings", related_name="offerings",
to="core.service", to="core.service",
verbose_name="Services", verbose_name="Service",
), ),
), ),
], ],
options={
"verbose_name": "Service offering",
"verbose_name_plural": "Service offerings",
},
), ),
migrations.CreateModel( migrations.CreateModel(
name="Plan", name="Plan",
@ -421,9 +465,20 @@ class Migration(migrations.Migration):
"description", "description",
models.TextField(blank=True, verbose_name="Description"), models.TextField(blank=True, verbose_name="Description"),
), ),
("features", models.JSONField(verbose_name="Features")), (
("pricing", models.JSONField(verbose_name="Pricing")), "features",
("term", models.DurationField(verbose_name="Term")), 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", "service_offering",
models.ForeignKey( models.ForeignKey(
@ -434,5 +489,9 @@ class Migration(migrations.Migration):
), ),
), ),
], ],
options={
"verbose_name": "Plan",
"verbose_name_plural": "Plans",
},
), ),
] ]

View file

@ -39,19 +39,20 @@ class Service(models.Model):
""" """
name = models.CharField(max_length=100, verbose_name=_("Name")) 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( category = models.ForeignKey(
to="ServiceCategory", to="ServiceCategory",
on_delete=models.PROTECT, on_delete=models.PROTECT,
related_name="services", related_name="services",
verbose_name=_("Category"), 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: class Meta:
verbose_name = _("Service") verbose_name = _("Service")
@ -96,7 +97,9 @@ class CloudProvider(models.Model):
null=True, null=True,
verbose_name=_("Logo"), 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: class Meta:
verbose_name = _("Cloud provider") verbose_name = _("Cloud provider")
@ -114,10 +117,12 @@ class Plan(models.Model):
name = models.CharField(max_length=100, verbose_name=_("Name")) name = models.CharField(max_length=100, verbose_name=_("Name"))
description = models.TextField(blank=True, verbose_name=_("Description")) description = models.TextField(blank=True, verbose_name=_("Description"))
# TODO schema # TODO schema
features = models.JSONField(verbose_name=_("Features")) features = models.JSONField(verbose_name=_("Features"), null=True, blank=True)
# TODO schema # TODO schema
pricing = models.JSONField(verbose_name=_("Pricing")) pricing = models.JSONField(verbose_name=_("Pricing"), null=True, blank=True)
term = models.DurationField(verbose_name=_("Term")) term = models.PositiveIntegerField(
verbose_name=_("Term"), help_text=_("Term in months")
)
service_offering = models.ForeignKey( service_offering = models.ForeignKey(
to="ServiceOffering", to="ServiceOffering",
on_delete=models.PROTECT, on_delete=models.PROTECT,
@ -138,24 +143,24 @@ class ServiceOffering(models.Model):
A service offering, e.g. "PostgreSQL on AWS", "MinIO on GCP". A service offering, e.g. "PostgreSQL on AWS", "MinIO on GCP".
""" """
description = models.TextField(blank=True, verbose_name=_("Description"))
service = models.ForeignKey( service = models.ForeignKey(
to="Service", to="Service",
on_delete=models.PROTECT, on_delete=models.PROTECT,
related_name="offerings", related_name="offerings",
verbose_name=_("Services"), verbose_name=_("Service"),
) )
provider = models.ForeignKey( provider = models.ForeignKey(
to="CloudProvider", to="CloudProvider",
on_delete=models.PROTECT, on_delete=models.PROTECT,
related_name="offerings", related_name="offerings",
verbose_name=_("Providers"), verbose_name=_("Provider"),
) )
control_plane = models.ManyToManyField( control_plane = models.ManyToManyField(
to="ControlPlane", to="ControlPlane",
related_name="offerings", related_name="offerings",
verbose_name=_("Control plane"), verbose_name=_("Control planes"),
) )
description = models.TextField(blank=True, verbose_name=_("Description"))
class Meta: class Meta:
verbose_name = _("Service offering") verbose_name = _("Service offering")