From 397032595d639b7494e7d0161f1f0ab37edd5597 Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Tue, 13 Mar 2018 18:50:08 +0300 Subject: [PATCH] LIL-301, 302 --- apps/payment/tasks.py | 18 +++++++++++++++++ apps/payment/views.py | 47 ++++++++++++++++++++++++++----------------- apps/user/models.py | 14 +++++++++++++ apps/user/tasks.py | 20 ++++++++++++++++++ project/settings.py | 3 +++ 5 files changed, 83 insertions(+), 19 deletions(-) create mode 100644 apps/payment/tasks.py create mode 100644 apps/user/tasks.py diff --git a/apps/payment/tasks.py b/apps/payment/tasks.py new file mode 100644 index 00000000..e5a3f296 --- /dev/null +++ b/apps/payment/tasks.py @@ -0,0 +1,18 @@ +from mixpanel import Mixpanel + +from django.conf import settings + +from project.celery import app + + +@app.task +def transaction_to_mixpanel(user_id, amount, time, product_type): + mix = Mixpanel(settings.MIX_TOKEN) + mix.people_track_charge( + user_id, + amount, + { + '$time': time, + 'product_type': product_type, + } + ) diff --git a/apps/payment/views.py b/apps/payment/views.py index 3e3165ab..e7490ad9 100644 --- a/apps/payment/views.py +++ b/apps/payment/views.py @@ -17,6 +17,7 @@ from paymentwall import Pingback, Product, Widget from apps.course.models import Course from apps.school.models import SchoolSchedule +from apps.payment.tasks import transaction_to_mixpanel from .models import AuthorBalance, CoursePayment, SchoolPayment @@ -146,27 +147,35 @@ class PaymentwallCallbackView(View): logger.info( json.dumps(payment_raw_data), ) + payment.status = pingback.get_type() payment.data = payment_raw_data - if pingback.is_deliverable() and product_type_name == 'school': - school_payment = SchoolPayment.objects.filter( - user=payment.user, - date_start__lte=now(), - date_end__gt=now(), - status__in=[ - Pingback.PINGBACK_TYPE_REGULAR, - Pingback.PINGBACK_TYPE_GOODWILL, - Pingback.PINGBACK_TYPE_RISK_REVIEWED_ACCEPTED, - ], - ).last() - if school_payment: - date_start = school_payment.date_end + timedelta(days=1) - date_end = date_start + timedelta(days=30) - else: - date_start = now() - date_end = now() + timedelta(days=30) - payment.date_start = date_start - payment.date_end = date_end + if pingback.is_deliverable(): + transaction_to_mixpanel.delay( + payment.user.id, + payment.amount, + now().strftime('%Y-%m-%dT%H:%M:%S'), + product_type_name, + ) + if product_type_name == 'school': + school_payment = SchoolPayment.objects.filter( + user=payment.user, + date_start__lte=now(), + date_end__gt=now(), + status__in=[ + Pingback.PINGBACK_TYPE_REGULAR, + Pingback.PINGBACK_TYPE_GOODWILL, + Pingback.PINGBACK_TYPE_RISK_REVIEWED_ACCEPTED, + ], + ).last() + if school_payment: + date_start = school_payment.date_end + timedelta(days=1) + date_end = date_start + timedelta(days=30) + else: + date_start = now() + date_end = now() + timedelta(days=30) + payment.date_start = date_start + payment.date_end = date_end payment.save() author_balance = getattr(payment, 'author_balance', None) diff --git a/apps/user/models.py b/apps/user/models.py index 7ccbf2dc..dd0ad0a1 100644 --- a/apps/user/models.py +++ b/apps/user/models.py @@ -12,6 +12,8 @@ from django.utils.translation import gettext_lazy as _ from api.v1 import serializers from apps.notification.utils import send_email +from apps.user.tasks import user_to_mixpanel + class User(AbstractUser): USER_ROLE = 0 @@ -89,6 +91,18 @@ def create_auth_token(sender, instance=None, created=False, **kwargs): instance.auth_token.delete() +@receiver(post_save, sender=User) +def send_user_info_to_mixpanel(sender, instance=None, created=False, **kwargs): + user_to_mixpanel.delay( + instance.id, + instance.email, + instance.first_name, + instance.last_name, + instance.date_joined, + instance.role, + ) + + class AuthorRequestManager(models.Manager): def create_by_user(self, user): obj = self.model( diff --git a/apps/user/tasks.py b/apps/user/tasks.py new file mode 100644 index 00000000..110bf976 --- /dev/null +++ b/apps/user/tasks.py @@ -0,0 +1,20 @@ +from mixpanel import Mixpanel + +from django.conf import settings + +from project.celery import app + + +@app.task +def user_to_mixpanel(user_id, email, first_name, last_name, date_joined, role): + mix = Mixpanel(settings.MIX_TOKEN) + mix.people_set( + user_id, + { + '$email': email, + '$first_name': first_name, + '$last_name': last_name, + '$created': date_joined, + 'role': role, + } + ) diff --git a/project/settings.py b/project/settings.py index 6860b3d0..c4ea30c7 100644 --- a/project/settings.py +++ b/project/settings.py @@ -270,6 +270,9 @@ else: Paymentwall.set_app_key('d6f02b90cf6b16220932f4037578aff7') Paymentwall.set_secret_key('4ea515bf94e34cf28646c2e12a7b8707') +# Mixpanel settings +MIX_TOKEN = '79bd6bfd98667ed977737e6810b8abcd' + # CORS settings if DEBUG: