forked from uncloud/uncloud
128 lines
4.1 KiB
Python
128 lines
4.1 KiB
Python
from rest_framework import viewsets, permissions
|
|
from rest_framework.response import Response
|
|
from django.db import transaction
|
|
from django.utils import timezone
|
|
|
|
from .models import *
|
|
from .serializers import *
|
|
|
|
from uncloud_pay.helpers import ProductViewSet
|
|
from uncloud_pay.models import Order
|
|
from uncloud_vm.models import VMProduct, VMDiskProduct
|
|
|
|
def create_managed_vm(cores, ram, disk_size, image, order):
|
|
# Create VM
|
|
disk = VMDiskProduct(
|
|
owner=order.owner,
|
|
order=order,
|
|
size_in_gb=disk_size,
|
|
image=image)
|
|
vm = VMProduct(
|
|
name="Managed Service Host",
|
|
owner=order.owner,
|
|
cores=cores,
|
|
ram_in_gb=ram,
|
|
primary_disk=disk)
|
|
disk.vm = vm
|
|
|
|
vm.save()
|
|
disk.save()
|
|
|
|
return vm
|
|
|
|
|
|
class MatrixServiceProductViewSet(ProductViewSet):
|
|
permission_classes = [permissions.IsAuthenticated]
|
|
serializer_class = MatrixServiceProductSerializer
|
|
|
|
def get_queryset(self):
|
|
return MatrixServiceProduct.objects.filter(owner=self.request.user)
|
|
|
|
def get_serializer_class(self):
|
|
if self.action == 'create':
|
|
return OrderMatrixServiceProductSerializer
|
|
else:
|
|
return MatrixServiceProductSerializer
|
|
|
|
@transaction.atomic
|
|
def create(self, request):
|
|
# Extract serializer data.
|
|
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.objects.create(
|
|
recurring_period=order_recurring_period,
|
|
owner=request.user,
|
|
billing_address=order_billing_address,
|
|
starting_date=timezone.now()
|
|
)
|
|
order.save()
|
|
|
|
# Create unerderlying VM.
|
|
data = serializer.validated_data.pop('vm')
|
|
vm = create_managed_vm(
|
|
order=order,
|
|
cores=data['cores'],
|
|
ram=data['ram_in_gb'],
|
|
disk_size=data['primary_disk']['size_in_gb'],
|
|
image=MatrixServiceProduct.base_image())
|
|
|
|
# Create service.
|
|
service = serializer.save(
|
|
order=order,
|
|
owner=request.user,
|
|
vm=vm)
|
|
|
|
return Response(serializer.data)
|
|
|
|
class GenericServiceProductViewSet(ProductViewSet):
|
|
permission_classes = [permissions.IsAuthenticated]
|
|
|
|
def get_queryset(self):
|
|
return GenericServiceProduct.objects.filter(owner=self.request.user)
|
|
|
|
def get_serializer_class(self):
|
|
if self.action == 'create':
|
|
return OrderGenericServiceProductSerializer
|
|
else:
|
|
return GenericServiceProductSerializer
|
|
|
|
@transaction.atomic
|
|
def create(self, request):
|
|
# Extract serializer data.
|
|
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.objects.create(
|
|
recurring_period=order_recurring_period,
|
|
owner=request.user,
|
|
billing_address=order_billing_address,
|
|
starting_date=timezone.now()
|
|
)
|
|
order.save()
|
|
|
|
# Create service.
|
|
print(serializer.validated_data)
|
|
service = serializer.save(order=order, owner=request.user)
|
|
|
|
# XXX: Move this to some kind of on_create hook in parent
|
|
# Product class?
|
|
order.add_record(
|
|
service.one_time_price,
|
|
service.recurring_price,
|
|
service.description)
|
|
|
|
# XXX: Move this to some kind of on_create hook in parent
|
|
# Product class?
|
|
order.add_record(
|
|
service.one_time_price,
|
|
service.recurring_price,
|
|
service.description)
|
|
|
|
return Response(serializer.data)
|