forked from uncloud/uncloud
97 lines
3.1 KiB
Python
97 lines
3.1 KiB
Python
from django.db import models
|
|
from django.contrib.auth import get_user_model
|
|
from django.utils import timezone
|
|
|
|
class Currency(models.Model):
|
|
name = models.CharField(max_length=128, unique=True)
|
|
short_name = models.CharField(max_length=3, unique=True)
|
|
|
|
def __str__(self):
|
|
return f"{self.name} {self.short_name}"
|
|
|
|
|
|
class TimeFrame(models.Model):
|
|
name = models.CharField(max_length=128, unique=True)
|
|
seconds = models.IntegerField(null=True, blank=True)
|
|
|
|
@staticmethod
|
|
def secs_to_name(secs):
|
|
name = ""
|
|
days = 0
|
|
hours = 0
|
|
|
|
if secs >= 24*3600:
|
|
days = secs // (24*3600)
|
|
secs -= (days*24*3600)
|
|
|
|
if secs >= 3600:
|
|
hours = secs // 3600
|
|
secs -= hours*3600
|
|
|
|
return f"{days} days {hours} hours {secs} seconds"
|
|
|
|
def __str__(self):
|
|
return "{} ({})".format(self.name, self.secs_to_name(self.seconds))
|
|
|
|
class PricePerTime(models.Model):
|
|
timeframe = models.ForeignKey(TimeFrame, on_delete=models.CASCADE)
|
|
price = models.FloatField()
|
|
currency = models.ForeignKey(Currency, on_delete=models.CASCADE)
|
|
|
|
def __str__(self):
|
|
return f"{self.price} {self.currency.short_name}/{self.timeframe}"
|
|
|
|
class Resource(models.Model):
|
|
name = models.CharField(max_length=128, unique=True) # CPU, RAM
|
|
unit = models.CharField(max_length=128, unique=True) # Count, GB
|
|
minimum_units = models.FloatField(null=True, blank=True) # might have min
|
|
maximum_units = models.FloatField(null=True, blank=True) # might have max
|
|
step_size = models.FloatField(default=1) # might/must step size
|
|
|
|
price_per_time = models.ManyToManyField(PricePerTime, blank=True)
|
|
|
|
def __str__(self):
|
|
return f"{self.name}: {self.minimum_units}-{self.maximum_units} (+/-){self.step_size} {self.unit}"
|
|
|
|
class ResourceOrder(models.Model):
|
|
"""
|
|
Resources that have been ordered
|
|
"""
|
|
timeframe = models.ForeignKey(TimeFrame, on_delete=models.CASCADE)
|
|
value = models.FloatField()
|
|
resource = models.ForeignKey(Resource, on_delete=models.CASCADE)
|
|
|
|
|
|
class Product(models.Model):
|
|
"""
|
|
Describes a product a user can buy
|
|
"""
|
|
|
|
name = models.CharField(max_length=128, unique=True)
|
|
|
|
# textconfig = models.ManyToManyField(ProductTextConfiguration)
|
|
# textfieldconfig = models.ManyToManyField(ProductTextFieldConfiguration)
|
|
|
|
resources = models.ManyToManyField(Resource)
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
|
|
class ProductOrder(models.Model):
|
|
"""
|
|
Describes a product a user bought
|
|
"""
|
|
product = models.ForeignKey(Product, on_delete=models.CASCADE)
|
|
resources = models.ManyToManyField(ResourceOrder)
|
|
|
|
|
|
class Order(models.Model):
|
|
owner = models.ForeignKey(get_user_model(), on_delete=models.CASCADE, editable=False)
|
|
|
|
creation_date = models.DateTimeField(auto_now_add=True)
|
|
starting_date = models.DateTimeField(default=timezone.now)
|
|
ending_date = models.DateTimeField(blank=True, null=True)
|
|
|
|
product = models.ManyToManyField(ProductOrder, blank=True)
|
|
|
|
#textconfigs = models.ManyToManyField(ResourceConfig)
|