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)
 |