wallet with category
This commit is contained in:
parent
3908af8bd8
commit
1443658656
6 changed files with 65 additions and 8 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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'],
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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',
|
||||
),
|
||||
]
|
||||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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
|
||||
)
|
||||
)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue