diff --git a/api/v1/serializers/payment.py b/api/v1/serializers/payment.py index b388be21..4330401f 100644 --- a/api/v1/serializers/payment.py +++ b/api/v1/serializers/payment.py @@ -46,26 +46,6 @@ 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() @@ -96,11 +76,14 @@ class AuthorBalanceSerializer(serializers.ModelSerializer): 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'] = { diff --git a/api/v1/views.py b/api/v1/views.py index a01f9d6d..df0d180c 100644 --- a/api/v1/views.py +++ b/api/v1/views.py @@ -1,7 +1,8 @@ from datetime import datetime +from decimal import Decimal from django.contrib.auth import get_user_model - +from django.db.models import Q from rest_framework import status, views, viewsets, generics from rest_framework.decorators import detail_route, list_route, action, permission_classes, authentication_classes from rest_framework.response import Response @@ -76,6 +77,7 @@ User = get_user_model() class AuthorBalanceViewSet(ExtendedModelViewSet): queryset = AuthorBalance.objects.filter( + Q(type=1) | Q(payment__status__in=Payment.PW_PAID_STATUSES), author__role__in=[User.AUTHOR_ROLE, User.ADMIN_ROLE, User.TEACHER_ROLE], ) serializer_class = AuthorBalanceCreateSerializer @@ -90,6 +92,34 @@ class AuthorBalanceViewSet(ExtendedModelViewSet): 'author__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) + + @action(methods=['post'], detail=False, url_path='add-withdrawal') + def add_withdrawal(self, request): + author_id = request.data.get('author_id') + amount = request.data.get('amount') + card = request.data.get('card') + if not all([author_id, amount, card]): + return Response(status=status.HTTP_400_BAD_REQUEST) + AuthorBalance.objects.create( + author_id=author_id, + type=AuthorBalance.OUT, + amount=Decimal(amount), + status=AuthorBalance.ACCEPTED, + card=card, + ) + return Response(status=status.HTTP_200_OK) + class BanerViewSet(ExtendedModelViewSet): queryset = Baner.objects.all() @@ -391,6 +421,18 @@ class UserViewSet(ExtendedModelViewSet): # 'delete': IsAdmin, # } + 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) + @list_route(methods=['get']) def me(self, request): serializer = self.get_serializer_class() diff --git a/apps/auth/templates/auth/password_reset.html b/apps/auth/templates/auth/password_reset.html index c611ee51..a9a3af16 100644 --- a/apps/auth/templates/auth/password_reset.html +++ b/apps/auth/templates/auth/password_reset.html @@ -3,7 +3,11 @@ {% block content %}

Для восстановления пароля нажмите кнопку ниже.

- Нажмите для восстановления + Нажмите для восстановления

Или скопируйте ссылку ниже, и вставьте её в адресную строку браузера.

{{ domain }}{% url 'lilcity:password_reset_confirm' uidb64=uid token=token %}

diff --git a/apps/course/templates/course/courses.html b/apps/course/templates/course/courses.html index f56279f6..edc9a7ce 100644 --- a/apps/course/templates/course/courses.html +++ b/apps/course/templates/course/courses.html @@ -57,7 +57,7 @@
{% if page_obj.has_next %} - + {% endif %}
diff --git a/apps/course/views.py b/apps/course/views.py index 6b578923..07ca6bad 100644 --- a/apps/course/views.py +++ b/apps/course/views.py @@ -236,7 +236,7 @@ class CourseView(DetailView): class CoursesView(ListView): model = Course context_object_name = 'course_items' - paginate_by = 6 + paginate_by = 12 def get(self, request, *args, **kwargs): self.object_list = self.get_queryset() diff --git a/apps/payment/models.py b/apps/payment/models.py index 0d406323..a953d5e8 100644 --- a/apps/payment/models.py +++ b/apps/payment/models.py @@ -61,7 +61,8 @@ class AuthorBalance(models.Model): verbose_name_plural = 'Балансы' def save(self, *args, **kwargs): - self.commission = self.calc_commission() + if self.status != self.ACCEPTED: + self.commission = self.calc_commission() if self.type == self.OUT: if self.status == self.DECLINED and not self.declined_send_at: send_email( diff --git a/web/src/components/blocks/BlockImageText.vue b/web/src/components/blocks/BlockImageText.vue index 2946c36b..ddba0845 100644 --- a/web/src/components/blocks/BlockImageText.vue +++ b/web/src/components/blocks/BlockImageText.vue @@ -30,6 +30,7 @@ @@ -65,4 +66,4 @@ 'lil-image': LilImage, }, } - \ No newline at end of file + diff --git a/web/src/components/redactor/VueRedactor.vue b/web/src/components/redactor/VueRedactor.vue index 1b99545b..93d8547c 100644 --- a/web/src/components/redactor/VueRedactor.vue +++ b/web/src/components/redactor/VueRedactor.vue @@ -1,5 +1,5 @@