149 lines
6.3 KiB
Python
149 lines
6.3 KiB
Python
from django.contrib import messages
|
|
from django.contrib.auth.decorators import login_required
|
|
from django.http import HttpResponseRedirect, HttpResponse
|
|
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-confirm-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 = <QueryDict: {'Token': ['NDEwMTI0Nzc0MDMzMA=='], 'OrderId': ['7'], 'TerminalNo': ['31127029'], 'RRN': ['511629156251'], 'status': ['0'], 'TspToken': ['00000000-0000-0000-0000-000000000000'], 'HashCardNumber': ['6008617E6BAB76997499446356F5C8B60288445650DD551FDF32007BCF2B14AF'], 'Amount': ['21,000'], 'SwAmount': [''], 'STraceNo': ['123232']}>
|
|
|
|
if 'redirect-to-app' in request.POST:
|
|
response = HttpResponse("", status=302)
|
|
response['Location'] = self.object.callback_url
|
|
return response
|
|
|
|
else:
|
|
self.object = self.get_object()
|
|
|
|
# post = <QueryDict: {'Token': ['NDEwMTI0Nzc0MDMzMA=='], 'OrderId': ['7'], 'TerminalNo': ['31127029'], 'RRN': ['511629156251'], 'status': ['0'], 'TspToken': ['00000000-0000-0000-0000-000000000000'], 'HashCardNumber': ['6008617E6BAB76997499446356F5C8B60288445650DD551FDF32007BCF2B14AF'], 'Amount': ['21,000'], 'SwAmount': [''], 'STraceNo': ['123232']}>
|
|
# post = <QueryDict: {'Token': ['NDI2MDY3ODI0MTg1OA=='], 'OrderId': ['47'], 'status': ['-138']}>
|
|
print(dict(request.POST))
|
|
post_dict = dict(request.POST)
|
|
if post_dict.get('status') in [0, '0', [0], ['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())
|
|
|