Exemple #1
0
class AddProduct(flask_wtf.FlaskForm):
    name     = wtforms.StringField("Name")
    price    = wtforms.StringField("Price")
    submit   = wtforms.SubmitField("Submit")
Exemple #2
0
class AdminUserClass(FlaskForm):
    us = wtforms.SelectField("User")
    course = wtforms.SelectField("Course")
    show_classes = wtforms.SubmitField("Show Available Classes")
    submit = wtforms.SubmitField("Register User to Class")
Exemple #3
0
class ConnectionForm(GenericForm):
    question_text = None
    connection = wtf.StringField(
        _l('Connection'),
        validators=[wtf.validators.DataRequired()]
    )
    opportunities = wtf.IntegerField(
        _l('Opportunities'),
        validators=[wtf.validators.DataRequired()],
        default=3
    )
    submit = wtf.SubmitField(_l('Create Section'))

    def create(self, quiz: md.Quiz):
        section = md.Section(
            user_id=current_user.id,
            container=quiz,
            order_number=self.order_number.data,
            name=self.name.data
        )
        md.db.session.add(section)

        order_number = 1

        for i in range(self.number_of_questions.data-1):
            question = md.Question(
                text=_('Question %(num)s', num=i+1),
                order_number=order_number,
                show_values=False,
                container=section
            )
            order_number += 1
            md.db.session.add(question)
            md.db.session.add(md.Value(
                text=_('Answer'),
                question=question,
                allowed_misses=3,
                points=1
            ))
            if i < self.opportunities.data:
                question = md.Question(
                    text=_('What is the connection? (+%(num)s/-1)', num=self.opportunities.data - i),
                    order_number=order_number,
                    show_values=False,
                    bonus=True,
                    container=section
                )
                order_number += 1
                md.db.session.add(question)
                for ans in self.connection.data.split(','):
                    text = ans.strip()
                    md.db.session.add(md.Value(
                        text=text,
                        question=question,
                        allowed_misses=int(len(text) / 4) + 1,
                        points=self.opportunities.data + 1 - i
                    ))

        question = md.Question(
            text=_('What is the connection?'),
            order_number=order_number,
            show_values=False,
            bonus=True,
            container=section
        )
        md.db.session.add(question)
        for ans in self.connection.data.split(','):
            text = ans.strip()
            md.db.session.add(md.Value(
                text=text,
                question=question,
                allowed_misses=int(len(text) / 4) + 1,
                points=1
            ))


        return section
Exemple #4
0
class ProgrammDeleteForm(flask_wtf.FlaskForm):
    submit_programm_delete_form = wtforms.SubmitField('Löschen')
Exemple #5
0
class SubnetExporterForm(FlaskForm):
    exporters = ExporterMultipleCheckBoxForm('Exporters')
    name = wtforms.StringField(label='Subnet name')
    submit = wtforms.SubmitField('Save changes')
class LoginForm(FlaskForm):
    username = wtforms.StringField(
        'Username', validators=[wtforms.validators.DataRequired()])
    password = wtforms.PasswordField(
        'Password', validators=[wtforms.validators.DataRequired()])
    submit = wtforms.SubmitField('Login')
class LoginForm(flask_wtf.FlaskForm):
    token = wtforms.TextAreaField("Token",
                                  validators=[validators.DataRequired()])
    submit = wtforms.SubmitField("Verify")
Exemple #8
0
class LoginForm(FlaskForm):
    username = wtforms.StringField('Username', validators=[DataRequired()])
    password = wtforms.StringField('Password', validators=[DataRequired()])
    remember_me = wtforms.BooleanField('Remember Me')
    submit = wtforms.SubmitField('Sign In')
Exemple #9
0
class LoginForm(FlaskForm):
    login = wtforms.StringField('Email or username',
                                validators=[v.DataRequired()])
    password = wtforms.PasswordField('Password', validators=[v.DataRequired()])
    remember_me = wtforms.BooleanField('Remember me')
    submit = wtforms.SubmitField('Login')
Exemple #10
0
class InviteForm(flask_wtf.FlaskForm):  # type:ignore
    action_revoke = wtforms.SubmitField(
        _l("Revoke")
    )
Exemple #11
0
class DeleteUserForm(flask_wtf.FlaskForm):  # type:ignore
    action_delete = wtforms.SubmitField(
        _l("Delete user permanently")
    )
Exemple #12
0
class SearchNameOrNumber(FlaskForm):
    name = wtf.StringField("Name")
    number = wtf.StringField("Number")
    submit = wtf.SubmitField("Search")
Exemple #13
0
class SubmitForm(FForm):
    submit = wtforms.SubmitField('Save')
    submit_return = wtforms.SubmitField('Save and return')
Exemple #14
0
class loginForm(flask_wtf.FlaskForm):
    name = wtforms.StringField('Input your name',
                               validators=[validators.Required()])
    password = wtforms.PasswordField('Input your password',
                                     validators=[validators.Required()])
    submit = wtforms.SubmitField('Submit')
Exemple #15
0
class ExporterForm(FlaskForm):
    exporter_port = wtforms.IntegerField(label="Port number",
                                         validators=[validators.DataRequired(message='Please enter valid port number')])
    exporter_name = wtforms.StringField(label="Exporter name",
                                        validators=[validators.DataRequired(message='Please enter exporter name')])
    submit = wtforms.SubmitField('Add exporter')
Exemple #16
0
class SigninForm(flask_wtf.FlaskForm):
    mail = wtf.StringField('Email', )
    pwd  = wtf.PasswordField('Password', )
    submit = wtf.SubmitField('Sign in')
Exemple #17
0
class ExporterEditForm(FlaskForm):
    exporter_port = wtforms.IntegerField(label="Port number",
                                         validators=[validators.DataRequired(message='Please enter valid port number')])
    exporter_meta = wtforms.TextAreaField(label="Meta", render_kw={'class': 'form-control', 'rows': 8})
    exporter_tag = wtforms.StringField(label="Tags")
    submit = wtforms.SubmitField('Save changes')
Exemple #18
0
class ResponseForm(FlaskForm):
    response = fields.StringField('response', validators=[validators.DataRequired()])
    submit = fields.SubmitField(label='Add')
Exemple #19
0
class ConfirmDeleteForm(Form):
    """
    Confirm a delete operation
    """
    delete = wtforms.SubmitField('Delete')
    cancel = wtforms.SubmitField('Cancel')
Exemple #20
0
class DeleteForm(FlaskForm):
    submit = fields.SubmitField(label='Delete')
Exemple #21
0
def ProgrammForm(event, programmpunkt):
    class Form(flask_wtf.FlaskForm):
        pass

    if programmpunkt is None:
        Form.url_part = gefolge_web.forms.AnnotatedStringField(
            'URL', [
                wtforms.validators.InputRequired(),
                wtforms.validators.Regexp(
                    '^[0-9a-z-]+$',
                    message=
                    'Darf nur aus Kleinbuchstaben, Zahlen und „-“ bestehen.'),
                wtforms.validators.
                NoneOf([
                    programmpunkt.url_part for programmpunkt in event.programm
                ],
                       message=
                       'Es gibt bereits einen Programmpunkt mit diesem Titel.'
                       ),
            ],
            prefix=f'https://gefolge.org/event/{event.event_id}/programm/')
    if programmpunkt is None or programmpunkt.name_editable:
        Form.display_name = wtforms.StringField('Titel', [
            wtforms.validators.InputRequired(),
            wtforms.validators.NoneOf(
                [
                    other.name for other in event.programm
                    if programmpunkt is None or other != programmpunkt
                ],
                message='Es gibt bereits einen Programmpunkt mit diesem Titel.'
            )
        ],
                                                default=''
                                                if programmpunkt is None else
                                                programmpunkt.name)
    Form.subtitle = wtforms.StringField(
        'Untertitel', [wtforms.validators.Length(max=40)],
        default='' if programmpunkt is None else programmpunkt.subtitle)
    Form.subtitle_notice = gefolge_web.forms.FormText(
        'Wird auf dem info-beamer und im Zeitplan angezeigt.')
    if programmpunkt is None or flask.g.user.is_admin or flask.g.user == event.orga(
            programmpunkt.orga_role):
        Form.orga = gefolge_web.forms.PersonField(
            'Orga',
            gefolge_web.login.Mensch if event.location is not None
            and event.location.is_online else filter(
                lambda person: person.is_mensch, event.signups),
            optional_label='Orga gesucht',
            default=None if programmpunkt is None else programmpunkt.orga)
    elif flask.g.user == programmpunkt.orga:
        if event.location is not None and event.location.is_online:
            programm_orga = gefolge_web.login.Mensch.admin()
        else:
            programm_orga = event.orga(programmpunkt.orga_role)
        Form.orga_notice = gefolge_web.forms.FormText(jinja2.Markup(
            'Bitte wende dich an {}, wenn du die Orga für diesen Programmpunkt abgeben möchtest.'
            .format(programm_orga.__html__())),
                                                      display_label='Orga')
    Form.start = gefolge_web.forms.DateTimeField(
        'Beginn', [wtforms.validators.Optional()],
        tz=event.timezone if programmpunkt is None else programmpunkt.timezone,
        default=None if programmpunkt is None else programmpunkt.start)
    Form.end = gefolge_web.forms.DateTimeField('Ende', [
        wtforms.validators.Optional(),
        gefolge_web.forms.OtherInputRequired(
            'start',
            'Bitte entweder auch den Beginn eintragen oder den Endzeitpunkt erstmal weglassen.'
        )
    ],
                                               tz=event.timezone
                                               if programmpunkt is None else
                                               programmpunkt.timezone,
                                               default=None
                                               if programmpunkt is None else
                                               programmpunkt.end)
    if programmpunkt is None or programmpunkt.description_editable:
        Form.description = flask.g.wiki.MarkdownField(
            'Beschreibung',
            default='' if programmpunkt is None else programmpunkt.description)
    if flask.g.user.is_admin or flask.g.user == event.orga('Programm'):
        Form.css_class = gefolge_web.forms.HorizontalButtonGroupField(
            'Farbe', [wtforms.validators.InputRequired()],
            choices=[('programm-meta', 'Kernprogramm, meta', '#a61c00',
                      '#cc4125'),
                     ('programm-essen', 'Essen', '#45818e', '#76a5af'),
                     ('programm-trip', 'Ausflug', '#3c78d8', '#6d9eeb'),
                     ('programm-reqsignup', 'Voranmeldung nötig', '#e69138',
                      '#f6b26b'),
                     ('programm-other', 'Sonstiges', '#f1c232', '#ffd966')],
            default='programm-other'
            if programmpunkt is None else programmpunkt.css_class)
    Form.submit_programm_form = wtforms.SubmitField(
        'Programmpunkt erstellen' if programmpunkt is None else 'Speichern')

    return Form()
Exemple #22
0
class SigninForm(flask_wtf.FlaskForm):

    username = wtforms.StringField("Name:", validators=[vld.DataRequired()])
    password = wtforms.PasswordField("Password:"******"Sign in")
Exemple #23
0
def ProfileForm(event, person):
    class Form(flask_wtf.FlaskForm):
        pass

    editor_data = event.attendee_data(flask.g.user)
    person_data = event.attendee_data(person)
    if person_data is None:
        person_data = {'id': person.snowflake}
        new_signup = True
    else:
        person_data = person_data.value()
        new_signup = False

    Form.section_nights = gefolge_web.forms.FormSection('Zeitraum')
    if event.start is None:
        Form.section_nights_intro = gefolge_web.forms.FormText('Coming soon™')
    else:
        for i, night in enumerate(event.nights):
            default = event.night_going(person_data, night)
            if new_signup:
                night_data = None
            else:
                night_data = default
            free_when_maybe = event.free(night) + (
                1 if night_data == 'yes' else 0
            )  # die Anzahl Plätze, die frei wären, wenn person auf vielleicht gehen würde
            maybes_when_maybe = len(event.night_maybes(night)) + (
                0 if night_data == 'maybe' else 1
            )  # die Anzahl Personen auf vielleicht wenn person auf vielleicht gehen würde
            maybe_is_waiting = free_when_maybe < 1 or free_when_maybe == 1 and maybes_when_maybe > 1  # es gibt keine freien Plätze mehr, oder genau einen und es ist sonst schon wer auf vielleicht
            yes_available = night_data == 'yes' or not maybe_is_waiting  # person ist schon auf ja oder es gibt aktuell keine Warteliste
            setattr(
                Form, 'night{}'.format(i),
                gefolge_web.forms.HorizontalButtonGroupField(
                    '{:%d.%m.}–{:%d.%m.}'.format(
                        night, night + datetime.timedelta(days=1)),
                    [wtforms.validators.InputRequired()],
                    ([('yes', 'Ja', '#449d44')] if yes_available else []) +
                    [(('maybe', 'Warteliste',
                       '#269abc') if maybe_is_waiting else
                      ('maybe', 'Vielleicht', '#d58512')),
                     ('no', 'Nein', '#ac2925')],
                    default=default))

    if event.rooms:
        Form.section_room = gefolge_web.forms.FormSection('Zimmer')
        if any(room.reserved for room in event.rooms):
            Form.section_room_intro = gefolge_web.forms.FormText(
                gefolge_web.util.render_template('event.form-notes-zimmer',
                                                 event=event,
                                                 person=person))
        Form.room = wtforms.SelectField(
            'Zimmer',
            choices=[('', 'noch nicht ausgewählt')] +
            [(str(room), room.description) for room in event.rooms
             if person in room.people or flask.g.user.is_admin or
             editor_data is not None and len(editor_data.get('orga', [])) > 0
             or room.free > 0 and not room.reserved],
            default='' if event.rooms.get(person) is None else str(
                event.rooms.get(person)))

    Form.section_travel = gefolge_web.forms.FormSection('An-/Abreise')
    Form.section_travel_intro = gefolge_web.forms.FormText(
        jinja2.Markup(
            'Um die Infos zu deiner An-/Abreise zu ändern, wende dich bitte an {}.'
            .format(gefolge_web.login.Mensch.admin().__html__())))  #TODO form

    Form.section_food = gefolge_web.forms.FormSection('Essen')
    if person_data.get('selbstversorger', False):
        Form.section_food_intro = gefolge_web.forms.FormText(
            jinja2.Markup(
                'Du bist als Selbstversorger eingetragen. Um das zu ändern, wende dich bitte an {}.'
                .format(gefolge_web.login.Mensch.admin().__html__())))
    else:
        Form.section_food_intro = gefolge_web.forms.FormText(
            'Bitte trage hier Informationen zu deiner Ernährung ein. Diese Daten werden nur der Orga angezeigt.'
        )
        Form.animal_products = gefolge_web.forms.HorizontalButtonGroupField(
            'tierische Produkte', [wtforms.validators.InputRequired()],
            choices=[('yes', 'uneingeschränkt', '#808080'),
                     ('vegetarian', 'vegetarisch', '#aac912'),
                     ('vegan', 'vegan', '#55a524')],
            default=person_data.get('food', {}).get('animalProducts', 'yes'))
        Form.allergies = wtforms.TextAreaField(
            'Allergien, Unverträglichkeiten',
            default=person_data.get('food', {}).get('allergies', ''))

    Form.section_programm = gefolge_web.forms.FormSection('Programm')
    if new_signup:
        Form.section_programm_intro = gefolge_web.forms.FormText(
            jinja2.Markup(
                'Nachdem du dich angemeldet hast, kannst du dich auf der <a href="{}">Programmseite</a> für Programmpunkte als interessiert eintragen.'
                .format(flask.url_for('event_programm',
                                      event=event.event_id))))
    else:
        Form.section_programm_intro = gefolge_web.forms.FormText(
            jinja2.Markup(
                'Auf der <a href="{}">Programmseite</a> kannst du {} für Programmpunkte als interessiert eintragen.'
                .format(
                    flask.url_for('event_programm', event=event.event_id),
                    'dich' if person == flask.g.user else person.__html__()))
        )  #TODO add support for deleting programm signups, then adjust this text

    if gefolge_web.util.now(event.timezone) < event.end and event.data.get(
            'covidTestRequired'):
        if event.data['covidTestRequired'].value() == 'geimpftGenesen':
            if person_data.get('covidStatus') != 'geimpftGenesen':
                Form.section_covid = gefolge_web.forms.FormSection('COVID-19')
                Form.covid_immune = wtforms.BooleanField(
                    'Ich gelte zum Zeitpunkt meiner Anreise als gegen COVID-19 immunisiert (geimpft und/oder genesen) und bringe einen entsprechenden Nachweis (Digitales COVID-Zertifikat der EU) mit.',
                    [wtforms.validators.DataRequired()])
        else:
            Form.section_covid = gefolge_web.forms.FormSection('COVID-19')
            Form.covid_status = wtforms.RadioField(
                'Status', [wtforms.validators.InputRequired()],
                choices=
                [('geimpftGenesen',
                  'Ich gelte zum Zeitpunkt meiner Anreise als gegen COVID-19 immunisiert (geimpft und/oder genesen) und bringe einen entsprechenden Nachweis (Digitales COVID-Zertifikat der EU) mit.'
                  ),
                 ('test',
                  'Ich bin nicht gegen COVID-19 immunisiert. Mir ist bekannt, dass ich bei meiner Ankunft ein tagesaktuelles negatives Testergebnis vorzeigen muss.'
                  )],
                default=person_data.get('covidStatus'))
            if new_signup:
                Form.covid_status_notice = gefolge_web.forms.FormText(
                    'Falls sich dein Status später ändert (z.B. weil du an COVID-19 erkrankst oder einen Impftermin absagen musst), kannst du diese Angabe in deinem Eventprofil jederzeit anpassen.'
                )

    def header_anmeldung():
        if not hasattr(Form, 'section_signup'):
            Form.section_signup = gefolge_web.forms.FormSection('Anmeldung')

    if new_signup and person == flask.g.user and event.anzahlung is not None and event.ausfall > event.anzahlung_total + event.anzahlung:
        header_anmeldung()
        if event.ausfall_date is None:
            Form.anzahlung_notice = gefolge_web.forms.FormText(
                'Wir können erst buchen, wenn die Ausfallgebühr von {} gesichert ist. Dazu fehlen noch {}, also {} Anmeldungen. Damit wir früher buchen können, kannst du freiwillig eine höhere Anzahlung bezahlen. Du bekommst den zusätzlichen Betrag wieder gutgeschrieben, wenn sich genug weitere Menschen angemeldet haben, dass ihre Anzahlungen ihn decken. Er wird nur behalten, um die Ausfallgebühr zu bezahlen, falls das event komplett ausfällt.'
                .format(
                    event.ausfall, event.ausfall - event.anzahlung_total,
                    math.ceil((event.ausfall - event.anzahlung_total).value /
                              event.anzahlung.value)))
        else:
            Form.anzahlung_notice = gefolge_web.forms.FormText(
                'Bis zum {:%d.%m.%Y} müssen wir die Ausfallgebühr von {} abdecken. Dazu fehlen noch {}, also {} Anmeldungen. Um sicher zu stellen, dass wir nicht stornieren müssen, kannst du freiwillig eine höhere Anzahlung bezahlen. Du bekommst den zusätzlichen Betrag wieder gutgeschrieben, wenn sich genug weitere Menschen angemeldet haben, dass ihre Anzahlungen ihn decken.'
                .format(
                    event.ausfall_date, event.ausfall,
                    event.ausfall - event.anzahlung_total,
                    math.ceil((event.ausfall - event.anzahlung_total).value /
                              event.anzahlung.value)))
        Form.anzahlung = gefolge_web.forms.EuroField('Anzahlung', [
            wtforms.validators.InputRequired(),
            gefolge_web.forms.EuroRange(
                min=event.anzahlung,
                message=
                'Die reguläre Anzahlung beträgt {min}. Mindestens soviel musst du bezahlen, um dich anzumelden.'
            ),
            gefolge_web.forms.EuroRange(
                max=event.ausfall - event.anzahlung_total,
                message=
                'Wir benötigen nur noch {max}, um die Ausfallgebühr abzudecken.'
            ),
            gefolge_web.forms.EuroRange(
                max=person.balance,
                message=jinja2.Markup(
                    f'Dein aktuelles Guthaben ist {flask.g.user.balance}. Auf <a href="{flask.g.user.profile_url}">deiner Profilseite</a> steht, wie du Guthaben aufladen kannst.'
                ))
        ],
                                                     default=event.anzahlung)
    if gefolge_web.util.now(
            event.timezone
    ) < event.end and person == flask.g.user and event.location is not None and event.location.hausordnung is not None and not person_data.get(
            'hausordnung', False
    ):  #TODO track last-changed event and hide if current version has already been accepted. Also show last-changed date
        header_anmeldung()
        Form.hausordnung = wtforms.BooleanField(
            jinja2.Markup(
                'Ich habe die <a href="{}">Hausordnung</a> zur Kenntnis genommen.'
                .format(event.location.hausordnung)),
            [wtforms.validators.DataRequired()])

    Form.submit_profile_form = wtforms.SubmitField('Anmelden' if hasattr(
        Form, 'section_signup') or new_signup else 'Speichern')
    return Form()
Exemple #24
0
class Twitter(flask_wtf.FlaskForm):
    subject = wtforms.StringField("Which topic to search for ? ")
    location = wtforms.StringField("Where to look for ?  ")

    submit = wtforms.SubmitField("Search")
Exemple #25
0
class NewSubnetsForm(FlaskForm):
    newsubnet = wtforms.StringField(label="Subnet",
                                    validators=[validators.regexp('^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\/(3[0-2]|[01]?[1-2][0-9])',
                                                                  message='Must be valid subnet in CIDR notation')])
    newsubnet_name = wtforms.StringField(label='Subnet name')
    submit = wtforms.SubmitField('Add subnet')
Exemple #26
0
class LoginForm(FlaskForm):
    uname = wtf.TextField('Username', [wtf.validators.required()])
    password = wtf.PasswordField('Password', [wtf.validators.required()])
    submit = wtf.SubmitField('Submit')
Exemple #27
0
class Average(wtf.Form):
    """Form for selecting and submitting a file."""

    filename = wtf.FileField(validators=[wtf.validators.InputRequired()])
    submit = wtf.SubmitField(label="Submit")
Exemple #28
0
class UserAbsenceForm( flask_wtf.FlaskForm ):
  choice_category = wtforms.SelectField( "Absence category", validate_choice = False, coerce=int )
  ts_absence_start = wtforms.DateTimeField( "Absence start", validators = [wtforms.validators.InputRequired()] )
  ts_absence_end = wtforms.DateTimeField( "Absence end", validators = [wtforms.validators.InputRequired()] )
  description = wtforms.TextAreaField( "Description", validators = [wtforms.validators.Length( min = 0, max = 500 )] )
  submit = wtforms.SubmitField( "Save" )
class QueryForm(flask_wtf.FlaskForm):
    query = wtforms.StringField("")
    submit = wtforms.SubmitField("search")
Exemple #30
0
class LoginForm(flask_wtf.FlaskForm):
    username = wtforms.StringField('username', validators=[wtforms.validators.InputRequired()])
    password = wtforms.PasswordField('password', validators=[wtforms.validators.InputRequired()])
    remember_me = wtforms.BooleanField('remember_me')
    login = wtforms.SubmitField('Log in')