from flask_wtf import FlaskForm from flask_wtf.file import FileField, FileAllowed, FileRequired from wtforms import StringField, SubmitField, DateTimeField, BooleanField, HiddenField, FloatField, SelectField from wtforms.validators import InputRequired, DataRequired, ValidationError, Length, NumberRange from pytz import timezone from app.models import Objective, Game from app import Config class CreateGameForm(FlaskForm): game_name = StringField('Game Name', validators=[InputRequired(), 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') old_name = '' 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) if self.start_time.data and end_time.data: if self.start_time.data > end_time.data: raise ValidationError('Start Time must be before End Time.') def date_time_validator(self, disabled, date_time): print(1) if disabled.data: date_time.data = None return clientzone = timezone(self.timezone.data) print(clientzone) print(date_time.data) date_time_utc = clientzone.localize(date_time.data).astimezone(timezone('UTC')) date_time.data = date_time_utc print(date_time.data) def validate_game_name(self, game_name): if game_name.data == '': return if game_name.data == self.old_name: return game = Game.query.filter_by(name=game_name.data).first() if game is not None: raise ValidationError('Please use a different name.') 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') old_name = '' def validate_objective_name(self, objective_name): if objective_name.data == '': return if objective_name.data == self.old_name: return objective = Objective.query.filter_by(name=objective_name.data).first() if objective is not None: raise ValidationError('Please use a different name.') class PlayerUpdateForm(FlaskForm): role = SelectField('Player Role', coerce=int, validators=[InputRequired()]) submit = SubmitField('Update') class PlayerAddForm(FlaskForm): name = StringField('Username', validators=[InputRequired(), Length(min=0, max=64)]) role = SelectField('Player Role', coerce=int, validators=[InputRequired()]) submit_add = SubmitField('Create') class UserCreateForm(FlaskForm): name = StringField('Username', validators=[InputRequired(), Length(min=0, max=64)]) role = SelectField('Player Role', coerce=int, validators=[InputRequired()]) submit_create = SubmitField('Create') class CatchBunnyForm(FlaskForm): bunny = SelectField('Bunny Name', coerce=int, validators=[InputRequired()]) photo = FileField('Upload Photo', validators=[FileRequired(), FileAllowed(Config.ALLOWED_PHOTO_EXTENSIONS, 'Images only!')]) submit = SubmitField('Send')