отрицательные балансы у преподавателей

remotes/origin/hotix/author_balances_and_access_expire_fix_11-02-19
gzbender 7 years ago
parent 826352fd3e
commit f3edc58046
  1. 25
      apps/course/management/commands/fix_access_expire.py
  2. 2
      apps/course/management/commands/update_courses_slug.py
  3. 58
      apps/payment/models.py
  4. 6
      apps/user/models.py

@ -0,0 +1,25 @@
from datetime import timedelta
from django.core.management.base import BaseCommand
from apps.payment.models import CoursePayment
from apps.course.models import Course
class Command(BaseCommand):
help = 'Fix access duration in all paid courses'
def add_arguments(self, parser):
parser.add_argument('access_duration', type=int, help='New access duration',)
def handle(self, *args, **options):
access_duration = options.get('access_duration')
for course in Course.objects.filter(price__gt=0):
course.access_duration = access_duration
course.save()
for payment in CoursePayment.objects.filter(status__in=CoursePayment.PW_PAID_STATUSES):
payment.access_expire = payment.created_at.date() + timedelta(days=payment.course.access_duration)
payment.save()

@ -7,7 +7,7 @@ from apps.course.models import Course
class Command(BaseCommand):
help = 'Upload users to Roistat'
help = 'Update courses slug'
def handle(self, *args, **options):
courses = Course.objects.filter(Q(slug__isnull=True) | Q(slug=''))

@ -63,7 +63,7 @@ class AuthorBalance(models.Model):
verbose_name_plural = 'Балансы'
def save(self, *args, **kwargs):
if self.status != self.ACCEPTED:
if self.type == self.IN and not self.id:
self.commission = self.calc_commission()
if self.type == self.OUT:
if self.status == self.DECLINED and not self.declined_send_at:
@ -228,36 +228,34 @@ class Payment(PolymorphicModel):
]
def save(self, *args, **kwargs):
amount_data = Payment.calc_amount(payment=self)
if self.status is None and not self.bonus:
self.amount = amount_data.get('amount')
if isinstance(self, SchoolPayment):
self.weekdays = amount_data.get('weekdays')
if not self.is_paid():
if not self.bonus:
amount_data = Payment.calc_amount(payment=self)
self.amount = amount_data.get('amount')
if isinstance(self, SchoolPayment):
self.weekdays = amount_data.get('weekdays')
super().save(*args, **kwargs)
if isinstance(self, CoursePayment) and self.is_paid():
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, GiftCertificatePayment) and self.is_paid():
ugs, created = UserGiftCertificate.objects.get_or_create(user=self.user, gift_certificate=self.gift_certificate,
payment=self)
if created:
from apps.notification.tasks import send_gift_certificate
send_gift_certificate(ugs.id)
# Если юзер реферал и нет платежа, где применялась скидка
if hasattr(self.user, 'referral') and not self.user.referral.payment and self.is_paid():
# Платеж - как сигнал, что скидка применилась
self.user.referral.payment = self
self.user.referral.save()
# Отправляем кэшбэк
self.user.referral.send_bonuses(amount_data.get('referral_bonus'), amount_data.get('referrer_bonus'))
if self.is_paid():
if isinstance(self, CoursePayment):
if not getattr(self, 'authorbalance', None):
AuthorBalance.objects.create(
author=self.course.author,
amount=self.amount,
payment=self,
)
if isinstance(self, GiftCertificatePayment):
ugs, created = UserGiftCertificate.objects.get_or_create(user=self.user, gift_certificate=self.gift_certificate,
payment=self)
if created:
from apps.notification.tasks import send_gift_certificate
send_gift_certificate(ugs.id)
# Если юзер реферал и нет платежа, где применялась скидка
if 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'))
class CoursePayment(Payment):

@ -108,9 +108,9 @@ class User(AbstractUser):
@cached_property
def balance(self):
from apps.payment.models import Payment
from apps.payment.models import Payment, AuthorBalance
income = self.balances.filter(
type=0,
type=AuthorBalance.IN,
payment__isnull=False,
payment__status__in=Payment.PW_PAID_STATUSES,
).aggregate(
@ -120,7 +120,7 @@ class User(AbstractUser):
income_amount = income.get('amount__sum') or 0
income_commission = income.get('commission__sum') or 0
payout = self.balances.filter(type=1, status=1).aggregate(models.Sum('amount'))
payout = self.balances.filter(type=AuthorBalance.OUT, status=AuthorBalance.ACCEPTED).aggregate(models.Sum('amount'))
payout_amount = payout.get('amount__sum') or 0
return income_amount - income_commission - payout_amount

Loading…
Cancel
Save