diff --git a/api/v1/serializers/payment.py b/api/v1/serializers/payment.py index 6268a63d..0d4aec8b 100644 --- a/api/v1/serializers/payment.py +++ b/api/v1/serializers/payment.py @@ -46,8 +46,30 @@ class AuthorBalanceCreateSerializer(serializers.ModelSerializer): return AuthorBalanceSerializer(instance, context=self.context).to_representation(instance) +class PaymentSerializer(serializers.ModelSerializer): + user = UserSerializer() + + class Meta: + model = Payment + fields = BASE_PAYMENT_FIELDS + read_only_fields = ( + 'id', + 'user', + 'created_at', + 'update_at', + ) + + def to_representation(self, instance): + if isinstance(instance, CoursePayment): + return CoursePaymentSerializer(instance, context=self.context).to_representation(instance) + elif isinstance(instance, SchoolPayment): + return SchoolPaymentSerializer(instance, context=self.context).to_representation(instance) + + class AuthorBalanceSerializer(serializers.ModelSerializer): author = UserSerializer() + # payment = PaymentSerializer() + payment = serializers.SerializerMethodField() class Meta: model = AuthorBalance @@ -70,25 +92,23 @@ class AuthorBalanceSerializer(serializers.ModelSerializer): 'payment', ) - -class PaymentSerializer(serializers.ModelSerializer): - user = UserSerializer() - - class Meta: - model = Payment - fields = BASE_PAYMENT_FIELDS - read_only_fields = ( - 'id', - 'user', - 'created_at', - 'update_at', - ) - - def to_representation(self, instance): - if isinstance(instance, CoursePayment): - return CoursePaymentSerializer(instance, context=self.context).to_representation(instance) - elif isinstance(instance, SchoolPayment): - return SchoolPaymentSerializer(instance, context=self.context).to_representation(instance) + def get_payment(self, instance): + try: + p = instance.payment + except Exception: + return None + data = { + 'id': p.id, + 'created_at': p.created_at, + 'amount': p.amount, + 'data': p.data, + } + if isinstance(instance.payment, CoursePayment): + data['course'] = { + 'id': p.course.id, + 'title': p.course.title, + } + return data class CoursePaymentSerializer(serializers.ModelSerializer): diff --git a/apps/user/models.py b/apps/user/models.py index 3320adb2..fced16c5 100644 --- a/apps/user/models.py +++ b/apps/user/models.py @@ -93,7 +93,7 @@ class User(AbstractUser): @cached_property def balance(self): - aggregate = self.balances.filter( + income = self.balances.filter( type=0, payment__isnull=False, payment__status__isnull=False @@ -101,9 +101,13 @@ class User(AbstractUser): models.Sum('amount'), models.Sum('commission'), ) - amount = aggregate.get('amount__sum') or 0 - commission = aggregate.get('commission__sum') or 0 - return amount - commission + income_amount = income.get('amount__sum') or 0 + income_commission = income.get('commission__sum') or 0 + + payout = self.balances.filter(type=1, status=1).aggregate(models.Sum('amount')) + payout_amount = payout.get('amount__sum') or 0 + + return income_amount - income_commission - payout_amount @cached_property def bonus(self):