This commit is contained in:
Sayyid Hamid Mahdavi 2026-04-22 19:59:44 +03:30
parent 82c35ffc4a
commit a318185147
3 changed files with 52 additions and 39 deletions

View file

@ -43,6 +43,17 @@ class BasePGModel(models.Model):
def reverse_request(self): def reverse_request(self):
pass pass
@property
def jajali_datetime(self):
def to_jalali(value):
if value:
import jdatetime
return jdatetime.datetime.fromgregorian(date=value, locale='fa_IR').strftime("%Y/%m/%d-%H:%M:%S")
else:
return value
return to_jalali(self.created_at)
class Meta: class Meta:
abstract = True abstract = True

View file

@ -13,16 +13,23 @@ from django.urls import path
from .constans import StateChoices from .constans import StateChoices
from .forms import ApplicationGatewayPolicyForm from .forms import ApplicationGatewayPolicyForm
from .models import PaymentRequest, PNA, Fake, ApplicationGatewayPolicy from .models import PaymentRequest, PNA, Fake, ApplicationGatewayPolicy, SEP
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class PNAAdmin(admin.ModelAdmin): class PNAAdmin(admin.ModelAdmin):
list_display = ['pna_status_code', 'pna_status_message', 'jajali_datetime', 'payment_request'] list_display = ['pna_status_code', 'pna_status_message', 'jajali_datetime', 'payment_request']
list_filter = ['pna_status'] list_filter = ['pna_status']
search_fields = ['pna_status_code', 'pna_status_message'] search_fields = ['pna_status_code', 'pna_status_message']
class SEPAdmin(admin.ModelAdmin):
list_display = ['sep_status_code', 'sep_status_message', 'jajali_datetime', 'payment_request']
list_filter = ['sep_status']
search_fields = ['sep_status_code', 'sep_status_message']
@admin.action(description="export exel") @admin.action(description="export exel")
def export_exel(modeladmin, request, queryset): def export_exel(modeladmin, request, queryset):
output = io.BytesIO() output = io.BytesIO()
@ -55,6 +62,7 @@ def export_exel(modeladmin, request, queryset):
# return the response # return the response
return response return response
@admin.action(description="mark as registered") @admin.action(description="mark as registered")
def mark_as_registered(model_admin, request, queryset): def mark_as_registered(model_admin, request, queryset):
for obj in queryset: for obj in queryset:
@ -63,12 +71,12 @@ def mark_as_registered(model_admin, request, queryset):
class PaymentRequestAdmin(admin.ModelAdmin): class PaymentRequestAdmin(admin.ModelAdmin):
list_display = ['state', 'check_success_again', 'uuid', 'splited_amount', 'user_id', 'jajali_datetime', 'is_registered', 'created_at', 'application', 'gateway'] list_display = ['state', 'check_success_again', 'uuid', 'splited_amount', 'user_id', 'jajali_datetime',
search_fields = ['application__uuid','application__client_id', 'amount', 'user__uuid'] 'is_registered', 'created_at', 'application', 'gateway']
search_fields = ['application__uuid', 'application__client_id', 'amount', 'user__uuid']
list_filter = ['application', 'state', 'gateway'] list_filter = ['application', 'state', 'gateway']
actions = [export_exel, mark_as_registered] actions = [export_exel, mark_as_registered]
def changelist_view(self, request, extra_context=None): def changelist_view(self, request, extra_context=None):
extra_context = extra_context or {} extra_context = extra_context or {}
@ -81,7 +89,8 @@ class PaymentRequestAdmin(admin.ModelAdmin):
return super().changelist_view(request, extra_context=extra_context) return super().changelist_view(request, extra_context=extra_context)
def check_success_again(self, obj): def check_success_again(self, obj):
if obj.state in [StateChoices.IPG_SUCCESS, StateChoices.WALLET_SUBMIT_PENDING, StateChoices.WALLET_SUBMIT_SUCCESS]: if obj.state in [StateChoices.IPG_SUCCESS, StateChoices.WALLET_SUBMIT_PENDING,
StateChoices.WALLET_SUBMIT_SUCCESS]:
return format_html( return format_html(
'<a class="button" href="{}">بررسی دوباره موفقیت</a>', '<a class="button" href="{}">بررسی دوباره موفقیت</a>',
f'{obj.uuid}/check_success_again/' f'{obj.uuid}/check_success_again/'
@ -91,9 +100,11 @@ class PaymentRequestAdmin(admin.ModelAdmin):
def get_urls(self): def get_urls(self):
urls = super().get_urls() urls = super().get_urls()
custom_urls = [ custom_urls = [
path('<uuid:payment_request_uuid>/check_success_again/', self.admin_site.admin_view(self.check_success_again_view)) path('<uuid:payment_request_uuid>/check_success_again/',
self.admin_site.admin_view(self.check_success_again_view))
] ]
return custom_urls + urls return custom_urls + urls
def check_success_again_view(self, request, payment_request_uuid): def check_success_again_view(self, request, payment_request_uuid):
logger.info(f"[Admin panel] Check success again for payment_request_uuid={payment_request_uuid}") logger.info(f"[Admin panel] Check success again for payment_request_uuid={payment_request_uuid}")
payment_request: PaymentRequest = get_object_or_404(PaymentRequest, uuid=payment_request_uuid) payment_request: PaymentRequest = get_object_or_404(PaymentRequest, uuid=payment_request_uuid)
@ -111,7 +122,7 @@ class PaymentRequestAdmin(admin.ModelAdmin):
class FakeAdmin(admin.ModelAdmin): class FakeAdmin(admin.ModelAdmin):
list_display = [ 'created_at'] list_display = ['created_at']
class ApplicationGatewayPolicyAdmin(admin.ModelAdmin): class ApplicationGatewayPolicyAdmin(admin.ModelAdmin):
@ -120,5 +131,6 @@ class ApplicationGatewayPolicyAdmin(admin.ModelAdmin):
admin.site.register(PaymentRequest, PaymentRequestAdmin) admin.site.register(PaymentRequest, PaymentRequestAdmin)
admin.site.register(PNA, PNAAdmin) admin.site.register(PNA, PNAAdmin)
admin.site.register(SEP, SEPAdmin)
admin.site.register(Fake, FakeAdmin) admin.site.register(Fake, FakeAdmin)
admin.site.register(ApplicationGatewayPolicy, ApplicationGatewayPolicyAdmin) admin.site.register(ApplicationGatewayPolicy, ApplicationGatewayPolicyAdmin)

View file

@ -243,16 +243,6 @@ class PNA(BasePGModel):
client = PNAClient() client = PNAClient()
@property
def jajali_datetime(self):
def to_jalali(value):
if value:
return jdatetime.datetime.fromgregorian(date=value, locale='fa_IR').strftime("%Y/%m/%d-%H:%M:%S")
else:
return value
return to_jalali(self.created_at)
def make_request(self): def make_request(self):
self.payment_request.change_state(StateChoices.CREATED, StateChoices.IPG_PENDING, 'can not change state') self.payment_request.change_state(StateChoices.CREATED, StateChoices.IPG_PENDING, 'can not change state')
amount = self.payment_request.amount + self.payment_request.commission amount = self.payment_request.amount + self.payment_request.commission
@ -428,27 +418,27 @@ class SEP(BasePGModel):
raise NotImplementedError() raise NotImplementedError()
# class Fake(BasePGModel): class Fake(BasePGModel):
# label = GatewayChoise.FAKE.value # label = GatewayChoise.FAKE.value
# image = f'image/{GatewayChoise.FAKE.value}.png' # image = f'image/{GatewayChoise.FAKE.value}.png'
#
# payment_request = models.OneToOneField(PaymentRequest, on_delete=models.PROTECT, related_name='+') payment_request = models.OneToOneField(PaymentRequest, on_delete=models.PROTECT, related_name='+')
#
# def make_request(self): def make_request(self):
# self.payment_request.change_state(StateChoices.CREATED, StateChoices.IPG_PENDING, 'can not change state') self.payment_request.change_state(StateChoices.CREATED, StateChoices.IPG_PENDING, 'can not change state')
#
# def get_pg_page_url(self): def get_pg_page_url(self):
# return reverse('pg:payment-confirm-view', kwargs={'uuid': self.payment_request.uuid}) return reverse('pg:payment-confirm-view', kwargs={'uuid': self.payment_request.uuid})
#
# def confirm_request(self, request=None): def confirm_request(self, request=None):
# self.payment_request.change_state(StateChoices.IPG_PENDING, StateChoices.IPG_SUCCESS, 'can not change state') self.payment_request.change_state(StateChoices.IPG_PENDING, StateChoices.IPG_SUCCESS, 'can not change state')
#
# self.payment_request.charge_wallet_balance() self.payment_request.charge_wallet_balance()
# messages.success(request, 'شارژ انجام شد') messages.success(request, 'شارژ انجام شد')
# self.save() self.save()
#
# def reverse_request(self): def reverse_request(self):
# raise NotImplementedError() raise NotImplementedError()
class ApplicationGatewayPolicy(BaseModel): class ApplicationGatewayPolicy(BaseModel):