Ejemplo n.º 1
0
class ProposalSpaceForm(forms.Form):
    name = forms.StringField(__("URL name"), validators=[forms.validators.DataRequired(), forms.ValidName(), AvailableName()])
    title = forms.StringField(__("Title"), validators=[forms.validators.DataRequired()])
    datelocation = forms.StringField(__("Date and Location"), validators=[forms.validators.DataRequired(), forms.validators.Length(max=50)])
    date = forms.DateField(__("Start date (for sorting)"),
        validators=[forms.validators.DataRequired(__("Enter a valid date in YYYY-MM-DD format"))])
    date_upto = forms.DateField(__("End date (for sorting)"),
        validators=[forms.validators.DataRequired(__("Enter a valid date in YYYY-MM-DD format"))])
    tagline = forms.StringField(__("Tagline"), validators=[forms.validators.DataRequired()],
        description=__("This is displayed on the card on the homepage"))
    website = forms.URLField(__("Website"),
        validators=[forms.validators.Optional()])
    description = forms.MarkdownField(__("Description"), validators=[forms.validators.DataRequired()],
        description=__("About Event"))
    timezone = forms.SelectField(__("Timezone"),
        description=__("The timezone in which this event occurs"),
        validators=[forms.validators.DataRequired()], choices=sorted_timezones(), default=u'UTC')
    bg_image = forms.URLField(__("Background image URL"), description=u"Background image for the mobile app",
        validators=[forms.validators.Optional()])
    bg_color = forms.StringField(__("Background color"),
        description=__("RGB color for the event, shown on the mobile app. Enter without the '#'. E.g. CCCCCC."),
        validators=[forms.validators.Optional(), forms.validators.Length(max=6)],
        default=u"CCCCCC")
    explore_url = forms.URLField(__("Explore tab URL"),
        description=__(u"Page containing the explore tab’s contents, for the mobile app"),
        validators=[forms.validators.Optional()])
    parent_space = QuerySelectField(__(u"Parent space"), get_label='title', allow_blank=True, blank_text=__(u"None"))

    status = forms.SelectField(__("Status"), coerce=int, choices=[
        (0, __("Draft")),
        (1, __("Open")),
        (2, __("Voting")),
        (3, __("Jury selection")),
        (4, __("Feedback")),
        (5, __("Closed")),
        (6, __("Withdrawn")),
        ],
        description=__(u"Proposals can only be submitted in the “Open” state. "
            u"“Closed” and “Withdrawn” are hidden from homepage"))
    admin_team = QuerySelectField(u"Admin Team", validators=[forms.validators.DataRequired(__(u"Please select a team"))],
        query_factory=profile_teams, get_label='title', allow_blank=False,
        description=__(u"The administrators of this proposal space"))
    review_team = QuerySelectField(u"Review Team", validators=[forms.validators.DataRequired(__(u"Please select a team"))],
        query_factory=profile_teams, get_label='title', allow_blank=False,
        description=__(u"Reviewers can see contact details of proposers, but can’t change settings"))
    allow_rsvp = forms.BooleanField(__("Allow site visitors to RSVP (login required)"))
    buy_tickets_url = forms.URLField(__("URL to buy tickets"),
        description=__(u"Eg: Explara, Instamojo"),
        validators=[forms.validators.Optional()])

    def validate_date_upto(self, date_upto):
        if self.date_upto.data < self.date.data:
            raise forms.ValidationError(_("End date cannot be before start date"))

    def validate_bg_color(self, field):
        if not valid_color_re.match(field.data):
            raise forms.ValidationError("Please enter a valid color code")
Ejemplo n.º 2
0
class ItemCollectionForm(forms.Form):
    title = forms.StringField(
        __("Item Collection title"),
        validators=[
            forms.validators.DataRequired(__("Please specify a title")),
            forms.validators.Length(max=250),
        ],
        filters=[forms.filters.strip()],
    )
    description_html = forms.TinyMce4Field(
        __("Description"),
        validators=[
            forms.validators.DataRequired(__("Please specify a description"))
        ],
    )
    tax_type = forms.SelectField(__("Tax type"),
                                 choices=[('GST', 'GST')],
                                 default='GST')
    place_supply_state_code = forms.SelectField(
        __("State"),
        description=__("State of supply"),
        coerce=int,
        default=indian_states_dict['KA']['short_code'],
        validators=[
            forms.validators.DataRequired(__("Please select a state"))
        ],
    )
    place_supply_country_code = forms.SelectField(
        __("Country"),
        description=__("Country of supply"),
        default='IN',
        validators=[
            forms.validators.DataRequired(__("Please select a country"))
        ],
    )

    def set_queries(self):
        self.place_supply_state_code.choices = [(0, '')] + [
            (state['short_code'], state['name'])
            for state in sorted(indian_states, key=lambda k: k['name'])
        ]
        self.place_supply_country_code.choices = [('', '')
                                                  ] + localized_country_list()

    def validate_place_supply_state_code(self, field):
        if field.data <= 0:
            # state short codes start from 1,
            # and 0 means empty value as mentioned above in set_queries
            raise forms.ValidationError(__("Please select a state"))
Ejemplo n.º 3
0
class ProposalStatusForm(forms.Form):
    status = forms.SelectField(__("Status"),
                               coerce=int,
                               choices=[(status, title)
                                        for (status,
                                             title) in PROPOSALSTATUS.items()
                                        if status != PROPOSALSTATUS.DRAFT])
Ejemplo n.º 4
0
class PriceForm(forms.Form):
    amount = forms.DecimalField(
        __("Amount"),
        validators=[
            forms.validators.InputRequired(
                __("Please specify an price amount")),
            forms.validators.NumberRange(min=0),
        ],
    )
    currency = forms.SelectField(__("Currency"),
                                 choices=[('INR', 'INR')],
                                 default='INR')
    start_at = forms.DateTimeField(
        __("Start date & time"),
        validators=[
            forms.validators.DataRequired(
                __("Please specify a start date & time"))
        ],
        naive=False,
    )
    end_at = forms.DateTimeField(
        __("End date & time"),
        validators=[
            forms.validators.DataRequired(
                __("Please specify an end date & time")),
            forms.validators.GreaterThan(
                'start_at', __("The price can’t end before it starts")),
        ],
        naive=False,
    )
Ejemplo n.º 5
0
class ProfileForm(forms.Form):
    fullname = forms.StringField(__("Full name"),
        validators=[forms.validators.DataRequired(), forms.validators.Length(max=80)])
    email = forms.EmailField(__("Email address"),
        validators=[forms.validators.DataRequired(), forms.ValidEmail()],
        widget_attrs={'autocorrect': 'none', 'autocapitalize': 'none'})
    username = forms.AnnotatedTextField(__("Username"), validators=[forms.validators.DataRequired()],
        filters=[forms.filters.none_if_empty()],
        prefix=u"https://hasgeek.com/…",
        widget_attrs={'autocorrect': 'none', 'autocapitalize': 'none'})
    timezone = forms.SelectField(__("Timezone"), validators=[forms.validators.DataRequired()], choices=timezones)

    def validate_username(self, field):
        # # Usernames are now mandatory. This should be commented out:
        # if not field.data:
        #     field.data = None
        #     return
        field.data = field.data.lower()  # Usernames can only be lowercase
        if not valid_username(field.data):
            raise forms.ValidationError(_("Usernames can only have alphabets, numbers and dashes (except at the ends)"))
        if field.data in current_app.config.get('RESERVED_USERNAMES', []):
            raise forms.ValidationError(_("This name is reserved"))
        if not self.edit_user.is_valid_username(field.data):
            raise forms.ValidationError(_("This username is taken"))

    # TODO: Move to function and place before ValidEmail()
    def validate_email(self, field):
        field.data = field.data.lower()  # Convert to lowercase
        existing = UserEmail.get(email=field.data)
        if existing is not None and existing.user != self.edit_obj:
            raise forms.ValidationError(_("This email address has been claimed by another user"))
Ejemplo n.º 6
0
class ProfileTransitionForm(forms.Form):
    transition = forms.SelectField(
        __("Project status"), validators=[forms.validators.DataRequired()])

    def set_queries(self):
        self.transition.choices = list(
            self.edit_obj.state.transitions().items())
Ejemplo n.º 7
0
class ItemForm(forms.Form):
    title = forms.StringField(__("Item title"),
        validators=[forms.validators.DataRequired(__("Please specify a title")),
            forms.validators.Length(max=250)], filters=[forms.filters.strip()])
    description = forms.TextAreaField(__("Description"), filters=[format_description],
        validators=[forms.validators.DataRequired(__("Please specify a description"))])
    restricted_entry = forms.BooleanField(__("Restrict entry?"))
    seq = forms.IntegerField(__("Sequence"),
        description=__("The sequence of the ticket on the listing"),
        validators=[forms.validators.DataRequired(__("Please specify the sequence order"))])
    category = QuerySelectField(__("Category"), get_label='title',
        validators=[forms.validators.DataRequired(__("Please select a category"))])
    quantity_total = forms.IntegerField(__("Quantity available"),
        validators=[forms.validators.DataRequired(__("Please specify the quantity available for sale"))])
    assignee_details = forms.TextAreaField(__("Assignee details"), filters=[format_json],
        validators=[validate_json], default=ASSIGNEE_DETAILS_PLACEHOLDER)
    event_date = forms.DateField(__("Event date"),
        description=__("The date on which this item will be invoiced"),
        validators=[forms.validators.DataRequired(__("Please specify a date for the event"))])
    transferable_until = forms.DateTimeField(__("Transferable until"),
        validators=[forms.validators.Optional()],
        naive=False)
    cancellable_until = forms.DateTimeField(__("Cancellable until"),
        validators=[forms.validators.Optional()],
        naive=False)
    place_supply_state_code = forms.SelectField(__("State"),
        description=__("State of supply"), coerce=int, default=indian_states_dict['KA']['short_code'],
        validators=[forms.validators.DataRequired(__("Please select a state"))])
    place_supply_country_code = forms.SelectField(__("Country"),
        description=__("Country of supply"), default='IN',
        validators=[forms.validators.DataRequired(__("Please select a country"))])

    def set_queries(self):
        self.place_supply_state_code.choices = [(0, '')] + [(state['short_code'], state['name']) for state in sorted(indian_states, key=lambda k: k['name'])]
        self.place_supply_country_code.choices = [('', '')] + localized_country_list()
        self.category.query = Category.query.join(ItemCollection).filter(
            Category.item_collection == self.edit_parent).options(db.load_only('id', 'title'))

    def validate_place_supply_state_code(self, field):
        if field.data <= 0:
            # state short codes start from 1,
            # and 0 means empty value as mentioned above in set_queries
            raise forms.ValidationError(__("Please select a state"))

    def validate_transferable_until(self, field):
        if field.data and field.data.date() > self.event_date.data:
            raise forms.ValidationError(__("Ticket transfer deadline cannot be after event date"))
Ejemplo n.º 8
0
class ProfileForm(forms.Form):
    fullname = forms.StringField(
        __("Full name"),
        validators=[
            forms.validators.DataRequired(),
            forms.validators.Length(max=User.__title_length__)
        ])
    email = forms.EmailField(
        __("Email address"),
        validators=[forms.validators.DataRequired(),
                    forms.ValidEmail()],
        widget_attrs={
            'autocorrect': 'none',
            'autocapitalize': 'none'
        })
    username = forms.AnnotatedTextField(
        __("Username"),
        validators=[
            forms.validators.DataRequired(),
            forms.validators.Length(max=Name.__name_length__)
        ],
        filters=[forms.filters.none_if_empty()],
        prefix=u"https://hasgeek.com/",
        widget_attrs={
            'autocorrect': 'none',
            'autocapitalize': 'none'
        })
    timezone = forms.SelectField(__("Timezone"),
                                 validators=[forms.validators.DataRequired()],
                                 choices=timezones)

    def validate_username(self, field):
        if field.data.lower() in current_app.config['RESERVED_USERNAMES']:
            raise forms.ValidationError(
                _("This name is reserved"
                  ))  # To be deprecated in favour of one below

        reason = self.edit_obj.validate_name_candidate(field.data)
        if not reason:
            return  # Username is available
        if reason == 'invalid':
            raise forms.ValidationError(
                _("Usernames can only have alphabets, numbers and dashes (except at the ends)"
                  ))
        elif reason == 'reserved':
            raise forms.ValidationError(_("This username is reserved"))
        elif reason in ('user', 'org'):
            raise forms.ValidationError(_("This username has been taken"))
        else:
            raise forms.ValidationError(_("This username is not available"))

    # TODO: Move to function and place before ValidEmail()
    def validate_email(self, field):
        existing = UserEmail.get(email=field.data)
        if existing is not None and existing.user != self.edit_obj:
            raise forms.ValidationError(
                _("This email address has been claimed by another user"))
Ejemplo n.º 9
0
class SessionForm(forms.Form):
    title = forms.StringField(__("Title"), validators=[forms.validators.DataRequired()])
    venue_room_id = forms.SelectField(__("Room"), choices=[], coerce=nullint, validators=[forms.validators.Optional()])
    description = forms.MarkdownField(__("Description"), validators=[forms.validators.Optional()])
    speaker = forms.StringField(__("Speaker"), validators=[forms.validators.Optional()])
    speaker_bio = forms.MarkdownField(__("Speaker bio"), validators=[forms.validators.Optional()])
    is_break = forms.BooleanField(__("This session is a break period"), default=False)
    start = forms.HiddenField(__("Start Time"), validators=[forms.validators.DataRequired()])
    end = forms.HiddenField(__("End Time"), validators=[forms.validators.DataRequired()])
Ejemplo n.º 10
0
class ProjectForm(forms.Form):
    title = forms.StringField(
        __("Title"),
        validators=[forms.validators.DataRequired()],
        filters=[forms.filters.strip()],
    )
    tagline = forms.StringField(
        __("Tagline"),
        validators=[forms.validators.DataRequired(), forms.validators.Length(max=250)],
        filters=[forms.filters.strip()],
        description=__("One line description of the project"),
    )
    location = forms.StringField(
        __("Location"),
        description=__(
            '“Online” if this is online-only, else the city or region (without quotes)'
        ),
        validators=[
            forms.validators.DataRequired(
                __("If this project is online-only, use “Online”")
            ),
            forms.validators.Length(
                min=3, max=50, message=__("%(max)d characters maximum")
            ),
        ],
        filters=[forms.filters.strip()],
    )
    timezone = forms.SelectField(
        __("Timezone"),
        description=__("The timezone in which this event occurs"),
        validators=[forms.validators.DataRequired()],
        choices=sorted_timezones(),
        default='UTC',
    )
    bg_image = forms.URLField(
        __("Banner image URL"),
        description=(
            "From images.hasgeek.com, with 16:9 aspect ratio."
            " Should be < 100 kB in size"
        ),
        validators=[
            forms.validators.Optional(),
            forms.validators.Length(max=2000),
            image_url_validator(),
        ],
    )
    description = forms.MarkdownField(
        __("Project description"),
        validators=[forms.validators.DataRequired()],
        description=__("Landing page contents"),
    )

    def validate_location(self, field):
        if re.search(double_quote_re, field.data) is not None:
            raise forms.ValidationError(
                __("Quotes are not necessary in the location name")
            )
Ejemplo n.º 11
0
class ModeratorReportForm(forms.Form):
    report_type = forms.SelectField(
        __("Report type"),
        coerce=int,
        validators=[forms.validators.InputRequired()])

    def set_queries(self):
        self.report_type.choices = [
            (idx, report_type.title)
            for idx, report_type in MODERATOR_REPORT_TYPE.items()
        ]
Ejemplo n.º 12
0
class ProposalTransitionForm(forms.Form):
    transition = forms.SelectField(
        __("Status"), validators=[forms.validators.DataRequired()])

    def set_queries(self):
        """
        value: transition method name
        label: transition object itself
        We need the whole object to get the additional metadata in templates
        """
        self.transition.choices = list(
            self.edit_obj.state.transitions().items())
Ejemplo n.º 13
0
class SessionForm(forms.Form):
    title = forms.StringField(
        __("Title"),
        validators=[forms.validators.DataRequired()],
        filters=[forms.filters.strip()],
    )
    venue_room_id = forms.SelectField(__("Room"),
                                      choices=[],
                                      coerce=nullint,
                                      validators=[forms.validators.Optional()])
    description = forms.MarkdownField(__("Description"),
                                      validators=[forms.validators.Optional()])
    speaker = forms.StringField(
        __("Speaker"),
        validators=[
            forms.validators.Optional(),
            forms.validators.Length(max=200)
        ],
        filters=[forms.filters.strip()],
    )
    speaker_bio = forms.MarkdownField(__("Speaker bio"),
                                      validators=[forms.validators.Optional()])
    banner_image_url = forms.URLField(
        __("Banner image URL"),
        description=__("From images.hasgeek.com, with 16:9 aspect ratio."
                       " Should be < 50 kB in size"),
        validators=[
            forms.validators.Optional(),
            forms.validators.Length(max=2000),
            image_url_validator(),
        ],
    )
    is_break = forms.BooleanField(__("This session is a break period"),
                                  default=False)
    featured = forms.BooleanField(__("This is a featured session"),
                                  default=False)
    start_at = forms.HiddenField(__("Start Time"),
                                 validators=[forms.validators.DataRequired()])
    end_at = forms.HiddenField(__("End Time"),
                               validators=[forms.validators.DataRequired()])
    video_url = forms.StringField(
        __("Video URL"),
        description=__("URL of the uploaded video after the session is over"),
        validators=[
            forms.validators.Optional(),
            forms.validators.ValidUrl(),
            forms.validators.Length(max=2000),
        ],
    )
Ejemplo n.º 14
0
class RsvpTransitionForm(forms.Form):
    transition = forms.SelectField(
        __("Status"), validators=[forms.validators.DataRequired()]
    )

    def set_queries(self):
        # Usually you need to use an instance's state.transitions to find
        # all the valid transitions for the current state of the instance.
        # But for RSVP, we're showing all the options all the time, so this
        # call is valid. We're also doing this because we want to load the
        # options in the form even without an Rsvp instance.
        self.transition.choices = [
            (transition_name, getattr(Rsvp, transition_name))
            for transition_name in Rsvp.state.statemanager.transitions
        ]
Ejemplo n.º 15
0
class VenueForm(forms.Form):
    title = forms.StringField(__("Name"),
                              description=__("Name of the venue"),
                              validators=[
                                  forms.validators.DataRequired(),
                                  forms.validators.Length(max=250)
                              ])
    description = forms.MarkdownField(
        __("Description"), description=__("An optional note about the venue"))
    address1 = forms.StringField(__("Address (line 1)"),
                                 validators=[
                                     forms.validators.Optional(),
                                     forms.validators.Length(max=160)
                                 ])
    address2 = forms.StringField(__("Address (line 2)"),
                                 validators=[
                                     forms.validators.Optional(),
                                     forms.validators.Length(max=160)
                                 ])
    city = forms.StringField(__("City"),
                             validators=[
                                 forms.validators.Optional(),
                                 forms.validators.Length(max=30)
                             ])
    state = forms.StringField(__("State"),
                              validators=[
                                  forms.validators.Optional(),
                                  forms.validators.Length(max=30)
                              ])
    postcode = forms.StringField(__("Post code"),
                                 validators=[
                                     forms.validators.Optional(),
                                     forms.validators.Length(max=20)
                                 ])
    country = forms.SelectField(__("Country"),
                                validators=[
                                    forms.validators.Optional(),
                                    forms.validators.Length(max=2)
                                ],
                                choices=country_codes,
                                default="IN")
    location = forms.CoordinatesField(__("Location"),
                                      validators=[
                                          forms.validators.Optional(),
                                          forms.validators.ValidCoordinates()
                                      ])
Ejemplo n.º 16
0
class BoardForm(forms.Form):
    """
    Edit board settings.
    """
    title = forms.StringField(__("Title"),
        validators=[
            forms.validators.DataRequired(__("The board needs a name")),
            forms.validators.Length(min=1, max=80, message=__("%%(max)d characters maximum"))],
        filters=[forms.filters.strip()])
    caption = forms.StringField(__("Caption"),
        description=__("The title and caption appear at the top of the page. Keep them concise"),
        validators=[
            forms.validators.Optional(),
            forms.validators.Length(min=0, max=80, message=__("%%(max)d characters maximum"))],
        filters=[forms.filters.strip(), forms.filters.none_if_empty()])
    name = forms.AnnotatedTextField(__("URL Name"), prefix='https://', suffix=u'.hasjob.co',
        description=__(u"Optional — Will be autogenerated if blank"),
        validators=[
            forms.validators.ValidName(),
            forms.validators.Length(min=0, max=63, message=__("%%(max)d characters maximum")),
            AvailableName(__(u"This name has been taken by another board"), model=Board)])
    description = forms.TinyMce4Field(__(u"Description"),
        description=__(u"The description appears at the top of the board, above all jobs. "
            u"Use it to introduce your board and keep it brief"),
        content_css=content_css,
        validators=[forms.validators.DataRequired(__("A description of the job board is required")),
            forms.validators.AllUrlsValid()])
    userid = forms.SelectField(__(u"Owner"), validators=[forms.validators.DataRequired(__("Select an owner"))],
        description=__(u"Select the user, organization or team who owns this board. "
            "Owners can add jobs to the board and edit these settings"))
    require_login = forms.BooleanField(__(u"Prompt users to login"), default=True,
        description=__(u"If checked, users must login to see all jobs available. "
            u"Logging in provides users better filtering for jobs that may be of interest to them, "
            u"and allows employers to understand how well their post is performing"))
    options = forms.FormField(BoardOptionsForm, __(u"Direct posting options"))
    autotag = forms.FormField(BoardTaggingForm, __(u"Automatic posting options"))

    def validate_name(self, field):
        if field.data:
            if field.data in Board.reserved_names:
                raise forms.ValidationError(_(u"This name is reserved. Please use another name"))
Ejemplo n.º 17
0
class VenueForm(forms.Form):
    title = forms.StringField(
        __("Name"),
        description=__("Name of the venue"),
        validators=[
            forms.validators.DataRequired(),
            forms.validators.Length(max=250)
        ],
        filters=[forms.filters.strip()],
    )
    description = forms.MarkdownField(
        __("Description"), description=__("An optional note about the venue"))
    address1 = forms.StringField(
        __("Address (line 1)"),
        validators=[
            forms.validators.Optional(),
            forms.validators.Length(max=160)
        ],
        filters=[forms.filters.strip()],
    )
    address2 = forms.StringField(
        __("Address (line 2)"),
        validators=[
            forms.validators.Optional(),
            forms.validators.Length(max=160)
        ],
        filters=[forms.filters.strip()],
    )
    city = forms.StringField(
        __("City"),
        validators=[
            forms.validators.Optional(),
            forms.validators.Length(max=30)
        ],
        filters=[forms.filters.strip()],
    )
    state = forms.StringField(
        __("State"),
        validators=[
            forms.validators.Optional(),
            forms.validators.Length(max=30)
        ],
        filters=[forms.filters.strip()],
    )
    postcode = forms.StringField(
        __("Post code"),
        validators=[
            forms.validators.Optional(),
            forms.validators.Length(max=20)
        ],
        filters=[forms.filters.strip()],
    )
    country = forms.SelectField(
        __("Country"),
        validators=[
            forms.validators.Optional(),
            forms.validators.Length(max=2)
        ],
        choices=[],
        default='IN',
    )
    coordinates = forms.CoordinatesField(
        __("Location"),
        description=__("Pick a location on the map"),
        validators=[
            forms.validators.Optional(),
            forms.validators.ValidCoordinates()
        ],
    )

    def set_queries(self):
        pycountry_locale = gettext.translation(
            'iso3166-2',
            pycountry.LOCALES_DIR,
            languages=[str(get_locale()), 'en'])
        countries = [(pycountry_locale.gettext(country.name), country.alpha_2)
                     for country in pycountry.countries]
        countries.sort()
        self.country.choices = [(code, name) for (name, code) in countries]
Ejemplo n.º 18
0
class ParticipantBadgeForm(forms.Form):
    choices = [('', "Badge printing status"), ('t', "Printed"),
               ('f', "Not printed")]
    badge_printed = forms.SelectField("",
                                      choices=[(val_title[0], val_title[1])
                                               for val_title in choices])
Ejemplo n.º 19
0
class AccountForm(forms.Form):
    fullname = forms.StringField(
        __("Full name"),
        description=__(
            "This is your name. We will make an account for your organization later"
        ),
        validators=[
            forms.validators.DataRequired(),
            forms.validators.Length(max=User.__title_length__),
        ],
    )
    email = forms.EmailField(
        __("Email address"),
        description=__(
            "Required for sending you tickets, invoices and notifications"),
        validators=[
            forms.validators.DataRequired(),
            EmailAddressAvailable(purpose='use'),
        ],
        widget_attrs={
            'autocorrect': 'none',
            'autocapitalize': 'none'
        },
    )
    username = forms.AnnotatedTextField(
        __("Username"),
        description=__(
            "Single word that can contain letters, numbers and dashes. "
            "You need a username to have a public profile"),
        validators=[
            forms.validators.DataRequired(),
            forms.validators.Length(max=Profile.__name_length__),
        ],
        filters=[forms.filters.none_if_empty()],
        prefix="https://hasgeek.com/",
        widget_attrs={
            'autocorrect': 'none',
            'autocapitalize': 'none'
        },
    )
    timezone = forms.SelectField(
        __("Timezone"),
        description=__(
            "Where in the world are you? Dates and times will be shown in your local "
            "timezone"),
        validators=[forms.validators.DataRequired()],
        choices=timezones,
        widget_attrs={},
    )
    auto_timezone = forms.BooleanField(__("Use your device’s timezone"))
    locale = forms.SelectField(
        __("Locale"),
        description=__("Your preferred UI language"),
        choices=list(supported_locales.items()),
    )
    auto_locale = forms.BooleanField(__("Use your device’s language"))

    def validate_username(self, field):
        reason = self.edit_obj.validate_name_candidate(field.data)
        if not reason:
            return  # Username is available
        raise_username_error(reason)
Ejemplo n.º 20
0
class ProjectCrewMembershipInviteForm(forms.Form):
    action = forms.SelectField(
        __("Choice"),
        choices=[('accept', __("Accept")), ('decline', __("Decline"))],
        validators=[forms.validators.DataRequired(_(u"Please make a choice"))],
    )
Ejemplo n.º 21
0
class ItemCollectionForm(forms.Form):
    title = forms.StringField(__("Item Collection title"),
        validators=[forms.validators.DataRequired(__("Please specify a title")),
        forms.validators.Length(max=250)], filters=[forms.filters.strip()])
    description_html = forms.TinyMce4Field(__("Description"))
    tax_type = forms.SelectField(__("Tax type"), choices=[('GST', 'GST')], default='GST')