From a9fac722cf03c2e0097c421de3b14bd0e8047991 Mon Sep 17 00:00:00 2001 From: gzbender Date: Thu, 20 Sep 2018 14:51:27 +0500 Subject: [PATCH] =?UTF-8?q?LIL-661=20=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D1=82?= =?UTF-8?q?=D1=8C=20=D0=BC=D0=B8=D0=BD=D0=B8=D0=BC=D0=B0=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D0=BE=D0=B5=20=D0=BA=D0=BE=D0=BB=D0=B8=D1=87=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D0=B2=D0=BE=20=D1=83=D1=80=D0=BE=D0=BA=D0=BE=D0=B2=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/payment/models.py | 21 +++++------ apps/payment/views.py | 19 ++++++---- project/templates/blocks/popup_buy.html | 1 + web/src/js/modules/popup.js | 47 ++++++++++++++++--------- 4 files changed, 54 insertions(+), 34 deletions(-) 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 @@
ШКОЛА
+
Итого, за месяц:
diff --git a/web/src/js/modules/popup.js b/web/src/js/modules/popup.js index 3793a62c..4ee8d45c 100644 --- a/web/src/js/modules/popup.js +++ b/web/src/js/modules/popup.js @@ -50,6 +50,7 @@ $(document).ready(function () { if(data === '.js-popup-buy') { console.log('reset selected'); + popup.data('day', $this.data('day') || ''); $('[data-day]').prop('checked', false); if ($this.text() === 'продлить') { @@ -147,8 +148,34 @@ $(document).ready(function () { }); function updateCart(){ - var $orderPrice = $('.order_price_text'); + var update = response => { + var text = '0p.'; + if(response && response.data && response.data.amount){ + if(response.data.price != response.data.amount) { + text = ''+response.data.price+' '+response.data.amount+'р.'; + } else { + text = response.data.amount+'p.'; + } + } + $price.html(text); + if(weekdays.length && (day || weekdays.length > 1)){ + $btnBuy.attr('href', link+'?'+decodeURIComponent($.param({ + weekdays: weekdays, + }, true))).removeClass('disabled').prop('disabled', false); + $error.text(''); + } + else{ + $btnBuy.attr('href', '').addClass('disabled').prop('disabled', true); + $error.text(day ? 'Выберите хотя бы 1 день для дополнения текущей подписки' : 'Выберите минимум 2 дня для покупки'); + } + $('.order__days').html(daysText.length ? daysText.join(', ') : 'Ничего не выбрано'); + } + var $btnBuy = $('.but_btn_popup'); + var link = $btnBuy.data('link'); + var $price = $('.order_price_text'); + var $error = $('.order__error'); var days = ['', 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота', 'Воскресенье']; + var day = popup.data('day'); var weekdays = []; var daysText = []; $('[data-day]').each(function() { @@ -161,24 +188,10 @@ $(document).ready(function () { if(weekdays.length){ api.getPaymentAmount({ user: window.LIL_STORE.user.id, weekdays: weekdays }) - .then((response) => { - var text = ''; - if(response.data.price != response.data.amount) { - text = ''+response.data.price+' '+response.data.amount+'р.'; - } else { - text = response.data.amount+'p.'; - } - $orderPrice.html(text); - }); + .then(update).catch(update); } else { - $orderPrice.html('0p.'); + update(); } - $('.order__days').html(daysText.length ? daysText.join(', ') : 'Ничего не выбрано'); - - var link = $('.but_btn_popup').data('link'); - - link = link+'?'+decodeURIComponent($.param({weekdays: weekdays}, true)); - $('.but_btn_popup').attr('href', link); } });