ipg/apps/pg/views.py
Sayyid Hamid Mahdavi d5a25dfaee basic pg app
2025-05-13 13:48:39 +03:30

68 lines
2.6 KiB
Python

from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.http import HttpResponseRedirect
from django.shortcuts import render
from django.urls import reverse
from django.utils.decorators import method_decorator
from django.views.generic import UpdateView
from oauth2_provider.contrib.rest_framework import TokenHasScope, IsAuthenticatedOrTokenHasScope
from rest_framework import generics
from rest_framework.views import APIView
from .forms import ChargeForm
from .models import ChargeRequest
from .serializers import ChargeRequestSerializer
from .constans import StateChoices
from ..gooyal_oauth2.utils import get_application
class ChargeRequestApiView(generics.CreateAPIView):
permission_classes = [IsAuthenticatedOrTokenHasScope]
serializer_class = ChargeRequestSerializer
required_scopes = ['wallet.wallet:get_balance'] # TODO: is it good scope?
model = ChargeRequest
def perform_create(self, serializer):
user = self.request.user
application = get_application(self.request)
charge_request: ChargeRequest = serializer.save(user=user, application=application)
# TODO: web view
# charge_request.charge_wallet_balance()
class ChargeView(UpdateView):
template_name = 'pg/charge-request.html'
form_class = ChargeForm
def get_queryset(self):
return ChargeRequest.objects.all()
# return Charge.objects.filter(state__in=[StateChoices.CREATED.value, StateChoices.SUCCESS.value])
def form_valid(self, form):
self.object = form.save()
charge_request: ChargeRequest = self.get_object()
try:
charge_request.charge_wallet_balance()
# transaction = Transaction.objects.create(
# uuid=charge.uuid,
# payee_id=charge.user.pk,
# payee_type=1,
# payer_id=payer_pk,
# payer_type=2,
# amount=amount,
# details={'description': 'شارژ مجازی کیف پول'}
# )
# transaction.submit()
# transaction.verify()
# charge.change_state(from_state=StateChoices.PENDING.value, to_state=StateChoices.SUCCESS.value)
messages.success(self.request, 'شارژ انجام شد')
except:
messages.error(self.request, 'خطایی رخ داده است')
charge_request.change_state(from_state=StateChoices.PENDING.value, to_state=StateChoices.EXPECTED_FAILURE.value)
return HttpResponseRedirect(self.get_success_url())
def get_success_url(self):
return reverse('core:charge', kwargs={'pk': self.object.pk})