diff --git a/apps/transactions/tasks.py b/apps/transactions/tasks.py new file mode 100644 index 0000000..cda007c --- /dev/null +++ b/apps/transactions/tasks.py @@ -0,0 +1,27 @@ +import razorpay +from celery import shared_task +from .models import Transaction +from ticket.models import Ticket +from django.conf import settings +from ticket.utils import generate_ticket_image + +client = razorpay.Client(auth=(settings.RAZORPAY_KEY, settings.RAZORPAY_SECRET)) + +@shared_task +def check_all_transaction_status(): + transactions = Transaction.objects.all + for transaction in transactions: + payment = client.payment.fetch(transaction.order_id) + if payment["status"] != transaction.payment_status: + transaction.payment_status = payment["status"] + transaction.save() + ticket = Ticket.objects.get(transaction_id=transaction) + if ticket.is_active == False and transaction.payment_status == "captured": + ticket.is_active = True + if ticket.ticket_image_generated == False: + generate_ticket_image(ticket) + ticket.save() + elif ticket.is_active == True and transaction.payment_status != "captured": + ticket.is_active = False + ticket.save() + diff --git a/apps/transactions/utils.py b/apps/transactions/utils.py new file mode 100644 index 0000000..5ab9e4c --- /dev/null +++ b/apps/transactions/utils.py @@ -0,0 +1,21 @@ +from event.models import Event, SubEvent, Addon + + +def HandlePriceCalculation(request): + event_id = request.data.get('event_id') + selected_sub_events = request.data.get('selected_sub_events', []), + selected_addons = request.data.get('selected_addons', []) + total_sub_event_allowed = Event.objects.get(pk=event_id).sub_events_included_allowed + sub_event_count = 0 + sub_event_price = 0 + addon_price = 0 + for sub_event in selected_sub_events[0]: + if sub_event_count < total_sub_event_allowed: + sub_event_count += 1 + else: + sub_event_price += SubEvent.objects.get(pk=sub_event).price + for addon in selected_addons: + addon_price += Addon.objects.get(pk=addon).price + event_price = Event.objects.get(pk=event_id).price + total_price = event_price + sub_event_price + addon_price + return int(total_price) \ No newline at end of file diff --git a/apps/transactions/views.py b/apps/transactions/views.py index 8ebcbf4..d8ae422 100644 --- a/apps/transactions/views.py +++ b/apps/transactions/views.py @@ -7,13 +7,13 @@ from .models import Transaction from ticket.utils import create_ticket, generate_ticket_image from ticket.models import Ticket -from event.models import Event, SubEvent, Addon from django.http import HttpResponse import os, razorpay, json from base.utils import EmailService +from .utils import HandlePriceCalculation -client = razorpay.Client(auth=(os.environ.get("RAZORPAY_KEY"), os.environ.get("RAZORPAY_SECRET"))) +client = razorpay.Client(auth=(settings.RAZORPAY_KEY, settings.RAZORPAY_SECRET)) class HandlePayment(APIView): def post(self, request): @@ -55,33 +55,13 @@ def post(self, request): "payment_id": order['id'], "amount": order['amount'], "currency": order['currency'], - "id": (os.environ.get("RAZORPAY_KEY")), + "id": settings.RAZORPAY_KEY, "Business": "JKLU", "callback_url": get_url_from_hostname(settings.HOSTNAME) + "/api/transactions/handle-payment-success/", "image": "https://sabrang.jklu.edu.in/wp-content/uploads/2022/10/sabrang-cover-text-e1664621537950.png"} return Response(return_data, status=status.HTTP_200_OK) -def HandlePriceCalculation(request): - event_id = request.data.get('event_id') - selected_sub_events = request.data.get('selected_sub_events', []), - selected_addons = request.data.get('selected_addons', []) - total_sub_event_allowed = Event.objects.get(pk=event_id).sub_events_included_allowed - sub_event_count = 0 - sub_event_price = 0 - addon_price = 0 - for sub_event in selected_sub_events[0]: - if sub_event_count < total_sub_event_allowed: - sub_event_count += 1 - else: - sub_event_price += SubEvent.objects.get(pk=sub_event).price - for addon in selected_addons: - addon_price += Addon.objects.get(pk=addon).price - event_price = Event.objects.get(pk=event_id).price - total_price = event_price + sub_event_price + addon_price - return int(total_price) - - class HandlePaymentSuccess(APIView): def post(self, request): razorpay_payment_id = request.data.get('razorpay_payment_id') diff --git a/settings/common.py b/settings/common.py index c728527..7d4d4ac 100644 --- a/settings/common.py +++ b/settings/common.py @@ -191,4 +191,8 @@ HOSTNAME = os.environ.get("HOSTNAME", "localhost:8000") -FRONTEND_URL = os.environ.get("FRONTEND_URL", "localhost:4200") \ No newline at end of file +FRONTEND_URL = os.environ.get("FRONTEND_URL", "localhost:4200") + +# Razorpay settings +RAZORPAY_KEY = os.environ.get("RAZORPAY_KEY", "") +RAZORPAY_SECRET = os.environ.get("RAZORPAY_SECRET", "") \ No newline at end of file diff --git a/ticketify/celery.py b/ticketify/celery.py index 5cccf84..f348cdf 100644 --- a/ticketify/celery.py +++ b/ticketify/celery.py @@ -14,6 +14,14 @@ # should have a `CELERY_` prefix. app.config_from_object("django.conf:settings", namespace='CELERY') +# Celery Periodic Tasks +app.conf.beat_schedule = { + 'check-all-transaction-status': { + 'task': 'transactions.tasks.check_all_transaction_status', + 'schedule': 1800.0, # 30 minutes + }, +} + # Load task modules from all registered Django apps. app.autodiscover_tasks()