uncloud-mravi/uncloud_service/views.py

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)