Initialize Django project #8
2 changed files with 167 additions and 103 deletions
|
@ -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",
|
||||||
|
},
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|
|
@ -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")
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue