wallet with category

This commit is contained in:
Sayyid Hamid Mahdavi 2025-09-18 13:39:12 +03:30
parent 3908af8bd8
commit 1443658656
6 changed files with 65 additions and 8 deletions

View file

@ -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)

View file

@ -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'],
}

View file

@ -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',
),
]

View file

@ -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(

View file

@ -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:

View file

@ -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
)
)