LIL-661 Сделать минимальное количество уроков 2

remotes/origin/hotfix/LIL-661
gzbender 8 years ago
parent 534fb4467e
commit a9fac722cf
  1. 21
      apps/payment/models.py
  2. 19
      apps/payment/views.py
  3. 1
      project/templates/blocks/popup_buy.html
  4. 47
      web/src/js/modules/popup.js

@ -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'),

@ -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,

@ -103,6 +103,7 @@
<div class="order__info">
<div class="order__label">ШКОЛА</div>
<div class="order__days"></div>
<div class="order__error"></div>
</div>
<div class="order__foot">
<div class="order__subtitle">Итого, за месяц:</div>

@ -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 = '<del>'+response.data.price+'</del> '+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 = '<del>'+response.data.price+'</del> '+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);
}
});

Loading…
Cancel
Save