forked from uncloud/uncloud
v3: seed timeframes, begin order definition
This commit is contained in:
parent
42e200b564
commit
69e564cba6
6 changed files with 123 additions and 53 deletions
|
@ -5,8 +5,11 @@ from .models import *
|
||||||
|
|
||||||
for m in [
|
for m in [
|
||||||
Order,
|
Order,
|
||||||
|
PricePerTime,
|
||||||
Product,
|
Product,
|
||||||
|
ProductOrder,
|
||||||
Resource,
|
Resource,
|
||||||
|
ResourceOrder,
|
||||||
TimeFrame,
|
TimeFrame,
|
||||||
]:
|
]:
|
||||||
admin.site.register(m)
|
admin.site.register(m)
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Generated by Django 4.0 on 2022-01-02 18:06
|
# Generated by Django 4.0 on 2022-01-02 19:50
|
||||||
|
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
import django.db.models.deletion
|
import django.db.models.deletion
|
||||||
|
@ -14,6 +14,22 @@ class Migration(migrations.Migration):
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Currency',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('name', models.CharField(max_length=128, unique=True)),
|
||||||
|
('short_name', models.CharField(max_length=3, unique=True)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='PricePerTime',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('price', models.FloatField()),
|
||||||
|
('currency', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='app.currency')),
|
||||||
|
],
|
||||||
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='Product',
|
name='Product',
|
||||||
fields=[
|
fields=[
|
||||||
|
@ -21,6 +37,18 @@ class Migration(migrations.Migration):
|
||||||
('name', models.CharField(max_length=128, unique=True)),
|
('name', models.CharField(max_length=128, unique=True)),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Resource',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('name', models.CharField(max_length=128, unique=True)),
|
||||||
|
('unit', models.CharField(max_length=128, unique=True)),
|
||||||
|
('minimum_units', models.FloatField(blank=True, null=True)),
|
||||||
|
('maximum_units', models.FloatField(blank=True, null=True)),
|
||||||
|
('step_size', models.FloatField(default=1)),
|
||||||
|
('price_per_time', models.ManyToManyField(blank=True, to='app.PricePerTime')),
|
||||||
|
],
|
||||||
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='TimeFrame',
|
name='TimeFrame',
|
||||||
fields=[
|
fields=[
|
||||||
|
@ -29,6 +57,33 @@ class Migration(migrations.Migration):
|
||||||
('seconds', models.IntegerField(blank=True, null=True)),
|
('seconds', models.IntegerField(blank=True, null=True)),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='ResourceOrder',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('value', models.FloatField()),
|
||||||
|
('resource', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='app.resource')),
|
||||||
|
('timeframe', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='app.timeframe')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='ProductOrder',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('product', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='app.product')),
|
||||||
|
('resources', models.ManyToManyField(to='app.ResourceOrder')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='product',
|
||||||
|
name='resources',
|
||||||
|
field=models.ManyToManyField(to='app.Resource'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='pricepertime',
|
||||||
|
name='timeframe',
|
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='app.timeframe'),
|
||||||
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='Order',
|
name='Order',
|
||||||
fields=[
|
fields=[
|
||||||
|
@ -37,7 +92,7 @@ class Migration(migrations.Migration):
|
||||||
('starting_date', models.DateTimeField(default=django.utils.timezone.now)),
|
('starting_date', models.DateTimeField(default=django.utils.timezone.now)),
|
||||||
('ending_date', models.DateTimeField(blank=True, null=True)),
|
('ending_date', models.DateTimeField(blank=True, null=True)),
|
||||||
('owner', models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, to='uauth.user')),
|
('owner', models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, to='uauth.user')),
|
||||||
('product', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='app.product')),
|
('product', models.ManyToManyField(blank=True, to='app.ProductOrder')),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|
28
uncloud_v3/app/migrations/0002_auto_20220102_1953.py
Normal file
28
uncloud_v3/app/migrations/0002_auto_20220102_1953.py
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
# Generated by Django 4.0 on 2022-01-02 19:53
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
def gen_timeframes(apps, schema_editor):
|
||||||
|
# We can't import the Person model directly as it may be a newer
|
||||||
|
# version than this migration expects. We use the historical version.
|
||||||
|
TimeFrame = apps.get_model('app', 'TimeFrame')
|
||||||
|
|
||||||
|
for timeframe in [ (3600, "1 hour"),
|
||||||
|
(86400, "1 day"),
|
||||||
|
(7*86400, "7 days"),
|
||||||
|
(30*86400, "30 days"),
|
||||||
|
(365*86400, "365 days") ]:
|
||||||
|
tf = TimeFrame(name=timeframe[1],
|
||||||
|
seconds=timeframe[0])
|
||||||
|
tf.save()
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('app', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RunPython(gen_timeframes),
|
||||||
|
]
|
|
@ -1,27 +0,0 @@
|
||||||
# Generated by Django 4.0 on 2022-01-02 18:28
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
import django.db.models.deletion
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('app', '0001_initial'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.CreateModel(
|
|
||||||
name='Resource',
|
|
||||||
fields=[
|
|
||||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
||||||
('name', models.CharField(max_length=128, unique=True)),
|
|
||||||
('unit', models.CharField(max_length=128, unique=True)),
|
|
||||||
('minimum_units', models.FloatField(blank=True, null=True)),
|
|
||||||
('maximum_units', models.FloatField(blank=True, null=True)),
|
|
||||||
('step_size', models.FloatField(default=1)),
|
|
||||||
('price', models.FloatField()),
|
|
||||||
('timeframe', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='app.timeframe')),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
]
|
|
|
@ -1,18 +0,0 @@
|
||||||
# Generated by Django 4.0 on 2022-01-02 18:33
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('app', '0002_resource'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='product',
|
|
||||||
name='resources',
|
|
||||||
field=models.ManyToManyField(to='app.Resource'),
|
|
||||||
),
|
|
||||||
]
|
|
|
@ -2,6 +2,14 @@ from django.db import models
|
||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
from django.utils import timezone
|
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):
|
class TimeFrame(models.Model):
|
||||||
name = models.CharField(max_length=128, unique=True)
|
name = models.CharField(max_length=128, unique=True)
|
||||||
seconds = models.IntegerField(null=True, blank=True)
|
seconds = models.IntegerField(null=True, blank=True)
|
||||||
|
@ -25,6 +33,14 @@ class TimeFrame(models.Model):
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "{} ({})".format(self.name, self.secs_to_name(self.seconds))
|
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):
|
class Resource(models.Model):
|
||||||
name = models.CharField(max_length=128, unique=True) # CPU, RAM
|
name = models.CharField(max_length=128, unique=True) # CPU, RAM
|
||||||
unit = models.CharField(max_length=128, unique=True) # Count, GB
|
unit = models.CharField(max_length=128, unique=True) # Count, GB
|
||||||
|
@ -32,11 +48,18 @@ class Resource(models.Model):
|
||||||
maximum_units = models.FloatField(null=True, blank=True) # might have max
|
maximum_units = models.FloatField(null=True, blank=True) # might have max
|
||||||
step_size = models.FloatField(default=1) # might/must step size
|
step_size = models.FloatField(default=1) # might/must step size
|
||||||
|
|
||||||
timeframe = models.ForeignKey(TimeFrame, on_delete=models.CASCADE)
|
price_per_time = models.ManyToManyField(PricePerTime, blank=True)
|
||||||
price = models.FloatField() # Per unit and per time frame
|
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f"{self.name}: {self.minimum_units}-{self.maximum_units} (+/-){self.step_size} {self.unit} {self.price}/{self.timeframe}"
|
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):
|
class Product(models.Model):
|
||||||
|
@ -49,12 +72,18 @@ class Product(models.Model):
|
||||||
# textconfig = models.ManyToManyField(ProductTextConfiguration)
|
# textconfig = models.ManyToManyField(ProductTextConfiguration)
|
||||||
# textfieldconfig = models.ManyToManyField(ProductTextFieldConfiguration)
|
# textfieldconfig = models.ManyToManyField(ProductTextFieldConfiguration)
|
||||||
|
|
||||||
# timeframes = models.ManyToManyField(TimeFrame)
|
|
||||||
resources = models.ManyToManyField(Resource)
|
resources = models.ManyToManyField(Resource)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.name
|
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):
|
class Order(models.Model):
|
||||||
owner = models.ForeignKey(get_user_model(), on_delete=models.CASCADE, editable=False)
|
owner = models.ForeignKey(get_user_model(), on_delete=models.CASCADE, editable=False)
|
||||||
|
@ -63,6 +92,6 @@ class Order(models.Model):
|
||||||
starting_date = models.DateTimeField(default=timezone.now)
|
starting_date = models.DateTimeField(default=timezone.now)
|
||||||
ending_date = models.DateTimeField(blank=True, null=True)
|
ending_date = models.DateTimeField(blank=True, null=True)
|
||||||
|
|
||||||
product = models.ForeignKey(Product, on_delete=models.CASCADE)
|
product = models.ManyToManyField(ProductOrder, blank=True)
|
||||||
#resourceconfigs = models.ManyToManyField(ResourceConfig)
|
|
||||||
#textconfigs = models.ManyToManyField(ResourceConfig)
|
#textconfigs = models.ManyToManyField(ResourceConfig)
|
||||||
|
|
Loading…
Reference in a new issue