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):
|
class TransactionAdmin(admin.ModelAdmin):
|
||||||
list_display = ['uuid', 'amount', 'created_at', 'updated_at', 'payer_id', 'payer_type', 'payee_id', 'payee_type', 'state', 'application']
|
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']
|
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(Transaction, TransactionAdmin)
|
||||||
admin.site.register(Wallet)
|
admin.site.register(Wallet)
|
||||||
|
|
|
||||||
|
|
@ -6,9 +6,10 @@ from .models import Transaction
|
||||||
|
|
||||||
|
|
||||||
class UserTransactionFilter(django_filters.FilterSet):
|
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:
|
class Meta:
|
||||||
model = Transaction
|
model = Transaction
|
||||||
fields = {
|
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):
|
class Transaction(BaseModel):
|
||||||
amount = models.PositiveBigIntegerField(_('amount'), blank=False, validators=[MinValueValidator(1)])
|
amount = models.PositiveBigIntegerField(_('amount'), blank=False, validators=[MinValueValidator(1)])
|
||||||
delay = models.PositiveIntegerField(default=0, blank=True) # number of days for delayed payments
|
delay = models.PositiveIntegerField(default=0, blank=True) # number of days for delayed payments
|
||||||
payer_id = models.UUIDField(blank=True, null=True)
|
_payer_id = models.UUIDField(blank=True, null=True)
|
||||||
payer_type = models.IntegerField(choices=TypeChoices.choices, blank=True, null=True)
|
_payer_type = models.IntegerField(choices=TypeChoices.choices, blank=True, null=True)
|
||||||
payee_id = models.UUIDField(null=True)
|
_payee_id = models.UUIDField(null=True)
|
||||||
payee_type = models.IntegerField(choices=TypeChoices.choices, blank=True, null=True)
|
_payee_type = models.IntegerField(choices=TypeChoices.choices, blank=True, null=True)
|
||||||
state = models.IntegerField(choices=StateChoices.choices, default=StateChoices.CREATED)
|
state = models.IntegerField(choices=StateChoices.choices, default=StateChoices.CREATED)
|
||||||
application = models.ForeignKey(oauth2_settings.APPLICATION_MODEL, on_delete=models.PROTECT,
|
application = models.ForeignKey(oauth2_settings.APPLICATION_MODEL, on_delete=models.PROTECT,
|
||||||
related_name='transactions', null=True)
|
related_name='transactions', null=True)
|
||||||
|
|
@ -120,6 +120,22 @@ class Transaction(BaseModel):
|
||||||
def get_payee(self):
|
def get_payee(self):
|
||||||
return self.payee_wallet.get_owner()
|
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):
|
def change_state(self, from_state, to_state, error_message=None, **data):
|
||||||
if self.state == from_state:
|
if self.state == from_state:
|
||||||
updated = Transaction.objects.filter(pk=self.pk, state=from_state).update(
|
updated = Transaction.objects.filter(pk=self.pk, state=from_state).update(
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,5 @@
|
||||||
|
import logging
|
||||||
|
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
from oauth2_provider.contrib.rest_framework import TokenHasScope, IsAuthenticatedOrTokenHasScope
|
from oauth2_provider.contrib.rest_framework import TokenHasScope, IsAuthenticatedOrTokenHasScope
|
||||||
from rest_framework import generics, permissions, mixins
|
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, \
|
from apps.wallet.serializers import ApplicationDepositSerializer, ApplicationWithdrawSerializer, \
|
||||||
ApplicationTransactionSerializer, ApplicationBalanceSerializer, MyWalletSerializer
|
ApplicationTransactionSerializer, ApplicationBalanceSerializer, MyWalletSerializer
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
def get_application(request):
|
def get_application(request):
|
||||||
try:
|
try:
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,8 @@ from rest_framework.exceptions import APIException
|
||||||
from rest_framework.views import exception_handler as drf_exception_handler
|
from rest_framework.views import exception_handler as drf_exception_handler
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
def exception_handler(exc, context):
|
def exception_handler(exc, context):
|
||||||
logger.exception(exc)
|
logger.exception(exc)
|
||||||
# پاسخ پیشفرض DRF را دریافت میکنیم
|
# پاسخ پیشفرض DRF را دریافت میکنیم
|
||||||
|
|
@ -30,6 +32,7 @@ def exception_handler(exc, context):
|
||||||
# در فایل middleware.py
|
# در فایل middleware.py
|
||||||
from django.http import JsonResponse
|
from django.http import JsonResponse
|
||||||
|
|
||||||
|
|
||||||
class ErrorMiddleware:
|
class ErrorMiddleware:
|
||||||
def __init__(self, get_response):
|
def __init__(self, get_response):
|
||||||
self.get_response = get_response
|
self.get_response = get_response
|
||||||
|
|
@ -48,4 +51,4 @@ class ErrorMiddleware:
|
||||||
"details": str(exception) # فقط در حالت توسعه! در تولید بهتر است لاگ شود.
|
"details": str(exception) # فقط در حالت توسعه! در تولید بهتر است لاگ شود.
|
||||||
},
|
},
|
||||||
status=500
|
status=500
|
||||||
)
|
)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue