1
0
Fork 0
mirror of https://codeberg.org/Mo8it/AdvLabDB.git synced 2024-12-20 23:41:20 +00:00

Add step to weighting fields

This commit is contained in:
Mo 2022-04-04 18:47:53 +02:00
parent c43382ac7a
commit 34ee938636
2 changed files with 17 additions and 8 deletions

View file

@ -16,7 +16,6 @@ from wtforms import Form
from wtforms.fields import ( from wtforms.fields import (
BooleanField, BooleanField,
DateField, DateField,
DecimalField,
IntegerField, IntegerField,
RadioField, RadioField,
SelectField, 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 import adminSpace, app, assistantSpace, db, user_datastore
from advlabdb.configUtils import getConfig from advlabdb.configUtils import getConfig
from advlabdb.customClasses import ( from advlabdb.customClasses import (
CustomDecimalFieldFactory,
CustomIdEndpointLinkRowAction, CustomIdEndpointLinkRowAction,
SecureAdminBaseView, SecureAdminBaseView,
SecureAdminModelView, SecureAdminModelView,
@ -696,21 +696,21 @@ class SemesterExperimentView(SecureAdminModelView):
blank_text="-", blank_text="-",
) )
oral_weighting = DecimalField( oral_weighting = CustomDecimalFieldFactory(0.01)(
"Oral weighting", "Oral weighting",
validators=[DataRequired(), NumberRange(min=0, max=1)], validators=[DataRequired(), NumberRange(min=0, max=1)],
default=0.5, default=0.5,
description="Between 0 and 1", description="Between 0 and 1",
places=2, places=2,
) )
protocol_weighting = DecimalField( protocol_weighting = CustomDecimalFieldFactory(0.01)(
"Protocol weighting", "Protocol weighting",
validators=[DataRequired(), NumberRange(min=0, max=1)], validators=[DataRequired(), NumberRange(min=0, max=1)],
default=0.5, default=0.5,
description="Between 0 and 1. Oral and protocol weightings have to add to 1! Both are rounded to 2 decimal digits.", description="Between 0 and 1. Oral and protocol weightings have to add to 1! Both are rounded to 2 decimal digits.",
places=2, places=2,
) )
final_weighting = DecimalField( final_weighting = CustomDecimalFieldFactory(0.01)(
"Final weighting", "Final weighting",
validators=[DataRequired(), NumberRange(min=0, max=1)], validators=[DataRequired(), NumberRange(min=0, max=1)],
default=1.0, default=1.0,
@ -772,10 +772,10 @@ class SemesterExperimentView(SecureAdminModelView):
model.checkAndRoundWeightings() model.checkAndRoundWeightings()
def update_model(self, form, model): def update_model(self, form, model):
weightingsChanged = not ( weightingsChanged = (
form.oral_weighting.data == model.oral_weighting form.oral_weighting.data != model.oral_weighting
and form.protocol_weighting.data == model.protocol_weighting or form.protocol_weighting.data != model.protocol_weighting
and form.final_weighting.data == model.final_weighting or form.final_weighting.data != model.final_weighting
) )
updateSuccessful = super().update_model(form, model) updateSuccessful = super().update_model(form, model)

View file

@ -5,6 +5,8 @@ from flask_admin.model.helpers import get_mdict_item_or_list
from flask_admin.model.template import EndpointLinkRowAction from flask_admin.model.template import EndpointLinkRowAction
from flask_security import current_user from flask_security import current_user
from sqlalchemy import and_ from sqlalchemy import and_
from wtforms.fields import DecimalField
from wtforms.widgets import NumberInput
from advlabdb.exceptions import DataBaseException, ModelViewException from advlabdb.exceptions import DataBaseException, ModelViewException
from advlabdb.models import ( from advlabdb.models import (
@ -269,3 +271,10 @@ class CustomIdEndpointLinkRowAction(EndpointLinkRowAction):
def render(self, context, row_id, row): def render(self, context, row_id, row):
return super().render(context, self.customId(row), row) return super().render(context, self.customId(row), row)
def CustomDecimalFieldFactory(step):
class CustomDecimalField(DecimalField):
widget = NumberInput(step=step)
return CustomDecimalField