diff --git a/uncloud/uncloud_pay/helpers.py b/uncloud/uncloud_pay/helpers.py new file mode 100644 index 0000000..8daef2e --- /dev/null +++ b/uncloud/uncloud_pay/helpers.py @@ -0,0 +1,45 @@ +import uuid + +from django.db import models +from django.contrib.auth import get_user_model +from django.utils.translation import gettext_lazy as _ + +# See https://docs.djangoproject.com/en/dev/ref/models/fields/#field-choices-enum-types +class RecurringPeriod(models.TextChoices): + ONE_TIME = 'ONCE', _('Onetime') + PER_YEAR = 'YEAR', _('Per Year') + PER_MONTH = 'MONTH', _('Per Month') + PER_MINUTE = 'MINUTE', _('Per Minute') + PER_DAY = 'DAY', _('Per Day') + PER_HOUR = 'HOUR', _('Per Hour') + PER_SECOND = 'SECOND', _('Per Second') + +class Product(models.Model): + uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) + owner = models.ForeignKey(get_user_model(), + on_delete=models.CASCADE, + editable=False) + + description = "" + + status = models.CharField(max_length=256, + choices = ( + ('pending', 'Pending'), + ('being_created', 'Being created'), + ('active', 'Active'), + ('deleted', 'Deleted') + ), + default='pending' + ) + + order = models.ForeignKey('uncloud_pay.Order', + on_delete=models.CASCADE, + editable=False, + null=True) + + @property + def recurring_price(self, recurring_period=RecurringPeriod.PER_MONTH): + pass # To be implemented in child. + + class Meta: + abstract = True diff --git a/uncloud/uncloud_pay/models.py b/uncloud/uncloud_pay/models.py index c4506a2..5f05b9d 100644 --- a/uncloud/uncloud_pay/models.py +++ b/uncloud/uncloud_pay/models.py @@ -1,23 +1,15 @@ +import uuid + from django.db import models from django.contrib.auth import get_user_model from django.core.validators import MinValueValidator -from django.utils.translation import gettext_lazy as _ -import uuid +from .helpers import RecurringPeriod +import uncloud_vm.models as vmmodels AMOUNT_MAX_DIGITS=10 AMOUNT_DECIMALS=2 -# See https://docs.djangoproject.com/en/dev/ref/models/fields/#field-choices-enum-types -class RecurringPeriod(models.TextChoices): - ONE_TIME = 'ONCE', _('Onetime') - PER_YEAR = 'YEAR', _('Per Year') - PER_MONTH = 'MONTH', _('Per Month') - PER_MINUTE = 'MINUTE', _('Per Minute') - PER_DAY = 'DAY', _('Per Day') - PER_HOUR = 'HOUR', _('Per Hour') - PER_SECOND = 'SECOND', _('Per Second') - class Bill(models.Model): owner = models.ForeignKey(get_user_model(), on_delete=models.CASCADE) @@ -63,8 +55,7 @@ class Order(models.Model): @property def products(self): # Blows up due to circular dependency... - # vms = VMProduct.objects.filter(order=self) - vms = [] + vms = vmmodels.VMProduct.objects.all() #filter(order=self) return vms # def amount(self): @@ -116,36 +107,3 @@ class Payment(models.Model): ), default='unknown') timestamp = models.DateTimeField(editable=False) - - - - -class Product(models.Model): - uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) - owner = models.ForeignKey(get_user_model(), - on_delete=models.CASCADE, - editable=False) - - description = "" - - status = models.CharField(max_length=256, - choices = ( - ('pending', 'Pending'), - ('being_created', 'Being created'), - ('active', 'Active'), - ('deleted', 'Deleted') - ), - default='pending' - ) - - order = models.ForeignKey(Order, - on_delete=models.CASCADE, - editable=False, - null=True) - - @property - def recurring_price(self, recurring_period=RecurringPeriod.PER_MONTH): - pass # To be implemented in child. - - class Meta: - abstract = True diff --git a/uncloud/uncloud_pay/serializers.py b/uncloud/uncloud_pay/serializers.py index d08f9cf..406b751 100644 --- a/uncloud/uncloud_pay/serializers.py +++ b/uncloud/uncloud_pay/serializers.py @@ -23,7 +23,7 @@ class PaymentMethodSerializer(serializers.ModelSerializer): fields = ['owner', 'primary', 'source', 'description'] class ProductSerializer(serializers.Serializer): - vms = VMProductSerializer(many=True, required=False) + vms = VMProductSerializer(many=True, required=False, queryset=VMProduct.objects.all()) def create(self, validated_data): owner = validated_data.pop('owner') @@ -31,7 +31,7 @@ class ProductSerializer(serializers.Serializer): vms = validated_data.pop('vms') for vm in vms: - VMProduct.objects.create(owner=owner, order=order, **vm) + print(VMProduct.objects.create(owner=owner, order=order, **vm)) return True # FIXME: shoudl return created objects diff --git a/uncloud/uncloud_vm/models.py b/uncloud/uncloud_vm/models.py index 2db99f3..02ec20f 100644 --- a/uncloud/uncloud_vm/models.py +++ b/uncloud/uncloud_vm/models.py @@ -1,9 +1,10 @@ -from django.db import models -from django.contrib.auth import get_user_model import uuid -from uncloud_pay.models import Product, RecurringPeriod -import uncloud_pay.models as pay_models +from django.db import models +from django.contrib.auth import get_user_model + +import uncloud_pay.models as paymodels +import uncloud_pay.helpers as payhelpers class VMHost(models.Model): @@ -33,7 +34,7 @@ class VMHost(models.Model): ) -class VMProduct(Product): +class VMProduct(payhelpers.Product): vmhost = models.ForeignKey(VMHost, on_delete=models.CASCADE, editable=False, @@ -45,8 +46,8 @@ class VMProduct(Product): ram_in_gb = models.FloatField() @property - def recurring_price(self, recurring_period=RecurringPeriod.PER_MONTH): - if recurring_period == RecurringPeriod.PER_MONTH: + def recurring_price(self, recurring_period=paymodels.RecurringPeriod.PER_MONTH): + if recurring_period == paymodels.RecurringPeriod.PER_MONTH: # TODO: move magic numbers in variables return self.cores * 3 + self.ram_in_gb * 2 else: @@ -79,7 +80,7 @@ class VMNetworkCard(models.Model): mac_address = models.IntegerField() -class VMSnapshotProduct(Product): +class VMSnapshotProduct(payhelpers.Product): price_per_gb_ssd = 0.35 price_per_gb_hdd = 1.5/100