Пример #1
0
 class Form(forms.Form):
     other = forms.StringField("Other")
     field = forms.StringField("Field",
                               validators=[
                                   forms.validators.RequiredIf('other'),
                                   forms.validators.Optional()
                               ])
Пример #2
0
class ResourceForm(forms.Form):
    """
    Edit a resource provided by an application
    """
    name = forms.StringField(__("Resource name"), validators=[forms.validators.DataRequired()],
        description=__("Name of the resource as a single word in lower case. "
        "This is provided by applications as part of the scope "
        "when requesting access to a user's resources"),
        widget_attrs={'autocorrect': 'none', 'autocapitalize': 'none'})
    title = forms.StringField(__("Title"), validators=[forms.validators.DataRequired()],
        description=__("Resource title that is displayed to users"))
    description = forms.TextAreaField(__("Description"),
        description=__("An optional description of what the resource is"))
    siteresource = forms.BooleanField(__("Site resource"),
        description=__("Enable if this resource is generic to the site and not owned by specific users"))
    restricted = forms.BooleanField(__("Restrict access to your apps"),
        description=__("Enable if access to the resource should be restricted to client apps "
            "that share the same owner. You may want to do this for sensitive resources "
            "that should only be available to your own apps"))

    def validate_name(self, field):
        field.data = field.data.lower()
        if not valid_username(field.data):
            raise forms.ValidationError(_("Name contains invalid characters"))

        if field.data in resource_registry:
            raise forms.ValidationError(_("This name is reserved for internal use"))

        existing = Resource.get(name=field.data, client=self.client)
        if existing and existing.id != self.edit_id:
            raise forms.ValidationError(_("A resource with that name already exists"))
Пример #3
0
class GetSetForm(forms.Form):
    firstname = forms.StringField("First name")
    lastname = forms.StringField("Last name")
    company = forms.StringField("Company")  # Test for NOT having get_/set_company
    password = forms.PasswordField("Password")
    confirm_password = forms.PasswordField("Confirm password")

    def get_firstname(self, obj):
        return obj.fullname.split(' ', 1)[0]

    def get_lastname(self, obj):
        parts = obj.fullname.split(' ', 1)
        if len(parts) > 1:
            return parts[-1]
        return ''

    def get_password(self, obj):
        return ''

    def get_confirm_password(self, obj):
        return ''

    def set_firstname(self, obj):
        pass

    def set_lastname(self, obj):
        obj.fullname = self.firstname.data + " " + self.lastname.data

    def set_password(self, obj):
        obj.password = self.password.data

    def set_confirm_password(self, obj):
        pass
Пример #4
0
class PublicEmailDomainFormTest(forms.Form):
    webmail_domain = forms.StringField(
        __("Webmail Domain"),
        validators=[forms.validators.IsPublicEmailDomain()])
    not_webmail_domain = forms.StringField(
        __("Not Webmail Domain"),
        validators=[forms.validators.IsNotPublicEmailDomain()])
Пример #5
0
class ResourceActionForm(forms.Form):
    """
    Edit an action associated with a resource
    """
    name = forms.StringField(
        __("Action name"),
        validators=[forms.validators.DataRequired()],
        description=
        __("Name of the action as a single word in lower case. "
           "This is provided by applications as part of the scope in the form "
           "'resource/action' when requesting access to a user's resources. "
           "Read actions are implicit when applications request just 'resource' "
           "in the scope and do not need to be specified as an explicit action"
           ),
        widget_attrs={
            'autocorrect': 'none',
            'autocapitalize': 'none'
        })
    title = forms.StringField(
        __("Title"),
        validators=[forms.validators.DataRequired()],
        description=__("Action title that is displayed to users"))
    description = forms.TextAreaField(
        __("Description"),
        description=__("An optional description of what the action is"))

    def validate_name(self, field):
        field.data = field.data.lower()
        if not valid_username(field.data):
            raise forms.ValidationError(_("Name contains invalid characters"))

        existing = self.edit_resource.get_action(field.data)
        if existing and existing.id != self.edit_id:
            raise forms.ValidationError(
                _("An action with that name already exists for this resource"))
Пример #6
0
class AssigneeForm(forms.Form):
    email = forms.EmailField(
        __("Email"),
        validators=[
            forms.validators.DataRequired(),
            forms.validators.Length(max=254)
        ],
    )
    fullname = forms.StringField(__("Full Name"),
                                 validators=[forms.validators.DataRequired()])
    phone = forms.StringField(__("Phone number"),
                              validators=[forms.validators.DataRequired()])

    def validate_email(self, field):
        existing_assignees = (
            Assignee.query.join(LineItem).join(Item).join(Order).filter(
                LineItem.item_id == self.edit_parent.item_id).filter(
                    Order.status != ORDER_STATUS.CANCELLED).filter(
                        Assignee.current.is_(True)).filter(
                            Assignee.email == field.data))
        if self.edit_obj is not None:
            existing_assignees = existing_assignees.filter(
                Assignee.id != self.edit_obj.id)
        if existing_assignees.count() > 0:
            raise forms.ValidationError(
                __("Email address has been already used"))
Пример #7
0
class VenueRoomForm(forms.Form):
    title = forms.StringField(
        __("Name"),
        description=__("Name of the room"),
        validators=[
            forms.validators.DataRequired(),
            forms.validators.Length(max=250)
        ],
        filters=[forms.filters.strip()],
    )
    description = forms.MarkdownField(
        __("Description"), description=__("An optional note about the room"))
    bgcolor = forms.StringField(
        __("Room colour"),
        validators=[
            forms.validators.DataRequired(),
            forms.validators.Length(max=6)
        ],
        description=__(
            "RGB colour for the room. Enter without the '#'. E.g. CCCCCC."),
        default="CCCCCC",
    )

    def validate_bgcolor(self, field):
        if not valid_color_re.match(field.data):
            raise forms.ValidationError("Please enter a valid color code")
Пример #8
0
class LabelForm(forms.Form):
    name = forms.StringField(
        "", widget=forms.HiddenInput(), validators=[forms.validators.Optional()]
    )
    title = forms.StringField(
        __("Label"),
        validators=[
            forms.validators.DataRequired(__("This can’t be empty")),
            forms.validators.Length(max=250),
        ],
        filters=[forms.filters.strip()],
    )
    icon_emoji = forms.StringField(
        "", validators=[forms.validators.Optional(), forms.validators.IsEmoji()]
    )
    required = forms.BooleanField(
        __("Make this label mandatory in proposal forms"),
        default=False,
        description=__("If checked, proposers must select one of the options"),
    )
    restricted = forms.BooleanField(
        __("Restrict use of this label to editors"),
        default=False,
        description=__(
            "If checked, only editors and reviewers can apply this label on proposals"
        ),
    )
Пример #9
0
class InvoiceForm(forms.Form):
    buyer_taxid = forms.StringField(__("GSTIN"), validators=[forms.validators.Optional(),
        forms.validators.Length(max=255), validate_gstin], filters=[forms.filters.strip(), forms.filters.none_if_empty()])
    invoicee_name = forms.StringField(__("Full name"), validators=[forms.validators.DataRequired(__("Please enter the buyer's full name")),
        forms.validators.Length(max=255)], filters=[forms.filters.strip()])
    invoicee_company = forms.StringField(__("Company"), validators=[forms.validators.Optional(),
        forms.validators.Length(max=255)], filters=[forms.filters.strip()])
    invoicee_email = forms.EmailField(__("Email"), validators=[forms.validators.DataRequired(__("Please enter an email address")),
        forms.validators.Length(min=5, max=80),
        forms.validators.ValidEmail(__("Please enter a valid email"))],
        filters=[forms.filters.strip()])
    street_address_1 = forms.StringField(__("Street address 1"), validators=[forms.validators.DataRequired(__("Please enter the street address")),
        forms.validators.Length(max=255)], filters=[forms.filters.strip()])
    street_address_2 = forms.StringField(__("Street address 2"), validators=[forms.validators.Optional(),
        forms.validators.Length(max=255)], filters=[forms.filters.strip()])
    city = forms.StringField(__("City"), validators=[forms.validators.DataRequired(__("Please enter the city")),
        forms.validators.Length(max=255)], filters=[forms.filters.strip()])
    country_code = forms.StringField(__("Country"), validators=[forms.validators.DataRequired(__("Please select a country")),
        forms.validators.Length(max=2)], filters=[forms.filters.strip()])
    state_code = forms.StringField(__("State code"), validators=[forms.validators.Length(max=4),
        validate_state_code], filters=[forms.filters.strip()])
    state = forms.StringField(__("State"), validators=[forms.validators.Optional(),
        forms.validators.Length(max=255)], filters=[forms.filters.strip(), forms.filters.none_if_empty()])
    postcode = forms.StringField(__("Postcode"), validators=[forms.validators.DataRequired(__("Please enter a postcode")),
        forms.validators.Length(max=8)], filters=[forms.filters.strip()])
Пример #10
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")
Пример #11
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")
            )
Пример #12
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()])
Пример #13
0
class BuyerForm(forms.Form):
    email = forms.EmailField(__("Email"),
                             validators=[
                                 forms.validators.DataRequired(),
                                 forms.validators.Length(max=80)
                             ])
    fullname = forms.StringField(__("Full name"),
                                 validators=[forms.validators.DataRequired()])
    phone = forms.StringField(__("Phone number"),
                              validators=[forms.validators.Length(max=16)])
Пример #14
0
class PermissionForm(forms.Form):
    """
    Create or edit a permission
    """
    name = forms.StringField(__("Permission name"), validators=[forms.validators.DataRequired()],
        description=__("Name of the permission as a single word in lower case. "
        "This is passed to the application when a user logs in. "
        "Changing the name will not automatically update it everywhere. "
        "You must reassign the permission to users who had it with the old name"),
        widget_attrs={'autocorrect': 'none', 'autocapitalize': 'none'})
    title = forms.StringField(__("Title"), validators=[forms.validators.DataRequired()],
        description=__("Permission title that is displayed to users"))
    description = forms.TextAreaField(__("Description"),
        description=__("An optional description of what the permission is for"))
    context = forms.RadioField(__("Context"), validators=[forms.validators.DataRequired()],
        description=__("Context where this permission is available"))

    def validate(self):
        rv = super(PermissionForm, self).validate()
        if not rv:
            return False

        if not valid_username(self.name.data):
            self.name.errors.append(_("Name contains invalid characters"))
            return False

        existing = Permission.get(name=self.name.data, allusers=True)
        if existing and existing.id != self.edit_id:
            self.name.errors.append(_("A global permission with that name already exists"))
            return False

        if self.context.data == self.edit_user.userid:
            existing = Permission.get(name=self.name.data, user=self.edit_user)
        else:
            org = Organization.get(userid=self.context.data)
            if org:
                existing = Permission.get(name=self.name.data, org=org)
            else:
                existing = None
        if existing and existing.id != self.edit_id:
            self.name.errors.append(_("You have another permission with the same name"))
            return False

        return True

    def validate_context(self, field):
        if field.data == self.edit_user.userid:
            self.user = self.edit_user
            self.org = None
        else:
            orgs = [org for org in self.edit_user.organizations_owned() if org.userid == field.data]
            if len(orgs) != 1:
                raise forms.ValidationError(_("Invalid context"))
            self.user = None
            self.org = orgs[0]
Пример #15
0
class RegisterForm(forms.Form):
    fullname = forms.StringField(__("Full name"),
                                 validators=[forms.validators.DataRequired()])
    email = forms.EmailField(__("Email address"),
                             validators=[
                                 forms.validators.DataRequired(),
                                 forms.validators.ValidEmail()
                             ],
                             widget_attrs={
                                 'autocorrect': 'none',
                                 'autocapitalize': 'none'
                             })
    username = forms.StringField(
        __("Username"),
        validators=[forms.validators.DataRequired()],
        description=__(
            "Single word that can contain letters, numbers and dashes"),
        widget_attrs={
            'autocorrect': 'none',
            'autocapitalize': 'none'
        })
    password = forms.PasswordField(
        __("Password"), validators=[forms.validators.DataRequired()])
    confirm_password = forms.PasswordField(
        __("Confirm password"),
        validators=[
            forms.validators.DataRequired(),
            forms.validators.EqualTo('password')
        ])
    recaptcha = wtf.RecaptchaField(
        __("Are you human?"),
        description=__(
            "Type both words into the text box to prove that you are a human and not a computer program"
        ))

    def validate_username(self, field):
        if field.data in current_app.config['RESERVED_USERNAMES']:
            raise forms.ValidationError, _("This name is reserved")
        if not valid_username(field.data):
            raise forms.ValidationError(
                _(u"Invalid characters in name. Names must be made of ‘a-z’, ‘0-9’ and ‘-’, without trailing dashes"
                  ))
        existing = User.get(username=field.data)
        if existing is not None:
            raise forms.ValidationError(_("This username is taken"))

    def validate_email(self, field):
        field.data = field.data.lower()  # Convert to lowercase
        existing = UserEmail.get(email=field.data)
        if existing is not None:
            raise forms.ValidationError(
                Markup(
                    _(u"This email address is already registered. Do you want to <a href=\"{loginurl}\">login</a> instead?"
                      ).format(loginurl=escape(url_for('.login')))))
Пример #16
0
class FiltersetForm(forms.Form):
    title = forms.StringField(__("Title"),
                              description=__("A title shown to viewers"),
                              validators=[forms.validators.DataRequired()],
                              filters=[forms.filters.strip()])
    description = forms.TinyMce4Field(
        __("Description"),
        content_css=content_css,
        description=__("Description shown to viewers and search engines"),
        validators=[forms.validators.DataRequired()])
    types = QuerySelectMultipleField(__("Job types"),
                                     widget=ListWidget(),
                                     option_widget=CheckboxInput(),
                                     get_label='title',
                                     validators=[forms.validators.Optional()])
    categories = QuerySelectMultipleField(
        __("Job categories"),
        widget=ListWidget(),
        option_widget=CheckboxInput(),
        get_label='title',
        validators=[forms.validators.Optional()])
    geonameids = forms.GeonameSelectMultiField("Locations",
                                               filters=[format_geonameids])
    remote_location = forms.BooleanField(__("Match remote jobs"))
    pay_cash_currency = forms.RadioField(
        __("Currency"),
        choices=get_currency_choices(),
        default='',
        validators=[forms.validators.Optional()])
    pay_cash = forms.IntegerField(__("Pay"),
                                  description=__("Minimum pay"),
                                  validators=[forms.validators.Optional()])
    keywords = forms.StringField(__("Keywords"),
                                 validators=[forms.validators.Optional()],
                                 filters=[forms.filters.strip()])
    auto_domains = forms.AutocompleteMultipleField(
        __("Domains"),
        autocomplete_endpoint='/api/1/domain/autocomplete',
        results_key='domains')
    auto_tags = forms.AutocompleteMultipleField(
        __("Tags"),
        autocomplete_endpoint='/api/1/tag/autocomplete',
        results_key='tags')

    def set_queries(self):
        if not self.edit_parent:
            self.edit_parent = g.board
        self.types.query = JobType.query.join(board_jobtype_table).filter(
            board_jobtype_table.c.board_id == self.edit_parent.id).order_by(
                'title')
        self.categories.query = JobCategory.query.join(
            board_jobcategory_table).filter(
                board_jobcategory_table.c.board_id ==
                self.edit_parent.id).order_by('title')
Пример #17
0
    class Form(forms.Form):
        """Test form."""

        other = forms.StringField("Other")
        field = forms.StringField(
            "Field",
            validators=[
                forms.validators.OptionalIf('other'),
                forms.validators.DataRequired(),
            ],
        )
Пример #18
0
class DomainForm(forms.Form):
    title = forms.StringField(
        __("Common name"),
        validators=[
            forms.validators.DataRequired(),
            forms.validators.Length(
                min=1, max=250, message=__("%(max)d characters maximum")
            ),
        ],
        filters=[forms.filters.strip()],
        description=__(
            "The name of your organization, excluding legal suffixes like Pvt Ltd"
        ),
    )
    legal_title = forms.StringField(
        __("Legal name"),
        validators=[
            forms.validators.Optional(),
            forms.validators.Length(
                min=1, max=250, message=__("%%(max)d characters maximum")
            ),
        ],
        filters=[forms.filters.none_if_empty()],
        description=__("Optional — The full legal name of your organization"),
    )
    # logo_url = forms.URLField(
    #     __("Logo URL"),  # TODO: Use ImgeeField
    #     validators=[
    #         forms.validators.Optional(),
    #         forms.validators.Length(
    #             min=0, max=250, message=__("%%(max)d characters maximum")
    #         ),
    #     ],
    #     description=Markup(
    #         __(
    #             u"Optional — Your organization’s logo. "
    #             u"Upload at <a target='_blank' href='https://images.hasgeek.com/'>images.hasgeek.com</a> "
    #             u"and use the Direct Link URL"
    #         )
    #     ),
    # )
    description = forms.TinyMce4Field(
        __("Description"),
        description=__(
            "Who are you and why should someone work for you? Tell your story"
        ),
        content_css=content_css,
        validators=[
            forms.validators.AllUrlsValid(invalid_urls=invalid_urls),
            forms.validators.NoObfuscatedEmail(
                __("Do not include contact information here")
            ),
        ],
    )
Пример #19
0
class TicketClientForm(forms.Form):
    name = forms.StringField(__("Name"),
                             validators=[forms.validators.DataRequired()])
    clientid = forms.StringField(__("Client id"),
                                 validators=[forms.validators.DataRequired()])
    client_eventid = forms.StringField(
        __("Client event id"), validators=[forms.validators.DataRequired()])
    client_secret = forms.StringField(
        __("Client event secret"),
        validators=[forms.validators.DataRequired()])
    client_access_token = forms.StringField(
        __("Client access token"),
        validators=[forms.validators.DataRequired()])
Пример #20
0
class UserGroupForm(forms.Form):
    name = forms.StringField(__("URL name"),
                             validators=[
                                 forms.validators.DataRequired(),
                                 forms.validators.ValidName(),
                                 AvailableName()
                             ])
    title = forms.StringField(__("Title"),
                              validators=[forms.validators.DataRequired()])
    users = forms.TextAreaField(
        __("Users"),
        validators=[forms.validators.DataRequired()],
        description=__("Usernames or email addresses, one per line"))
Пример #21
0
class OrderSessionForm(forms.Form):
    utm_campaign = forms.StringField(__("UTM Campaign"), filters=[trim(250)])
    utm_source = forms.StringField(__("UTM Source"), filters=[trim(250)])
    utm_medium = forms.StringField(__("UTM Medium"), filters=[trim(250)])
    utm_term = forms.StringField(__("UTM Term"), filters=[trim(250)])
    utm_content = forms.StringField(__("UTM Content"), filters=[trim(250)])
    utm_id = forms.StringField(__("UTM Id"), filters=[trim(250)])
    gclid = forms.StringField(__("Gclid"), filters=[trim(250)])
    referrer = forms.StringField(__("Referrer"), filters=[trim(2083)])
    host = forms.StringField(__("Host"), filters=[trim(2083)])
Пример #22
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),
        ],
    )
Пример #23
0
class OrderRefundForm(forms.Form):
    amount = forms.IntegerField(
        __("Amount"),
        validators=[
            forms.validators.DataRequired(__("Please specify an amount"))
        ],
    )
    internal_note = forms.StringField(
        __("Internal note"),
        validators=[
            forms.validators.DataRequired(
                __("Please specify a note for future reference")),
            forms.validators.Length(max=250),
        ],
        description=__("Add a note for future reference"),
        filters=[forms.filters.none_if_empty()],
    )
    refund_description = forms.StringField(
        __("Refund description"),
        validators=[
            forms.validators.DataRequired(
                __("Please specify a description for the invoice")),
            forms.validators.Length(max=250),
        ],
        description=__("Description for the invoice"),
        filters=[forms.filters.none_if_empty()],
    )
    note_to_user = forms.MarkdownField(
        __("Note to user"),
        validators=[
            forms.validators.DataRequired(
                __("Please specify a note for the buyer"))
        ],
        description=__("Send this note to the buyer"),
        filters=[forms.filters.none_if_empty()],
    )

    def validate_amount(self, field):
        requested_refund_amount = field.data
        order = self.edit_parent
        if not order.paid_amount:
            raise StopValidation(
                __("Refunds can only be issued for paid orders"))
        if (order.refunded_amount +
                requested_refund_amount) > order.paid_amount:
            raise StopValidation(
                __("Invalid refund amount! Must be lesser than {amount}, the net amount paid for the order"
                   .format(amount=order.net_amount)))
Пример #24
0
class CampaignContentForm(forms.Form):
    subject = forms.StringField(
        __("Subject"),
        description=__("A subject title shown to viewers"),
        validators=[forms.validators.Optional()],
        filters=[forms.filters.strip(), forms.filters.none_if_empty()],
    )
    blurb = forms.TinyMce4Field(
        __("Blurb"),
        description=__(
            "Teaser to introduce the campaign and convince users to interact"
        ),
        content_css=content_css,
        validators=[forms.validators.Optional(), forms.validators.AllUrlsValid()],
    )
    description = forms.TinyMce4Field(
        __("Description"),
        description=__("Optional additional content to follow after the blurb"),
        content_css=content_css,
        validators=[forms.validators.Optional(), forms.validators.AllUrlsValid()],
    )
    banner_image = forms.URLField(
        __("Banner image URL"),
        validators=[forms.validators.Optional()],  # TODO: Use ImgeeField
        description=__("An image to illustrate your campaign"),
    )
    banner_location = forms.RadioField(
        __("Banner location"),
        choices=list(BANNER_LOCATION.items()),
        coerce=int,
        description=__("Where should this banner appear relative to text?"),
    )
Пример #25
0
class CategoryForm(forms.Form):
    title = forms.StringField(__("Category title"),
        validators=[forms.validators.DataRequired(__("Please specify a title")),
            forms.validators.Length(max=250)], filters=[forms.filters.strip()])
    seq = forms.IntegerField(__("Sequence"),
        description=__("The sequence of the category on the listing"),
        validators=[forms.validators.DataRequired(__("Please specify the sequence order")), available_seq])
Пример #26
0
class AuthClientPermissionEditForm(forms.Form):
    """
    Edit a user or team's permissions
    """

    perms = forms.StringField(__("Permissions"),
                              validators=[permission_validator])
Пример #27
0
class LoginForm(forms.Form):
    username = forms.StringField(
        __("Username or Email"),
        validators=[forms.validators.DataRequired()],
        widget_attrs={
            'autocorrect': 'none',
            'autocapitalize': 'none'
        },
    )
    password = forms.PasswordField(
        __("Password"), validators=[forms.validators.DataRequired()])

    def validate_username(self, field):
        existing = getuser(field.data)
        if existing is None:
            raise forms.ValidationError(_("User does not exist"))

    def validate_password(self, field):
        if not self.username.data:
            # Can't validate password without a user
            return
        user = getuser(self.username.data)
        if user and not user.pw_hash:
            raise LoginPasswordResetException()
        if user is None or not user.password_is(field.data):
            if not self.username.errors:
                raise forms.ValidationError(_("Incorrect password"))
        self.user = user
Пример #28
0
class CampaignForm(forms.Form):
    title = forms.StringField(
        __("Title"),
        description=__("A reference name for looking up this campaign again"),
        validators=[
            forms.validators.DataRequired(__("A title is required")),
            forms.validators.StripWhitespace()
        ])
    start_at = forms.DateTimeField(__("Start at"),
                                   timezone=lambda: g.user.timezone
                                   if g.user else None)
    end_at = forms.DateTimeField(__("End at"),
                                 timezone=lambda: g.user.timezone
                                 if g.user else None)
    public = forms.BooleanField(__("This campaign is live"))
    position = forms.RadioField(__("Display position"),
                                choices=CAMPAIGN_POSITION.items(),
                                coerce=int)
    priority = forms.IntegerField(
        __("Priority"),
        default=0,
        description=__(
            "A larger number is higher priority when multiple campaigns are running on the "
            "same dates. 0 implies lowest priority"))
    boards = QuerySelectMultipleField(
        __("Boards"),
        widget=ListWidget(),
        option_widget=CheckboxInput(),
        query_factory=lambda: Board.query.order_by('title'),
        get_label='title',
        validators=[forms.validators.Optional()],
        description=__(u"Select the boards this campaign is active on"))
    geonameids = forms.GeonameSelectMultiField(
        "Locations",
        description=__(
            "This campaign will be targetted at users and jobs with matching locations"
        ))
    user_required = forms.RadioField(__("User is required"),
                                     coerce=getbool,
                                     choices=[(None, __("N/A")),
                                              (True, __("Yes")),
                                              (False, __("No"))])
    flags = forms.RadioMatrixField(
        "Flags",
        coerce=getbool,
        fields=Campaign.flag_choices,
        description=__(
            "All selected flags must match the logged in user for the campaign to be shown"
        ),
        choices=[('None', __("N/A")), ('True', __("True")),
                 ('False', __("False"))])
    content = forms.FormField(CampaignContentForm, __("Campaign content"))

    def validate_geonameids(self, field):
        field.data = [int(x) for x in field.data if x.isdigit()]

    def validate_end_at(self, field):
        if field.data <= self.start_at.data:
            raise forms.ValidationError(
                __(u"The campaign can’t end before it starts"))
Пример #29
0
class DomainForm(forms.Form):
    title = forms.StringField(
        __(u"Common name"),
        validators=[
            forms.validators.DataRequired(),
            forms.validators.StripWhitespace()
        ],
        description=__(
            "The name of your organization, excluding legal suffixes like Pvt Ltd"
        ))
    legal_title = forms.NullTextField(
        __("Legal name"),
        validators=[forms.validators.Optional()],
        description=__(u"Optional — The full legal name of your organization"))
    logo_url = forms.URLField(
        __("Logo URL"),
        validators=[forms.validators.Optional()],  # TODO: Use ImgeeField
        description=__(u"Optional — Your organization’s logo"))
    description = forms.TinyMce4Field(
        __("Description"),
        description=__(
            "Who are you and why should someone work for you? Tell your story"
        ),
        content_css=content_css,
        validators=[
            forms.validators.AllUrlsValid(invalid_urls=invalid_urls),
            forms.validators.NoObfuscatedEmail(
                u"Do not include contact information here")
        ])
Пример #30
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"))