diff --git a/api/v1/serializers/payment.py b/api/v1/serializers/payment.py index 79a8d464..432310d8 100644 --- a/api/v1/serializers/payment.py +++ b/api/v1/serializers/payment.py @@ -46,8 +46,29 @@ 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 = serializers.SerializerMethodField() class Meta: model = AuthorBalance @@ -70,25 +91,23 @@ class AuthorBalanceSerializer(serializers.ModelSerializer): 'payment', ) - -class PaymentCreateSerializer(serializers.ModelSerializer): - - class Meta: - model = Payment - # fields = ( - # 'weekdays', - # 'date_start', - # 'date_end', - # ) - fields = '__all__' - read_only_fields = ( - 'id', - 'user', - 'created_at', - 'update_at', - ) - - + 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 PaymentSerializer(serializers.ModelSerializer): @@ -112,6 +131,7 @@ class PaymentSerializer(serializers.ModelSerializer): class CoursePaymentCreateSerializer(serializers.ModelSerializer): + class Meta: model = CoursePayment fields = BASE_PAYMENT_FIELDS + ('course',) @@ -124,13 +144,24 @@ class CoursePaymentCreateSerializer(serializers.ModelSerializer): ) -class CoursePaymentSerializer(CoursePaymentCreateSerializer): +class CoursePaymentSerializer(serializers.ModelSerializer): user = UserSerializer() course = CourseSerializer() + class Meta: + model = CoursePayment + fields = BASE_PAYMENT_FIELDS + ('course',) + read_only_fields = ( + 'id', + 'user', + 'course', + 'created_at', + 'update_at', + ) + class SchoolPaymentCreateSerializer(serializers.ModelSerializer): - user = UserSerializer() + class Meta: model = SchoolPayment fields = BASE_PAYMENT_FIELDS + ( @@ -146,14 +177,8 @@ class SchoolPaymentCreateSerializer(serializers.ModelSerializer): '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 SchoolPaymentSerializer(SchoolPaymentCreateSerializer): +class SchoolPaymentSerializer(serializers.ModelSerializer): user = UserSerializer() class Meta: diff --git a/api/v1/views.py b/api/v1/views.py index b12240c2..c161a90d 100644 --- a/api/v1/views.py +++ b/api/v1/views.py @@ -34,7 +34,7 @@ from .serializers.payment import ( AuthorBalanceSerializer, AuthorBalanceCreateSerializer, PaymentSerializer, CoursePaymentSerializer, SchoolPaymentSerializer, - PaymentCreateSerializer, CoursePaymentCreateSerializer, SchoolPaymentCreateSerializer) + CoursePaymentCreateSerializer, SchoolPaymentCreateSerializer) from .serializers.user import ( AuthorRequestSerializer, UserSerializer, UserPhotoSerializer, @@ -453,13 +453,9 @@ class AuthorRequestViewSet(ExtendedModelViewSet): filter_fields = ('status',) -class PaymentViewSet(ExtendedModelViewSet): +class PaymentViewSet(viewsets.ModelViewSet): queryset = Payment.objects.all() - serializer_class = PaymentCreateSerializer - serializer_class_map = { - 'list': PaymentSerializer, - 'retrieve': PaymentSerializer, - } + serializer_class = PaymentSerializer permission_classes = (IsAdmin,) filter_fields = ('status', 'user',) ordering_fields = ( @@ -472,14 +468,14 @@ class PaymentViewSet(ExtendedModelViewSet): def get_serializer(self, instance, *args, **kwargs): print('instance', type(instance), self.action) serializer_class = self.get_serializer_class() - if self.action == 'partial_update': + if 'update' in self.action: if isinstance(instance, CoursePayment): serializer_class = CoursePaymentCreateSerializer elif isinstance(instance, SchoolPayment): serializer_class = SchoolPaymentCreateSerializer print('serializer_class', serializer_class) kwargs['context'] = self.get_serializer_context() - return serializer_class(*args, **kwargs) + return serializer_class(instance, *args, **kwargs) def get_queryset(self): queryset = self.queryset diff --git a/apps/user/models.py b/apps/user/models.py index 0df7cd01..47008960 100644 --- a/apps/user/models.py +++ b/apps/user/models.py @@ -92,7 +92,7 @@ class User(AbstractUser): @property def balance(self): - aggregate = self.balances.filter( + income = self.balances.filter( type=0, payment__isnull=False, payment__status__isnull=False @@ -100,9 +100,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 @receiver(post_save, sender=User)