Example #1
0
class Conditional(FlaskForm):
    function_id = StringField('Function ID', widget=widgets.HiddenInput())
    function_type = StringField('Function Type', widget=widgets.HiddenInput())
    name = StringField(TRANSLATIONS['name']['title'])
    conditional_statement = StringField(lazy_gettext('Conditional Statement'))
    conditional_status = StringField(lazy_gettext('Conditional Status'))
    period = DecimalField(
        lazy_gettext('Period (seconds)'),
        widget=NumberInput(step='any'))
    log_level_debug = BooleanField(
        TRANSLATIONS['log_level_debug']['title'])
    message_include_code = BooleanField(
        TRANSLATIONS['message_include_code']['title'])
    refractory_period = DecimalField(
        lazy_gettext('Refractory Period (seconds)'),
        widget=NumberInput(step='any'))
    start_offset = DecimalField(
        lazy_gettext('Start Offset (seconds)'),
        widget=NumberInput(step='any'))
    pyro_timeout = DecimalField(
        lazy_gettext('Timeout (seconds)'),
        widget=NumberInput(step='any'))
    condition_type = SelectField(
        choices=[('', TRANSLATIONS['select_one']['title'])] + CONDITIONAL_CONDITIONS)
    add_condition = SubmitField(lazy_gettext('Add'))
Example #2
0
class MethodMod(FlaskForm):
    method_id = StringField('Method ID', widget=widgets.HiddenInput())
    method_data_id = StringField('Method Data ID',
                                 widget=widgets.HiddenInput())
    method_type = HiddenField('Method Type')
    name = StringField(TRANSLATIONS['name']['title'])
    daily_time_start = StringField(lazy_gettext('Start HH:MM:SS'),
                                   render_kw={"placeholder": "HH:MM:SS"})
    daily_time_end = StringField(lazy_gettext('End HH:MM:SS'),
                                 render_kw={"placeholder": "HH:MM:SS"})
    time_start = StringField(lazy_gettext('Start YYYY-MM-DD HH:MM:SS'),
                             render_kw={"placeholder": "YYYY-MM-DD HH:MM:SS"})
    time_end = StringField(lazy_gettext('End YYYY-MM-DD HH:MM:SS'),
                           render_kw={"placeholder": "YYYY-MM-DD HH:MM:SS"})
    output_daily_time = StringField(lazy_gettext('Time HH:MM:SS'),
                                    render_kw={"placeholder": "HH:MM:SS"})
    output_time = StringField(lazy_gettext('Time YYYY-MM-DD HH:MM:SS'),
                              render_kw={"placeholder": "YYYY-MM-DD HH:MM:SS"})
    duration = DecimalField(lazy_gettext('Duration (seconds)'),
                            widget=NumberInput(step='any'))
    duration_end = DecimalField(lazy_gettext('Duration to End (seconds)'),
                                widget=NumberInput(step='any'))
    setpoint_start = DecimalField(lazy_gettext('Start Setpoint'),
                                  widget=NumberInput(step='any'))
    setpoint_end = DecimalField(lazy_gettext('End Setpoint'),
                                widget=NumberInput(step='any'))
    rename = SubmitField(TRANSLATIONS['rename']['title'])
    save = SubmitField(TRANSLATIONS['save']['title'])
    delete = SubmitField(TRANSLATIONS['delete']['title'])
Example #3
0
class PIDModVolumeLower(FlaskForm):
    lower_min_amount = DecimalField(
        lazy_gettext('Min On Amount (Lower)'),
        validators=[validators.NumberRange(min=0, max=86400)],
        widget=NumberInput(step='any'))
    lower_max_amount = DecimalField(
        lazy_gettext('Max On Amount (Lower)'),
        validators=[validators.NumberRange(min=0, max=86400)],
        widget=NumberInput(step='any'))
Example #4
0
	def __build_settings(self, config, props):
		class MyForm(FlaskForm): pass
		
		for n in props:
			prop = config.get_property(n)
			render = {}
			render[self.__HTML_CLASS] = (str(prop.get_dependency()) if prop.get_dependency() else '') + self.__HTML_FORM
			render[self.__HTML_FILL] = self.__HTML_FLEX_FILL
			if prop.get_dependency():
				render[self.__HTML_PAD] = self.__HTML_PX3		
				render[self.__HTML_CLASSDEP] = prop.get_dependency()
				render[self.__HTML_CLASSDEPVAL] = prop.get_dependency_value() if prop.get_dependency_value() else '1'
				if (not prop.get_dependency_value() and not bool(config.getint(prop.get_dependency()))) or (prop.get_dependency_value() and not config.get(prop.get_dependency()) == prop.get_dependency_value()):
					render[self.__HTML_DISABLED] = self.__HTML_DISABLED

			if prop.get_type() == configprop.STRING_TYPE or prop.get_type() == configprop.INTEGER_TYPE or prop.get_type() == configprop.FLOAT_TYPE:
				if prop.get_possible():
					render[self.__HTML_CLASS] = (str(prop.get_dependency()) if prop.get_dependency() else '') + self.__HTML_SELECT
					render[self.__HTML_FILL] = str()
					setattr(MyForm, n, SelectField(self.__adapt_name(config, n), default=config.get_default(n), choices=prop.get_possible(), render_kw=render, description=config.get_comment(n)))
				elif prop.get_type() == configprop.STRING_TYPE:
					setattr(MyForm, n, StringField(self.__adapt_name(config, n), default=config.get_default(n), description=config.get_comment(n), render_kw=render))
				elif prop.get_type() == configprop.INTEGER_TYPE:
					render[self.__HTML_FILL] = str()					
					setattr(MyForm, n, IntegerField(self.__adapt_name(config, n), widget=NumberInput(min = prop.get_min(), max = prop.get_max()), default=config.get_default(n), render_kw=render, description=config.get_comment(n)))
				else:
					render[self.__HTML_FILL] = str()					
					setattr(MyForm, n, FloatField(self.__adapt_name(config, n), widget=NumberInput(min = prop.get_min(), max = prop.get_max(), step = "any"), default=config.get_default(n), render_kw=render, description=config.get_comment(n)))
			elif prop.get_type() == configprop.FILE_TYPE:
				setattr(MyForm, n, StringField(self.__adapt_name(config, n), default=config.get_default(n), render_kw=render, description=config.get_comment(n)))
			elif prop.get_type() == configprop.BOOLEAN_TYPE:
				render[self.__HTML_CLASS]  = (str(prop.get_dependency()) if prop.get_dependency() else '') + self.__HTML_CHECKBOX
				setattr(MyForm, n, BooleanField(self.__adapt_name(config, n), default=config.get_default(n), false_values=self.__FALSE_VALS, description=config.get_comment(n), render_kw=render))
			elif prop.get_type() == configprop.STRINGLIST_TYPE:
				setattr(MyForm, n, StringField(self.__adapt_name(config, n), default=config.get_default(n), render_kw=render, description=config.get_comment(n)))
			elif prop.get_type() == configprop.INTLIST_TYPE:
				setattr(MyForm, n, StringField(self.__adapt_name(config, n), default=config.get_default(n), render_kw=render, description=config.get_comment(n)))
			elif prop.get_type() == configprop.PASSWORD_TYPE:
				setattr(MyForm, n, StringField(self.__adapt_name(config, n), widget=PasswordInput(hide_value=False), default=config.get_default(n), description=config.get_comment(n), render_kw=render))

		form = MyForm(data = [(name, config.get(name)) for name in props if config.get_property(name).get_type() != configprop.BOOLEAN_TYPE])
		for i in [prop for prop in props if config.get_property(prop).get_type() == configprop.BOOLEAN_TYPE]:
			getattr(form, i).data = config.getint(i)
		
		for i in props:
			try:
				config.validate(i)
				getattr(form, i).errors = ()
			except Warning:
				getattr(form, i).errors = ()
				pass
			except Exception as e:
				getattr(form, i).errors = (e)
				getattr(form, i).render_kw[self.__HTML_CLASS] += self.__HTML_IS_INVALID
				getattr(form, i).render_kw[self.__HTML_INVALID] = self.__HTML_IS_INVALID
		return form
Example #5
0
class PIDModPWMLower(FlaskForm):
    lower_min_duty_cycle = DecimalField(
        lazy_gettext('Min Duty Cycle (Lower)'),
        validators=[validators.NumberRange(min=0, max=100)],
        widget=NumberInput(step='any'))
    lower_max_duty_cycle = DecimalField(
        lazy_gettext('Max Duty Cycle (Lower)'),
        validators=[validators.NumberRange(min=0, max=100)],
        widget=NumberInput(step='any'))
    lower_always_min_pwm = BooleanField(
        TRANSLATIONS['lower_always_min_pwm']['title'])
Example #6
0
class PIDModRelayLower(FlaskForm):
    lower_min_duration = DecimalField(
        lazy_gettext('Min On Duration (Lower)'),
        validators=[validators.NumberRange(min=0, max=86400)],
        widget=NumberInput(step='any'))
    lower_max_duration = DecimalField(
        lazy_gettext('Max On Duration (Lower)'),
        validators=[validators.NumberRange(min=0, max=86400)],
        widget=NumberInput(step='any'))
    lower_min_off_duration = DecimalField(
        lazy_gettext('Min Off Duration (Lower)'),
        validators=[validators.NumberRange(min=0, max=86400)],
        widget=NumberInput(step='any'))
Example #7
0
class DashboardBase(FlaskForm):
    choices_widgets = []
    dict_widgets = parse_widget_information()
    list_widgets_sorted = generate_form_widget_list(dict_widgets)
    choices_widgets.append(('', lazy_gettext('Add Dashboard Widget')))

    for each_widget in list_widgets_sorted:
        choices_widgets.append(
            (each_widget, dict_widgets[each_widget]['widget_name']))

    widget_type = SelectField('Dashboard Widget Type',
                              choices=choices_widgets,
                              validators=[DataRequired()])

    dashboard_id = StringField('Dashboard ID', widget=widgets.HiddenInput())
    widget_id = StringField('Widget ID', widget=widgets.HiddenInput())

    name = StringField(TRANSLATIONS['name']['title'],
                       validators=[DataRequired()])
    font_em_name = DecimalField(TRANSLATIONS['font_em_name']['title'])
    refresh_duration = IntegerField(
        TRANSLATIONS['refresh_duration']['title'],
        validators=[
            validators.NumberRange(
                min=1, message=TRANSLATIONS['refresh_duration']['title'])
        ],
        widget=NumberInput())
    enable_drag_handle = BooleanField(lazy_gettext('Enable Drag Handle'))
    widget_add = SubmitField(TRANSLATIONS['create']['title'])
    widget_mod = SubmitField(TRANSLATIONS['save']['title'])
    widget_delete = SubmitField(TRANSLATIONS['delete']['title'])
Example #8
0
class UserMod(FlaskForm):
    user_id = StringField('User ID', widget=widgets.HiddenInput())
    email = EmailField(
        TRANSLATIONS['email']['title'],
        render_kw={"placeholder": TRANSLATIONS['email']['title']},
        validators=[DataRequired(), validators.Email()])
    password_new = PasswordField(
        TRANSLATIONS['password']['title'],
        render_kw={"placeholder": lazy_gettext("New Password")},
        validators=[
            validators.Optional(),
            validators.EqualTo('password_repeat',
                               message=lazy_gettext('Passwords must match')),
            validators.Length(
                min=6,
                message=lazy_gettext('Password must be 6 or more characters'))
        ])
    password_repeat = PasswordField(
        lazy_gettext('Repeat Password'),
        render_kw={"placeholder": lazy_gettext("Repeat Password")})
    code = PasswordField(
        lazy_gettext('Keypad Code'),
        render_kw={"placeholder": lazy_gettext("Keypad Code")})
    api_key = StringField('API Key',
                          render_kw={"placeholder": "API Key (Base64)"})
    role_id = IntegerField(lazy_gettext('Role ID'),
                           validators=[DataRequired()],
                           widget=NumberInput())
    theme = StringField(lazy_gettext('Theme'))
    user_generate_api_key = SubmitField("Generate API Key")
    user_save = SubmitField(TRANSLATIONS['save']['title'])
    user_delete = SubmitField(TRANSLATIONS['delete']['title'])
Example #9
0
class CustomController(FlaskForm):
    function_id = StringField('Function ID', widget=widgets.HiddenInput())
    function_type = StringField('Function Type', widget=widgets.HiddenInput())
    name = StringField(TRANSLATIONS['name']['title'])
    num_channels = IntegerField(lazy_gettext('Number of Measurements'),
                                widget=NumberInput())
    measurements_enabled = SelectMultipleField(
        TRANSLATIONS['measurements_enabled']['title'])
    log_level_debug = BooleanField(TRANSLATIONS['log_level_debug']['title'])
Example #10
0
class Trigger(FlaskForm):
    function_id = StringField('Function ID', widget=widgets.HiddenInput())
    function_type = StringField('Function Type', widget=widgets.HiddenInput())
    name = StringField(TRANSLATIONS['name']['title'])
    log_level_debug = BooleanField(TRANSLATIONS['log_level_debug']['title'])

    # Edge detection
    measurement = StringField(TRANSLATIONS['measurement']['title'])
    edge_detected = StringField(lazy_gettext('If Edge Detected'))

    # Sunrise/sunset
    rise_or_set = StringField(lazy_gettext('Rise or Set'))
    latitude = DecimalField(lazy_gettext('Latitude (decimal)'),
                            widget=NumberInput(step='any'))
    longitude = DecimalField(lazy_gettext('Longitude (decimal)'),
                             widget=NumberInput(step='any'))
    zenith = DecimalField(lazy_gettext('Zenith'),
                          widget=NumberInput(step='any'))
    date_offset_days = IntegerField(lazy_gettext('Date Offset (days)'),
                                    widget=NumberInput())
    time_offset_minutes = IntegerField(lazy_gettext('Time Offset (minutes)'),
                                       widget=NumberInput())

    # Receive infrared from remote
    program = StringField(lazy_gettext('Program'))
    word = StringField(lazy_gettext('Word'))

    # Timer
    period = DecimalField(lazy_gettext('Period (seconds)'),
                          widget=NumberInput(step='any'))
    timer_start_offset = IntegerField(lazy_gettext('Start Offset (seconds)'),
                                      widget=NumberInput())
    timer_start_time = StringField(lazy_gettext('Start Time (HH:MM)'))
    timer_end_time = StringField(lazy_gettext('End Time (HH:MM)'))

    # Method
    trigger_actions_at_period = BooleanField(
        lazy_gettext('Trigger Every Period'))
    trigger_actions_at_start = BooleanField(
        lazy_gettext('Trigger when Activated'))

    # Output
    unique_id_1 = StringField(lazy_gettext('If ID 1'))
    unique_id_2 = StringField(lazy_gettext('If ID 2'))
    output_state = StringField(lazy_gettext('If State'))
    output_duration = DecimalField(lazy_gettext('If Duration (seconds)'),
                                   widget=NumberInput(step='any'))
    output_duty_cycle = DecimalField(lazy_gettext('If Duty Cycle (%%)'),
                                     widget=NumberInput(step='any'))
Example #11
0
class ConditionalConditions(FlaskForm):
    conditional_id = StringField(
        'Conditional ID',widget=widgets.HiddenInput())
    conditional_condition_id = StringField(
        'Conditional Condition ID', widget=widgets.HiddenInput())

    # Measurement
    input_id = StringField('Input ID', widget=widgets.HiddenInput())
    measurement = StringField(TRANSLATIONS['measurement']['title'])
    max_age = IntegerField(
        TRANSLATIONS['max_age']['title'],
        widget=NumberInput())

    # GPIO State
    gpio_pin = IntegerField(
        lazy_gettext('GPIO Pin (BCM)'), widget=NumberInput())

    output_id = StringField(TRANSLATIONS['output']['title'])
    controller_id = StringField(TRANSLATIONS['controller']['title'])

    save_condition = SubmitField(TRANSLATIONS['save']['title'])
    delete_condition = SubmitField(TRANSLATIONS['delete']['title'])
Example #12
0
class LogView(FlaskForm):
    lines = IntegerField(
        'Number of Lines',
        render_kw={'placeholder': lazy_gettext('Lines')},
        validators=[
            validators.NumberRange(
                min=1,
                message=lazy_gettext(
                    'Number of lines should be greater than 0'))
        ],
        widget=NumberInput())

    log = StringField(lazy_gettext('Log'))
    log_view = SubmitField(lazy_gettext('View Log'))
Example #13
0
class SettingsGeneral(FlaskForm):
    landing_page = StringField(lazy_gettext('Landing Page'))
    index_page = StringField(lazy_gettext('Index Page'))
    language = StringField(lazy_gettext('Language'))
    rpyc_timeout = StringField(lazy_gettext('Pyro Timeout'))
    daemon_debug_mode = BooleanField(
        lazy_gettext('Enable Daemon Debug Logging'))
    force_https = BooleanField(lazy_gettext('Force HTTPS'))
    hide_success = BooleanField(lazy_gettext('Hide success messages'))
    hide_info = BooleanField(lazy_gettext('Hide info messages'))
    hide_warning = BooleanField(lazy_gettext('Hide warning messages'))
    hide_tooltips = BooleanField(lazy_gettext('Hide Form Tooltips'))
    grid_cell_height = IntegerField(lazy_gettext('Grid Cell Height (px)'),
                                    widget=NumberInput())
    max_amps = DecimalField(lazy_gettext('Max Amps'),
                            widget=NumberInput(step='any'))
    output_stats_volts = IntegerField(lazy_gettext('Voltage'),
                                      widget=NumberInput())
    output_stats_cost = DecimalField(lazy_gettext('Cost per kWh'),
                                     widget=NumberInput(step='any'))
    output_stats_currency = StringField(lazy_gettext('Currency Unit'))
    output_stats_day_month = StringField(lazy_gettext('Day of Month'))
    output_usage_report_gen = BooleanField(
        lazy_gettext('Generate Usage/Cost Report'))
    output_usage_report_span = StringField(
        lazy_gettext('Time Span to Generate'))
    output_usage_report_day = IntegerField(
        lazy_gettext('Day of Week/Month to Generate'), widget=NumberInput())
    output_usage_report_hour = IntegerField(
        lazy_gettext('Hour of Day to Generate'),
        validators=[
            validators.NumberRange(min=0,
                                   max=23,
                                   message=lazy_gettext("Hour Options: 0-23"))
        ],
        widget=NumberInput())
    stats_opt_out = BooleanField(lazy_gettext('Opt-out of statistics'))
    enable_upgrade_check = BooleanField(lazy_gettext('Check for Updates'))
    net_test_ip = StringField(lazy_gettext('Internet Test IP Address'))
    net_test_port = IntegerField(lazy_gettext('Internet Test Port'),
                                 widget=NumberInput())
    net_test_timeout = IntegerField(lazy_gettext('Internet Test Timeout'),
                                    widget=NumberInput())
    settings_general_save = SubmitField(TRANSLATIONS['save']['title'])
Example #14
0
class TimetablePDFExportForm(IndicoForm):
    _pdf_options_fields = {'pagesize', 'firstPageNumber'}

    advanced = BooleanField(_('Advanced timetable'),
                            widget=SwitchWidget(),
                            description=_('Advanced customization options'))
    document_settings = IndicoSelectMultipleCheckboxBooleanField(
        _('Document settings'), [HiddenUnless('advanced')],
        choices=_DOCUMENT_SETTINGS_CHOICES)
    contribution_info = IndicoSelectMultipleCheckboxBooleanField(
        _('Contributions related info'), [HiddenUnless('advanced')],
        choices=_CONTRIBUTION_CHOICES)
    session_info = IndicoSelectMultipleCheckboxBooleanField(
        _('Sessions related info'), [HiddenUnless('advanced')],
        choices=_SESSION_CHOICES)
    visible_entries = IndicoSelectMultipleCheckboxBooleanField(
        _('Breaks and contributions'), [HiddenUnless('advanced')],
        choices=_VISIBLE_ENTRIES_CHOICES)
    other = IndicoSelectMultipleCheckboxBooleanField(_('Miscellaneous'),
                                                     choices=_OTHER_CHOICES)
    pagesize = SelectField(_('Page size'),
                           choices=[('A0', 'A0'), ('A1', 'A1'), ('A2', 'A2'),
                                    ('A3', 'A3'), ('A4', 'A4'), ('A5', 'A5'),
                                    ('Letter', 'Letter')],
                           default='A4')
    firstPageNumber = IntegerField(_('Number for the first page'),
                                   [NumberRange(min=1)],
                                   default=1,
                                   widget=NumberInput(step=1))
    submitted = HiddenField()

    def is_submitted(self):
        return 'submitted' in request.args

    @property
    def data_for_format(self):
        if not self.advanced.data:
            fields = ('visible_entries', )
        else:
            fields = set(
                get_form_field_names(TimetablePDFExportForm)
            ) - self._pdf_options_fields - {'csrf_token', 'advanced'}
        data = {}
        for fieldname in fields:
            data.update(getattr(self, fieldname).data)
        return data
Example #15
0
class StatisticsForm(FlaskForm):
    select_game_range_filter = SelectField('', choices=[('lastgames', lazy_gettext('Last ... games')),
                                                        ('daterange', lazy_gettext('From ... to ...'))])
    number_of_games = IntegerField(widget=NumberInput(), default=50, validators=[DataRequired()])
    date_from = DateField(lazy_gettext('From'), widget=DateInput(),
                          default=datetime(1901, 1, 1), validators=[DataRequired()])
    date_to = DateField(lazy_gettext('to'), widget=DateInput(),
                        default=datetime(2099, 12, 31), validators=[DataRequired()])
    submit = SubmitField(lazy_gettext('Filter'))
    apply_filter = SubmitField(lazy_gettext('Apply'))
    hiddenfield_selected_tab = HiddenField(id='hiddenFieldSelectedTab')
    game_types = SelectField(lazy_gettext('Game type'), choices=game_types, validators=[DataRequired()], default="501")
    opponents = SelectField(lazy_gettext('Opponent'), id='selectOpponent', default='all', choices=opponents,
                            validators=[DataRequired()])
    computer_level = SelectField(lazy_gettext('Level'), default='all', choices=computer_level,
                                 validators=[DataRequired()])
    opponent_name = StringField(lazy_gettext('Opponent name'))
    in_mode = SelectField(lazy_gettext('Mode In'), choices=in_choice, validators=[DataRequired()], default="si")
    out_mode = SelectField(lazy_gettext('Mode Out'), choices=out_choice, validators=[DataRequired()], default="do")
Example #16
0
class SettingsEmail(FlaskForm):
    smtp_host = StringField(
        lazy_gettext('SMTP Host'),
        render_kw={"placeholder": lazy_gettext('SMTP Host')},
        validators=[DataRequired()])
    smtp_port = IntegerField(lazy_gettext('SMTP Port'),
                             validators=[Optional()])
    smtp_protocol = StringField(lazy_gettext('SMTP Protocol'),
                                validators=[DataRequired()])
    smtp_ssl = BooleanField('Enable SSL')
    smtp_user = StringField(
        lazy_gettext('SMTP User'),
        render_kw={"placeholder": lazy_gettext('SMTP User')},
        validators=[DataRequired()])
    smtp_password = PasswordField(
        lazy_gettext('SMTP Password'),
        render_kw={"placeholder": TRANSLATIONS['password']['title']})
    smtp_from_email = EmailField(
        lazy_gettext('From Email'),
        render_kw={"placeholder": TRANSLATIONS['email']['title']},
        validators=[DataRequired(), validators.Email()])
    smtp_hourly_max = IntegerField(
        lazy_gettext('Max emails (per hour)'),
        render_kw={"placeholder": lazy_gettext('Max emails (per hour)')},
        validators=[
            validators.NumberRange(
                min=1,
                message=lazy_gettext(
                    'Must have at least one message able to be '
                    'sent per hour.'))
        ],
        widget=NumberInput())
    send_test = SubmitField(lazy_gettext('Send Test Email'))
    send_test_to_email = EmailField(
        lazy_gettext('Test Email To'),
        render_kw={"placeholder": lazy_gettext('To Email Address')},
        validators=[validators.Email(),
                    validators.Optional()])
    save = SubmitField(TRANSLATIONS['save']['title'])
Example #17
0
    def add_custom_fields(self, user_info_fields):
        """Add custom user_info fields.

        :param list(obj) user_info_fields: Custom user info fields
        """

        # NOTE: use a new UserInfoForm class for every UserForm instance,
        #       so custom fields are only set for the current tenant
        #       and not globally
        class UserInfoForm(FlaskForm):
            """Subform for custom user info fields"""
            pass

        # override form_class in user_info FormField
        self.user_info.args = (UserInfoForm, "User info")

        # add custom fields
        for field in user_info_fields:
            field_class = StringField
            widget = None
            if field.get('type') == 'string':
                field_class = StringField
            if field.get('type') == 'textarea':
                field_class = TextAreaField
            elif field.get('type') == 'integer':
                field_class = IntegerField
                widget = NumberInput()

            validators = [Optional()]
            if field.get('required', False):
                validators = [DataRequired()]

            form_field = field_class(field['title'],
                                     widget=widget,
                                     validators=validators)
            # add custom field to UserInfoForm
            setattr(UserInfoForm, field['name'], form_field)
Example #18
0
class SettingsPi(FlaskForm):
    pigpiod_state = StringField('pigpiod state', widget=widgets.HiddenInput())
    enable_i2c = SubmitField(lazy_gettext('Enable I2C'))
    disable_i2c = SubmitField(lazy_gettext('Disable I2C'))
    enable_one_wire = SubmitField(lazy_gettext('Enable 1-Wire'))
    disable_one_wire = SubmitField(lazy_gettext('Disable 1-Wire'))
    enable_serial = SubmitField(lazy_gettext('Enable Serial'))
    disable_serial = SubmitField(lazy_gettext('Disable Serial'))
    enable_spi = SubmitField(lazy_gettext('Enable SPI'))
    disable_spi = SubmitField(lazy_gettext('Disable SPI'))
    enable_ssh = SubmitField(lazy_gettext('Enable SSH'))
    disable_ssh = SubmitField(lazy_gettext('Disable SSH'))
    enable_pi_camera = SubmitField(lazy_gettext('Enable Pi Camera'))
    disable_pi_camera = SubmitField(lazy_gettext('Disable Pi Camera'))
    hostname = StringField(lazy_gettext('Hostname'))
    change_hostname = SubmitField(lazy_gettext('Change Hostname'))
    pigpiod_sample_rate = StringField(lazy_gettext('Configure pigpiod'))
    change_pigpiod_sample_rate = SubmitField(lazy_gettext('Reconfigure'))

    sample_rate_controller_conditional = DecimalField(
        lazy_gettext('Conditional Sample Rate (seconds)'),
        widget=NumberInput(step='any'))
    sample_rate_controller_function = DecimalField(
        lazy_gettext('Function Sample Rate (seconds)'),
        widget=NumberInput(step='any'))
    sample_rate_controller_input = DecimalField(
        lazy_gettext('Input Sample Rate (seconds)'),
        widget=NumberInput(step='any'))
    sample_rate_controller_output = DecimalField(
        lazy_gettext('Output Sample Rate (seconds)'),
        widget=NumberInput(step='any'))
    sample_rate_controller_pid = DecimalField(
        lazy_gettext('PID Sample Rate (seconds)'),
        widget=NumberInput(step='any'))
    sample_rate_controller_widget = DecimalField(
        lazy_gettext('Widget Sample Rate (seconds)'),
        widget=NumberInput(step='any'))
    save_sample_rates = SubmitField(lazy_gettext('Save Sample Rates'))
Example #19
0
class InputMod(FlaskForm):
    input_id = StringField('Input ID', widget=widgets.HiddenInput())
    input_measurement_id = StringField(widget=widgets.HiddenInput())
    name = StringField(TRANSLATIONS['name']['title'],
                       validators=[DataRequired()])
    period = DecimalField(
        TRANSLATIONS['period']['title'],
        validators=[DataRequired(),
                    validators.NumberRange(min=5, max=86400)],
        widget=NumberInput(step='any'))
    start_offset = DecimalField(
        TRANSLATIONS['start_offset']['title'],
        validators=[DataRequired(),
                    validators.NumberRange(min=0, max=86400)],
        widget=NumberInput(step='any'))
    log_level_debug = BooleanField(TRANSLATIONS['log_level_debug']['title'])
    num_channels = IntegerField(lazy_gettext('Number of Measurements'),
                                widget=NumberInput())
    location = StringField(lazy_gettext('Location'))
    ftdi_location = StringField(TRANSLATIONS['ftdi_location']['title'])
    uart_location = StringField(TRANSLATIONS['uart_location']['title'])
    gpio_location = IntegerField(TRANSLATIONS['gpio_location']['title'])
    i2c_location = StringField(TRANSLATIONS['i2c_location']['title'])
    i2c_bus = IntegerField(TRANSLATIONS['i2c_bus']['title'],
                           widget=NumberInput())
    baud_rate = IntegerField(TRANSLATIONS['baud_rate']['title'],
                             widget=NumberInput())
    power_output_id = StringField(
        lazy_gettext('Power Output'))  # For powering input
    calibrate_sensor_measure = StringField(
        lazy_gettext('Calibration Measurement'))
    resolution = IntegerField(TRANSLATIONS['resolution']['title'],
                              widget=NumberInput())
    resolution_2 = IntegerField(TRANSLATIONS['resolution']['title'],
                                widget=NumberInput())
    sensitivity = IntegerField(TRANSLATIONS['sensitivity']['title'],
                               widget=NumberInput())
    measurements_enabled = SelectMultipleField(
        TRANSLATIONS['measurements_enabled']['title'])

    # Server options
    host = StringField(TRANSLATIONS['host']['title'])
    port = IntegerField(TRANSLATIONS['port']['title'], widget=NumberInput())
    times_check = IntegerField(TRANSLATIONS['times_check']['title'],
                               widget=NumberInput())
    deadline = IntegerField(TRANSLATIONS['deadline']['title'],
                            widget=NumberInput())

    # Linux Command
    cmd_command = StringField(TRANSLATIONS['cmd_command']['title'])

    # MAX chip options
    thermocouple_type = StringField(TRANSLATIONS['thermocouple_type']['title'])
    ref_ohm = IntegerField(TRANSLATIONS['ref_ohm']['title'],
                           widget=NumberInput())

    # SPI Communication
    pin_clock = IntegerField(TRANSLATIONS['pin_clock']['title'],
                             widget=NumberInput())
    pin_cs = IntegerField(TRANSLATIONS['pin_cs']['title'],
                          widget=NumberInput())
    pin_mosi = IntegerField(TRANSLATIONS['pin_mosi']['title'],
                            widget=NumberInput())
    pin_miso = IntegerField(TRANSLATIONS['pin_miso']['title'],
                            widget=NumberInput())

    # Bluetooth Communication
    bt_adapter = StringField(TRANSLATIONS['bt_adapter']['title'])

    # ADC
    adc_gain = IntegerField(TRANSLATIONS['adc_gain']['title'],
                            widget=NumberInput())
    adc_resolution = IntegerField(TRANSLATIONS['adc_resolution']['title'],
                                  widget=NumberInput())
    adc_sample_speed = StringField(TRANSLATIONS['adc_sample_speed']['title'])

    switch_edge = StringField(lazy_gettext('Edge'))
    switch_bouncetime = IntegerField(lazy_gettext('Bounce Time (ms)'),
                                     widget=NumberInput())
    switch_reset_period = IntegerField(lazy_gettext('Reset Period'),
                                       widget=NumberInput())

    # Pre-Output
    pre_output_id = StringField(TRANSLATIONS['pre_output_id']['title'])
    pre_output_duration = DecimalField(
        TRANSLATIONS['pre_output_duration']['title'],
        validators=[validators.NumberRange(min=0, max=86400)],
        widget=NumberInput(step='any'))
    pre_output_during_measure = BooleanField(
        TRANSLATIONS['pre_output_during_measure']['title'])

    # RPM/Signal
    weighting = DecimalField(TRANSLATIONS['weighting']['title'],
                             widget=NumberInput(step='any'))
    rpm_pulses_per_rev = DecimalField(
        TRANSLATIONS['rpm_pulses_per_rev']['title'],
        widget=NumberInput(step='any'))
    sample_time = DecimalField(TRANSLATIONS['sample_time']['title'],
                               widget=NumberInput(step='any'))

    # SHT options
    sht_voltage = StringField(TRANSLATIONS['sht_voltage']['title'])

    input_duplicate = SubmitField(TRANSLATIONS['duplicate']['title'])
    input_mod = SubmitField(TRANSLATIONS['save']['title'])
    input_delete = SubmitField(TRANSLATIONS['delete']['title'])
    input_acquire_measurements = SubmitField(
        lazy_gettext('Acquire Measurements Now'))
    input_activate = SubmitField(TRANSLATIONS['activate']['title'])
    input_deactivate = SubmitField(TRANSLATIONS['deactivate']['title'])
Example #20
0
class MethodAdd(FlaskForm):
    method_id = StringField('Method ID', widget=widgets.HiddenInput())
    method_type = HiddenField('Method Type')
    daily_time_start = StringField(lazy_gettext('Start HH:MM:SS'),
                                   render_kw={"placeholder": "HH:MM:SS"})
    daily_time_end = StringField(lazy_gettext('End HH:MM:SS'),
                                 render_kw={"placeholder": "HH:MM:SS"})
    time_start = StringField(lazy_gettext('Start YYYY-MM-DD HH:MM:SS'),
                             render_kw={"placeholder": "YYYY-MM-DD HH:MM:SS"})
    time_end = StringField(lazy_gettext('End YYYY-MM-DD HH:MM:SS'),
                           render_kw={"placeholder": "YYYY-MM-DD HH:MM:SS"})
    setpoint_start = DecimalField(lazy_gettext('Start Setpoint'),
                                  widget=NumberInput(step='any'))
    setpoint_end = DecimalField(lazy_gettext('End Setpoint (optional)'),
                                widget=NumberInput(step='any'))
    duration = DecimalField(lazy_gettext('Duration (seconds)'),
                            widget=NumberInput(step='any'))
    duration_end = DecimalField(lazy_gettext('Duration to End (seconds)'),
                                widget=NumberInput(step='any'))
    amplitude = DecimalField(lazy_gettext('Amplitude'),
                             widget=NumberInput(step='any'))
    frequency = DecimalField(lazy_gettext('Frequency'),
                             widget=NumberInput(step='any'))
    shift_angle = DecimalField(lazy_gettext('Angle Shift (0 to 360)'),
                               widget=NumberInput(step='any'))
    shiftY = DecimalField(lazy_gettext('Y-Axis Shift'),
                          widget=NumberInput(step='any'))
    x0 = DecimalField('X0', widget=NumberInput(step='any'))
    y0 = DecimalField('Y0', widget=NumberInput(step='any'))
    x1 = DecimalField('X1', widget=NumberInput(step='any'))
    y1 = DecimalField('Y1', widget=NumberInput(step='any'))
    x2 = DecimalField('X2', widget=NumberInput(step='any'))
    y2 = DecimalField('Y2', widget=NumberInput(step='any'))
    x3 = DecimalField('X3', widget=NumberInput(step='any'))
    y3 = DecimalField('Y3', widget=NumberInput(step='any'))
    output_daily_time = StringField(lazy_gettext('Time HH:MM:SS'),
                                    render_kw={"placeholder": "HH:MM:SS"})
    output_time = StringField(lazy_gettext('Time YYYY-MM-DD HH:MM:SS'),
                              render_kw={"placeholder": "YYYY-MM-DD HH:MM:SS"})
    save = SubmitField(lazy_gettext('Add to Method'))
    restart = SubmitField(lazy_gettext('Set Repeat Option'))
    linked_method_id = StringField('Linked Method Id')
Example #21
0
class Camera(FlaskForm):
    camera_id = StringField('Camera ID', widget=widgets.HiddenInput())
    name = StringField(TRANSLATIONS['name']['title'])
    library = StringField(lazy_gettext('Library'))
    device = StringField(lazy_gettext('Device'))

    capture_still = SubmitField(lazy_gettext('Capture Still'))
    start_timelapse = SubmitField(lazy_gettext('Start Timelapse'))
    pause_timelapse = SubmitField(lazy_gettext('Pause Timelapse'))
    resume_timelapse = SubmitField(lazy_gettext('Resume Timelapse'))
    stop_timelapse = SubmitField(lazy_gettext('Stop Timelapse'))
    timelapse_interval = DecimalField(
        lazy_gettext('Interval (seconds)'),
        validators=[
            validators.NumberRange(
                min=0,
                message=lazy_gettext(
                    'Photo Interval must be a positive value'))
        ],
        widget=NumberInput(step='any'))
    timelapse_runtime_sec = DecimalField(
        lazy_gettext('Run Time (seconds)'),
        validators=[
            validators.NumberRange(
                min=0,
                message=lazy_gettext(
                    'Total Run Time must be a positive value'))
        ],
        widget=NumberInput(step='any'))
    start_stream = SubmitField(lazy_gettext('Start Stream'))
    stop_stream = SubmitField(lazy_gettext('Stop Stream'))

    opencv_device = IntegerField(lazy_gettext('OpenCV Device'),
                                 widget=NumberInput())
    hflip = BooleanField(lazy_gettext('Flip image horizontally'))
    vflip = BooleanField(lazy_gettext('Flip image vertically'))
    rotation = IntegerField(lazy_gettext('Rotate Image'), widget=NumberInput())
    brightness = DecimalField(lazy_gettext('Brightness'),
                              widget=NumberInput(step='any'))
    contrast = DecimalField(lazy_gettext('Contrast'),
                            widget=NumberInput(step='any'))
    exposure = DecimalField(lazy_gettext('Exposure'),
                            widget=NumberInput(step='any'))
    gain = DecimalField(lazy_gettext('Gain'), widget=NumberInput(step='any'))
    hue = DecimalField(lazy_gettext('Hue'), widget=NumberInput(step='any'))
    saturation = DecimalField(lazy_gettext('Saturation'),
                              widget=NumberInput(step='any'))
    white_balance = DecimalField(lazy_gettext('White Balance'),
                                 widget=NumberInput(step='any'))
    custom_options = StringField(lazy_gettext('Custom Options'))
    output_id = StringField(TRANSLATIONS['output']['title'])
    output_duration = DecimalField('{} ({})'.format(
        TRANSLATIONS['duration']['title'], TRANSLATIONS['output']['title']),
                                   widget=NumberInput(step='any'))
    cmd_pre_camera = StringField(lazy_gettext('Pre Command'))
    cmd_post_camera = StringField(lazy_gettext('Post Command'))
    path_still = StringField(lazy_gettext('Still Image Path'))
    path_timelapse = StringField(lazy_gettext('Timelapse Path'))
    path_video = StringField(lazy_gettext('Video Path'))
    camera_add = SubmitField(TRANSLATIONS['add']['title'])
    camera_mod = SubmitField(TRANSLATIONS['save']['title'])
    camera_del = SubmitField(TRANSLATIONS['delete']['title'])
    hide_still = BooleanField(lazy_gettext('Hide Last Still'))
    hide_timelapse = BooleanField(lazy_gettext('Hide Last Timelapse'))
    show_preview = BooleanField(lazy_gettext('Show Preview'))
    output_format = StringField(lazy_gettext('Output Format'))

    # Resolutions
    width = IntegerField(lazy_gettext('Still Image Width'),
                         widget=NumberInput())
    height = IntegerField(lazy_gettext('Still Image Height'),
                          widget=NumberInput())
    resolution_stream_width = IntegerField(lazy_gettext('Stream Width'),
                                           widget=NumberInput())
    resolution_stream_height = IntegerField(lazy_gettext('Stream Height'),
                                            widget=NumberInput())
    stream_fps = IntegerField(lazy_gettext('Stream Frames Per Second'),
                              widget=NumberInput())

    # Picamera
    picamera_shutter_speed = IntegerField(lazy_gettext('Shutter Speed'))
    picamera_sharpness = IntegerField(lazy_gettext('Sharpness'))
    picamera_iso = StringField(lazy_gettext('ISO'))
    picamera_awb = StringField(lazy_gettext('Auto White Balance'))
    picamera_awb_gain_red = DecimalField(lazy_gettext('AWB Gain Red'),
                                         widget=NumberInput(step='any'))
    picamera_awb_gain_blue = DecimalField(lazy_gettext('AWB Gain Blue'),
                                          widget=NumberInput(step='any'))
    picamera_exposure_mode = StringField(lazy_gettext('Exposure Mode'))
    picamera_meter_mode = StringField(lazy_gettext('Meter Mode'))
    picamera_image_effect = StringField(lazy_gettext('Image Effect'))

    # HTTP Address
    url_still = StringField(lazy_gettext('Still HTTP Address'))
    url_stream = StringField(lazy_gettext('Stream HTTP Address'))

    # Timelapse video generation
    timelapse_image_set = StringField(lazy_gettext('Image Set'))
    timelapse_codec = StringField(lazy_gettext('Codec'))
    timelapse_fps = IntegerField(lazy_gettext('Frames Per Second'))
    timelapse_generate = SubmitField(lazy_gettext('Generate Video'))
Example #22
0
class RegistrationFormEditForm(IndicoForm):
    _price_fields = ('currency', 'base_price')
    _registrant_notification_fields = ('notification_sender_address',
                                       'message_pending', 'message_unpaid',
                                       'message_complete', 'attach_ical')
    _manager_notification_fields = ('manager_notifications_enabled',
                                    'manager_notification_recipients')
    _special_fields = _price_fields + _registrant_notification_fields + _manager_notification_fields

    title = StringField(_('Title'), [DataRequired()],
                        description=_('The title of the registration form'))
    introduction = TextAreaField(
        _('Introduction'),
        description=
        _('Introduction to be displayed when filling out the registration form'
          ))
    contact_info = StringField(
        _('Contact info'),
        description=
        _('How registrants can get in touch with somebody for extra information'
          ))
    moderation_enabled = BooleanField(
        _('Moderated'),
        widget=SwitchWidget(),
        description=_('If enabled, registrations require manager approval'))
    require_login = BooleanField(
        _('Only logged-in users'),
        widget=SwitchWidget(),
        description=_('Users must be logged in to register'))
    require_user = BooleanField(
        _('Registrant must have account'),
        widget=SwitchWidget(),
        description=_(
            'Registrations emails must be associated with an Indico account'))
    limit_registrations = BooleanField(
        _('Limit registrations'),
        widget=SwitchWidget(),
        description=_('Whether there is a limit of registrations'))
    registration_limit = IntegerField(
        _('Capacity'), [
            HiddenUnless('limit_registrations'),
            DataRequired(),
            NumberRange(min=1)
        ],
        description=_('Maximum number of registrations'))
    modification_mode = IndicoEnumSelectField(
        _('Modification allowed'),
        enum=ModificationMode,
        description=_('Will users be able to modify their data? When?'))
    publish_registration_count = BooleanField(
        _('Publish number of registrations'),
        widget=SwitchWidget(),
        description=_('Number of registered participants will be displayed in '
                      'the event page'))
    publish_checkin_enabled = BooleanField(
        _('Publish check-in status'),
        widget=SwitchWidget(),
        description=_(
            'Check-in status will be shown publicly on the event page'))
    base_price = DecimalField(
        _('Registration fee'), [
            NumberRange(min=0, max=999999.99),
            Optional(), _check_if_payment_required
        ],
        filters=[lambda x: x if x is not None else 0],
        widget=NumberInput(step='0.01'),
        description=_('A fixed fee all users have to pay when registering.'))
    currency = SelectField(_('Currency'), [DataRequired()],
                           description=_('The currency for new registrations'))
    notification_sender_address = StringField(_('Notification sender address'),
                                              [IndicoEmail()],
                                              filters=[lambda x: (x or None)])
    message_pending = TextAreaField(
        _('Message for pending registrations'),
        description=
        _('Text included in emails sent to pending registrations (Markdown syntax)'
          ))
    message_unpaid = TextAreaField(
        _('Message for unpaid registrations'),
        description=
        _('Text included in emails sent to unpaid registrations (Markdown syntax)'
          ))
    message_complete = TextAreaField(
        _('Message for complete registrations'),
        description=
        _('Text included in emails sent to complete registrations (Markdown syntax)'
          ))
    attach_ical = BooleanField(
        _('Attach iCalendar file'),
        widget=SwitchWidget(),
        description=
        _('Attach an iCalendar file to the mail sent once a registration is complete'
          ))
    manager_notifications_enabled = BooleanField(
        _('Enabled'),
        widget=SwitchWidget(),
        description=_('Enable notifications to managers about registrations'))
    manager_notification_recipients = EmailListField(
        _('List of recipients'), [
            HiddenUnless('manager_notifications_enabled', preserve_data=True),
            DataRequired()
        ],
        description=_('Email addresses that will receive notifications'))

    def __init__(self, *args, **kwargs):
        self.event = kwargs.pop('event')
        self.regform = kwargs.pop('regform', None)
        super().__init__(*args, **kwargs)
        self._set_currencies()
        self.notification_sender_address.description = _(
            'Email address set as the sender of all '
            'notifications sent to users. If empty, '
            'then {email} is used.').format(email=config.NO_REPLY_EMAIL)

    def _set_currencies(self):
        currencies = [(c['code'], '{0[code]} ({0[name]})'.format(c))
                      for c in payment_settings.get('currencies')]
        self.currency.choices = sorted(currencies, key=lambda x: x[1].lower())
Example #23
0
class PIDModBase(FlaskForm):
    function_id = StringField('Function ID', widget=widgets.HiddenInput())
    function_type = StringField('Function Type', widget=widgets.HiddenInput())
    name = StringField(TRANSLATIONS['name']['title'],
                       validators=[DataRequired()])
    measurement = StringField(TRANSLATIONS['measurement']['title'],
                              validators=[DataRequired()])
    direction = SelectField(lazy_gettext('Direction'),
                            choices=[('raise', lazy_gettext('Raise')),
                                     ('lower', lazy_gettext('Lower')),
                                     ('both', lazy_gettext('Both'))],
                            validators=[DataRequired()])
    period = DecimalField(
        TRANSLATIONS['period']['title'],
        validators=[validators.NumberRange(min=1, max=86400)],
        widget=NumberInput(step='any'))
    log_level_debug = BooleanField(TRANSLATIONS['log_level_debug']['title'])
    start_offset = DecimalField(TRANSLATIONS['start_offset']['title'],
                                widget=NumberInput(step='any'))
    max_measure_age = DecimalField(
        TRANSLATIONS['max_age']['title'],
        validators=[validators.NumberRange(min=1, max=86400)],
        widget=NumberInput(step='any'))
    setpoint = DecimalField(
        TRANSLATIONS['setpoint']['title'],
        validators=[validators.NumberRange(min=-1000000, max=1000000)],
        widget=NumberInput(step='any'))
    band = DecimalField(lazy_gettext('Band (+/- Setpoint)'),
                        widget=NumberInput(step='any'))
    send_lower_as_negative = BooleanField(
        lazy_gettext('Send Lower as Negative'))
    store_lower_as_negative = BooleanField(
        lazy_gettext('Store Lower as Negative'))
    k_p = DecimalField(lazy_gettext('Kp Gain'),
                       validators=[validators.NumberRange(min=0)],
                       widget=NumberInput(step='any'))
    k_i = DecimalField(lazy_gettext('Ki Gain'),
                       validators=[validators.NumberRange(min=0)],
                       widget=NumberInput(step='any'))
    k_d = DecimalField(lazy_gettext('Kd Gain'),
                       validators=[validators.NumberRange(min=0)],
                       widget=NumberInput(step='any'))
    integrator_max = DecimalField(lazy_gettext('Integrator Min'),
                                  widget=NumberInput(step='any'))
    integrator_min = DecimalField(lazy_gettext('Integrator Max'),
                                  widget=NumberInput(step='any'))
    raise_output_id = StringField(lazy_gettext('Output (Raise)'))
    raise_output_type = StringField(lazy_gettext('Action (Raise)'))
    lower_output_id = StringField(lazy_gettext('Output (Lower)'))
    lower_output_type = StringField(lazy_gettext('Action (Lower)'))
    setpoint_tracking_type = StringField(
        TRANSLATIONS['setpoint_tracking_type']['title'])
    setpoint_tracking_method_id = StringField('Setpoint Tracking Method')
    setpoint_tracking_input_math_id = StringField('Setpoint Tracking Input')
    setpoint_tracking_max_age = DecimalField('Max Age (seconds)',
                                             validators=[Optional()],
                                             widget=NumberInput(step='any'))
    pid_hold = SubmitField(lazy_gettext('Hold'))
    pid_pause = SubmitField(lazy_gettext('Pause'))
    pid_resume = SubmitField(lazy_gettext('Resume'))
Example #24
0
class UserForm(FlaskForm):
    """Main form for User GUI"""
    name = StringField('User name', validators=[DataRequired()])
    description = TextAreaField('Description', validators=[Optional()])
    email = StringField('Email', validators=[Optional(), Email()])

    # custom user fields
    # NOTE: actual subform added in add_custom_fields()
    user_info = FormField(FlaskForm, "User info", _meta={'csrf': False})

    password = PasswordField('Password')
    password2 = PasswordField('Repeat Password',
                              validators=[EqualTo('password')])
    totp_enabled = False
    totp_secret = StringField('TOTP secret',
                              validators=[Optional(),
                                          Length(max=128)])
    last_sign_in_at = StringField('Last sign in', validators=[Optional()])
    failed_sign_in_count = IntegerField(
        'Failed login attempts',
        widget=NumberInput(min=0),
        validators=[
            Optional(),
            NumberRange(min=0, message="Number must be greater or equal 0")
        ])

    groups = SelectMultipleField('Assigned groups',
                                 coerce=int,
                                 validators=[Optional()])
    roles = SelectMultipleField('Assigned roles',
                                coerce=int,
                                validators=[Optional()])

    submit = SubmitField('Save')

    def __init__(self, config_models, user_info_fields, **kwargs):
        """Constructor

        :param ConfigModels config_models: Helper for ORM models
        """
        self.config_models = config_models
        self.User = self.config_models.model('users')

        # store any provided user object
        self.obj = kwargs.get('obj')

        self.add_custom_fields(user_info_fields)

        super(UserForm, self).__init__(**kwargs)

    def add_custom_fields(self, user_info_fields):
        """Add custom user_info fields.

        :param list(obj) user_info_fields: Custom user info fields
        """

        # NOTE: use a new UserInfoForm class for every UserForm instance,
        #       so custom fields are only set for the current tenant
        #       and not globally
        class UserInfoForm(FlaskForm):
            """Subform for custom user info fields"""
            pass

        # override form_class in user_info FormField
        self.user_info.args = (UserInfoForm, "User info")

        # add custom fields
        for field in user_info_fields:
            field_class = StringField
            widget = None
            if field.get('type') == 'string':
                field_class = StringField
            if field.get('type') == 'textarea':
                field_class = TextAreaField
            elif field.get('type') == 'integer':
                field_class = IntegerField
                widget = NumberInput()

            validators = [Optional()]
            if field.get('required', False):
                validators = [DataRequired()]

            form_field = field_class(field['title'],
                                     widget=widget,
                                     validators=validators)
            # add custom field to UserInfoForm
            setattr(UserInfoForm, field['name'], form_field)

    def validate_name(self, field):
        # check if user name exists
        session = self.config_models.session()
        query = session.query(self.User).filter_by(name=field.data)
        if self.obj:
            # ignore current user
            query = query.filter(self.User.id != self.obj.id)
        user = query.first()
        session.close()
        if user is not None:
            raise ValidationError('Name has already been taken.')

    def validate_email(self, email):
        session = self.config_models.session()
        query = session.query(self.User).filter_by(email=email.data)
        if self.obj:
            # ignore current user
            query = query.filter(self.User.id != self.obj.id)
        user = query.first()
        session.close()
        if user is not None:
            raise ValidationError('Please use a different email address.')
Example #25
0
class PIDModValueLower(FlaskForm):
    lower_min_amount = DecimalField(lazy_gettext('Min Amount (Lower)'),
                                    widget=NumberInput(step='any'))
    lower_max_amount = DecimalField(lazy_gettext('Max Amount (Lower)'),
                                    widget=NumberInput(step='any'))
Example #26
0
class PIDModValueRaise(FlaskForm):
    raise_min_amount = DecimalField(lazy_gettext('Min Amount (Raise)'),
                                    widget=NumberInput(step='any'))
    raise_max_amount = DecimalField(lazy_gettext('Max Amount (Raise)'),
                                    widget=NumberInput(step='any'))