class ChangeUserDetailsForm(Form): birthday = BirthdayField(_("Birthday"), format="%d %m %Y", validators=[Optional()], widget=SelectBirthdayWidget()) gender = SelectField(_("Gender"), default="None", choices=[("None", ""), ("Male", _("Male")), ("Female", _("Female"))]) location = StringField(_("Location"), validators=[Optional()]) website = StringField(_("Website"), validators=[Optional(), URL()]) avatar = StringField(_("Avatar"), validators=[Optional(), URL()]) signature = TextAreaField(_("Forum Signature"), validators=[Optional()]) notes = TextAreaField(_("Notes"), validators=[Optional(), Length(min=0, max=5000)]) submit = SubmitField(_("Save")) def validate_birthday(self, field): if field.data is None: return True def validate_avatar(self, field): if field.data is not None: error, status = check_image(field.data) if error is not None: raise ValidationError(error) return status
def test_select_birthday_widget(): """Test the SelectDateWidget.""" assert SelectBirthdayWidget.FORMAT_CHOICES['%d'] == [(x, str(x)) for x in range(1, 32)] assert SelectBirthdayWidget.FORMAT_CHOICES['%m'] == [(x, str(x)) for x in range(1, 13)] assert SelectBirthdayWidget.FORMAT_CLASSES == { '%d': 'select_date_day', '%m': 'select_date_month', '%Y': 'select_date_year' } select_birthday_widget = SelectBirthdayWidget(years=[0, 1]) assert select_birthday_widget.FORMAT_CHOICES['%Y'] == [(0, '0'), (1, '1')] class Field(object): id = 'world' name = 'helloWorld' format = '%d %m %Y' data = None html = select_birthday_widget(field=Field(), surrounded_div="test-div") assert 'world' in html assert 'helloWorld' in html assert 'class="select_date_day"' in html assert 'class="select_date_month"' in html assert 'class="select_date_year"' in html assert '<div class="test-div">' in html
class UserForm(Form): username = StringField( _("Username"), validators=[ DataRequired(message=_("A Username is required.")), is_username ]) email = StringField( _("E-Mail Address"), validators=[ DataRequired(message=_("A E-Mail Address is required.")), Email(message=_("Invalid E-Mail Address.")) ]) password = PasswordField("Password", validators=[Optional()]) birthday = BirthdayField(_("Birthday"), format="%d %m %Y", widget=SelectBirthdayWidget(), validators=[Optional()]) gender = SelectField(_("Gender"), default="None", choices=[("None", ""), ("Male", _("Male")), ("Female", _("Female"))]) location = StringField(_("Location"), validators=[Optional()]) website = StringField(_("Website"), validators=[Optional(), URL()]) avatar = StringField(_("Avatar"), validators=[Optional(), URL()]) signature = TextAreaField(_("Forum Signature"), validators=[Optional(), Length(min=0, max=250)]) notes = TextAreaField(_("Notes"), validators=[Optional(), Length(min=0, max=5000)]) primary_group = QuerySelectField(_("Primary Group"), query_factory=select_primary_group, get_label="name") secondary_groups = QuerySelectMultipleField( _("Secondary Groups"), # TODO: Template rendering errors "NoneType is not callable" # without this, figure out why. query_factory=select_primary_group, get_label="name") submit = SubmitField(_("Save")) def validate_username(self, field): if hasattr(self, "user"): user = User.query.filter( db.and_(User.username.like(field.data), db.not_(User.id == self.user.id))).first() else: user = User.query.filter(User.username.like(field.data)).first() if user: raise ValidationError(_("This Username is already taken.")) def validate_email(self, field): if hasattr(self, "user"): user = User.query.filter( db.and_(User.email.like(field.data), db.not_(User.id == self.user.id))).first() else: user = User.query.filter(User.email.like(field.data)).first() if user: raise ValidationError(_("This E-Mail Address is already taken.")) def save(self): user = User(**self.data) return user.save()