from typing import Optional as tOptional from flask_babel import lazy_gettext from flask_wtf import FlaskForm from wtforms import ( BooleanField, DateField, Field, RadioField, StringField, SubmitField, ValidationError, ) from wtforms.validators import Email, InputRequired, Length, Optional class NotEqualTo: """ Compares the values of two fields. :param fieldname: The name of the other field to compare to. :param message: Error message to raise in case of a validation error. Can be interpolated with `%(other_label)s` and `%(other_name)s` to provide a more helpful error. """ def __init__(self, fieldname: str, message: tOptional[str] = None) -> None: self.fieldname = fieldname self.message = message def __call__(self, form: FlaskForm, field: Field) -> None: try: other = form[self.fieldname] except KeyError as exc: raise ValidationError( field.gettext("Invalid field name '%s'.") % self.fieldname ) from exc if field.data != other.data: return d = { "other_label": hasattr(other, "label") and other.label.text or self.fieldname, "other_name": self.fieldname, } message = self.message if message is None: message = field.gettext("Field must not be equal to %(other_name)s.") raise ValidationError(message % d) class MembershipForm(FlaskForm): username = StringField( lazy_gettext("Username"), validators=[ InputRequired(lazy_gettext("This field is required!")), Length(max=255), ], ) email = StringField( lazy_gettext("E-Mail"), validators=[InputRequired(lazy_gettext("This field is required!")), Email()], ) fullname = StringField( lazy_gettext("Full Name"), validators=[ InputRequired(lazy_gettext("This field is required!")), Length(max=65536), ], ) membership = RadioField( lazy_gettext("Membership Plan"), validators=[InputRequired(lazy_gettext("Please select one of the options!"))], choices=[ ( "regular", lazy_gettext( "Regular membership - Membership with voting rights on the general assembly." ), ), ( "supporting", lazy_gettext( "Supporting membership - Membership without voting rights on the general assembly." ), ), ], ) student = BooleanField( lazy_gettext( "I am a student and would like to have the reduced membership fees." ), validators=[ Optional(), NotEqualTo( "starving", lazy_gettext( "Student and Starving Hacker are mutually exclusive! Please select only one of them." ), ), ], ) starving = BooleanField( lazy_gettext( "I am a starving hacker and cannot afford the membership! (Please get in touch with us at info@c3l.lu before filling out this membership form)" ) ) payment = RadioField( lazy_gettext("Payment Options"), validators=[InputRequired(lazy_gettext("Please select one of the options!"))], ) birthday = DateField(lazy_gettext("Birthday"), validators=[InputRequired()]) street = StringField( lazy_gettext("Nr., Street"), validators=[Optional(), Length(max=4000)], ) postal = StringField( lazy_gettext("Postal Code"), validators=[Optional(), Length(max=30)], ) city = StringField( lazy_gettext("City/Town"), validators=[Optional(), Length(max=500)], ) state = StringField( lazy_gettext("State/County/Province"), validators=[Optional(), Length(max=500)], ) country = StringField( lazy_gettext("Country"), validators=[Optional(), Length(max=500)], ) terms = BooleanField( lazy_gettext( 'By submitting this membership application, you agree to have read and understood the statutes of the Chaos Computer Club Lëtzebuerg A.S.B.L..' ), validators=[InputRequired()], ) submit = SubmitField(lazy_gettext("Become a member"))