Rough first draft of service models
This commit is contained in:
parent
c850310754
commit
9c59005eb5
2 changed files with 149 additions and 0 deletions
|
@ -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",
|
||||
]
|
||||
|
|
133
src/servala/core/models/service.py
Normal file
133
src/servala/core/models/service.py
Normal 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"),
|
||||
)
|
Loading…
Add table
Add a link
Reference in a new issue