diff --git a/uncloud_pay/models.py b/uncloud_pay/models.py index 66ad4d2..47c1fe1 100644 --- a/uncloud_pay/models.py +++ b/uncloud_pay/models.py @@ -56,7 +56,7 @@ def default_payment_delay(): # See https://docs.djangoproject.com/en/dev/ref/models/fields/#field-choices-enum-types class RecurringPeriod(models.IntegerChoices): """ - We don't support months are years, because the vary in length. + We don't support months are years, because they vary in length. This is not only complicated, but also unfair to the user, as the user pays the same amount for different durations. """ @@ -648,6 +648,9 @@ class Product(UncloudModel): @property def one_time_price(self): + """ + Default is 0 CHF + """ return 0 @property diff --git a/uncloud_vm/models.py b/uncloud_vm/models.py index 440df08..e8504a6 100644 --- a/uncloud_vm/models.py +++ b/uncloud_vm/models.py @@ -54,6 +54,7 @@ class VMHost(UncloudModel): return self.usable_cores - sum([vm.cores for vm in self.vms ]) + class VMProduct(Product): vmhost = models.ForeignKey( VMHost, on_delete=models.CASCADE, editable=False, blank=True, null=True @@ -75,10 +76,14 @@ class VMProduct(Product): return self.cores * 3 + self.ram_in_gb * 4 def __str__(self): - return "VM {} ({}): {} cores {} gb ram".format(self.uuid, - self.name, - self.cores, - self.ram_in_gb) + if self.name: + name = f"{self.name} ({self.id})" + else: + name = self.id + + return "VM {}: {} cores {} gb ram".format(name, + self.cores, + self.ram_in_gb) @property def description(self): @@ -140,6 +145,16 @@ class VMDiskImageProduct(UncloudModel): self.size_in_gb) +# See https://docs.djangoproject.com/en/dev/ref/models/fields/#field-choices-enum-types +class VMDiskType(models.TextChoices): + """ + Types of disks that can be attached to VMs + """ + CEPH_SSD = 'ceph/ssd' + CEPH_HDD = 'ceph/hdd' + LOCAL_SSD = 'local/ssd' + LOCAL_HDD = 'local/hdd' + class VMDiskProduct(Product): """ @@ -155,6 +170,11 @@ class VMDiskProduct(Product): size_in_gb = models.FloatField(blank=True) + disk_type = models.CharField( + max_length=20, + choices=VMDiskType.choices, + default=VMDiskType.CEPH_SSD) + @property def description(self): return "Disk for VM '{}': {}GB".format(self.vm.name, self.size_in_gb) @@ -163,10 +183,9 @@ class VMDiskProduct(Product): def recurring_price(self): return (self.size_in_gb / 10) * 3.5 - # Sample code for clean method - # Ensures that a VMDiskProduct can only be created from a VMDiskImageProduct # that is in status 'active' + # This might not be need in "for billing only" constellations # def clean(self): # if self.image.status != 'active':