Création d'argent
En faisant un transfert d'une note vers elle-même, on peut créer de l'argent.
Code incriminé (note/models/transaction.py#L120
) :
def save(self, *args, **kwargs):
"""
When saving, also transfer money between two notes
"""
created = self.pk is None
to_transfer = self.amount * self.quantity
if not created:
# Revert old transaction
old_transaction = Transaction.objects.get(pk=self.pk)
if old_transaction.valid:
self.source.balance += to_transfer
self.destination.balance -= to_transfer
if self.valid:
self.source.balance -= to_transfer
self.destination.balance += to_transfer
# Save notes
self.source.save()
self.destination.save()
super().save(*args, **kwargs)
Le problème est que si self.source.pk == self.destination.pk
, on a pas self.source is self.destination
(en gros les deux instances de Note pointent vers le même objet dans la base de données mais les informations ne sont pas partagées.
Pistes de résolution :
- Interdire ce type de transactions (voir s'il est possible de dire directement dans la base de données que
source
!=destination
) - Traiter ce cas à part
- Sauvegarder l'une des notes avant l'autre