diff --git a/api/v1/serializers/payment.py b/api/v1/serializers/payment.py index 8d50f217..7c48cf46 100644 --- a/api/v1/serializers/payment.py +++ b/api/v1/serializers/payment.py @@ -3,7 +3,7 @@ from rest_framework import serializers from apps.payment.models import ( AuthorBalance, Payment, CoursePayment, SchoolPayment, - GiftCertificatePayment) + GiftCertificatePayment, UserBonus,) from .user import UserSerializer from .course import CourseSerializer @@ -200,3 +200,68 @@ class GiftCertificatePaymentSerializer(serializers.ModelSerializer): 'created_at', 'update_at', ) + + +class UserBonusCreateSerializer(serializers.ModelSerializer): + class Meta: + model = UserBonus + fields = ( + 'user', 'amount', 'payment', 'referral', 'created_at', 'is_service', 'action_name', + ) + read_only_fields = ( + 'id', + 'created_at', + ) + + def to_representation(self, instance): + return UserBonusSerializer(instance, context=self.context).to_representation(instance) + + +class UserBonusSerializer(serializers.ModelSerializer): + user = UserSerializer() + payment = serializers.SerializerMethodField() + referral = serializers.SerializerMethodField() + + class Meta: + model = UserBonus + fields = ( + 'user', 'amount', 'payment', 'referral', 'created_at', 'is_service', 'action_name', + ) + read_only_fields = ( + 'id', + 'user', + 'created_at', + ) + + def get_payment(self, instance): + try: + p = instance.payment + except Exception: + return None + if not p: + return None + data = { + 'id': p.id, + 'created_at': p.created_at, + 'amount': p.amount, + 'data': p.data, + 'status': p.status, + } + if isinstance(instance.payment, CoursePayment): + data['course'] = { + 'id': p.course.id, + 'title': p.course.title, + } + return data + + def get_referral(self, instance): + try: + r = instance.referral + except Exception: + return None + if not r: + return None + return { + 'id': r.id, + 'referral': UserSerializer(instance=r.referral).data, + } diff --git a/api/v1/urls.py b/api/v1/urls.py index b86acbbc..07baaaf1 100644 --- a/api/v1/urls.py +++ b/api/v1/urls.py @@ -19,7 +19,7 @@ from .views import ( SchoolScheduleViewSet, LiveLessonViewSet, PaymentViewSet, ObjectCommentsViewSet, ContestViewSet, ContestWorkViewSet, - AuthorBalanceUsersViewSet, CaptureEmail, FAQViewSet, UserGalleryViewSet) + AuthorBalanceUsersViewSet, CaptureEmail, FAQViewSet, UserGalleryViewSet, BonusesViewSet) router = DefaultRouter() router.register(r'author-requests', AuthorRequestViewSet, base_name='author-requests') @@ -43,10 +43,9 @@ router.register(r'galleries', GalleryViewSet, base_name='galleries') router.register(r'gallery-images', GalleryImageViewSet, base_name='gallery-images') router.register(r'faq', FAQViewSet, base_name='faq') router.register(r'school-schedules', SchoolScheduleViewSet, base_name='school-schedules') - +router.register(r'bonuses', BonusesViewSet, base_name='bonuses') router.register(r'users', UserViewSet, base_name='users') router.register(r'user-gallery', UserGalleryViewSet, base_name='user-gallery') - router.register(r'contests', ContestViewSet, base_name='contests') router.register(r'contest-works', ContestWorkViewSet, base_name='contest_works') diff --git a/api/v1/views.py b/api/v1/views.py index 3164c00a..c2b43019 100644 --- a/api/v1/views.py +++ b/api/v1/views.py @@ -39,7 +39,7 @@ from .serializers.school import ( ) from .serializers.payment import ( AuthorBalanceSerializer, AuthorBalanceCreateSerializer, - PaymentSerializer, + PaymentSerializer, UserBonusSerializer, UserBonusCreateSerializer, CoursePaymentCreateSerializer, SchoolPaymentCreateSerializer) from .serializers.user import ( AuthorRequestSerializer, @@ -68,7 +68,7 @@ from apps.content.models import ( Contest, ContestWork, FAQ) from apps.payment.models import ( AuthorBalance, Payment, - CoursePayment, SchoolPayment, + CoursePayment, SchoolPayment, UserBonus, ) from apps.school.models import SchoolSchedule, LiveLesson from apps.user.models import AuthorRequest @@ -724,7 +724,37 @@ class CaptureEmail(views.APIView): return Response({'status': 'ok'}) - class FAQViewSet(ExtendedModelViewSet): queryset = FAQ.objects.all() serializer_class = FAQSerializer + + +class BonusesViewSet(ExtendedModelViewSet): + queryset = UserBonus.objects.all() + serializer_class = UserBonusCreateSerializer + serializer_class_map = { + 'list': UserBonusSerializer, + } + permission_classes = (IsAdmin,) + filter_fields = ('user', 'referral', 'payment', 'is_service', 'action_name') + search_fields = ( + 'action_name', + 'user__email', + 'user__first_name', + 'user__last_name', + 'referral__referral__email', + 'referral__referral__first_name', + 'referral__referral__last_name', + ) + + def list(self, request, *args, **kwargs): + queryset = self.filter_queryset(self.get_queryset()) + + if request.query_params.get('page'): + page = self.paginate_queryset(queryset) + if page is not None: + serializer = self.get_serializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.get_serializer(queryset, many=True) + return Response(serializer.data) diff --git a/apps/payment/models.py b/apps/payment/models.py index e9abf4d4..5b4e7615 100644 --- a/apps/payment/models.py +++ b/apps/payment/models.py @@ -304,7 +304,7 @@ class GiftCertificatePayment(Payment): class UserBonus(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='bonuses') - amount = models.DecimalField(max_digits=8, decimal_places=2, default=0, editable=False) + amount = models.DecimalField(max_digits=8, decimal_places=2, default=0) payment = models.ForeignKey(Payment, on_delete=models.SET_NULL, null=True) referral = models.ForeignKey('user.Referral', on_delete=models.SET_NULL, null=True) created_at = models.DateTimeField(auto_now_add=True)