|
|
|
@ -1,7 +1,9 @@
|
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
from django.db import models
|
|
|
|
|
from django.core.validators import *
|
|
|
|
|
from django.contrib.auth.models import User
|
|
|
|
|
|
|
|
|
|
from django.db.models.deletion import SET_NULL
|
|
|
|
|
from django.db.models.signals import pre_delete
|
|
|
|
|
from decimal import Decimal
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -19,7 +21,7 @@ class Transaction(models.Model):
|
|
|
|
|
"""Represents a money transaction into the users account. """
|
|
|
|
|
user = models.ForeignKey(User)
|
|
|
|
|
transactionType = models.ForeignKey(TransactionType, verbose_name='Typ')
|
|
|
|
|
dateTime = models.DateTimeField()
|
|
|
|
|
dateTime = models.DateTimeField(auto_now_add=True)
|
|
|
|
|
amount = models.DecimalField(max_digits=8, decimal_places=2, validators=[MinValueValidator(Decimal("0.01"))])
|
|
|
|
|
checked = models.BooleanField(default=False)
|
|
|
|
|
|
|
|
|
@ -44,4 +46,44 @@ class Transaction(models.Model):
|
|
|
|
|
profile.save()
|
|
|
|
|
super(Transaction, self).delete(*args, **kwargs)
|
|
|
|
|
|
|
|
|
|
class VirtualTransaction(models.Model):
|
|
|
|
|
""" Represents a transaction between two users. """
|
|
|
|
|
user = models.ForeignKey(User, null=True, on_delete=SET_NULL)
|
|
|
|
|
recipient = models.ForeignKey(User, related_name='receivedtransaction', null=True, on_delete=SET_NULL, verbose_name=u'Empfänger')
|
|
|
|
|
dateTime = models.DateTimeField(auto_now_add=True)
|
|
|
|
|
amount = models.DecimalField(max_digits=8, decimal_places=2, validators=[MinValueValidator(Decimal("0.01"))], verbose_name='Betrag')
|
|
|
|
|
comment = models.CharField(max_length=100, verbose_name='Verwendungszweck')
|
|
|
|
|
|
|
|
|
|
def __unicode__(self):
|
|
|
|
|
return u"%s ==> %s: %s Euro" % (self.user, self.recipient, self.amount)
|
|
|
|
|
def save(self, *args, **kwargs):
|
|
|
|
|
userProfile = self.user.get_profile()
|
|
|
|
|
recipientProfile = self.recipient.get_profile()
|
|
|
|
|
amount = None
|
|
|
|
|
if self.id == None:
|
|
|
|
|
amount = self.amount
|
|
|
|
|
else:
|
|
|
|
|
oldobj = VirtualTransaction.objects.get(id=self.id)
|
|
|
|
|
amount = self.amount - oldobj.amount
|
|
|
|
|
userProfile.balance -= amount
|
|
|
|
|
recipientProfile.balance += amount
|
|
|
|
|
userProfile.save()
|
|
|
|
|
recipientProfile.save()
|
|
|
|
|
super(VirtualTransaction, self).save(*args, **kwargs)
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
|
def pre_delete_signal(sender, instance, **kwargs):
|
|
|
|
|
""" Pre delete signal to ensure consistent balances on object delete. """
|
|
|
|
|
# Only revert if both users exist.
|
|
|
|
|
if instance.user and instance.recipient:
|
|
|
|
|
# revert transaction
|
|
|
|
|
print instance.user
|
|
|
|
|
print dir(instance)
|
|
|
|
|
userProfile = instance.user.get_profile()
|
|
|
|
|
recipientProfile = instance.recipient.get_profile()
|
|
|
|
|
userProfile.balance += instance.amount
|
|
|
|
|
recipientProfile.balance -= instance.amount
|
|
|
|
|
userProfile.save()
|
|
|
|
|
recipientProfile.save()
|
|
|
|
|
pre_delete.connect(VirtualTransaction.pre_delete_signal, sender=VirtualTransaction)
|
|
|
|
|
|
|
|
|
|