From 41aa6964d2a1ff411cd36b469f322c708a7fe437 Mon Sep 17 00:00:00 2001
From: Yohann D'ANELLO <yohann.danello@gmail.com>
Date: Thu, 26 Mar 2020 14:45:48 +0100
Subject: [PATCH] Store used aliases in transactions

---
 apps/note/models/transactions.py | 22 ++++++++++
 apps/note/tables.py              | 20 ++++++++-
 locale/de/LC_MESSAGES/django.po  | 73 +++++++++++++++++---------------
 locale/fr/LC_MESSAGES/django.po  | 73 +++++++++++++++++---------------
 static/js/consos.js              |  7 ++-
 static/js/transfer.js            | 16 +++++--
 6 files changed, 136 insertions(+), 75 deletions(-)

diff --git a/apps/note/models/transactions.py b/apps/note/models/transactions.py
index 93d1071a..c6b8baa6 100644
--- a/apps/note/models/transactions.py
+++ b/apps/note/models/transactions.py
@@ -2,6 +2,7 @@
 # SPDX-License-Identifier: GPL-3.0-or-later
 
 from django.db import models
+from django.db.models import F
 from django.urls import reverse
 from django.utils import timezone
 from django.utils.translation import gettext_lazy as _
@@ -93,12 +94,26 @@ class Transaction(PolymorphicModel):
         related_name='+',
         verbose_name=_('source'),
     )
+
+    source_alias = models.CharField(
+        max_length=255,
+        default="",  # Will be remplaced by the name of the note on save
+        verbose_name=_('used alias'),
+    )
+
     destination = models.ForeignKey(
         Note,
         on_delete=models.PROTECT,
         related_name='+',
         verbose_name=_('destination'),
     )
+
+    destination_alias = models.CharField(
+        max_length=255,
+        default="",  # Will be remplaced by the name of the note on save
+        verbose_name=_('used alias'),
+    )
+
     created_at = models.DateTimeField(
         verbose_name=_('created at'),
         default=timezone.now,
@@ -142,6 +157,13 @@ class Transaction(PolymorphicModel):
         When saving, also transfer money between two notes
         """
 
+        # If the aliases are not entered, we assume that the used alias is the name of the note
+        if not self.source_alias:
+            self.source_alias = str(self.source)
+
+        if not self.destination_alias:
+            self.destination_alias = str(self.destination)
+
         if self.source.pk == self.destination.pk:
             # When source == destination, no money is transfered
             super().save(*args, **kwargs)
diff --git a/apps/note/tables.py b/apps/note/tables.py
index 328f620a..4b57cfa2 100644
--- a/apps/note/tables.py
+++ b/apps/note/tables.py
@@ -21,11 +21,29 @@ class HistoryTable(tables.Table):
                 'table table-condensed table-striped table-hover'
         }
         model = Transaction
-        exclude = ("id", "polymorphic_ctype", "invalidity_reason")
+        exclude = ("id", "polymorphic_ctype", "invalidity_reason", "source_alias", "destination_alias",)
         template_name = 'django_tables2/bootstrap4.html'
         sequence = ('...', 'type', 'total', 'valid',)
         orderable = False
 
+    source = tables.Column(
+        attrs={
+            "td": {
+                "data-toggle": "tooltip",
+                "title": lambda record: _("used alias").capitalize() + " : " + record.source_alias,
+            }
+        }
+    )
+
+    destination = tables.Column(
+        attrs={
+            "td": {
+                "data-toggle": "tooltip",
+                "title": lambda record: _("used alias").capitalize() + " : " + record.destination_alias,
+            }
+        }
+    )
+
     type = tables.Column()
 
     total = tables.Column()  # will use Transaction.total() !!
diff --git a/locale/de/LC_MESSAGES/django.po b/locale/de/LC_MESSAGES/django.po
index 519cf289..bc1a0d03 100644
--- a/locale/de/LC_MESSAGES/django.po
+++ b/locale/de/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-03-25 14:46+0100\n"
+"POT-Creation-Date: 2020-03-26 14:40+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -24,8 +24,8 @@ msgstr ""
 
 #: apps/activity/models.py:19 apps/activity/models.py:44
 #: apps/member/models.py:63 apps/member/models.py:114
-#: apps/note/models/notes.py:188 apps/note/models/transactions.py:24
-#: apps/note/models/transactions.py:44 apps/note/models/transactions.py:210
+#: apps/note/models/notes.py:188 apps/note/models/transactions.py:25
+#: apps/note/models/transactions.py:45 apps/note/models/transactions.py:232
 #: templates/member/profile_detail.html:15
 msgid "name"
 msgstr ""
@@ -46,13 +46,13 @@ msgstr ""
 msgid "activity types"
 msgstr ""
 
-#: apps/activity/models.py:48 apps/note/models/transactions.py:69
+#: apps/activity/models.py:48 apps/note/models/transactions.py:70
 #: apps/permission/models.py:91
 msgid "description"
 msgstr ""
 
 #: apps/activity/models.py:54 apps/note/models/notes.py:164
-#: apps/note/models/transactions.py:62
+#: apps/note/models/transactions.py:63
 msgid "type"
 msgstr ""
 
@@ -120,11 +120,11 @@ msgstr ""
 msgid "create"
 msgstr ""
 
-#: apps/logs/models.py:61 apps/note/tables.py:126
+#: apps/logs/models.py:61 apps/note/tables.py:147
 msgid "edit"
 msgstr ""
 
-#: apps/logs/models.py:62 apps/note/tables.py:130
+#: apps/logs/models.py:62 apps/note/tables.py:151
 msgid "delete"
 msgstr ""
 
@@ -255,12 +255,12 @@ msgstr ""
 msgid "Alias successfully deleted"
 msgstr ""
 
-#: apps/note/admin.py:120 apps/note/models/transactions.py:94
+#: apps/note/admin.py:120 apps/note/models/transactions.py:95
 msgid "source"
 msgstr ""
 
 #: apps/note/admin.py:128 apps/note/admin.py:156
-#: apps/note/models/transactions.py:53 apps/note/models/transactions.py:100
+#: apps/note/models/transactions.py:54 apps/note/models/transactions.py:108
 msgid "destination"
 msgstr ""
 
@@ -310,7 +310,7 @@ msgstr ""
 msgid "display image"
 msgstr ""
 
-#: apps/note/models/notes.py:53 apps/note/models/transactions.py:103
+#: apps/note/models/notes.py:53 apps/note/models/transactions.py:118
 msgid "created at"
 msgstr ""
 
@@ -384,101 +384,106 @@ msgstr ""
 msgid "You can't delete your main alias."
 msgstr ""
 
-#: apps/note/models/transactions.py:30
+#: apps/note/models/transactions.py:31
 msgid "transaction category"
 msgstr ""
 
-#: apps/note/models/transactions.py:31
+#: apps/note/models/transactions.py:32
 msgid "transaction categories"
 msgstr ""
 
-#: apps/note/models/transactions.py:47
+#: apps/note/models/transactions.py:48
 msgid "A template with this name already exist"
 msgstr ""
 
-#: apps/note/models/transactions.py:56 apps/note/models/transactions.py:111
+#: apps/note/models/transactions.py:57 apps/note/models/transactions.py:126
 msgid "amount"
 msgstr ""
 
-#: apps/note/models/transactions.py:57
+#: apps/note/models/transactions.py:58
 msgid "in centimes"
 msgstr ""
 
-#: apps/note/models/transactions.py:75
+#: apps/note/models/transactions.py:76
 msgid "transaction template"
 msgstr ""
 
-#: apps/note/models/transactions.py:76
+#: apps/note/models/transactions.py:77
 msgid "transaction templates"
 msgstr ""
 
-#: apps/note/models/transactions.py:107
+#: apps/note/models/transactions.py:101 apps/note/models/transactions.py:114
+#: apps/note/tables.py:33 apps/note/tables.py:42
+msgid "used alias"
+msgstr ""
+
+#: apps/note/models/transactions.py:122
 msgid "quantity"
 msgstr ""
 
-#: apps/note/models/transactions.py:115
+#: apps/note/models/transactions.py:130
 msgid "reason"
 msgstr ""
 
-#: apps/note/models/transactions.py:120
+#: apps/note/models/transactions.py:135
 msgid "valid"
 msgstr ""
 
-#: apps/note/models/transactions.py:125 apps/note/tables.py:74
+#: apps/note/models/transactions.py:140 apps/note/tables.py:95
 msgid "invalidity reason"
 msgstr ""
 
-#: apps/note/models/transactions.py:132
+#: apps/note/models/transactions.py:147
 msgid "transaction"
 msgstr ""
 
-#: apps/note/models/transactions.py:133
+#: apps/note/models/transactions.py:148
 msgid "transactions"
 msgstr ""
 
-#: apps/note/models/transactions.py:180 templates/base.html:83
+#: apps/note/models/transactions.py:202 templates/base.html:83
 #: templates/note/transaction_form.html:19
 #: templates/note/transaction_form.html:145
 msgid "Transfer"
 msgstr ""
 
-#: apps/note/models/transactions.py:200
+#: apps/note/models/transactions.py:222
 msgid "Template"
 msgstr ""
 
-#: apps/note/models/transactions.py:215
+#: apps/note/models/transactions.py:237
 msgid "first_name"
 msgstr ""
 
-#: apps/note/models/transactions.py:220
+#: apps/note/models/transactions.py:242
 msgid "bank"
 msgstr ""
 
-#: apps/note/models/transactions.py:226 templates/note/transaction_form.html:24
+#: apps/note/models/transactions.py:248 templates/note/transaction_form.html:24
 msgid "Credit"
 msgstr ""
 
-#: apps/note/models/transactions.py:226 templates/note/transaction_form.html:28
+#: apps/note/models/transactions.py:248 templates/note/transaction_form.html:28
 msgid "Debit"
 msgstr ""
 
-#: apps/note/models/transactions.py:242 apps/note/models/transactions.py:247
+#: apps/note/models/transactions.py:264 apps/note/models/transactions.py:269
 msgid "membership transaction"
 msgstr ""
 
-#: apps/note/models/transactions.py:243
+#: apps/note/models/transactions.py:265
 msgid "membership transactions"
 msgstr ""
 
-#: apps/note/tables.py:39
+#: apps/note/tables.py:57
 msgid "Click to invalidate"
 msgstr ""
 
-#: apps/note/tables.py:39
+#: apps/note/tables.py:57
 msgid "Click to validate"
 msgstr ""
 
-#: apps/note/tables.py:72
+#: apps/note/tables.py:93
 msgid "No reason specified"
 msgstr ""
 
diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po
index d07c4f21..f7f1d1a4 100644
--- a/locale/fr/LC_MESSAGES/django.po
+++ b/locale/fr/LC_MESSAGES/django.po
@@ -3,7 +3,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-03-25 14:46+0100\n"
+"POT-Creation-Date: 2020-03-26 14:40+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -19,8 +19,8 @@ msgstr "activité"
 
 #: apps/activity/models.py:19 apps/activity/models.py:44
 #: apps/member/models.py:63 apps/member/models.py:114
-#: apps/note/models/notes.py:188 apps/note/models/transactions.py:24
-#: apps/note/models/transactions.py:44 apps/note/models/transactions.py:210
+#: apps/note/models/notes.py:188 apps/note/models/transactions.py:25
+#: apps/note/models/transactions.py:45 apps/note/models/transactions.py:232
 #: templates/member/profile_detail.html:15
 msgid "name"
 msgstr "nom"
@@ -41,13 +41,13 @@ msgstr "type d'activité"
 msgid "activity types"
 msgstr "types d'activité"
 
-#: apps/activity/models.py:48 apps/note/models/transactions.py:69
+#: apps/activity/models.py:48 apps/note/models/transactions.py:70
 #: apps/permission/models.py:91
 msgid "description"
 msgstr "description"
 
 #: apps/activity/models.py:54 apps/note/models/notes.py:164
-#: apps/note/models/transactions.py:62
+#: apps/note/models/transactions.py:63
 msgid "type"
 msgstr "type"
 
@@ -115,11 +115,11 @@ msgstr "Nouvelles données"
 msgid "create"
 msgstr "Créer"
 
-#: apps/logs/models.py:61 apps/note/tables.py:126
+#: apps/logs/models.py:61 apps/note/tables.py:147
 msgid "edit"
 msgstr "Modifier"
 
-#: apps/logs/models.py:62 apps/note/tables.py:130
+#: apps/logs/models.py:62 apps/note/tables.py:151
 msgid "delete"
 msgstr "Supprimer"
 
@@ -254,12 +254,12 @@ msgstr "Compte n°%(id)s : %(username)s"
 msgid "Alias successfully deleted"
 msgstr "L'alias a bien été supprimé"
 
-#: apps/note/admin.py:120 apps/note/models/transactions.py:94
+#: apps/note/admin.py:120 apps/note/models/transactions.py:95
 msgid "source"
 msgstr "source"
 
 #: apps/note/admin.py:128 apps/note/admin.py:156
-#: apps/note/models/transactions.py:53 apps/note/models/transactions.py:100
+#: apps/note/models/transactions.py:54 apps/note/models/transactions.py:108
 msgid "destination"
 msgstr "destination"
 
@@ -310,7 +310,7 @@ msgstr ""
 msgid "display image"
 msgstr "image affichée"
 
-#: apps/note/models/notes.py:53 apps/note/models/transactions.py:103
+#: apps/note/models/notes.py:53 apps/note/models/transactions.py:118
 msgid "created at"
 msgstr "créée le"
 
@@ -384,101 +384,106 @@ msgstr "Un alias avec un nom similaire existe déjà : {}"
 msgid "You can't delete your main alias."
 msgstr "Vous ne pouvez pas supprimer votre alias principal."
 
-#: apps/note/models/transactions.py:30
+#: apps/note/models/transactions.py:31
 msgid "transaction category"
 msgstr "catégorie de transaction"
 
-#: apps/note/models/transactions.py:31
+#: apps/note/models/transactions.py:32
 msgid "transaction categories"
 msgstr "catégories de transaction"
 
-#: apps/note/models/transactions.py:47
+#: apps/note/models/transactions.py:48
 msgid "A template with this name already exist"
 msgstr "Un modèle de transaction avec un nom similaire existe déjà."
 
-#: apps/note/models/transactions.py:56 apps/note/models/transactions.py:111
+#: apps/note/models/transactions.py:57 apps/note/models/transactions.py:126
 msgid "amount"
 msgstr "montant"
 
-#: apps/note/models/transactions.py:57
+#: apps/note/models/transactions.py:58
 msgid "in centimes"
 msgstr "en centimes"
 
-#: apps/note/models/transactions.py:75
+#: apps/note/models/transactions.py:76
 msgid "transaction template"
 msgstr "modèle de transaction"
 
-#: apps/note/models/transactions.py:76
+#: apps/note/models/transactions.py:77
 msgid "transaction templates"
 msgstr "modèles de transaction"
 
-#: apps/note/models/transactions.py:107
+#: apps/note/models/transactions.py:101 apps/note/models/transactions.py:114
+#: apps/note/tables.py:33 apps/note/tables.py:42
+msgid "used alias"
+msgstr "alias utilisé"
+
+#: apps/note/models/transactions.py:122
 msgid "quantity"
 msgstr "quantité"
 
-#: apps/note/models/transactions.py:115
+#: apps/note/models/transactions.py:130
 msgid "reason"
 msgstr "raison"
 
-#: apps/note/models/transactions.py:120
+#: apps/note/models/transactions.py:135
 msgid "valid"
 msgstr "valide"
 
-#: apps/note/models/transactions.py:125 apps/note/tables.py:74
+#: apps/note/models/transactions.py:140 apps/note/tables.py:95
 msgid "invalidity reason"
 msgstr "Motif d'invalidité"
 
-#: apps/note/models/transactions.py:132
+#: apps/note/models/transactions.py:147
 msgid "transaction"
 msgstr "transaction"
 
-#: apps/note/models/transactions.py:133
+#: apps/note/models/transactions.py:148
 msgid "transactions"
 msgstr "transactions"
 
-#: apps/note/models/transactions.py:180 templates/base.html:83
+#: apps/note/models/transactions.py:202 templates/base.html:83
 #: templates/note/transaction_form.html:19
 #: templates/note/transaction_form.html:145
 msgid "Transfer"
 msgstr "Virement"
 
-#: apps/note/models/transactions.py:200
+#: apps/note/models/transactions.py:222
 msgid "Template"
 msgstr "Bouton"
 
-#: apps/note/models/transactions.py:215
+#: apps/note/models/transactions.py:237
 msgid "first_name"
 msgstr "Prénom"
 
-#: apps/note/models/transactions.py:220
+#: apps/note/models/transactions.py:242
 msgid "bank"
 msgstr "Banque"
 
-#: apps/note/models/transactions.py:226 templates/note/transaction_form.html:24
+#: apps/note/models/transactions.py:248 templates/note/transaction_form.html:24
 msgid "Credit"
 msgstr "Crédit"
 
-#: apps/note/models/transactions.py:226 templates/note/transaction_form.html:28
+#: apps/note/models/transactions.py:248 templates/note/transaction_form.html:28
 msgid "Debit"
 msgstr "Retrait"
 
-#: apps/note/models/transactions.py:242 apps/note/models/transactions.py:247
+#: apps/note/models/transactions.py:264 apps/note/models/transactions.py:269
 msgid "membership transaction"
 msgstr "transaction d'adhésion"
 
-#: apps/note/models/transactions.py:243
+#: apps/note/models/transactions.py:265
 msgid "membership transactions"
 msgstr "transactions d'adhésion"
 
-#: apps/note/tables.py:39
+#: apps/note/tables.py:57
 msgid "Click to invalidate"
 msgstr "Cliquez pour dévalider"
 
-#: apps/note/tables.py:39
+#: apps/note/tables.py:57
 msgid "Click to validate"
 msgstr "Cliquez pour valider"
 
-#: apps/note/tables.py:72
+#: apps/note/tables.py:93
 msgid "No reason specified"
 msgstr "Pas de motif spécifié"
 
diff --git a/static/js/consos.js b/static/js/consos.js
index b201e748..8ac2b7eb 100644
--- a/static/js/consos.js
+++ b/static/js/consos.js
@@ -167,7 +167,7 @@ function reset() {
 function consumeAll() {
     notes_display.forEach(function(note_display) {
         buttons.forEach(function(button) {
-            consume(note_display.id, button.dest, button.quantity * note_display.quantity, button.amount,
+            consume(note_display.id, note_display.name, button.dest, button.quantity * note_display.quantity, button.amount,
                 button.name + " (" + button.category_name + ")", button.type, button.category_id, button.id);
        });
     });
@@ -176,6 +176,7 @@ function consumeAll() {
 /**
  * Create a new transaction from a button through the API.
  * @param source The note that paid the item (type: int)
+ * @param source_alias The alias used for the source (type: str)
  * @param dest The note that sold the item (type: int)
  * @param quantity The quantity sold (type: int)
  * @param amount The price of one item, in cents (type: int)
@@ -184,7 +185,7 @@ function consumeAll() {
  * @param category The category id of the button (type: int)
  * @param template The button id (type: int)
  */
-function consume(source, dest, quantity, amount, reason, type, category, template) {
+function consume(source, source_alias, dest, quantity, amount, reason, type, category, template) {
     $.post("/api/note/transaction/transaction/",
         {
             "csrfmiddlewaretoken": CSRF_TOKEN,
@@ -195,6 +196,7 @@ function consume(source, dest, quantity, amount, reason, type, category, templat
             "polymorphic_ctype": type,
             "resourcetype": "RecurrentTransaction",
             "source": source,
+            "source_alias": source_alias,
             "destination": dest,
             "category": category,
             "template": template
@@ -210,6 +212,7 @@ function consume(source, dest, quantity, amount, reason, type, category, templat
                 "polymorphic_ctype": type,
                 "resourcetype": "RecurrentTransaction",
                 "source": source,
+                "source_alias": source_alias,
                 "destination": dest,
                 "category": category,
                 "template": template
diff --git a/static/js/transfer.js b/static/js/transfer.js
index cfa4f1f9..a23c6e38 100644
--- a/static/js/transfer.js
+++ b/static/js/transfer.js
@@ -72,7 +72,8 @@ $("#transfer").click(function() {
                     "polymorphic_ctype": TRANSFER_POLYMORPHIC_CTYPE,
                     "resourcetype": "Transaction",
                     "source": user_id,
-                    "destination": dest.id
+                    "destination": dest.id,
+                    "destination_alias": dest.name
                 }).done(function () {
                     addMsg("Le transfert de "
                         + pretty_money(dest.quantity * 100 * $("#amount").val()) + " de votre note "
@@ -91,7 +92,8 @@ $("#transfer").click(function() {
                         "polymorphic_ctype": TRANSFER_POLYMORPHIC_CTYPE,
                         "resourcetype": "Transaction",
                         "source": user_id,
-                        "destination": dest.id
+                        "destination": dest.id,
+                        "destination_alias": dest.name
                     }).done(function () {
                         addMsg("Le transfert de "
                             + pretty_money(dest.quantity * 100 * $("#amount").val()) + " de votre note "
@@ -121,7 +123,9 @@ $("#transfer").click(function() {
                         "polymorphic_ctype": TRANSFER_POLYMORPHIC_CTYPE,
                         "resourcetype": "Transaction",
                         "source": source.id,
-                        "destination": dest.id
+                        "source_alias": source.name,
+                        "destination": dest.id,
+                        "destination_alias": dest.name
                     }).done(function () {
                         addMsg("Le transfert de "
                             + pretty_money(source.quantity * dest.quantity * 100 * $("#amount").val()) + " de la note " + source.name
@@ -140,7 +144,9 @@ $("#transfer").click(function() {
                             "polymorphic_ctype": TRANSFER_POLYMORPHIC_CTYPE,
                             "resourcetype": "Transaction",
                             "source": source.id,
-                            "destination": dest.id
+                            "source_alias": source.name,
+                            "destination": dest.id,
+                            "destination_alias": dest.name
                         }).done(function () {
                             addMsg("Le transfert de "
                                 + pretty_money(source.quantity * dest.quantity * 100 * $("#amount").val()) + " de la note " + source.name
@@ -186,7 +192,9 @@ $("#transfer").click(function() {
                 "polymorphic_ctype": SPECIAL_TRANSFER_POLYMORPHIC_CTYPE,
                 "resourcetype": "SpecialTransaction",
                 "source": source,
+                "source_alias": source.name,
                 "destination": dest,
+                "destination_alias": dest.name,
                 "last_name": $("#last_name").val(),
                 "first_name": $("#first_name").val(),
                 "bank": $("#bank").val()
-- 
GitLab