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.decorators.csrf import csrf_exempt from django.views.generic import UpdateView, DetailView from oauth2_provider.contrib.rest_framework import TokenHasScope, IsAuthenticatedOrTokenHasScope from rest_framework import generics from rest_framework.views import APIView from .forms import ChargeRequestForm from .models import ChargeRequest from .serializers import ChargeRequestSerializer from .constans import StateChoices from ..gooyal_oauth2.utils import get_application class ChargeRequestCreateApiView(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() @method_decorator(csrf_exempt, name='dispatch') class ChargeRequestView(UpdateView): template_name = 'pg/charge-request.html' form_class = ChargeRequestForm # pk_url_kwarg = 'uuid' slug_field = 'uuid' slug_url_kwarg = 'uuid' def get_queryset(self): # return ChargeRequest.objects.all() # return Charge.objects.filter(state__in=[StateChoices.CREATED.value, StateChoices.SUCCESS.value]) return ChargeRequest.objects.filter(state__in=[StateChoices.CREATED.value]) def form_valid(self, form): self.object = form.save() charge_request: ChargeRequest = self.get_object() # try: charge_request.request_sale() pna_redirect_url = charge_request.get_pna_redirect_url() if pna_redirect_url: return HttpResponseRedirect(pna_redirect_url) else: messages.error(self.request, 'can not redirect to pna') # TODO: redirect to error page return HttpResponseRedirect(reverse('pg:charge-request-view', kwargs={'uuid': charge_request.uuid})) def get_success_url(self): return self.object.callback_url # return reverse('pg:charge-request-view', kwargs={'pk': self.object.pk}) @method_decorator(csrf_exempt, name='dispatch') class ChargeConfirmView(UpdateView): template_name = 'pg/charge-confirm.html' form_class = ChargeRequestForm # pk_url_kwarg = 'uuid' slug_field = 'uuid' slug_url_kwarg = 'uuid' def get_queryset(self): return ChargeRequest.objects.all() # return Charge.objects.filter(state__in=[StateChoices.CREATED.value, StateChoices.SUCCESS.value]) def get(self, request, *args, **kwargs): print('get') print(args) print(kwargs) self.object = self.get_object() context = self.get_context_data() messages.info(self.request, 'در پردازش صفحه خطایی وجود دارد.') return self.render_to_response(context) def post(self, request, *args, **kwargs): print("post") print(request.POST) print(args) print(kwargs) # post = if 'redirect-to-app' in request.POST: return super().post(request, *args, **kwargs) else: self.object = self.get_object() # post = if request.POST.get('status') == 0: try: charge_request: ChargeRequest = self.get_object() charge_request.charge_wallet_balance() charge_request.confirm_sale() messages.success(self.request, 'شارژ انجام شد') except Exception as e: print(e) messages.error(self.request, str(e)) else: print(request.POST) messages.error(self.request, "نتیجه تراکنش از سمت درگاه دریافت نشد.") context = self.get_context_data(object=self.object) return self.render_to_response(context) # def form_valid(self, form): # self.object = form.save() # charge_request: ChargeRequest = self.get_object() # try: # # # 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) # # except Exception as e: # print(e) # 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 self.object.callback_url