Make VM order-able again

This commit is contained in:
fnux 2020-04-18 13:51:31 +02:00
commit d794b24c86
5 changed files with 70 additions and 34 deletions

View file

@ -10,7 +10,7 @@ from rest_framework.response import Response
from rest_framework.exceptions import ValidationError
from .models import VMHost, VMProduct, VMSnapshotProduct, VMDiskProduct, VMDiskImageProduct, VMCluster
from uncloud_pay.models import Order
from uncloud_pay.models import Order, BillingAddress
from .serializers import *
from uncloud_pay.helpers import ProductViewSet
@ -136,9 +136,9 @@ class VMProductViewSet(ProductViewSet):
def get_queryset(self):
if self.request.user.is_superuser:
obj = VMProduct.objects.all()
obj = VMWithOSProduct.objects.all()
else:
obj = VMProduct.objects.filter(owner=self.request.user)
obj = VMWithOSProduct.objects.filter(owner=self.request.user)
return obj
@ -156,29 +156,39 @@ class VMProductViewSet(ProductViewSet):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
order_recurring_period = serializer.validated_data.pop("recurring_period")
order_billing_address = serializer.validated_data.pop("billing_address")
# Create base order.
order = Order(
recurring_period=order_recurring_period,
billing_address=order_billing_address,
owner=request.user,
starting_date=timezone.now()
)
order.save()
# Create disk image.
disk = VMDiskProduct(owner=request.user, order=order,
disk = VMDiskProduct(owner=request.user,
**serializer.validated_data.pop("primary_disk"))
vm = VMWithOSProduct(owner=request.user, primary_disk=disk,
**serializer.validated_data)
disk.vm = vm # XXX: Is this really needed?
# Create VM.
vm = serializer.save(owner=request.user, order=order, primary_disk=disk)
disk.vm = vm
# Create VM and Disk orders.
vm_order = Order.from_product(
vm,
recurring_period=order_recurring_period,
starting_date=timezone.now()
)
disk_order = Order.from_product(
disk,
recurring_period=order_recurring_period,
starting_date=timezone.now()
)
# Commit to DB.
vm.order = vm_order
vm.save()
vm_order.save()
disk.order = disk_order
disk_order.save()
disk.save()
return Response(VMProductSerializer(vm, context={'request': request}).data)
class NicoVMProductViewSet(ProductViewSet):
permission_classes = [permissions.IsAuthenticated]
serializer_class = NicoVMProductSerializer
@ -194,6 +204,7 @@ class NicoVMProductViewSet(ProductViewSet):
return Response(serializer.data)
###
# Admin stuff.