from flask_wtf import FlaskForm from flask_wtf.file import FileField, FileAllowed from wtforms import StringField, SubmitField, BooleanField, URLField, IntegerField, DateField, SelectField from wtforms.validators import DataRequired, Length, ValidationError from minibase.blueprints.sensor.models import nbiotDevice import minibase.blueprints.company.utils as companyUtils import minibase.blueprints.user.utils as userUtils import minibase.blueprints.sensor.utils as sensorUtils import minibase.blueprints.database.utils as dbUtils from datetime import date class nbiotDeviceForm(FlaskForm): # Defines the self class to be used for the user update name = StringField('Device Name', validators=[DataRequired(), Length(min=3, max=50)]) model = StringField('Device Model', validators=[DataRequired(), Length(min=3, max=50)]) serial_no = StringField('Serial Number', validators=[DataRequired(), Length(min=3, max=50)]) device_id = StringField('Device Id', validators=[DataRequired(), Length(min=3, max=50)]) imsi = StringField('Imsi No', validators=[DataRequired(), Length(min=10, max=50)]) iccid = StringField('Iccid No', validators=[DataRequired(), Length(min=10, max=100)]) ip = StringField('Ip (ipv4)', validators=[DataRequired(), Length(min=7, max=15)]) port = StringField('Port', validators=[DataRequired(), Length(min=3, max=10)]) registration_date = DateField('Registration Date', format='%Y-%m-%d', default=date.today, validators=[DataRequired()]) activation_date = DateField('Activation Date', format='%Y-%m-%d', default=date.today, validators=[DataRequired()]) deactivation_date = DateField('Deactivation Date', format='%Y-%m-%d', default=date.today, validators=[DataRequired()]) device_owner_id = SelectField('Owner', validators=[DataRequired()]) device_user_id = SelectField('User') status_id = SelectField('Status', validators=[DataRequired()]) type_id = SelectField('Type', validators=[DataRequired()]) area_id = SelectField('Area', validators=[DataRequired()]) company_manufacturer_id = SelectField( 'Manufacturer', validators=[DataRequired()], render_kw={"custom_option": "search_field", "query_table": "Companies", "query_key": "name", "query_return": "name" }) company_owner_id = SelectField('Managed By', validators=[DataRequired()], render_kw={"custom_option": "search_field", "query_table": "Companies", "query_key": "name", "query_return": "name" }) image_file = FileField('Update Sensor Picture', validators=[FileAllowed(['jpg', 'png'])]) submit = SubmitField() def populate_for_updating(self, device): self.originalModel = device self.submit.label.text = "Update" self.device_user_id.choices = [(row.id, row.username) for row in userUtils.queryUserNamesWithDefault(device.device_user_id)] self.device_owner_id.choices = [(row.id, row.username) for row in userUtils.queryUserNamesWithDefault(device.device_owner_id)] self.company_manufacturer_id.choices = [(row.id, row.name) for row in companyUtils.queryNamesWithDefault(device.company_manufacturer_id)] self.company_owner_id.choices = [(row.id, row.name) for row in companyUtils.queryNamesWithDefault(device.company_owner_id)] self.status_id.choices = [(row.id, row.name) for row in sensorUtils.queryStatusNamesWithDefault(device.status_id)] self.type_id.choices = [(row.id, row.name) for row in sensorUtils.queryTypeNamesWithDefault(device.type_id)] self.area_id.choices = [(row.id, row.name) for row in sensorUtils.queryAreaNamesWithDefault(device.area_id)] def populate_for_adding(self, device): self.originalModel = device self.submit.label.text = "Add" if self.company_manufacturer_id.data: self.company_manufacturer_id.choices = [(row.id, row.name) for row in companyUtils.queryNamesWithDefault(self.company_manufacturer_id.data)] self.device_user_id.choices = [(row.id, row.username) for row in userUtils.queryUserNamesWithDefault(device.device_user_id)] self.device_owner_id.choices = [(row.id, row.username) for row in userUtils.queryUserNamesWithDefault(device.device_owner_id)] self.company_manufacturer_id.choices = [(row.id, row.name) for row in companyUtils.queryNamesWithDefault(device.company_manufacturer_id)] self.company_owner_id.choices = [(row.id, row.name) for row in companyUtils.queryNamesWithDefault(device.company_owner_id)] self.status_id.choices = [(row.id, row.name) for row in sensorUtils.queryStatusNamesWithDefault(device.status_id)] self.type_id.choices = [(row.id, row.name) for row in sensorUtils.queryTypeNamesWithDefault(device.type_id)] self.area_id.choices = [(row.id, row.name) for row in sensorUtils.queryAreaNamesWithDefault(device.area_id)] #custom validators specific naming convention: validate_. This is how Flask-WTF knows which field the validator is associated with. def validate_name(self, input): if input.data != self.originalModel.name: if (dbUtils.queryIlikeFromTable(nbiotDevice, nbiotDevice.name, input.data)): raise ValidationError(f'This {self.name.name} already exists.') def validate_serial_no(self, input): if input.data != self.originalModel.serial_no: if (dbUtils.queryIlikeFromTable(nbiotDevice, nbiotDevice.serial_no, input.data)): raise ValidationError(f'This {self.serial_no.name} already exists.') def validate_imsi(self, input): if input.data != self.originalModel.imsi: if (dbUtils.queryIlikeFromTable(nbiotDevice, nbiotDevice.imsi, input.data)): raise ValidationError(f'This {self.imsi.name} already exists.') def validate_iccid(self, input): if input.data != self.originalModel.iccid: if (dbUtils.queryIlikeFromTable(nbiotDevice, nbiotDevice.iccid, input.data)): raise ValidationError(f'This {self.iccid.name} already exists.') def validate_ip(self, input): if input.data != self.originalModel.ip: if (dbUtils.queryIlikeFromTable(nbiotDevice, nbiotDevice.ip, input.data)): raise ValidationError(f'This {self.ip.name} already exists.')