diff --git a/advlabdb/adminModelViews.py b/advlabdb/adminModelViews.py index 39c22ef..289b070 100644 --- a/advlabdb/adminModelViews.py +++ b/advlabdb/adminModelViews.py @@ -16,7 +16,6 @@ from wtforms import Form from wtforms.fields import ( BooleanField, DateField, - DecimalField, IntegerField, RadioField, SelectField, @@ -27,6 +26,7 @@ from wtforms.validators import URL, DataRequired, Email, NumberRange, Optional from advlabdb import adminSpace, app, assistantSpace, db, user_datastore from advlabdb.configUtils import getConfig from advlabdb.customClasses import ( + CustomDecimalFieldFactory, CustomIdEndpointLinkRowAction, SecureAdminBaseView, SecureAdminModelView, @@ -696,21 +696,21 @@ class SemesterExperimentView(SecureAdminModelView): blank_text="-", ) - oral_weighting = DecimalField( + oral_weighting = CustomDecimalFieldFactory(0.01)( "Oral weighting", validators=[DataRequired(), NumberRange(min=0, max=1)], default=0.5, description="Between 0 and 1", places=2, ) - protocol_weighting = DecimalField( + protocol_weighting = CustomDecimalFieldFactory(0.01)( "Protocol weighting", validators=[DataRequired(), NumberRange(min=0, max=1)], default=0.5, description="Between 0 and 1. Oral and protocol weightings have to add to 1! Both are rounded to 2 decimal digits.", places=2, ) - final_weighting = DecimalField( + final_weighting = CustomDecimalFieldFactory(0.01)( "Final weighting", validators=[DataRequired(), NumberRange(min=0, max=1)], default=1.0, @@ -772,10 +772,10 @@ class SemesterExperimentView(SecureAdminModelView): model.checkAndRoundWeightings() def update_model(self, form, model): - weightingsChanged = not ( - form.oral_weighting.data == model.oral_weighting - and form.protocol_weighting.data == model.protocol_weighting - and form.final_weighting.data == model.final_weighting + weightingsChanged = ( + form.oral_weighting.data != model.oral_weighting + or form.protocol_weighting.data != model.protocol_weighting + or form.final_weighting.data != model.final_weighting ) updateSuccessful = super().update_model(form, model) diff --git a/advlabdb/customClasses.py b/advlabdb/customClasses.py index 04d977b..3c5c970 100644 --- a/advlabdb/customClasses.py +++ b/advlabdb/customClasses.py @@ -5,6 +5,8 @@ from flask_admin.model.helpers import get_mdict_item_or_list from flask_admin.model.template import EndpointLinkRowAction from flask_security import current_user from sqlalchemy import and_ +from wtforms.fields import DecimalField +from wtforms.widgets import NumberInput from advlabdb.exceptions import DataBaseException, ModelViewException from advlabdb.models import ( @@ -269,3 +271,10 @@ class CustomIdEndpointLinkRowAction(EndpointLinkRowAction): def render(self, context, row_id, row): return super().render(context, self.customId(row), row) + + +def CustomDecimalFieldFactory(step): + class CustomDecimalField(DecimalField): + widget = NumberInput(step=step) + + return CustomDecimalField