Integration of ReceiptPreference into the UI.

This commit is contained in:
s3lph 2018-08-31 20:57:08 +02:00
parent 0adba41c8d
commit c26e0ffc21
5 changed files with 55 additions and 10 deletions

View file

@ -6,22 +6,37 @@ class ReceiptPreference(Enum):
A user's preference for the frequency of receiving receipts.
"""
def __new__(cls, *args, **kwargs):
e = object.__new__(cls)
# The enum's internal value
e._value_: int = args[0]
# The human-readable description
e._human_readable: str = args[1]
return e
@property
def human_readable(self) -> str:
"""
A human-readable description of the receipt preference, to be displayed in the UI.
"""
return self._human_readable
"""
No receipts should be generated.
"""
NONE = 0
NONE = 0, 'No receipts'
"""
A receipt should be generated for each transaction.
"""
EACH = 1
EACH = 1, 'Individual receipt per transaction'
"""
A receipt should be generated once a month.
"""
MONTHLY = 2
MONTHLY = 2, 'Aggregated, monthly'
"""
A receipt should be generated once a year.
"""
YEARLY = 3
YEARLY = 3, 'Aggregated, yearly'

View file

@ -5,7 +5,7 @@ import magic
from matemat.webserver import pagelet, RequestArguments, PageletResponse, RedirectResponse, TemplateResponse
from matemat.db import MatematDatabase
from matemat.db.primitives import User
from matemat.db.primitives import User, ReceiptPreference
from matemat.exceptions import DatabaseConsistencyError, HttpException
@ -47,6 +47,7 @@ def admin(method: str,
# Render the "Admin/Settings" page
return TemplateResponse('admin.html',
authuser=user, authlevel=authlevel, users=users, products=products,
receipt_preference_class=ReceiptPreference,
setupname=config['InstanceName'])
@ -73,9 +74,13 @@ def handle_change(args: RequestArguments, user: User, db: MatematDatabase, confi
# An empty e-mail field should be interpreted as NULL
if len(email) == 0:
email = None
# Attempt to update username and e-mail
try:
db.change_user(user, agent=None, name=username, email=email)
receipt_pref = ReceiptPreference(int(str(args.receipt_pref)))
except ValueError:
return
# Attempt to update username, e-mail and receipt preference
try:
db.change_user(user, agent=None, name=username, email=email, receipt_pref=receipt_pref)
except DatabaseConsistencyError:
return

View file

@ -5,7 +5,7 @@ import magic
from matemat.webserver import pagelet, RequestArguments, PageletResponse, RedirectResponse, TemplateResponse
from matemat.db import MatematDatabase
from matemat.db.primitives import User
from matemat.db.primitives import User, ReceiptPreference
from matemat.exceptions import DatabaseConsistencyError, HttpException
from matemat.util.currency_format import parse_chf
@ -56,6 +56,7 @@ def moduser(method: str,
# Render the "Modify User" page
return TemplateResponse('moduser.html',
authuser=authuser, user=user, authlevel=authlevel,
receipt_preference_class=ReceiptPreference,
setupname=config['InstanceName'])
@ -87,11 +88,19 @@ def handle_change(args: RequestArguments, user: User, authuser: User, db: Matema
# Admin requested update of the user's details
elif change == 'update':
# Only write a change if all properties of the user are present in the request arguments
if 'username' not in args or 'email' not in args or 'password' not in args or 'balance' not in args:
if 'username' not in args or \
'email' not in args or \
'password' not in args or \
'balance' not in args or \
'receipt_pref' not in args:
return
# Read the properties from the request arguments
username = str(args.username)
email = str(args.email)
try:
receipt_pref = ReceiptPreference(int(str(args.receipt_pref)))
except ValueError:
return
password = str(args.password)
balance = parse_chf(str(args.balance))
is_member = 'ismember' in args
@ -106,7 +115,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)
balance=balance, receipt_pref=receipt_pref)
except DatabaseConsistencyError:
return
# If a new avatar was uploaded, process it

View file

@ -8,6 +8,14 @@
<label for="admin-myaccount-email">E-Mail: </label>
<input id="admin-myaccount-email" type="text" name="email" value="{% if authuser.email is not none %}{{ authuser.email }}{% endif %}" /><br/>
<label for="admin-myaccount-receipt-pref">Receipts: </label>
<select id="admin-myaccount-receipt-pref" name="receipt_pref">
{% for pref in receipt_preference_class %}
<option value="{{ pref.value }}" {% if authuser.receipt_pref == pref %} selected="selected" {% endif %}>{{ pref.human_readable }}</option>
{% endfor %}
</select>
<br/>
<label for="admin-myaccount-ismember">Member: </label>
<input id="admin-myaccount-ismember" type="checkbox" disabled="disabled" {% if authuser.is_member %} checked="checked" {% endif %}/><br/>

View file

@ -20,6 +20,14 @@
<label for="moduser-account-password">Password: </label>
<input id="moduser-account-password" type="password" name="password" /><br/>
<label for="moduser-account-receipt-pref">Receipts: </label>
<select id="moduser-account-receipt-pref" name="receipt_pref">
{% for pref in receipt_preference_class %}
<option value="{{ pref.value }}" {% if user.receipt_pref == pref %} selected="selected" {% endif %}>{{ pref.human_readable }}</option>
{% endfor %}
</select>
<br/>
<label for="moduser-account-ismember">Member: </label>
<input id="moduser-account-ismember" name="ismember" type="checkbox" {% if user.is_member %} checked="checked" {% endif %}/><br/>