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 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 (nbiotDevice.query.filter(nbiotDevice.name.ilike(f'%{input.data}%')).first()): raise ValidationError('This Name already exists. Please choose a different one.') def validate_serial_no(self, input): if input.data != self.originalModel.serial_no: if (nbiotDevice.query.filter(nbiotDevice.serial_no.ilike(f'%{input.data}%')).first()): raise ValidationError('This Serial Number is already registered.') def validate_imsi(self, input): if input.data != self.originalModel.imsi: if (nbiotDevice.query.filter(nbiotDevice.imsi.ilike(f'%{input.data}%')).first()): raise ValidationError('This IMSI no is already registered.') def validate_iccid(self, input): if input.data != self.originalModel.iccid: if (nbiotDevice.query.filter(nbiotDevice.iccid.ilike(f'%{input.data}%')).first()): raise ValidationError('This ICCID no is already registered.') def validate_ip(self, input): if input.data != self.originalModel.ip: if (nbiotDevice.query.filter(nbiotDevice.ip.ilike(f'%{input.data}%')).first()): raise ValidationError('A devie already has this IP')