wallet/apps/core/views.py
Sayyid Hamid Mahdavi 413a5497e4 some cleanups
2025-10-23 12:45:09 +03:30

78 lines
2.8 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 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):