diff --git a/apps/payment/templates/payment/pay.html b/apps/payment/templates/payment/pay.html new file mode 100644 index 00000000..ec26e9ca --- /dev/null +++ b/apps/payment/templates/payment/pay.html @@ -0,0 +1,29 @@ +{% extends "templates/lilcity/index.html" %} +{% load static %} +{% load rupluralize from plural %} + +{% block content %} +
+
+ {% if school and request.user.bonus and not payment.bonus %} + {% if request.user.bonus >= payment.amount %} + Оплатить бонусами +

или купить онлайн

+ {% else %} +

Для оплаты части стоимости вы можете использовать бонусы

+ + {% endif %} + {% endif %} +
+ {% include "./paymentwall_widget.html" %} +
+
+
+{% endblock content %} + +{% block foot %} + +{% endblock foot %} diff --git a/apps/payment/templates/payment/paymentwall_widget.html b/apps/payment/templates/payment/paymentwall_widget.html index bdde28e0..08fc4c5f 100644 --- a/apps/payment/templates/payment/paymentwall_widget.html +++ b/apps/payment/templates/payment/paymentwall_widget.html @@ -1,9 +1,3 @@ -{% extends "templates/lilcity/index.html" %} {% load static %} {% block content %} -
-
- {% autoescape off %} - {{ widget }} - {% endautoescape %} -
-
-{% endblock content %} +{% autoescape off %} +{{ widget }} +{% endautoescape %} diff --git a/apps/payment/views.py b/apps/payment/views.py index 8eb30777..34eb6bc2 100644 --- a/apps/payment/views.py +++ b/apps/payment/views.py @@ -14,7 +14,7 @@ from django.http import HttpResponse, Http404 from django.shortcuts import redirect, get_object_or_404 from django.views.generic import View, TemplateView from django.views.decorators.csrf import csrf_exempt -from django.urls import reverse_lazy +from django.urls import reverse from django.utils.decorators import method_decorator from django.utils.timezone import now @@ -119,7 +119,8 @@ class CourseBuyView(TemplateView): @method_decorator(login_required, name='dispatch') class SchoolBuyView(TemplateView): - template_name = 'payment/paymentwall_widget.html' + # template_name = 'payment/paymentwall_widget.html' + template_name = 'payment/pay.html' def get(self, request, *args, **kwargs): host = urlsplit(self.request.META.get('HTTP_REFERER')) @@ -128,30 +129,39 @@ class SchoolBuyView(TemplateView): roistat_visit = request.COOKIES.get('roistat_visit', None) date_start = request.GET.get('date_start') duration = request.GET.get('duration') + payment_id = request.GET.get('payment_id') package = get_object_or_404(Package, duration=duration) date_start = date_start and datetime.datetime.strptime(date_start, '%Y-%m-%d').date() or now().date() - amount_data = SchoolPayment.calc_amount(package=package, user=request.user, date_start=date_start) - school_payment = SchoolPayment.objects.create( - user=request.user, - weekdays=amount_data.get('weekdays'), - roistat_visit=roistat_visit, - date_start=amount_data.get('date_start'), - date_end=amount_data.get('date_end'), - package=package, - ) + if payment_id: + school_payment = get_object_or_404(SchoolPayment, id=payment_id) + else: + amount_data = SchoolPayment.calc_amount(package=package, user=request.user, date_start=date_start) + school_payment = SchoolPayment.objects.create( + user=request.user, + weekdays=amount_data.get('weekdays'), + roistat_visit=roistat_visit, + date_start=amount_data.get('date_start'), + date_end=amount_data.get('date_end'), + package=package, + ) if use_bonuses and request.user.bonus: if request.user.bonus >= school_payment.amount: bonus = UserBonus.objects.create(amount= -school_payment.amount, user=request.user, payment=school_payment) school_payment.amount = 0 school_payment.status = Pingback.PINGBACK_TYPE_REGULAR else: - bonus = UserBonus.objects.create(amount= -request.user.bonus, user=request.user, - payment=school_payment) school_payment.amount -= request.user.bonus + bonus = UserBonus.objects.create(amount= -request.user.bonus, user=request.user, + payment=school_payment) school_payment.bonus = bonus school_payment.save() if school_payment.is_paid(): - return redirect(reverse_lazy('payment-success')) + return redirect('%s?duration=%s' % (reverse('payment-success'), duration)) + if payment_id and school_payment.bonus and not use_bonuses: + bonus = school_payment.bonus + school_payment.amount += school_payment.bonus + school_payment.bonus = None + bonus.delete() product = Product( f'school_{school_payment.id}', school_payment.amount, @@ -168,11 +178,17 @@ class SchoolBuyView(TemplateView): 'evaluation': 1, 'demo': 1, 'test_mode': 1, - 'success_url': host + str(reverse_lazy('payment-success')) + '?duration=%s' % duration, - 'failure_url': host + str(reverse_lazy('payment-error')), + 'success_url': host + reverse('payment-success') + '?duration=%s' % duration, + 'failure_url': host + reverse('payment-error'), } ) - return self.render_to_response(context={'widget': widget.get_html_code()}) + if self.request.is_ajax(): + self.template_name = 'payment/paymentwall_widget.html' + return self.render_to_response(context={ + 'widget': widget.get_html_code({'height': '400'}), + 'school': True, + 'payment': school_payment, + }) @method_decorator(login_required, name='dispatch') diff --git a/web/src/js/pages/pay.js b/web/src/js/pages/pay.js new file mode 100644 index 00000000..ea217e10 --- /dev/null +++ b/web/src/js/pages/pay.js @@ -0,0 +1,11 @@ +import $ from 'jquery'; + +$(document).ready(function () { + const $useBonuses = $('#use-bonuses-checkbox input'); + const $widget = $('#pw-widget'); + $useBonuses.change(e => { + $.get($useBonuses.data('url') + '&use_bonuses=' + ($useBonuses.prop('checked') ? 1 : '')).then(response => { + $widget.html(response); + }); + }); +}); diff --git a/web/src/sass/_common.sass b/web/src/sass/_common.sass index badaeaf4..8c5ca684 100755 --- a/web/src/sass/_common.sass +++ b/web/src/sass/_common.sass @@ -5238,6 +5238,27 @@ a width: 24px margin-bottom: -6px + +.pw-widget + display: inline-block + position: relative + + &:before + content: ' ' + position: absolute + top: 30% + left: 50% + width: 50px + height: 50px + border-left: 3px solid transparent + border: 3px solid #B5B5B5 + border-right: none + border-top: none + border-bottom: none + z-index: -1 + border-radius: 50% + animation: loading .6s infinite linear + .mobile-hide +m display: none diff --git a/web/webpack.config.js b/web/webpack.config.js index afdec32d..24404936 100644 --- a/web/webpack.config.js +++ b/web/webpack.config.js @@ -17,6 +17,7 @@ module.exports = { liveLesson: "./src/js/pages/live-lesson.js", freeLessons: "./src/js/pages/free-lessons.js", userGalleryEdit: "./src/js/pages/user-gallery-edit.js", + pay: "./src/js/pages/pay.js", mixpanel: "./src/js/third_party/mixpanel-2-latest.js", sprite: glob('./src/icons/*.svg'), images: glob('./src/img/*.*'),