From a318185147e6515d26e42270d15dd153de8bb8d1 Mon Sep 17 00:00:00 2001 From: Sayyid Hamid Mahdavi Date: Wed, 22 Apr 2026 19:59:44 +0330 Subject: [PATCH] admin --- apps/core/models.py | 11 ++++++++++ apps/pg/admin.py | 28 +++++++++++++++++------- apps/pg/models.py | 52 ++++++++++++++++++--------------------------- 3 files changed, 52 insertions(+), 39 deletions(-) diff --git a/apps/core/models.py b/apps/core/models.py index dd19bf8..9ff8c7a 100644 --- a/apps/core/models.py +++ b/apps/core/models.py @@ -43,6 +43,17 @@ class BasePGModel(models.Model): def reverse_request(self): 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: abstract = True diff --git a/apps/pg/admin.py b/apps/pg/admin.py index 906e450..7188deb 100644 --- a/apps/pg/admin.py +++ b/apps/pg/admin.py @@ -13,16 +13,23 @@ from django.urls import path from .constans import StateChoices from .forms import ApplicationGatewayPolicyForm -from .models import PaymentRequest, PNA, Fake, ApplicationGatewayPolicy +from .models import PaymentRequest, PNA, Fake, ApplicationGatewayPolicy, SEP logger = logging.getLogger(__name__) + class PNAAdmin(admin.ModelAdmin): list_display = ['pna_status_code', 'pna_status_message', 'jajali_datetime', 'payment_request'] list_filter = ['pna_status'] 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") def export_exel(modeladmin, request, queryset): output = io.BytesIO() @@ -55,6 +62,7 @@ def export_exel(modeladmin, request, queryset): # return the response return response + @admin.action(description="mark as registered") def mark_as_registered(model_admin, request, queryset): for obj in queryset: @@ -63,12 +71,12 @@ def mark_as_registered(model_admin, request, queryset): class PaymentRequestAdmin(admin.ModelAdmin): - list_display = ['state', 'check_success_again', 'uuid', 'splited_amount', 'user_id', 'jajali_datetime', 'is_registered', 'created_at', 'application', 'gateway'] - search_fields = ['application__uuid','application__client_id', 'amount', 'user__uuid'] + list_display = ['state', 'check_success_again', 'uuid', 'splited_amount', 'user_id', 'jajali_datetime', + 'is_registered', 'created_at', 'application', 'gateway'] + search_fields = ['application__uuid', 'application__client_id', 'amount', 'user__uuid'] list_filter = ['application', 'state', 'gateway'] actions = [export_exel, mark_as_registered] - def changelist_view(self, request, extra_context=None): extra_context = extra_context or {} @@ -81,7 +89,8 @@ class PaymentRequestAdmin(admin.ModelAdmin): return super().changelist_view(request, extra_context=extra_context) 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( 'بررسی دوباره موفقیت', f'{obj.uuid}/check_success_again/' @@ -91,9 +100,11 @@ class PaymentRequestAdmin(admin.ModelAdmin): def get_urls(self): urls = super().get_urls() custom_urls = [ - path('/check_success_again/', self.admin_site.admin_view(self.check_success_again_view)) + path('/check_success_again/', + self.admin_site.admin_view(self.check_success_again_view)) ] return custom_urls + urls + 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}") payment_request: PaymentRequest = get_object_or_404(PaymentRequest, uuid=payment_request_uuid) @@ -111,7 +122,7 @@ class PaymentRequestAdmin(admin.ModelAdmin): class FakeAdmin(admin.ModelAdmin): - list_display = [ 'created_at'] + list_display = ['created_at'] class ApplicationGatewayPolicyAdmin(admin.ModelAdmin): @@ -120,5 +131,6 @@ class ApplicationGatewayPolicyAdmin(admin.ModelAdmin): admin.site.register(PaymentRequest, PaymentRequestAdmin) admin.site.register(PNA, PNAAdmin) +admin.site.register(SEP, SEPAdmin) admin.site.register(Fake, FakeAdmin) -admin.site.register(ApplicationGatewayPolicy, ApplicationGatewayPolicyAdmin) \ No newline at end of file +admin.site.register(ApplicationGatewayPolicy, ApplicationGatewayPolicyAdmin) diff --git a/apps/pg/models.py b/apps/pg/models.py index e8a146f..595ad18 100644 --- a/apps/pg/models.py +++ b/apps/pg/models.py @@ -243,16 +243,6 @@ class PNA(BasePGModel): 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): self.payment_request.change_state(StateChoices.CREATED, StateChoices.IPG_PENDING, 'can not change state') amount = self.payment_request.amount + self.payment_request.commission @@ -428,27 +418,27 @@ class SEP(BasePGModel): raise NotImplementedError() -# class Fake(BasePGModel): -# label = GatewayChoise.FAKE.value -# image = f'image/{GatewayChoise.FAKE.value}.png' -# -# payment_request = models.OneToOneField(PaymentRequest, on_delete=models.PROTECT, related_name='+') -# -# def make_request(self): -# self.payment_request.change_state(StateChoices.CREATED, StateChoices.IPG_PENDING, 'can not change state') -# -# def get_pg_page_url(self): -# return reverse('pg:payment-confirm-view', kwargs={'uuid': self.payment_request.uuid}) -# -# def confirm_request(self, request=None): -# self.payment_request.change_state(StateChoices.IPG_PENDING, StateChoices.IPG_SUCCESS, 'can not change state') -# -# self.payment_request.charge_wallet_balance() -# messages.success(request, 'شارژ انجام شد') -# self.save() -# -# def reverse_request(self): -# raise NotImplementedError() +class Fake(BasePGModel): + # label = GatewayChoise.FAKE.value + # image = f'image/{GatewayChoise.FAKE.value}.png' + + payment_request = models.OneToOneField(PaymentRequest, on_delete=models.PROTECT, related_name='+') + + def make_request(self): + self.payment_request.change_state(StateChoices.CREATED, StateChoices.IPG_PENDING, 'can not change state') + + def get_pg_page_url(self): + return reverse('pg:payment-confirm-view', kwargs={'uuid': self.payment_request.uuid}) + + def confirm_request(self, request=None): + self.payment_request.change_state(StateChoices.IPG_PENDING, StateChoices.IPG_SUCCESS, 'can not change state') + + self.payment_request.charge_wallet_balance() + messages.success(request, 'شارژ انجام شد') + self.save() + + def reverse_request(self): + raise NotImplementedError() class ApplicationGatewayPolicy(BaseModel):