db_kyc_project/backend/users/signals/transactions.py
Даня Вакуленков 4a18a785e9 Add backend code
2024-12-10 23:31:35 +03:00

43 lines
1.6 KiB
Python

from decimal import Decimal
from django.dispatch import receiver
from django.db import transaction
from django.db.models import F
from django.db.models.signals import post_save, pre_save, pre_delete
from users.models import Transaction, ClickTransaction
from users.errors import NotEnoughFundsError
from misc.models import Setting
@receiver(pre_save, dispatch_uid='transaction_pre_save_signal')
def transaction_pre_save_signal(sender, instance, **kwargs):
if not isinstance(instance, Transaction) or not instance.pk:
return
transaction_instance = Transaction.objects.get(pk=instance.id)
instance._old_value = transaction_instance.value
@receiver(post_save, dispatch_uid='transaction_signal')
def transaction_signal(sender, instance, created, **kwargs):
if not issubclass(sender, Transaction):
return
with transaction.atomic():
user_instance = instance.user
user_instance.points = F('points') + (instance.value - getattr(instance, '_old_value', 0))
user_instance.save()
user_instance.refresh_from_db()
if user_instance.points < 0:
raise NotEnoughFundsError
@receiver(pre_delete, dispatch_uid='transaction_pre_delete_signal')
def transaction_pre_delete_signal(sender, instance, **kwargs):
if not issubclass(sender, Transaction):
return
with transaction.atomic():
user_instance = instance.user
user_instance.points = F('points') - instance.value
user_instance.save()
user_instance.refresh_from_db()
if user_instance.points < 0:
raise NotEnoughFundsError