from django.contrib.auth import get_user_model from rest_framework import serializers from .models import * from .helpers import get_balance_for from functools import reduce from uncloud_vm.serializers import VMProductSerializer from uncloud_vm.models import VMProduct # TODO: remove magic numbers for decimal fields class BillRecordSerializer(serializers.Serializer): order = serializers.CharField() description = serializers.CharField() recurring_period = serializers.CharField() recurring_price = serializers.DecimalField(max_digits=10, decimal_places=2) amount = serializers.DecimalField(max_digits=10, decimal_places=2) class BillSerializer(serializers.ModelSerializer): records = BillRecordSerializer(many=True, read_only=True) class Meta: model = Bill fields = ['owner', 'total', 'due_date', 'creation_date', 'starting_date', 'ending_date', 'records'] class PaymentSerializer(serializers.ModelSerializer): class Meta: model = Payment fields = ['owner', 'amount', 'source', 'timestamp'] class PaymentMethodSerializer(serializers.ModelSerializer): class Meta: model = PaymentMethod fields = '__all__' class ProductSerializer(serializers.Serializer): vms = VMProductSerializer(many=True, read_only=True) class OrderRecordSerializer(serializers.ModelSerializer): class Meta: model = OrderRecord fields = ['setup_fee', 'recurring_price', 'description'] class OrderSerializer(serializers.ModelSerializer): records = OrderRecordSerializer(many=True, read_only=True) class Meta: model = Order fields = ['uuid', 'creation_date', 'starting_date', 'ending_date', 'bill', 'recurring_period', 'records', 'recurring_price', 'setup_fee'] class UserSerializer(serializers.ModelSerializer): class Meta: model = get_user_model() fields = ['username', 'email', 'balance'] # Display current 'balance' balance = serializers.SerializerMethodField('get_balance') def __sum_balance(self, entries): return reduce(lambda acc, entry: acc + entry.amount, entries, 0) def get_balance(self, user): return get_balance_for(user)