- {% if request.user.role == 1 or request.user.role == 2 %}
- {% for balance in request.user.balances.all %}
-
-
{{balance.payment.course.title}}
-
{{balance.amount}}
-
Получено
-
- {% endfor %}
- {% else %}
{% for payment in request.user.payments.all %}
-
{{payment.course.title}}
+ {% if payment.course %}
+
Курс. {{payment.course.title}}
+ {% else %}
+
+ Школа. {% if payment.date_start and payment.date_end %}{{ payment.date_start }} - {{ payment.date_end }}{% endif %}
+ {{ payment }}
+
+ {% endif %}
+ {% if payment.balance %}
+
{{payment.balance.amount}}
+ {% else %}
{{payment.amount}}
-
Получено
+ {% endif %}
+ {% if payment.balance.type == 1 %}
+
+ {% if payment.balance.status == 0 %}
+ Ожидается подтверждение выплаты
+ {% elif payment.balance.status == 1 %}
+ Выплачено
+ {% else %}
+ Выплата отменена
+ Причина: "{{ payment.balance.cause }}
+ {% endif %}
+
+ {% else %}
+
+ {% if payment.is_deliverable %}
+ Получено
+ {% elif payment.is_under_review %}
+ Ожидается подтверждение оплаты
+ {% else %}
+ Ошибка оплаты
+ {% endif %}
+
+ {% endif %}
{% endfor %}
- {% endif %}
diff --git a/apps/user/views.py b/apps/user/views.py
index 0cb5b6c1..6d959069 100644
--- a/apps/user/views.py
+++ b/apps/user/views.py
@@ -1,9 +1,12 @@
from io import BytesIO
from PIL import Image
from os.path import splitext
+from datetime import timedelta
+
from django.contrib.auth import login
+from django.core.exceptions import ValidationError
from django.shortcuts import render, reverse, redirect
-from django.views.generic import DetailView, UpdateView, TemplateView
+from django.views.generic import DetailView, UpdateView, TemplateView, FormView
from django.contrib import messages
from django.contrib.auth import get_user_model
from django.contrib.auth.decorators import login_required, permission_required
@@ -11,13 +14,14 @@ from django.contrib.auth.hashers import check_password, make_password
from django.http import Http404
from django.urls import reverse_lazy
from django.utils.decorators import method_decorator
+from django.utils.timezone import now
from apps.auth.tokens import verification_email_token
from apps.course.models import Course
-from apps.payment.models import CoursePayment
+from apps.payment.models import AuthorBalance, CoursePayment
from apps.notification.utils import send_email
-from .forms import UserEditForm
+from .forms import UserEditForm, WithdrawalForm
User = get_user_model()
@@ -31,6 +35,7 @@ def resend_email_verify(request):
return redirect('user-edit-profile', request.user.id)
+@method_decorator(login_required, name='dispatch')
class UserView(DetailView):
model = User
template_name = 'user/profile.html'
@@ -52,6 +57,7 @@ class UserView(DetailView):
return context
+@method_decorator(login_required, name='dispatch')
class NotificationEditView(TemplateView):
template_name = 'user/notification-settings.html'
@@ -59,13 +65,40 @@ class NotificationEditView(TemplateView):
return super().get(request)
-class PaymentHistoryView(TemplateView):
+@method_decorator(login_required, name='dispatch')
+class PaymentHistoryView(FormView):
template_name = 'user/payment-history.html'
+ form_class = WithdrawalForm
def get(self, request, pk=None):
return super().get(request)
+ def post(self, request, pk=None):
+ form = self.get_form()
+ if AuthorBalance.objects.filter(created_at__gte=now() - timedelta(days=30)).exists():
+ messages.error(request, 'Запрос на вывод средств можно сделать только один раз в 30 дней.')
+ return self.form_invalid(form)
+ if form.is_valid():
+ if request.user.balance < form.cleaned_data['amount']:
+ form.errors['amount'] = 'Сумма для вывода не может быть меньше средств на счету'
+ return self.form_invalid(form)
+ AuthorBalance.objects.create(
+ author=request.user,
+ type=AuthorBalance.OUT,
+ amount=form.cleaned_data['amount'],
+ status=AuthorBalance.PENDING,
+ card=form.cleaned_data['amount'],
+ )
+ return self.form_valid(form)
+ else:
+ return self.form_invalid(form)
+
+ def get_success_url(self):
+ success_url = reverse_lazy('user-edit-payments', args=[self.request.user.id])
+ return success_url
+
+@method_decorator(login_required, name='dispatch')
class UserEditView(UpdateView):
model = User
template_name = 'user/profile-settings.html'