From 3764bc44ff0a43de9508134a8097362fbecadc7f Mon Sep 17 00:00:00 2001
From: Yohann D'ANELLO <yohann.danello@gmail.com>
Date: Thu, 27 Feb 2020 17:22:59 +0100
Subject: [PATCH] Fix money creation, closes #25

---
 apps/note/forms.py               | 18 ++++++++++++++++++
 apps/note/models/transactions.py |  7 +++++--
 apps/note/views.py               | 11 +++--------
 3 files changed, 26 insertions(+), 10 deletions(-)

diff --git a/apps/note/forms.py b/apps/note/forms.py
index 15cccf2e..3222acec 100644
--- a/apps/note/forms.py
+++ b/apps/note/forms.py
@@ -3,6 +3,7 @@
 
 from dal import autocomplete
 from django import forms
+from django.utils.translation import gettext_lazy as _
 
 from .models import Transaction, TransactionTemplate, TemplateTransaction
 
@@ -33,6 +34,23 @@ class TransactionForm(forms.ModelForm):
     def save(self, commit=True):
         super().save(commit)
 
+
+    def clean(self):
+        """
+        If the user has no right to transfer funds, then it will be the source of the transfer by default.
+        Transactions between a note and the same note are not authorized.
+        """
+
+        cleaned_data = super().clean()
+        if not "source" in cleaned_data: # TODO Replace it with "if %user has no right to transfer funds"
+            cleaned_data["source"] = self.user.note
+
+        if cleaned_data["source"].pk == cleaned_data["destination"].pk:
+            self.add_error("destination", _("Source and destination must be different."))
+
+        return cleaned_data
+
+
     class Meta:
         model = Transaction
         fields = (
diff --git a/apps/note/models/transactions.py b/apps/note/models/transactions.py
index 49fc44b4..598c119b 100644
--- a/apps/note/models/transactions.py
+++ b/apps/note/models/transactions.py
@@ -84,8 +84,6 @@ class Transaction(PolymorphicModel):
 
     amount is store in centimes of currency, making it a  positive integer
     value. (from someone to someone else)
-
-    TODO: Ensure source != destination.
     """
 
     source = models.ForeignKey(
@@ -126,6 +124,11 @@ class Transaction(PolymorphicModel):
         """
         When saving, also transfer money between two notes
         """
+
+        if self.source.pk == self.destination.pk:
+            # When source == destination, no money is transfered
+            return
+
         created = self.pk is None
         to_transfer = self.amount * self.quantity
         if not created:
diff --git a/apps/note/views.py b/apps/note/views.py
index 75577a2e..5038df16 100644
--- a/apps/note/views.py
+++ b/apps/note/views.py
@@ -41,17 +41,12 @@ class TransactionCreate(LoginRequiredMixin, CreateView):
 
         if False:  # TODO: fix it with "if %user has no right to transfer funds"
             del form.fields['source']
+            form.user = self.request.user
 
         return form
 
-    def form_valid(self, form):
-        """
-        If the user has no right to transfer funds, then it will be the source of the transfer by default.
-        """
-        if False:  # TODO: fix it with "if %user has no right to transfer funds"
-            form.instance.source = self.request.user.note
-
-        return super().form_valid(form)
+    def get_success_url(self):
+        return reverse('note:transfer')
 
 
 class NoteAutocomplete(autocomplete.Select2QuerySetView):
-- 
GitLab