From 1443658656654511fdd6b6e992f6037022642e80 Mon Sep 17 00:00:00 2001 From: Sayyid Hamid Mahdavi Date: Thu, 18 Sep 2025 13:39:12 +0330 Subject: [PATCH] wallet with category --- apps/wallet/admin.py | 2 +- apps/wallet/filters.py | 5 +-- ...payee_id_transaction__payee_id_and_more.py | 33 +++++++++++++++++++ apps/wallet/models.py | 24 +++++++++++--- apps/wallet/views/application.py | 4 +++ utils/exceptions.py | 5 ++- 6 files changed, 65 insertions(+), 8 deletions(-) create mode 100644 apps/wallet/migrations/0010_rename_payee_id_transaction__payee_id_and_more.py diff --git a/apps/wallet/admin.py b/apps/wallet/admin.py index 22cec1d..a10945c 100755 --- a/apps/wallet/admin.py +++ b/apps/wallet/admin.py @@ -4,7 +4,7 @@ from .models import Transaction, Wallet, Category class TransactionAdmin(admin.ModelAdmin): list_display = ['uuid', 'amount', 'created_at', 'updated_at', 'payer_id', 'payer_type', 'payee_id', 'payee_type', 'state', 'application'] search_fields = ['uuid', 'created_at', 'updated_at', 'payer_id', 'payee_id', 'application__uuid'] - list_filter = ['state', 'payer_type', 'payee_type'] + list_filter = ['state'] admin.site.register(Transaction, TransactionAdmin) admin.site.register(Wallet) diff --git a/apps/wallet/filters.py b/apps/wallet/filters.py index 85ab859..c12c41e 100644 --- a/apps/wallet/filters.py +++ b/apps/wallet/filters.py @@ -6,9 +6,10 @@ from .models import Transaction class UserTransactionFilter(django_filters.FilterSet): + payer_id = django_filters.UUIDFilter(field_name='payer_wallet__owner_uuid', lookup_expr='iexact') + payee_id = django_filters.UUIDFilter(field_name='payee_wallet__owner_uuid', lookup_expr='iexact') + class Meta: model = Transaction fields = { - 'payer_id': ['iexact'], - 'payee_id': ['iexact'], } diff --git a/apps/wallet/migrations/0010_rename_payee_id_transaction__payee_id_and_more.py b/apps/wallet/migrations/0010_rename_payee_id_transaction__payee_id_and_more.py new file mode 100644 index 0000000..3c65295 --- /dev/null +++ b/apps/wallet/migrations/0010_rename_payee_id_transaction__payee_id_and_more.py @@ -0,0 +1,33 @@ +# Generated by Django 5.2.6 on 2025-09-18 10:06 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('wallet', '0009_alter_transaction_payee_id'), + ] + + operations = [ + migrations.RenameField( + model_name='transaction', + old_name='payee_id', + new_name='_payee_id', + ), + migrations.RenameField( + model_name='transaction', + old_name='payee_type', + new_name='_payee_type', + ), + migrations.RenameField( + model_name='transaction', + old_name='payer_id', + new_name='_payer_id', + ), + migrations.RenameField( + model_name='transaction', + old_name='payer_type', + new_name='_payer_type', + ), + ] diff --git a/apps/wallet/models.py b/apps/wallet/models.py index 477a522..e899f91 100755 --- a/apps/wallet/models.py +++ b/apps/wallet/models.py @@ -83,10 +83,10 @@ class TransactionQuerySet(models.QuerySet): class Transaction(BaseModel): amount = models.PositiveBigIntegerField(_('amount'), blank=False, validators=[MinValueValidator(1)]) delay = models.PositiveIntegerField(default=0, blank=True) # number of days for delayed payments - payer_id = models.UUIDField(blank=True, null=True) - payer_type = models.IntegerField(choices=TypeChoices.choices, blank=True, null=True) - payee_id = models.UUIDField(null=True) - payee_type = models.IntegerField(choices=TypeChoices.choices, blank=True, null=True) + _payer_id = models.UUIDField(blank=True, null=True) + _payer_type = models.IntegerField(choices=TypeChoices.choices, blank=True, null=True) + _payee_id = models.UUIDField(null=True) + _payee_type = models.IntegerField(choices=TypeChoices.choices, blank=True, null=True) state = models.IntegerField(choices=StateChoices.choices, default=StateChoices.CREATED) application = models.ForeignKey(oauth2_settings.APPLICATION_MODEL, on_delete=models.PROTECT, related_name='transactions', null=True) @@ -120,6 +120,22 @@ class Transaction(BaseModel): def get_payee(self): return self.payee_wallet.get_owner() + @property + def payer_id(self): + return self.payer_wallet.owner_uuid + + @property + def payer_type(self): + return self.payer_wallet.owner_type + + @property + def payee_id(self): + return self.payee_wallet.owner_uuid + + @property + def payee_type(self): + return self.payee_wallet.owner_type + def change_state(self, from_state, to_state, error_message=None, **data): if self.state == from_state: updated = Transaction.objects.filter(pk=self.pk, state=from_state).update( diff --git a/apps/wallet/views/application.py b/apps/wallet/views/application.py index 5f179dd..3811029 100755 --- a/apps/wallet/views/application.py +++ b/apps/wallet/views/application.py @@ -1,3 +1,5 @@ +import logging + from django.db.models import Q from oauth2_provider.contrib.rest_framework import TokenHasScope, IsAuthenticatedOrTokenHasScope from rest_framework import generics, permissions, mixins @@ -12,6 +14,8 @@ from apps.wallet.models import Transaction, Category, Wallet from apps.wallet.serializers import ApplicationDepositSerializer, ApplicationWithdrawSerializer, \ ApplicationTransactionSerializer, ApplicationBalanceSerializer, MyWalletSerializer +logger = logging.getLogger(__name__) + def get_application(request): try: diff --git a/utils/exceptions.py b/utils/exceptions.py index 1fb3b04..f0b7e9c 100644 --- a/utils/exceptions.py +++ b/utils/exceptions.py @@ -4,6 +4,8 @@ from rest_framework.exceptions import APIException from rest_framework.views import exception_handler as drf_exception_handler logger = logging.getLogger(__name__) + + def exception_handler(exc, context): logger.exception(exc) # پاسخ پیش‌فرض DRF را دریافت می‌کنیم @@ -30,6 +32,7 @@ def exception_handler(exc, context): # در فایل middleware.py from django.http import JsonResponse + class ErrorMiddleware: def __init__(self, get_response): self.get_response = get_response @@ -48,4 +51,4 @@ class ErrorMiddleware: "details": str(exception) # فقط در حالت توسعه! در تولید بهتر است لاگ شود. }, status=500 - ) \ No newline at end of file + )