From 41aa6964d2a1ff411cd36b469f322c708a7fe437 Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO 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 \n" "Language-Team: LANGUAGE \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 \n" "Language-Team: LANGUAGE \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()