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})