bitvend/bitvend/forms.py

57 lines
1.6 KiB
Python

from flask_wtf import FlaskForm
from wtforms import StringField
from flask_login import current_user
from bitvend.models import User
from wtforms.fields.core import DecimalField
from wtforms.validators import DataRequired, NumberRange, ValidationError
from decimal import Decimal, InvalidOperation
class DecimalUnityField(DecimalField):
unity = 100
def __init__(self, label=None, validators=None, unity=100, **kwargs):
super(DecimalUnityField, self).__init__(label, validators, **kwargs)
self.unity = unity
def _value(self):
if self.data is not None:
format = "%%0.%df" % self.places
return format % (Decimal(self.data) / self.unity,)
elif self.raw_data:
return self.raw_data[0]
def process_formdata(self, valuelist):
if valuelist:
try:
self.data = int(Decimal(valuelist[0]) * self.unity)
except InvalidOperation:
self.data = None
def UserExists(form, field):
if not User.query.get(field.data):
raise ValidationError("User does not exist.")
def NotCurrentUser(form, field):
if field.data == current_user.uid:
raise ValidationError("Are you serious?")
class TransferForm(FlaskForm):
target = StringField(
"Target user", validators=[DataRequired(), UserExists, NotCurrentUser]
)
amount = DecimalUnityField(
"Amount",
default=0,
validators=[
NumberRange(min=1),
],
)
class ManualForm(FlaskForm):
amount = DecimalUnityField("Amount", default=0, validators=[])