from flask_wtf import FlaskForm from wtforms import StringField, PasswordField, BooleanField, SubmitField, TextAreaField, DateTimeField, BooleanField, HiddenField, FloatField from wtforms.validators import DataRequired, EqualTo, ValidationError, Length, NumberRange from app.models import Player, Objective from pytz import timezone class LoginForm(FlaskForm): username = StringField('Username', validators=[DataRequired()]) password = PasswordField('Password', validators=[DataRequired()]) remember_me = BooleanField('Remember Me', default=True) submit = SubmitField('Sign In') class RegistrationForm(FlaskForm): username = StringField('Username', validators=[DataRequired(), Length(min=0, max=64)]) password = PasswordField('Password', validators=[DataRequired(), Length(min=0, max=128)]) password2 = PasswordField( 'Repeat Password', validators=[DataRequired(), EqualTo('password')]) submit = SubmitField('Register') def validate_username(self, username): player = Player.query.filter_by(name=username.data).first() if player is not None: raise ValidationError('Please use a different username.') class CreateGameForm(FlaskForm): game_name = StringField('Game Name', validators=[DataRequired(), Length(min=0, max=64)]) start_time_disabled = BooleanField('No start time') start_time = DateTimeField(id='datetimepicker_start', format="%d-%m-%Y %H:%M") end_time_disabled = BooleanField('No end time') end_time = DateTimeField(id='datetimepicker_end', format="%d-%m-%Y %H:%M") timezone = HiddenField(validators=[DataRequired()]) submit = SubmitField('Create') def validate_start_time(self, start_time): self.date_time_validator(self.start_time_disabled, start_time) def validate_end_time(self, end_time): self.date_time_validator(self.end_time_disabled, end_time) def date_time_validator(self, disabled, date_time): if disabled.data: date_time.data = None return clientzone = timezone(self.timezone.data) date_time_utc = clientzone.localize(date_time.data).astimezone(timezone('UTC')) date_time.data = date_time_utc class ObjectiveForm(FlaskForm): objective_name = StringField('Objective Name', validators=[Length(min=0, max=64)]) latitude = FloatField('Latitude', validators=[DataRequired(), NumberRange(min=-90, max=90)]) longitude = FloatField('Longitude', validators=[DataRequired(), NumberRange(min=-180, max=180)]) submit = SubmitField('Save') def validate_objective_name(self, objective_name): if objective_name.data == '': return objective = Objective.query.filter_by(name=objective_name.data).first() if objective is not None: raise ValidationError('Please use a different name.')