From a3fa86fb25b26126dfc1af5dff2f62843e2d76fe Mon Sep 17 00:00:00 2001 From: s3lph Date: Sat, 1 Sep 2018 23:48:10 +0200 Subject: [PATCH] Implemented "Balance change reason" field. --- matemat/db/facade.py | 11 +++++++---- matemat/db/test/test_facade.py | 5 ++++- matemat/webserver/pagelets/moduser.py | 7 +++++-- templates/moduser.html | 3 +++ 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/matemat/db/facade.py b/matemat/db/facade.py index 7b798ed..c65fff3 100644 --- a/matemat/db/facade.py +++ b/matemat/db/facade.py @@ -266,9 +266,10 @@ class MatematDatabase(object): # Resolve the values to change name: str = kwargs['name'] if 'name' in kwargs else user.name email: str = kwargs['email'] if 'email' in kwargs else user.email - balance: int = kwargs['balance'] if 'balance' in kwargs else user.balance is_admin: bool = kwargs['is_admin'] if 'is_admin' in kwargs else user.is_admin is_member: bool = kwargs['is_member'] if 'is_member' in kwargs else user.is_member + balance: int = kwargs['balance'] if 'balance' in kwargs else user.balance + balance_reason: Optional[str] = kwargs['balance_reason'] if 'balance_reason' in kwargs else None receipt_pref: ReceiptPreference = kwargs['receipt_pref'] if 'receipt_pref' in kwargs else user.receipt_pref with self.db.transaction() as c: c.execute('SELECT balance FROM users WHERE user_id = :user_id', {'user_id': user.id}) @@ -287,11 +288,13 @@ class MatematDatabase(object): 'value': balance - oldbalance, 'old_balance': oldbalance }) - # TODO: Implement reason field c.execute(''' INSERT INTO modifications (ta_id, agent, reason) - VALUES (last_insert_rowid(), :agent, NULL) - ''', {'agent': agent.name}) + VALUES (last_insert_rowid(), :agent, :reason) + ''', { + 'agent': agent.name, + 'reason': balance_reason + }) c.execute(''' UPDATE users SET username = :username, diff --git a/matemat/db/test/test_facade.py b/matemat/db/test/test_facade.py index de225f4..da763b5 100644 --- a/matemat/db/test/test_facade.py +++ b/matemat/db/test/test_facade.py @@ -174,7 +174,7 @@ class DatabaseTest(unittest.TestCase): agent = db.create_user('admin', 'supersecurepassword', 'admin@example.com', True, True) user = db.create_user('testuser', 'supersecurepassword', 'testuser@example.com', True, True) db.change_user(user, agent, email='newaddress@example.com', is_admin=False, is_member=False, balance=4200, - receipt_pref=ReceiptPreference.MONTHLY) + balance_reason='This is a reason!', receipt_pref=ReceiptPreference.MONTHLY) # Changes must be reflected in the passed user object self.assertEqual('newaddress@example.com', user.email) self.assertFalse(user.is_admin) @@ -188,6 +188,9 @@ class DatabaseTest(unittest.TestCase): self.assertFalse(checkuser.is_member) self.assertEqual(4200, checkuser.balance) self.assertEqual(ReceiptPreference.MONTHLY, checkuser.receipt_pref) + with db.transaction(exclusive=False) as c: + c.execute('SELECT reason FROM modifications LIMIT 1') + self.assertEqual('This is a reason!', c.fetchone()[0]) # Balance change without an agent must fail with self.assertRaises(ValueError): db.change_user(user, None, balance=0) diff --git a/matemat/webserver/pagelets/moduser.py b/matemat/webserver/pagelets/moduser.py index a2f135f..140aed1 100644 --- a/matemat/webserver/pagelets/moduser.py +++ b/matemat/webserver/pagelets/moduser.py @@ -1,4 +1,4 @@ -from typing import Any, Dict, Union +from typing import Any, Dict, Optional, Union import os import magic @@ -103,6 +103,9 @@ def handle_change(args: RequestArguments, user: User, authuser: User, db: Matema return password = str(args.password) balance = parse_chf(str(args.balance)) + balance_reason: Optional[str] = str(args.reason) + if balance_reason == '': + balance_reason = None is_member = 'ismember' in args is_admin = 'isadmin' in args # An empty e-mail field should be interpreted as NULL @@ -115,7 +118,7 @@ def handle_change(args: RequestArguments, user: User, authuser: User, db: Matema db.change_password(user, '', password, verify_password=False) # Write the user detail changes db.change_user(user, agent=authuser, name=username, email=email, is_member=is_member, is_admin=is_admin, - balance=balance, receipt_pref=receipt_pref) + balance=balance, balance_reason=balance_reason, receipt_pref=receipt_pref) except DatabaseConsistencyError: return # If a new avatar was uploaded, process it diff --git a/templates/moduser.html b/templates/moduser.html index cede6b5..586d883 100644 --- a/templates/moduser.html +++ b/templates/moduser.html @@ -37,6 +37,9 @@ CHF
+ +
+