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 TemplateView, FormView, UpdateView from oauth2_provider.contrib.rest_framework import TokenHasScope, IsAuthenticatedOrTokenHasScope from rest_framework import generics from rest_framework.views import APIView from apps.core.forms import ChargeForm from apps.core.models import Charge from apps.core.serializers import ChargeSerializer from apps.wallet.constans import StateChoices from apps.wallet.models import Transaction # Create your views here. @method_decorator(login_required, name='dispatch') class HomeView(TemplateView): template_name = 'core/home.html' class ChargeRequestApiView(generics.CreateAPIView): permission_classes = [IsAuthenticatedOrTokenHasScope] serializer_class = ChargeSerializer required_scopes = ['wallet.wallet:get_balance'] model = Charge def perform_create(self, serializer): user = self.request.user serializer.save(user = user) # TODO: refactor class ChargeView(UpdateView): template_name = 'core/charge.html' form_class = ChargeForm def get_queryset(self): return Charge.objects.all() # return Charge.objects.filter(state__in=[StateChoices.CREATED.value, StateChoices.SUCCESS.value]) def form_valid(self, form): self.object = form.save() amount = form.cleaned_data['amount'] payer_pk = 'a95557d6-4f21-4717-99c2-354db85f940e' charge: Charge = self.get_object() try: charge.change_state(from_state=StateChoices.CREATED.value, to_state=StateChoices.PENDING.value) 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.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}) # def form_valid(self, form):