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'))
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'])
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'))
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
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'])
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'))
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'])
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'])
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'])
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'))
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'])
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'))
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'])
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
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")
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'])
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)
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'))
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'])
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')
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'))
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())
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'))
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.')
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'))
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'))