mirror of https://gitlab.crans.org/bde/nk20
Merge branch 'devalidation_reason' into 'master'
Motif de dévalidation See merge request bde/nk20!67
This commit is contained in:
commit
ed746f39b2
|
@ -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,
|
||||
|
@ -115,11 +130,19 @@ class Transaction(PolymorphicModel):
|
|||
verbose_name=_('reason'),
|
||||
max_length=255,
|
||||
)
|
||||
|
||||
valid = models.BooleanField(
|
||||
verbose_name=_('valid'),
|
||||
default=True,
|
||||
)
|
||||
|
||||
invalidity_reason = models.CharField(
|
||||
verbose_name=_('invalidity reason'),
|
||||
max_length=255,
|
||||
default=None,
|
||||
null=True,
|
||||
)
|
||||
|
||||
class Meta:
|
||||
verbose_name = _("transaction")
|
||||
verbose_name_plural = _("transactions")
|
||||
|
@ -134,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)
|
||||
|
@ -152,6 +182,10 @@ class Transaction(PolymorphicModel):
|
|||
self.source.balance -= to_transfer
|
||||
self.destination.balance += to_transfer
|
||||
|
||||
# When a transaction is declared valid, we ensure that the invalidity reason is null, if it was
|
||||
# previously invalid
|
||||
self.invalidity_reason = None
|
||||
|
||||
# We save first the transaction, in case of the user has no right to transfer money
|
||||
super().save(*args, **kwargs)
|
||||
|
||||
|
|
|
@ -5,6 +5,7 @@ import html
|
|||
|
||||
import django_tables2 as tables
|
||||
from django.db.models import F
|
||||
from django.utils.html import format_html
|
||||
from django_tables2.utils import A
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
|
@ -20,19 +21,48 @@ class HistoryTable(tables.Table):
|
|||
'table table-condensed table-striped table-hover'
|
||||
}
|
||||
model = Transaction
|
||||
exclude = ("id", "polymorphic_ctype", )
|
||||
exclude = ("id", "polymorphic_ctype", "invalidity_reason", "source_alias", "destination_alias",)
|
||||
template_name = 'django_tables2/bootstrap4.html'
|
||||
sequence = ('...', 'type', 'total', 'valid', )
|
||||
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() !!
|
||||
|
||||
valid = tables.Column(attrs={"td": {"id": lambda record: "validate_" + str(record.id),
|
||||
"class": lambda record: str(record.valid).lower() + ' validate',
|
||||
"onclick": lambda record: 'de_validate(' + str(record.id) + ', '
|
||||
+ str(record.valid).lower() + ')'}})
|
||||
valid = tables.Column(
|
||||
attrs={
|
||||
"td": {
|
||||
"id": lambda record: "validate_" + str(record.id),
|
||||
"class": lambda record: str(record.valid).lower() + ' validate',
|
||||
"data-toggle": "tooltip",
|
||||
"title": lambda record: _("Click to invalidate") if record.valid else _("Click to validate"),
|
||||
"onclick": lambda record: 'in_validate(' + str(record.id) + ', ' + str(record.valid).lower() + ')',
|
||||
"onmouseover": lambda record: '$("#invalidity_reason_'
|
||||
+ str(record.id) + '").show();$("#invalidity_reason_'
|
||||
+ str(record.id) + '").focus();',
|
||||
"onmouseout": lambda record: '$("#invalidity_reason_' + str(record.id) + '").hide()',
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
def order_total(self, queryset, is_descending):
|
||||
# needed for rendering
|
||||
|
@ -53,8 +83,18 @@ class HistoryTable(tables.Table):
|
|||
def render_reason(self, value):
|
||||
return html.unescape(value)
|
||||
|
||||
def render_valid(self, value):
|
||||
return "✔" if value else "✖"
|
||||
def render_valid(self, value, record):
|
||||
"""
|
||||
When the validation status is hovered, an input field is displayed to let the user specify an invalidity reason
|
||||
"""
|
||||
val = "✔" if value else "✖"
|
||||
val += "<input type='text' class='form-control' id='invalidity_reason_" + str(record.id) \
|
||||
+ "' value='" + (html.escape(record.invalidity_reason)
|
||||
if record.invalidity_reason else ("" if value else str(_("No reason specified")))) \
|
||||
+ "'" + ("" if value else " disabled") \
|
||||
+ " placeholder='" + html.escape(_("invalidity reason").capitalize()) + "'" \
|
||||
+ " style='position: absolute; width: 15em; margin-left: -15.5em; margin-top: -2em; display: none;'>"
|
||||
return format_html(val)
|
||||
|
||||
|
||||
# function delete_button(id) provided in template file
|
||||
|
|
|
@ -327,7 +327,7 @@
|
|||
"note",
|
||||
"transaction"
|
||||
],
|
||||
"query": "[\"AND\", {\"source\": [\"user\", \"note\"]}, {\"amount__lte\": [\"user\", \"note\", \"balance\"]}]",
|
||||
"query": "[\"AND\", {\"source\": [\"user\", \"note\"]}, [\"OR\", {\"amount__lte\": [\"user\", \"note\", \"balance\"]}, {\"valid\": false}]]",
|
||||
"type": "add",
|
||||
"mask": 1,
|
||||
"field": "",
|
||||
|
@ -387,7 +387,7 @@
|
|||
"note",
|
||||
"recurrenttransaction"
|
||||
],
|
||||
"query": "[\"AND\", {\"destination\": [\"club\", \"note\"]}, {\"amount__lte\": {\"F\": [\"ADD\", [\"F\", \"source__balance\"], 5000]}}]",
|
||||
"query": "[\"AND\", {\"destination\": [\"club\", \"note\"]}, [\"OR\", {\"amount__lte\": {\"F\": [\"ADD\", [\"F\", \"source__balance\"], 5000]}}, {\"valid\": false}]]",
|
||||
"type": "add",
|
||||
"mask": 2,
|
||||
"field": "",
|
||||
|
|
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-03-24 15:49+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:198
|
||||
#: 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/permission/models.py:90
|
||||
#: 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/logs/models.py:61 apps/note/tables.py:147
|
||||
msgid "edit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/logs/models.py:62
|
||||
#: apps/logs/models.py:62 apps/note/tables.py:151
|
||||
msgid "delete"
|
||||
msgstr ""
|
||||
|
||||
|
@ -210,7 +210,7 @@ msgstr ""
|
|||
msgid "clubs"
|
||||
msgstr ""
|
||||
|
||||
#: apps/member/models.py:120 apps/permission/models.py:275
|
||||
#: apps/member/models.py:120 apps/permission/models.py:276
|
||||
msgid "role"
|
||||
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,55 +384,64 @@ 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:119
|
||||
#: apps/note/models/transactions.py:135
|
||||
msgid "valid"
|
||||
msgstr ""
|
||||
|
||||
#: apps/note/models/transactions.py:124
|
||||
#: apps/note/models/transactions.py:140 apps/note/tables.py:95
|
||||
msgid "invalidity reason"
|
||||
msgstr ""
|
||||
|
||||
#: apps/note/models/transactions.py:147
|
||||
msgid "transaction"
|
||||
msgstr ""
|
||||
|
||||
#: apps/note/models/transactions.py:125
|
||||
#: apps/note/models/transactions.py:148
|
||||
msgid "transactions"
|
||||
msgstr ""
|
||||
|
||||
#: apps/note/models/transactions.py:168 templates/base.html:98
|
||||
#: apps/note/models/transactions.py:202 templates/base.html:83
|
||||
#: templates/note/transaction_form.html:19
|
||||
#: templates/note/transaction_form.html:145
|
||||
msgid "Transfer"
|
||||
|
@ -634,15 +643,15 @@ msgid ""
|
|||
"again unless your session expires or you logout."
|
||||
msgstr ""
|
||||
|
||||
#: note_kfet/settings/base.py:153
|
||||
#: note_kfet/settings/base.py:151
|
||||
msgid "German"
|
||||
msgstr ""
|
||||
|
||||
#: note_kfet/settings/base.py:154
|
||||
#: note_kfet/settings/base.py:152
|
||||
msgid "English"
|
||||
msgstr ""
|
||||
|
||||
#: note_kfet/settings/base.py:155
|
||||
#: note_kfet/settings/base.py:153
|
||||
msgid "French"
|
||||
msgstr ""
|
||||
|
||||
|
@ -650,18 +659,14 @@ msgstr ""
|
|||
msgid "The ENS Paris-Saclay BDE note."
|
||||
msgstr ""
|
||||
|
||||
#: templates/base.html:84
|
||||
#: templates/base.html:87
|
||||
msgid "Clubs"
|
||||
msgstr ""
|
||||
|
||||
#: templates/base.html:89
|
||||
#: templates/base.html:92
|
||||
msgid "Activities"
|
||||
msgstr ""
|
||||
|
||||
#: templates/base.html:94
|
||||
msgid "Buttons"
|
||||
msgstr ""
|
||||
|
||||
#: templates/cas_server/base.html:7
|
||||
msgid "Central Authentication Service"
|
||||
msgstr ""
|
||||
|
@ -798,7 +803,7 @@ msgstr ""
|
|||
msgid "Sign up"
|
||||
msgstr ""
|
||||
|
||||
#: templates/note/conso_form.html:28 templates/note/transaction_form.html:40
|
||||
#: templates/note/conso_form.html:28 templates/note/transaction_form.html:50
|
||||
msgid "Select emitters"
|
||||
msgstr ""
|
||||
|
||||
|
@ -842,12 +847,28 @@ msgstr ""
|
|||
msgid "Transfer type"
|
||||
msgstr ""
|
||||
|
||||
#: templates/note/transaction_form.html:86
|
||||
msgid "Name"
|
||||
msgstr ""
|
||||
|
||||
#: templates/note/transaction_form.html:92
|
||||
msgid "First name"
|
||||
msgstr ""
|
||||
|
||||
#: templates/note/transaction_form.html:98
|
||||
msgid "Bank"
|
||||
msgstr ""
|
||||
|
||||
#: templates/note/transaction_form.html:111
|
||||
#: templates/note/transaction_form.html:169
|
||||
#: templates/note/transaction_form.html:176
|
||||
msgid "Select receivers"
|
||||
msgstr ""
|
||||
|
||||
#: templates/note/transaction_form.html:128
|
||||
msgid "Amount"
|
||||
msgstr ""
|
||||
|
||||
#: templates/note/transaction_form.html:138
|
||||
msgid "Reason"
|
||||
msgstr ""
|
||||
|
@ -864,6 +885,22 @@ msgstr ""
|
|||
msgid "Buttons list"
|
||||
msgstr ""
|
||||
|
||||
#: templates/note/transactiontemplate_list.html:9
|
||||
msgid "search button"
|
||||
msgstr ""
|
||||
|
||||
#: templates/note/transactiontemplate_list.html:20
|
||||
msgid "buttons listing "
|
||||
msgstr ""
|
||||
|
||||
#: templates/note/transactiontemplate_list.html:71
|
||||
msgid "button successfully deleted "
|
||||
msgstr ""
|
||||
|
||||
#: templates/note/transactiontemplate_list.html:75
|
||||
msgid "Unable to delete button "
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/logged_out.html:8
|
||||
msgid "Thanks for spending some quality time with the Web site today."
|
||||
msgstr ""
|
||||
|
@ -873,7 +910,7 @@ msgid "Log in again"
|
|||
msgstr ""
|
||||
|
||||
#: templates/registration/login.html:7 templates/registration/login.html:8
|
||||
#: templates/registration/login.html:26
|
||||
#: templates/registration/login.html:28
|
||||
#: templates/registration/password_reset_complete.html:10
|
||||
msgid "Log in"
|
||||
msgstr ""
|
||||
|
@ -885,7 +922,15 @@ msgid ""
|
|||
"page. Would you like to login to a different account?"
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/login.html:27
|
||||
#: templates/registration/login.html:22
|
||||
msgid "You can also register via the central authentification server "
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/login.html:23
|
||||
msgid "using this link "
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/login.html:29
|
||||
msgid "Forgotten your password or username?"
|
||||
msgstr ""
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-03-24 15:49+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:198
|
||||
#: 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/permission/models.py:90
|
||||
#: 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/logs/models.py:61 apps/note/tables.py:147
|
||||
msgid "edit"
|
||||
msgstr "Modifier"
|
||||
|
||||
#: apps/logs/models.py:62
|
||||
#: apps/logs/models.py:62 apps/note/tables.py:151
|
||||
msgid "delete"
|
||||
msgstr "Supprimer"
|
||||
|
||||
|
@ -209,7 +209,7 @@ msgstr "club"
|
|||
msgid "clubs"
|
||||
msgstr "clubs"
|
||||
|
||||
#: apps/member/models.py:120 apps/permission/models.py:275
|
||||
#: apps/member/models.py:120 apps/permission/models.py:276
|
||||
msgid "role"
|
||||
msgstr "rôle"
|
||||
|
||||
|
@ -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,35 +384,40 @@ 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é"
|
||||
|
||||
|
@ -634,15 +639,15 @@ msgid ""
|
|||
"again unless your session expires or you logout."
|
||||
msgstr ""
|
||||
|
||||
#: note_kfet/settings/base.py:153
|
||||
#: note_kfet/settings/base.py:151
|
||||
msgid "German"
|
||||
msgstr ""
|
||||
|
||||
#: note_kfet/settings/base.py:154
|
||||
#: note_kfet/settings/base.py:152
|
||||
msgid "English"
|
||||
msgstr ""
|
||||
|
||||
#: note_kfet/settings/base.py:155
|
||||
#: note_kfet/settings/base.py:153
|
||||
msgid "French"
|
||||
msgstr ""
|
||||
|
||||
|
@ -650,18 +655,14 @@ msgstr ""
|
|||
msgid "The ENS Paris-Saclay BDE note."
|
||||
msgstr "La note du BDE de l'ENS Paris-Saclay."
|
||||
|
||||
#: templates/base.html:84
|
||||
#: templates/base.html:87
|
||||
msgid "Clubs"
|
||||
msgstr "Clubs"
|
||||
|
||||
#: templates/base.html:89
|
||||
#: templates/base.html:92
|
||||
msgid "Activities"
|
||||
msgstr "Activités"
|
||||
|
||||
#: templates/base.html:94
|
||||
msgid "Buttons"
|
||||
msgstr "Boutons"
|
||||
|
||||
#: templates/cas_server/base.html:7
|
||||
msgid "Central Authentication Service"
|
||||
msgstr ""
|
||||
|
@ -800,7 +801,7 @@ msgstr "Sauvegarder les changements"
|
|||
msgid "Sign up"
|
||||
msgstr "Inscription"
|
||||
|
||||
#: templates/note/conso_form.html:28 templates/note/transaction_form.html:40
|
||||
#: templates/note/conso_form.html:28 templates/note/transaction_form.html:50
|
||||
msgid "Select emitters"
|
||||
msgstr "Sélection des émetteurs"
|
||||
|
||||
|
@ -844,12 +845,28 @@ msgstr "Paiement externe"
|
|||
msgid "Transfer type"
|
||||
msgstr "Type de transfert"
|
||||
|
||||
#: templates/note/transaction_form.html:86
|
||||
msgid "Name"
|
||||
msgstr "Nom"
|
||||
|
||||
#: templates/note/transaction_form.html:92
|
||||
msgid "First name"
|
||||
msgstr "Prénom"
|
||||
|
||||
#: templates/note/transaction_form.html:98
|
||||
msgid "Bank"
|
||||
msgstr "Banque"
|
||||
|
||||
#: templates/note/transaction_form.html:111
|
||||
#: templates/note/transaction_form.html:169
|
||||
#: templates/note/transaction_form.html:176
|
||||
msgid "Select receivers"
|
||||
msgstr "Sélection des destinataires"
|
||||
|
||||
#: templates/note/transaction_form.html:128
|
||||
msgid "Amount"
|
||||
msgstr "Montant"
|
||||
|
||||
#: templates/note/transaction_form.html:138
|
||||
msgid "Reason"
|
||||
msgstr "Raison"
|
||||
|
@ -866,6 +883,22 @@ msgstr "Note à débiter"
|
|||
msgid "Buttons list"
|
||||
msgstr "Liste des boutons"
|
||||
|
||||
#: templates/note/transactiontemplate_list.html:9
|
||||
msgid "search button"
|
||||
msgstr "Chercher un bouton"
|
||||
|
||||
#: templates/note/transactiontemplate_list.html:20
|
||||
msgid "buttons listing "
|
||||
msgstr "Liste des boutons"
|
||||
|
||||
#: templates/note/transactiontemplate_list.html:71
|
||||
msgid "button successfully deleted "
|
||||
msgstr "Le bouton a bien été supprimé"
|
||||
|
||||
#: templates/note/transactiontemplate_list.html:75
|
||||
msgid "Unable to delete button "
|
||||
msgstr "Impossible de supprimer le bouton "
|
||||
|
||||
#: templates/registration/logged_out.html:8
|
||||
msgid "Thanks for spending some quality time with the Web site today."
|
||||
msgstr ""
|
||||
|
@ -875,7 +908,7 @@ msgid "Log in again"
|
|||
msgstr ""
|
||||
|
||||
#: templates/registration/login.html:7 templates/registration/login.html:8
|
||||
#: templates/registration/login.html:26
|
||||
#: templates/registration/login.html:28
|
||||
#: templates/registration/password_reset_complete.html:10
|
||||
msgid "Log in"
|
||||
msgstr ""
|
||||
|
@ -887,7 +920,15 @@ msgid ""
|
|||
"page. Would you like to login to a different account?"
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/login.html:27
|
||||
#: templates/registration/login.html:22
|
||||
msgid "You can also register via the central authentification server "
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/login.html:23
|
||||
msgid "using this link "
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/login.html:29
|
||||
msgid "Forgotten your password or username?"
|
||||
msgstr ""
|
||||
|
||||
|
|
|
@ -265,7 +265,16 @@ function autoCompleteNote(field_id, alias_matched_id, note_list_id, notes, notes
|
|||
}
|
||||
|
||||
// When a validate button is clicked, we switch the validation status
|
||||
function de_validate(id, validated) {
|
||||
function in_validate(id, validated) {
|
||||
|
||||
let invalidity_reason;
|
||||
let reason_obj = $("#invalidity_reason_" + id);
|
||||
|
||||
if (validated)
|
||||
invalidity_reason = reason_obj.val();
|
||||
else
|
||||
invalidity_reason = null;
|
||||
|
||||
$("#validate_" + id).html("<strong style=\"font-size: 16pt;\">⟳ ...</strong>");
|
||||
|
||||
// Perform a PATCH request to the API in order to update the transaction
|
||||
|
@ -278,12 +287,13 @@ function de_validate(id, validated) {
|
|||
"X-CSRFTOKEN": CSRF_TOKEN
|
||||
},
|
||||
data: {
|
||||
"resourcetype": "RecurrentTransaction",
|
||||
valid: !validated
|
||||
resourcetype: "RecurrentTransaction",
|
||||
valid: !validated,
|
||||
invalidity_reason: invalidity_reason,
|
||||
},
|
||||
success: function () {
|
||||
// Refresh jQuery objects
|
||||
$(".validate").click(de_validate);
|
||||
$(".validate").click(in_validate);
|
||||
|
||||
refreshBalance();
|
||||
// error if this method doesn't exist. Please define it.
|
||||
|
|
|
@ -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,12 +196,32 @@ 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
|
||||
}, reset).fail(function (e) {
|
||||
reset();
|
||||
|
||||
addMsg("Une erreur est survenue lors de la transaction : " + e.responseText, "danger");
|
||||
$.post("/api/note/transaction/transaction/",
|
||||
{
|
||||
"csrfmiddlewaretoken": CSRF_TOKEN,
|
||||
"quantity": quantity,
|
||||
"amount": amount,
|
||||
"reason": reason,
|
||||
"valid": false,
|
||||
"invalidity_reason": "Solde insuffisant",
|
||||
"polymorphic_ctype": type,
|
||||
"resourcetype": "RecurrentTransaction",
|
||||
"source": source,
|
||||
"source_alias": source_alias,
|
||||
"destination": dest,
|
||||
"category": category,
|
||||
"template": template
|
||||
}).done(function() {
|
||||
reset();
|
||||
addMsg("La transaction n'a pas pu être validée pour cause de solde insuffisant.", "danger");
|
||||
}).fail(function () {
|
||||
reset();
|
||||
addMsg("Une erreur est survenue lors de la transaction : " + e.responseText, "danger");
|
||||
});
|
||||
});
|
||||
}
|
||||
|
|
|
@ -83,19 +83,41 @@ $("#transfer").click(function() {
|
|||
"polymorphic_ctype": TRANSFER_POLYMORPHIC_CTYPE,
|
||||
"resourcetype": "Transaction",
|
||||
"source": user_id,
|
||||
"destination": dest.id
|
||||
}, function () {
|
||||
"destination": dest.id,
|
||||
"destination_alias": dest.name
|
||||
}).done(function () {
|
||||
addMsg("Le transfert de "
|
||||
+ pretty_money(dest.quantity * 100 * $("#amount").val()) + " de votre note "
|
||||
+ " vers la note " + dest.name + " a été fait avec succès !", "success");
|
||||
|
||||
reset();
|
||||
}).fail(function (err) {
|
||||
addMsg("Le transfert de "
|
||||
+ pretty_money(dest.quantity * 100 * $("#amount").val()) + " de votre note "
|
||||
+ " vers la note " + dest.name + " a échoué : " + err.responseText, "danger");
|
||||
}).fail(function () {
|
||||
$.post("/api/note/transaction/transaction/",
|
||||
{
|
||||
"csrfmiddlewaretoken": CSRF_TOKEN,
|
||||
"quantity": dest.quantity,
|
||||
"amount": 100 * $("#amount").val(),
|
||||
"reason": $("#reason").val(),
|
||||
"valid": false,
|
||||
"invalidity_reason": "Solde insuffisant",
|
||||
"polymorphic_ctype": TRANSFER_POLYMORPHIC_CTYPE,
|
||||
"resourcetype": "Transaction",
|
||||
"source": user_id,
|
||||
"destination": dest.id,
|
||||
"destination_alias": dest.name
|
||||
}).done(function () {
|
||||
addMsg("Le transfert de "
|
||||
+ pretty_money(dest.quantity * 100 * $("#amount").val()) + " de votre note "
|
||||
+ " vers la note " + dest.name + " a échoué : Solde insuffisant", "danger");
|
||||
|
||||
reset();
|
||||
reset();
|
||||
}).fail(function (err) {
|
||||
addMsg("Le transfert de "
|
||||
+ pretty_money(dest.quantity * 100 * $("#amount").val()) + " de votre note "
|
||||
+ " vers la note " + dest.name + " a échoué : " + err.responseText, "danger");
|
||||
|
||||
reset();
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
@ -112,19 +134,43 @@ $("#transfer").click(function() {
|
|||
"polymorphic_ctype": TRANSFER_POLYMORPHIC_CTYPE,
|
||||
"resourcetype": "Transaction",
|
||||
"source": source.id,
|
||||
"destination": dest.id
|
||||
}, function () {
|
||||
"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
|
||||
+ " vers la note " + dest.name + " a été fait avec succès !", "success");
|
||||
|
||||
reset();
|
||||
}).fail(function (err) {
|
||||
addMsg("Le transfert de "
|
||||
+ pretty_money(source.quantity * dest.quantity * 100 * $("#amount").val()) + " de la note " + source.name
|
||||
+ " vers la note " + dest.name + " a échoué : " + err.responseText, "danger");
|
||||
$.post("/api/note/transaction/transaction/",
|
||||
{
|
||||
"csrfmiddlewaretoken": CSRF_TOKEN,
|
||||
"quantity": source.quantity * dest.quantity,
|
||||
"amount": 100 * $("#amount").val(),
|
||||
"reason": $("#reason").val(),
|
||||
"valid": false,
|
||||
"invalidity_reason": "Solde insuffisant",
|
||||
"polymorphic_ctype": TRANSFER_POLYMORPHIC_CTYPE,
|
||||
"resourcetype": "Transaction",
|
||||
"source": source.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
|
||||
+ " vers la note " + dest.name + " a échoué : Solde insuffisant", "danger");
|
||||
|
||||
reset();
|
||||
reset();
|
||||
}).fail(function (err) {
|
||||
addMsg("Le transfert de "
|
||||
+ pretty_money(source.quantity * dest.quantity * 100 * $("#amount").val()) + " de la note " + source.name
|
||||
+ " vers la note " + dest.name + " a échoué : " + err.responseText, "danger");
|
||||
|
||||
reset();
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -157,15 +203,17 @@ $("#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()
|
||||
}, function () {
|
||||
}).done(function () {
|
||||
addMsg("Le crédit/retrait a bien été effectué !", "success");
|
||||
reset();
|
||||
}).fail(function (err) {
|
||||
addMsg("Le crédit/transfert a échoué : " + err.responseText, "danger");
|
||||
addMsg("Le crédit/retrait a échoué : " + err.responseText, "danger");
|
||||
reset();
|
||||
});
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue