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")
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"))
class ProposalStatusForm(forms.Form): status = forms.SelectField(__("Status"), coerce=int, choices=[(status, title) for (status, title) in PROPOSALSTATUS.items() if status != PROPOSALSTATUS.DRAFT])
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, )
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"))
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())
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"))
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"))
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()])
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") )
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() ]
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())
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), ], )
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 ]
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() ])
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"))
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]
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])
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)
class ProjectCrewMembershipInviteForm(forms.Form): action = forms.SelectField( __("Choice"), choices=[('accept', __("Accept")), ('decline', __("Decline"))], validators=[forms.validators.DataRequired(_(u"Please make a choice"))], )
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')