diff --git a/apps/payment/models.py b/apps/payment/models.py index 761021bc..338615ed 100644 --- a/apps/payment/models.py +++ b/apps/payment/models.py @@ -118,6 +118,7 @@ class Payment(PolymorphicModel): if school_payment: user = school_payment.user weekdays = school_payment.weekdays + weekdays = weekdays and set(map(int, weekdays)) discount = 0 price = 0 if course: @@ -128,18 +129,17 @@ class Payment(PolymorphicModel): user=user, date_start__lte=now().date(), date_end__gte=now().date(), - add_days=False, status__in=[ Pingback.PINGBACK_TYPE_REGULAR, Pingback.PINGBACK_TYPE_GOODWILL, Pingback.PINGBACK_TYPE_RISK_REVIEWED_ACCEPTED, ], ) - school_schedules_purchased = school_payments.annotate( + school_schedules_purchased = list(school_payments.annotate( joined_weekdays=Func(F('weekdays'), function='unnest', ) - ).values_list('joined_weekdays', flat=True).distinct() - weekdays = set(map(int, weekdays)) - set(school_schedules_purchased) - prev_school_payment = school_payments.last() + ).values_list('joined_weekdays', flat=True).distinct()) + weekdays = weekdays - set(school_schedules_purchased) + prev_school_payment = school_payments.filter(add_days=False).last() add_days = bool(prev_school_payment) else: add_days = False @@ -147,11 +147,12 @@ class Payment(PolymorphicModel): weekday__in=weekdays, ) if add_days: - weekdays_count = weekdays_in_date_range(now().date(), prev_school_payment.date_end) - all_weekdays_count = weekdays_in_date_range(prev_school_payment.date_start, prev_school_payment.date_end) - for ss in school_schedules: - price += ss.month_price // all_weekdays_count.get(ss.weekday, 0) * weekdays_count.get( - ss.weekday, 0) + if weekdays: + weekdays_count = weekdays_in_date_range(now().date(), prev_school_payment.date_end) + all_weekdays_count = weekdays_in_date_range(prev_school_payment.date_start, prev_school_payment.date_end) + for ss in school_schedules: + price += ss.month_price // all_weekdays_count.get(ss.weekday, 0) * weekdays_count.get( + ss.weekday, 0) else: price = school_schedules.aggregate( models.Sum('month_price'), diff --git a/apps/payment/views.py b/apps/payment/views.py index 09ac590d..951f8619 100644 --- a/apps/payment/views.py +++ b/apps/payment/views.py @@ -27,7 +27,7 @@ from apps.course.models import Course from apps.school.models import SchoolSchedule from apps.payment.tasks import transaction_to_mixpanel, product_payment_to_mixpanel, transaction_to_roistat -from .models import AuthorBalance, CoursePayment, SchoolPayment +from .models import AuthorBalance, CoursePayment, SchoolPayment, Payment logger = logging.getLogger('django') @@ -102,13 +102,13 @@ class SchoolBuyView(TemplateView): weekdays = set(request.GET.getlist('weekdays', [])) roistat_visit = request.COOKIES.get('roistat_visit', None) if not weekdays: - messages.error(request, 'Выберите несколько дней недели.') - return redirect('school:summer-school') + messages.error(request, 'Выберите дни для покупки.') + return redirect('school:school') try: weekdays = [int(weekday) for weekday in weekdays] except ValueError: messages.error(request, 'Ошибка выбора дней недели.') - return redirect('school:summer-school') + return redirect('school:school') prev_school_payment = SchoolPayment.objects.filter( user=request.user, date_start__lte=now().date(), @@ -122,6 +122,11 @@ class SchoolBuyView(TemplateView): ).first() # ??? first? add_days = bool(prev_school_payment) if add_days: + amount_data = Payment.calc_amount(user=request.user, weekdays=weekdays) + if not amount_data.get('amount'): + messages.error(request, 'Выбранные дни отсутствуют в оставшемся периоде подписки.') + return redirect('school:school') + school_payment = SchoolPayment.objects.create( user=request.user, weekdays=weekdays, @@ -130,10 +135,10 @@ class SchoolBuyView(TemplateView): add_days=True, roistat_visit=roistat_visit, ) - if school_payment.amount <= 0: - messages.error(request, 'Выбранные дни отсутствуют в оставшемся периоде подписки') - return redirect(reverse_lazy('school:school')) else: + if len(weekdays) < 2: + messages.error(request, 'Выберите минимум 2 дня недели.') + return redirect('school:school') school_payment = SchoolPayment.objects.create( user=request.user, weekdays=weekdays, diff --git a/project/templates/blocks/popup_buy.html b/project/templates/blocks/popup_buy.html index 3294f273..061f0b8c 100644 --- a/project/templates/blocks/popup_buy.html +++ b/project/templates/blocks/popup_buy.html @@ -103,6 +103,7 @@