Rough first draft of service models

This commit is contained in:
Tobias Kunze 2025-03-09 14:57:58 +01:00
parent c850310754
commit 9c59005eb5
2 changed files with 149 additions and 0 deletions

View file

@ -5,11 +5,27 @@ from .organization import (
OrganizationOrigin,
OrganizationRole,
)
from .service import (
ControlPlane,
Plan,
Service,
ServiceCategory,
ServiceOffering,
ServiceOfferingPlan,
ServiceProvider,
)
__all__ = [
"BillingEntity",
"ControlPlane",
"Organization",
"OrganizationMembership",
"OrganizationOrigin",
"OrganizationRole",
"Plan",
"Service",
"ServiceCategory",
"ServiceOffering",
"ServiceOfferingPlan",
"ServiceProvider",
]

View file

@ -0,0 +1,133 @@
from django.db import models
from django.utils.translation import gettext_lazy as _
class ServiceCategory(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/service_categories",
blank=True,
null=True,
verbose_name=_("Logo"),
)
parent = models.ForeignKey(
to="self",
on_delete=models.CASCADE,
related_name="children",
blank=True,
null=True,
verbose_name=_("Parent"),
)
def __str__(self):
return self.name
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"),
)
def __str__(self):
return self.name
class ControlPlane(models.Model):
name = models.CharField(max_length=100, verbose_name=_("Name"))
description = models.TextField(blank=True, verbose_name=_("Description"))
k8s_api_endpoint = models.URLField(verbose_name=_("Kubernetes API endpoint"))
# TODO: schema
api_credentials = models.JSONField(verbose_name=_("API credentials"))
def __str__(self):
return self.name
class ServiceProvider(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/service_providers",
blank=True,
null=True,
verbose_name=_("Logo"),
)
external_links = models.JSONField(blank=True, verbose_name=_("External links"))
control_plane = models.ForeignKey(
to="ControlPlane",
on_delete=models.PROTECT,
related_name="service_providers",
verbose_name=_("Control plane"),
)
def __str__(self):
return self.name
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"))
# TODO schema
pricing = models.JSONField(verbose_name=_("Pricing"))
term = models.DurationField(verbose_name=_("Term"))
def __str__(self):
return self.name
class ServiceOfferingPlan(models.Model):
offering = models.ForeignKey(
to="ServiceOffering",
on_delete=models.CASCADE,
related_name="offering_plans",
verbose_name=_("Offering"),
)
plan = models.ForeignKey(
to="Plan",
on_delete=models.CASCADE,
related_name="offering_plans",
verbose_name=_("Plan"),
)
pricing = models.JSONField(verbose_name=_("Pricing"))
class ServiceOffering(models.Model):
description = models.TextField(blank=True, verbose_name=_("Description"))
services = models.ManyToManyField(
to="Service",
related_name="offerings",
verbose_name=_("Services"),
)
providers = models.ManyToManyField(
to="ServiceProvider",
related_name="offerings",
verbose_name=_("Providers"),
)
control_plane = models.ForeignKey(
to="ControlPlane",
on_delete=models.PROTECT,
related_name="offerings",
verbose_name=_("Control plane"),
)
plans = models.ManyToManyField(
to="Plan",
through="ServiceOfferingPlan",
related_name="offerings",
verbose_name=_("Plans"),
)