remotes/origin/hotfix/LIL-691
gzbender 7 years ago
parent 63a0a33cf8
commit b3c499481c
  1. 8
      api/v1/serializers/config.py
  2. 2
      api/v1/views.py
  3. 8
      apps/auth/views.py
  4. 4
      apps/config/models.py
  5. 28
      apps/payment/migrations/0020_userbonus.py
  6. 77
      apps/payment/models.py
  7. 29
      apps/user/migrations/0023_referral.py
  8. 20
      apps/user/migrations/0024_referral_payment.py
  9. 20
      apps/user/migrations/0025_auto_20180820_0651.py
  10. 8
      apps/user/models.py
  11. 6
      apps/user/templates/user/bonus-history.html
  12. 7
      apps/user/views.py
  13. 4
      project/templates/blocks/lil_store_js.html
  14. 2
      project/views.py
  15. 2
      web/src/js/modules/api.js
  16. 4
      web/src/js/modules/common.js
  17. 2
      web/src/js/modules/popup.js

@ -20,8 +20,8 @@ class ConfigSerializer(serializers.ModelSerializer):
MAIN_PAGE_TOP_IMAGE = serializers.SerializerMethodField()
# SCHOOL_LOGO_IMAGE = serializers.ImageField(required=False, allow_null=True)
# MAIN_PAGE_TOP_IMAGE = serializers.ImageField(required=False, allow_null=True)
REFERRER_CASHBACK = serializers.IntegerField()
REFERRAL_DISCOUNT = serializers.IntegerField()
REFERRER_BONUS = serializers.IntegerField()
REFERRAL_BONUS = serializers.IntegerField()
class Meta:
model = Config
@ -39,8 +39,8 @@ class ConfigSerializer(serializers.ModelSerializer):
'INSTAGRAM_PROFILE_URL',
'SCHOOL_LOGO_IMAGE',
'MAIN_PAGE_TOP_IMAGE',
'REFERRER_CASHBACK',
'REFERRAL_DISCOUNT',
'REFERRER_BONUS',
'REFERRAL_BONUS',
)
def get_SCHOOL_LOGO_IMAGE(self, config):

@ -476,7 +476,7 @@ class PaymentViewSet(ExtendedModelViewSet):
return queryset.filter(status__isnull=False).order_by('-created_at')
@action(methods=['get'], detail=False, url_path='calc-amount')
@action(methods=['get'], detail=False, url_path='calc-amount', authentication_classes=[], permission_classes=[])
def calc_amount(self, request, pk=None):
user = request.query_params.get('user')
course = request.query_params.get('course')

@ -56,8 +56,8 @@ class LearnerRegistrationView(FormView):
user.save()
referrer = self.request.session.get('referrer')
if referrer:
Referral.objects.create(referral=user, referrer_id=referrer, discount=config.REFERRAL_DISCOUNT,
referrer_cashback=config.REFERRER_CASHBACK)
Referral.objects.create(referral=user, referrer_id=referrer, bonus=config.REFERRAL_BONUS,
referrer_bonus=config.REFERRER_BONUS)
# TODO: email admins? мб реферера уже нет, старая ссылка
self.request.session['referrer'] = None
login(self.request, user)
@ -198,8 +198,8 @@ class FacebookLoginOrRegistration(View):
referrer = self.request.session.get('referrer')
if referrer:
config = Config.load()
Referral.objects.create(referral=user, referrer_id=referrer, discount=config.REFERRAL_DISCOUNT,
referrer_cashback=config.REFERRER_CASHBACK)
Referral.objects.create(referral=user, referrer_id=referrer, bonus=config.REFERRAL_BONUS,
referrer_bonus=config.REFERRER_BONUS)
# TODO: email admins? мб реферера уже нет, старая ссылка
self.request.session['referrer'] = None

@ -47,7 +47,7 @@ class Config(models.Model):
'SERVICE_DISCOUNT': '',
'SCHOOL_LOGO_IMAGE': '',
'MAIN_PAGE_TOP_IMAGE': '',
'REFERRER_CASHBACK': '',
'REFERRAL_DISCOUNT': '',
'REFERRER_BONUS': '',
'REFERRAL_BONUS': '',
}
return obj

@ -1,28 +0,0 @@
# Generated by Django 2.0.6 on 2018-08-20 06:51
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('user', '0025_auto_20180820_0651'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('payment', '0019_payment_roistat_visit'),
]
operations = [
migrations.CreateModel(
name='UserBonus',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('amount', models.DecimalField(decimal_places=2, default=0, editable=False, max_digits=8)),
('created_at', models.DateTimeField(auto_now_add=True)),
('payment', models.OneToOneField(null=True, on_delete=django.db.models.deletion.SET_NULL, to='payment.Payment')),
('referral', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='user.Referral')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='bonuses', to=settings.AUTH_USER_MODEL)),
],
),
]

@ -110,17 +110,17 @@ class Payment(PolymorphicModel):
ordering = ('created_at',)
@classmethod
def calc_amount(cls, course_payment=None, school_payment=None, user=None, course=None, weekdays=None,
def calc_amount(cls, payment=None, user=None, course=None, weekdays=None,
add_days=False, date_start=None, date_end=None):
if course_payment:
course = course_payment.course
user = course_payment.user
if school_payment:
user = school_payment.user
weekdays = school_payment.weekdays
add_days = school_payment.add_days
date_start = school_payment.date_start
date_end = school_payment.date_end
if isinstance(payment, CoursePayment):
course = payment.course
user = payment.user
if isinstance(payment, SchoolPayment):
user = payment.user
weekdays = payment.weekdays
add_days = payment.add_days
date_start = payment.date_start
date_end = payment.date_end
referral_bonus = 0
referrer_bonus = 0
if hasattr(user, 'referral') and not user.referral.payment:
@ -184,30 +184,25 @@ class Payment(PolymorphicModel):
Pingback.PINGBACK_TYPE_RISK_REVIEWED_DECLINED,
]
class CoursePayment(Payment):
course = models.ForeignKey(Course, on_delete=models.CASCADE, verbose_name='Курс', related_name='payments')
class Meta:
verbose_name = 'Платеж за курс'
verbose_name_plural = 'Платежи за курсы'
def save(self, *args, **kwargs):
amount_data = Payment.calc_amount(course_payment=self)
amount_data = Payment.calc_amount(payment=self)
self.amount = amount_data.get('amount')
super().save(*args, **kwargs)
author_balance = getattr(self, 'authorbalance', None)
if not author_balance:
AuthorBalance.objects.create(
author=self.course.author,
amount=self.amount,
payment=self,
)
else:
author_balance.amount = self.amount
author_balance.save()
if isinstance(self, CoursePayment):
author_balance = getattr(self, 'authorbalance', None)
if not author_balance:
AuthorBalance.objects.create(
author=self.course.author,
amount=self.amount,
payment=self,
)
else:
author_balance.amount = self.amount
author_balance.save()
# Если юзер реферал и нет платежа, где применялась скидка
if hasattr(self.user, 'referral') and not self.user.referral.payment:
if hasattr(self.user, 'referral') and not self.user.referral.payment\
and self.status in [Pingback.PINGBACK_TYPE_REGULAR, Pingback.PINGBACK_TYPE_GOODWILL,
Pingback.PINGBACK_TYPE_RISK_REVIEWED_ACCEPTED,]:
# Платеж - как сигнал, что скидка применилась
self.user.referral.payment = self
self.user.referral.save()
@ -215,6 +210,14 @@ class CoursePayment(Payment):
self.user.referral.send_bonuses(amount_data.get('referral_bonus'), amount_data.get('referrer_bonus'))
class CoursePayment(Payment):
course = models.ForeignKey(Course, on_delete=models.CASCADE, verbose_name='Курс', related_name='payments')
class Meta:
verbose_name = 'Платеж за курс'
verbose_name_plural = 'Платежи за курсы'
class SchoolPayment(Payment):
weekdays = ArrayField(models.IntegerField(), size=7, verbose_name='Дни недели')
add_days = models.BooleanField('Докупленные дни', default=False)
@ -232,18 +235,6 @@ class SchoolPayment(Payment):
])
return days
def save(self, *args, **kwargs):
amount_data = Payment.calc_amount(school_payment=self)
self.amount = amount_data.get('amount')
super().save(*args, **kwargs)
# Если юзер реферал и нет платежа, где применялась скидка
if not self.add_days and hasattr(self.user, 'referral') and not self.user.referral.payment:
# Платеж - как сигнал, что скидка применилась
self.user.referral.payment = self
self.user.referral.save()
# Отправляем кэшбэк
self.user.referral.send_bonuses(amount_data.get('referral_bonus'), amount_data.get('referrer_bonus'))
@property
def date_end_humanize(self):
return arrow.get(self.date_end, settings.TIME_ZONE).humanize(locale='ru')
@ -252,7 +243,7 @@ class SchoolPayment(Payment):
class UserBonus(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='bonuses')
amount = models.DecimalField(max_digits=8, decimal_places=2, default=0, editable=False)
payment = models.OneToOneField(Payment, on_delete=models.SET_NULL, null=True)
payment = models.ForeignKey(Payment, on_delete=models.SET_NULL, null=True)
referral = models.ForeignKey('user.Referral', on_delete=models.SET_NULL, null=True)
created_at = models.DateTimeField(auto_now_add=True)

@ -1,29 +0,0 @@
# Generated by Django 2.0.6 on 2018-07-29 05:24
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('user', '0022_user_instagram_hashtag'),
]
operations = [
migrations.CreateModel(
name='Referral',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('discount', models.IntegerField()),
('referrer_cashback', models.IntegerField()),
('referral', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
('referrer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='referrals', to=settings.AUTH_USER_MODEL)),
],
options={
'verbose_name': 'Реферал',
'verbose_name_plural': 'Рефералы',
},
),
]

@ -1,20 +0,0 @@
# Generated by Django 2.0.6 on 2018-07-30 18:24
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('payment', '0019_payment_roistat_visit'),
('user', '0023_referral'),
]
operations = [
migrations.AddField(
model_name='referral',
name='payment',
field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='payment.Payment'),
),
]

@ -1,20 +0,0 @@
# Generated by Django 2.0.6 on 2018-08-20 06:51
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('user', '0024_referral_payment'),
]
operations = [
migrations.AlterField(
model_name='referral',
name='referral',
field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='referral', to=settings.AUTH_USER_MODEL),
),
]

@ -1,4 +1,6 @@
from json import dumps
from django.utils.functional import cached_property
from rest_framework.authtoken.models import Token
from phonenumber_field.modelfields import PhoneNumberField
@ -89,7 +91,7 @@ class User(AbstractUser):
user_data = dumps(user_data, ensure_ascii=False)
return user_data
@property
@cached_property
def balance(self):
aggregate = self.balances.filter(
type=0,
@ -103,9 +105,9 @@ class User(AbstractUser):
commission = aggregate.get('commission__sum') or 0
return amount - commission
@property
@cached_property
def bonus(self):
return self.balances.aggregate(models.Sum('amount')).get('amount__sum') or 0
return int(self.bonuses.aggregate(models.Sum('amount')).get('amount__sum')) or 0
@receiver(post_save, sender=User)

@ -40,12 +40,12 @@
{% if payment.balance %}
<div class="transactions__cell">{{payment.balance.amount}}</div>
{% else %}
<div class="transactions__cell">{{payment.amount}}</div>
<div class="transactions__cell">{{payment.amount|floatformat }}</div>
{% endif %}
{% if bonus.referral %}
<div class="transactions__cell"><a href="{% url 'user' id=bonus.referral.id %}">{{ bonus.referral.get_full_name }}</a></div>
<div class="transactions__cell"><a href="{% url 'user' pk=bonus.referral.referral.id %}">{{ bonus.referral.referral.get_full_name }}</a></div>
{% endif %}
<div class="transactions__cell">{{ bonus.amount }}</div>
<div class="transactions__cell">{{ bonus.amount|floatformat }}</div>
{% endwith %}
</div>
{% empty %}

@ -5,6 +5,7 @@ from os.path import splitext
from datetime import timedelta
from paymentwall import Pingback
import short_url
from urllib.parse import urljoin
from django.conf import settings
from django.contrib.auth import login
@ -313,7 +314,7 @@ class BonusHistoryView(TemplateView):
def get(self, request, *args, **kwargs):
context = self.get_context_data(**kwargs)
context['bonuses'] = request.user.bonuses.all()
context['referrer_url'] = '%s%s?referrer=%s' % (
settings.MAIN_HOST, reverse('index'), short_url.encode_url(request.user.id)
)
context['referrer_url'] = urljoin(settings.MAIN_HOST, '%s?referrer=%s' % (
reverse('index'), short_url.encode_url(request.user.id)
))
return self.render_to_response(context)

@ -1,12 +1,14 @@
{% load static %}
<script>
window.LIL_STORE = {
isRegistration: {{ is_registration|yesno:"true,false" }},
staticUrl: '{% static "" %}',
accessToken: '{{ request.user.auth_token }}',
isMobile: {{ request.user_agent.is_mobile|yesno:"true,false" }},
user: {
id: '{{ request.user.id|default:'' }}',
},
flags: {
isReferralRegistration: '{{ is_referral_registration|yesno:"true,false" }}',
}
};
</script>

@ -82,7 +82,7 @@ class IndexView(TemplateView):
referrer = None
context.update({
'is_registration': bool(referrer),
'is_referral_registration': bool(referrer),
'online': online,
'online_coming_soon': online_coming_soon,
'school_schedule': school_schedule,

@ -506,7 +506,7 @@ export const api = {
return api.get('/api/v1/payments/calc-amount', {
params: params,
headers: {
'Authorization': `Token ${window.STORE.accessToken}`,
'Authorization': `Token ${window.LIL_STORE.accessToken}`,
}
});
}

@ -41,7 +41,7 @@ $(document).ready(function () {
})
});
if(window.LIL_STORE.isRegistration && ! window.LIL_STORE.user.id){
if(window.LIL_STORE.flags.isReferralRegistration && ! window.LIL_STORE.user.id){
$('.js-header-enter').click();
}
});
@ -71,4 +71,4 @@ function updateHeader() {
headerElement.css('top', '');
}
}
}
}

@ -158,7 +158,7 @@ $(document).ready(function () {
});
if(weekdays.length){
api.getPaymentAmount({ user: window.STORE.user.id, weekdays: weekdays })
api.getPaymentAmount({ user: window.LIL_STORE.user.id, weekdays: weekdays })
.then((response) => {
var text = '';
if(response.data.price != response.data.amount) {

Loading…
Cancel
Save