diff --git a/web/init/static/csv/nbiotDevice.csv b/web/init/static/csv/nbiotDevice.csv new file mode 100644 index 00000000..195fc885 --- /dev/null +++ b/web/init/static/csv/nbiotDevice.csv @@ -0,0 +1,2 @@ +name,device_id,serial_no,imsi,iccid,ip,port,user_id,owner_id,man_id,status_id,type_id,area_id +miniUni,24070580,24070576,901405710203483,89882280000107407542,10.128.24.42,50000,1,1,1,1,1,1 diff --git a/web/init/static/csv/nbiotDeviceArea.csv b/web/init/static/csv/nbiotDeviceArea.csv new file mode 100644 index 00000000..725bb338 --- /dev/null +++ b/web/init/static/csv/nbiotDeviceArea.csv @@ -0,0 +1,5 @@ +name,description +Roof,Placed on a roof +WashingMachine,Placed behind a washing machine +BoilerRoom,Placed on a the boiler room +Bathroom,Placed on a the bathroom diff --git a/web/init/static/csv/nbiotDeviceStatus.csv b/web/init/static/csv/nbiotDeviceStatus.csv new file mode 100644 index 00000000..d3cce468 --- /dev/null +++ b/web/init/static/csv/nbiotDeviceStatus.csv @@ -0,0 +1,5 @@ +name,description +Active,Active an running +Ready,Registered and ready but not registered to the network +Offline,Went offline due to a reason like no more battery or +Deactivated,"Registration is overdue, and thus Deactivated by the operator" diff --git a/web/init/static/csv/nbiotDeviceType.csv b/web/init/static/csv/nbiotDeviceType.csv new file mode 100644 index 00000000..4ef5686b --- /dev/null +++ b/web/init/static/csv/nbiotDeviceType.csv @@ -0,0 +1,2 @@ +name,description +WaterDetector,Sensor for detection water levels. diff --git a/web/instance/test.db b/web/instance/test.db index 70a8f4da..623d892a 100644 Binary files a/web/instance/test.db and b/web/instance/test.db differ diff --git a/web/minibase/__pycache__/menuDictionary.cpython-311.pyc b/web/minibase/__pycache__/menuDictionary.cpython-311.pyc new file mode 100644 index 00000000..e71bbd7b Binary files /dev/null and b/web/minibase/__pycache__/menuDictionary.cpython-311.pyc differ diff --git a/web/minibase/__pycache__/theme.cpython-311.pyc b/web/minibase/__pycache__/theme.cpython-311.pyc index b4fcfef9..f495e652 100644 Binary files a/web/minibase/__pycache__/theme.cpython-311.pyc and b/web/minibase/__pycache__/theme.cpython-311.pyc differ diff --git a/web/minibase/blueprints/company/__pycache__/forms.cpython-311.pyc b/web/minibase/blueprints/company/__pycache__/forms.cpython-311.pyc index 61351cda..bbd53480 100644 Binary files a/web/minibase/blueprints/company/__pycache__/forms.cpython-311.pyc and b/web/minibase/blueprints/company/__pycache__/forms.cpython-311.pyc differ diff --git a/web/minibase/blueprints/company/__pycache__/routes.cpython-311.pyc b/web/minibase/blueprints/company/__pycache__/routes.cpython-311.pyc index 782b1452..91decf7b 100644 Binary files a/web/minibase/blueprints/company/__pycache__/routes.cpython-311.pyc and b/web/minibase/blueprints/company/__pycache__/routes.cpython-311.pyc differ diff --git a/web/minibase/blueprints/company/forms.py b/web/minibase/blueprints/company/forms.py index de6b79eb..72543e3a 100644 --- a/web/minibase/blueprints/company/forms.py +++ b/web/minibase/blueprints/company/forms.py @@ -7,10 +7,10 @@ import minibase.blueprints.company.utils as companyUtils class updateCompanyForm(FlaskForm): # Defines the form class to be used for the user update name = StringField('Name', validators=[DataRequired(), Length(min=3, max=100)]) website = URLField('Website', validators=[DataRequired(), Length(min=3, max=100)]) + street = StringField('Street', validators=[DataRequired()]) street_no = IntegerField('No', validators=[DataRequired()]) post_code = IntegerField('Post', validators=[DataRequired()]) - city = SelectField('City', validators=[DataRequired()]) state = SelectField('State', validators=[DataRequired()]) country = SelectField('Country', validators=[DataRequired()]) diff --git a/web/minibase/blueprints/company/routes.py b/web/minibase/blueprints/company/routes.py index 30a905f2..c98edfa7 100644 --- a/web/minibase/blueprints/company/routes.py +++ b/web/minibase/blueprints/company/routes.py @@ -28,6 +28,14 @@ def edit_company(companyId): if id: form = updateCompanyForm() company = companyUtils.queryById(companyId) + form.city.choices = [(row.id, row.name) for row in geoUtils.queryCiytNamesOfStateWithDefId(company.city_id, company.state_id)] + form.state.choices = [(row.id, row.name) for row in geoUtils.queryStateNamesOfCuntryWithDefId(company.state_id, company.country_id)] + form.country.choices = [(row.id, row.name) for row in geoUtils.queryCountryNamesWithDefault(company.country_id)] + form.industry.choices = [(row.id, row.name) for row in mainUtils.queryIndustryNamesWithDefault(company.industry_id)] + form.legal_entity.choices = [(row.id, row.name) for row in companyUtils.queryLegalEntityNames()] + form.type.choices = [(row.id, row.name) for row in companyUtils.queryTypeNames()] + form.relation.choices = [(row.id, row.name) for row in companyUtils.queryRelationNames()] + form.status.choices = [(row.id, row.name) for row in companyUtils.queryStatusNames()] if form.validate_on_submit(): comp = Companies( @@ -53,22 +61,7 @@ def edit_company(companyId): form.street.data = company.street form.street_no.data = company.street_no form.post_code.data = company.post_code - #form.city.choices = [(row.id, row.name) for row in geoUtils.queryCityNames()] - form.city.data = company.city - form.state.choices = [(row.id, row.name) for row in geoUtils.queryStateNamesOfCuntry(company.country.id)] - form.state.data = company.state - form.country.choices = [(row.id, row.name) for row in geoUtils.queryCountryNames()] - form.country.data = company.country - form.industry.choices = [(row.id, row.name) for row in mainUtils.queryIndustryNames()] - form.industry.data = company.industry - form.legal_entity.choices = [(row.id, row.name) for row in companyUtils.queryLegalEntityNames()] - form.legal_entity.data = company.legal_entity - form.type.choices = [(row.id, row.name) for row in companyUtils.queryTypeNames()] - form.type.data = company.type - form.relation.choices = [(row.id, row.name) for row in companyUtils.queryRelationNames()] - form.relation.data = company.relation - form.status.choices = [(row.id, row.name) for row in companyUtils.queryStatusNames()] - form.status.data = company.status + form.comment.data = company.comment # This could be very interesting but neds more time to think ! #for field in form: @@ -76,11 +69,13 @@ def edit_company(companyId): # attr = getattr(company, field.name) # field.data = attr image_file = url_for('static', filename='pics/' + companyUtils.queryImageById(companyId)) - info = "kerem" + + mylist = [['name','website','industry'], ['street','street_no','city','state','country'], 'timestamp'] + return render_template('company/account.html', theme=theme, image_file=image_file, - info = info, + itemList=mylist, form=form) else: flash('You need to select a company id', 'alarm') diff --git a/web/minibase/blueprints/company/templates/company/account.html b/web/minibase/blueprints/company/templates/company/account.html index fb0c5505..b414f562 100644 --- a/web/minibase/blueprints/company/templates/company/account.html +++ b/web/minibase/blueprints/company/templates/company/account.html @@ -6,27 +6,26 @@
- - + + +
- - +
-
-
+
+
{% include 'form.html' %}
- -
-
- {{ info }} +
+
{% endblock content %} + diff --git a/web/minibase/blueprints/database/__pycache__/utils.cpython-311.pyc b/web/minibase/blueprints/database/__pycache__/utils.cpython-311.pyc index 46588e72..c988bdbb 100644 Binary files a/web/minibase/blueprints/database/__pycache__/utils.cpython-311.pyc and b/web/minibase/blueprints/database/__pycache__/utils.cpython-311.pyc differ diff --git a/web/minibase/blueprints/database/utils.py b/web/minibase/blueprints/database/utils.py index 25a5a6fc..2aa93aff 100644 --- a/web/minibase/blueprints/database/utils.py +++ b/web/minibase/blueprints/database/utils.py @@ -1,5 +1,5 @@ from minibase.app import db - +from sqlalchemy import case class table_printable: def __init__(self, table, link_for_item, item_to_be_linked): @@ -19,15 +19,16 @@ class table_printable_paginate: self.item_to_be_linked = item_to_be_linked self.paginate = 1 +def queryNameWithDefaultId(table,defId): + choices = table.query.order_by(case((table.id == defId, 0),else_=1),table.name.asc()) + return choices def dbAdd(dbClass): db.session.add(dbClass) - def dbCommit(): db.session.commit() - def dbAddAndCommit(dbClass): db.session.add(dbClass) db.session.commit() diff --git a/web/minibase/blueprints/geography/__pycache__/utils.cpython-311.pyc b/web/minibase/blueprints/geography/__pycache__/utils.cpython-311.pyc index e0bc12fa..6a3198d7 100644 Binary files a/web/minibase/blueprints/geography/__pycache__/utils.cpython-311.pyc and b/web/minibase/blueprints/geography/__pycache__/utils.cpython-311.pyc differ diff --git a/web/minibase/blueprints/geography/utils.py b/web/minibase/blueprints/geography/utils.py index 468d76f0..b697cfd2 100644 --- a/web/minibase/blueprints/geography/utils.py +++ b/web/minibase/blueprints/geography/utils.py @@ -1,20 +1,39 @@ from minibase.blueprints.geography.models import Country, City, State, Region, Subregion - +import minibase.blueprints.database.utils as dbUtils +from sqlalchemy import case def queryCountryNames(): choices = Country.query.order_by(Country.name.asc()) return choices +def queryCountryNamesWithDefault(defId): + choices = dbUtils.queryNameWithDefaultId(Country,defId) + return choices + def queryStateNames(): choices = State.query.order_by(State.name.asc()) return choices -def queryStateNamesOfCuntry(id): - choices = State.query.order_by(State.name.asc()).filter_by(country_id=id) +def queryStateNamesWithDefault(defId): + choices = dbUtils.queryNameWithDefaultId(State,defId) return choices def queryCityNames(): choices = City.query.order_by(City.name.asc()) return choices + +def queryCityNamesWithDefault(defId): + choices = dbUtils.queryNameWithDefaultId(City,defId) + return choices + +def queryCiytNamesOfStateWithDefId(defId, Filterid): + table=City + choices = table.query.order_by(case((table.id == defId, 0),else_=1), table.name.asc()).filter_by(state_id=Filterid) + return choices + +def queryStateNamesOfCuntryWithDefId(defId, Filterid): + table=State + choices = table.query.order_by(case((table.id == defId, 0),else_=1), table.name.asc()).filter_by(country_id=Filterid) + return choices diff --git a/web/minibase/blueprints/main/__pycache__/utils.cpython-311.pyc b/web/minibase/blueprints/main/__pycache__/utils.cpython-311.pyc index 518a7e88..e26819fb 100644 Binary files a/web/minibase/blueprints/main/__pycache__/utils.cpython-311.pyc and b/web/minibase/blueprints/main/__pycache__/utils.cpython-311.pyc differ diff --git a/web/minibase/blueprints/main/utils.py b/web/minibase/blueprints/main/utils.py index 31d86177..73656b88 100644 --- a/web/minibase/blueprints/main/utils.py +++ b/web/minibase/blueprints/main/utils.py @@ -1,6 +1,15 @@ from minibase.blueprints.main.models import Industries +import minibase.blueprints.database.utils as dbUtils + +from sqlalchemy import case def queryIndustryNames(): choices = Industries.query.order_by(Industries.name.asc()) return choices + +def queryIndustryNamesWithDefault(defId): + choices = dbUtils.queryNameWithDefaultId(Industries,defId) + return choices + + diff --git a/web/minibase/blueprints/sensor/__init__.py b/web/minibase/blueprints/sensor/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/web/minibase/blueprints/sensor/__pycache__/__init__.cpython-311.pyc b/web/minibase/blueprints/sensor/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 00000000..d0ad7e0a Binary files /dev/null and b/web/minibase/blueprints/sensor/__pycache__/__init__.cpython-311.pyc differ diff --git a/web/minibase/blueprints/sensor/__pycache__/forms.cpython-311.pyc b/web/minibase/blueprints/sensor/__pycache__/forms.cpython-311.pyc new file mode 100644 index 00000000..bd81fa6f Binary files /dev/null and b/web/minibase/blueprints/sensor/__pycache__/forms.cpython-311.pyc differ diff --git a/web/minibase/blueprints/sensor/__pycache__/models.cpython-311.pyc b/web/minibase/blueprints/sensor/__pycache__/models.cpython-311.pyc new file mode 100644 index 00000000..3abc83ff Binary files /dev/null and b/web/minibase/blueprints/sensor/__pycache__/models.cpython-311.pyc differ diff --git a/web/minibase/blueprints/sensor/__pycache__/routes.cpython-311.pyc b/web/minibase/blueprints/sensor/__pycache__/routes.cpython-311.pyc new file mode 100644 index 00000000..9bc39dbd Binary files /dev/null and b/web/minibase/blueprints/sensor/__pycache__/routes.cpython-311.pyc differ diff --git a/web/minibase/blueprints/sensor/__pycache__/utils.cpython-311.pyc b/web/minibase/blueprints/sensor/__pycache__/utils.cpython-311.pyc new file mode 100644 index 00000000..4c4b692e Binary files /dev/null and b/web/minibase/blueprints/sensor/__pycache__/utils.cpython-311.pyc differ diff --git a/web/minibase/blueprints/sensor/forms.py b/web/minibase/blueprints/sensor/forms.py new file mode 100644 index 00000000..50d4e462 --- /dev/null +++ b/web/minibase/blueprints/sensor/forms.py @@ -0,0 +1,117 @@ +from flask_wtf import FlaskForm +from flask_wtf.file import FileField, FileAllowed +from wtforms import StringField, PasswordField, SubmitField, BooleanField, URLField, IntegerField, DateField, SelectField +from wtforms.validators import DataRequired, Length, Email, EqualTo, ValidationError +from iot.blueprints.sensor.models import nbiotDevice +from datetime import date + +class updateNbioDeviceUpdateForm(FlaskForm): # Defines the form class to be used for the user update + name = StringField('Device Name', validators=[DataRequired(), Length(min=3, max=50)]) + device_id = StringField('Device Id', validators=[DataRequired(), Length(min=3, max=50)]) + serialNumber = StringField('Serial Number', 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()]) + owner_id = SelectField('Owner', validators=[DataRequired()]) + user_id = SelectField('User') + status_id = SelectField('Status', validators=[DataRequired()]) + type_id = SelectField('Type', validators=[DataRequired()]) + area_id = SelectField('Area', validators=[DataRequired()]) + + + submit = SubmitField(f'Update') + + def __init__(self, current_device_id, *args, **kwargs): + super().__init__(*args, **kwargs) + self.current_device = nbiotDevice.query.get(current_device_id) + + def validate_name(self, input): + if input.data != self.current_device.name: + content = nbiotDevice.query.filter_by(name=input.data).first() + if content: + raise ValidationError('That device name is taken please choose another one') + + def validate_device_id(self, input): + if input.data != self.current_device.device_id: + content = nbiotDevice.query.filter_by(device_id=input.data).first() + if content: + raise ValidationError('That device id is taken please choose another one') + + def validate_imsi(self, input): + if input.data != self.current_device.imsi: + content = nbiotDevice.query.filter_by(imsi=input.data).first() + if content: + raise ValidationError('That IMSI id is taken please choose another one') + + def validate_iccid(self, input): + if input.data != self.current_device.iccid: + content = nbiotDevice.query.filter_by(iccid=input.data).first() + if content: + raise ValidationError('That ICCID id is taken please choose another one') + + def validate_ip(self, input): + if input.data != self.current_device.ip: + content = nbiotDevice.query.filter_by(ip=input.data).first() + if content: + raise ValidationError('That IP id is taken please choose another one') + +class updateNbioDeviceAddForm(FlaskForm): # Defines the form class to be used for the user update + name = StringField('Device Name', 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=[Length(min=7, max=15)]) + port = StringField('Port', validators=[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()]) + user_id = SelectField('Owner', validators=[DataRequired()]) + status_id = SelectField('Status', validators=[DataRequired()]) + type_id = SelectField('Type', validators=[DataRequired()]) + area_id = SelectField('Area', validators=[DataRequired()]) + + submit = SubmitField(f'Add') + + def validate_name(self, input): + content = nbiotDevice.query.filter_by(name=input.data).first() + if content: + raise ValidationError('That device name is taken please choose another one') + + def validate_device_id(self, input): + content = nbiotDevice.query.filter_by(device_id=input.data).first() + if content: + raise ValidationError('That device id is taken please choose another one') + + def validate_imsi(self, input): + content = nbiotDevice.query.filter_by(imsi=input.data).first() + if content: + raise ValidationError('That IMSI id is taken please choose another one') + + def validate_iccid(self, input): + content = nbiotDevice.query.filter_by(iccid=input.data).first() + if content: + raise ValidationError('That ICCID id is taken please choose another one') + + def validate_ip(self, input): + content = nbiotDevice.query.filter_by(ip=input.data).first() + if content: + raise ValidationError('That IP id is taken please choose another one') + + +class updateRoleForm(FlaskForm): + id = StringField('ID', render_kw={'disabled':''}) + role = StringField('Role', validators=[DataRequired(), Length(min=4, max=20)]) + description = StringField('Description', validators=[DataRequired(), Length(min=4, max=200)]) + submit = SubmitField() + + +class updateRoleForm(FlaskForm): + id = StringField('ID', render_kw={'disabled':''}) + role = StringField('Role', validators=[DataRequired(), Length(min=4, max=20)]) + description = StringField('Description', validators=[DataRequired(), Length(min=4, max=200)]) + submit = SubmitField() + diff --git a/web/minibase/blueprints/sensor/models.py b/web/minibase/blueprints/sensor/models.py new file mode 100644 index 00000000..fa3ffb26 --- /dev/null +++ b/web/minibase/blueprints/sensor/models.py @@ -0,0 +1,61 @@ +from iot.app import db +from datetime import datetime + +class nbiotDevice(db.Model): + __tablename__ = 'nbiotDevice' + id = db.Column(db.Integer, primary_key=True) + + name = db.Column(db.String(50), nullable=False) + device_id = db.Column(db.String(30), nullable=False) + imsi = db.Column(db.String(30), nullable=False) + iccid = db.Column(db.String(50), nullable=False) + ip = db.Column(db.String(20), nullable=True) + port = db.Column(db.String(20), nullable=True) + registration_date = db.Column(db.DateTime, nullable=True) + activation_date = db.Column(db.DateTime, nullable=True) + deactivation_date = db.Column(db.DateTime, nullable=True) + created = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) + updated = db.Column(db.DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow) + + owner_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False) + user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=True) + status_id = db.Column(db.Integer, db.ForeignKey('nbiotDeviceStatus.id'), nullable=False) + type_id = db.Column(db.Integer, db.ForeignKey('nbiotDeviceType.id'), nullable=False) + area_id = db.Column(db.Integer, db.ForeignKey('nbiotDeviceArea.id'), nullable=False) + + owner = db.relationship('User', foreign_keys=[owner_id], backref='owned_devices') + user = db.relationship('User', foreign_keys=[user_id], backref='used_devices') + +class nbiotDeviceStatus(db.Model): + __tablename__ = 'nbiotDeviceStatus' + id = db.Column(db.Integer, primary_key=True) + name = db.Column(db.String(50), nullable=False) + description = db.Column(db.String(300), nullable=False) + + +class nbiotDeviceType(db.Model): + __tablename__ = 'nbiotDeviceType' + id = db.Column(db.Integer, primary_key=True) + name = db.Column(db.String(50), nullable=False) + description = db.Column(db.String(300), nullable=False) + + +class nbiotDeviceArea(db.Model): + __tablename__ = 'nbiotDeviceArea' + id = db.Column(db.Integer, primary_key=True) + name = db.Column(db.String(50), nullable=False) + description = db.Column(db.String(300), nullable=False) + + +class waterDetector(db.Model): + __tablename__ = 'waterDetector' + id = db.Column(db.Integer, primary_key=True) + pins = db.Column(db.Integer, nullable=True) + alarms = db.Column(db.Integer, nullable=True) + voltage = db.Column(db.Integer, nullable=True) + signal = db.Column(db.Integer, nullable=True) + sleepTime = db.Column(db.Integer, nullable=True) + scanTime = db.Column(db.Integer, nullable=True) + holdTime = db.Column(db.Integer, nullable=True) + timeStamp = db.Column(db.DateTime, nullable=False) + diff --git a/web/minibase/blueprints/sensor/routes.py b/web/minibase/blueprints/sensor/routes.py new file mode 100644 index 00000000..fa49e73e --- /dev/null +++ b/web/minibase/blueprints/sensor/routes.py @@ -0,0 +1,133 @@ +from flask import render_template, Blueprint, request, flash, redirect, url_for +import iot.theme as theme +from iot.blueprints.sensor.models import nbiotDevice +import iot.blueprints.sensor.utils as sensorUtils +from iot.blueprints.sensor.forms import updateNbioDeviceUpdateForm, updateNbioDeviceAddForm +import iot.blueprints.database.utils as dbUtils +import iot.blueprints.user.utils as userUtils +from iot.app import db +import json +import os + +sensor = Blueprint('sensor', __name__, template_folder='templates') + +DATA_FILE = 'data.json' + + +sensor.route('/callback', methods=['POST']) +def callback(): + data = request.json + + if not data: + return jsonify({"error": "Invalid data"}), 400 + + # Read existing data + if os.path.exists(DATA_FILE): + with open(DATA_FILE, 'r') as f: + stored_data = json.load(f) + else: + stored_data = [] + + # Append new data + stored_data.append(data) + + # Write data back to file + with open(DATA_FILE, 'w') as f: + json.dump(stored_data, f, indent=4) + + return 'Callback received', 200 + + +@sensor.route('/data', methods=['GET']) +def get_data(): + if os.path.exists(DATA_FILE): + with open(DATA_FILE, 'r') as f: + stored_data = json.load(f) + else: + stored_data = [] + + return jsonify(stored_data) + + +@sensor.route('/list', methods=['GET','POST']) +def list(): + page=request.args.get('page', 1, type=int) + table=dbUtils.table_printable_paginate(nbiotDevice, page, 20, 'edit/', 'id') + return(render_template('view.html', theme=theme, table=table, title="Devices List")) + + +@sensor.route("/edit/", methods=['GET', 'POST']) +def edit(deviceId): + if deviceId: + device = nbiotDevice.query.get_or_404(deviceId) + form = updateNbioDeviceUpdateForm(current_device_id=device.id) + form.user_id.choices = [(row.id, row.username) for row in userUtils.queryUserChoices(device.user_id)] + form.owner_id.choices = [(row.id, row.username) for row in userUtils.queryUserChoices(device.user_id)] + form.status_id.choices = [(row.id, row.name) for row in sensorUtils.queryStatusChoices(device.status_id)] + form.type_id.choices = [(row.id, row.name) for row in sensorUtils.queryTypeChoices(device.type_id)] + form.area_id.choices = [(row.id, row.name) for row in sensorUtils.queryAreaChoices(device.area_id)] + if form.validate_on_submit(): + device.name=form.name.data + device.device_id=form.device_id.data + device.imsi=form.imsi.data + device.iccid=form.iccid.data + device.ip=form.ip.data + device.port=form.port.data + device.registration_date=form.registration_date.data + device.activation_date=form.activation_date.data + device.deactivation_date=form.deactivation_date.data + device.owner_id=form.owner_id.data + device.user_id=form.user_id.data + device.status_id=form.status_id.data + device.type_id=form.type_id.data + device.area_id=form.area_id.data + db.session.commit() + flash('Device has been successfully updated', 'success') + return redirect(url_for('sensor.edit', deviceId=deviceId)) + elif request.method == 'GET': + form.name.data = device.name + form.device_id.data = device.device_id + form.imsi.data = device.imsi + form.iccid.data = device.iccid + form.ip.data = device.ip + form.port.data = device.port + form.registration_date.data = device.registration_date + form.activation_date.data = device.activation_date + form.deactivation_date.data = device.deactivation_date + + return render_template('sensor/account.html', + theme=theme, + form=form) + else: + flash('You need to select a Device id', 'alarm') + return redirect(url_for('sensor.list')) + + +@sensor.route('/add', methods=['GET', 'POST']) +def add(): + form = updateNbioDeviceAddForm() + form.user_id.choices = [(row.id, row.username) for row in userUtils.queryUserChoices(1)] + form.status_id.choices = [(row.id, row.name) for row in sensorUtils.queryStatusChoices(1)] + form.type_id.choices = [(row.id, row.name) for row in sensorUtils.queryTypeChoices(1)] + form.area_id.choices = [(row.id, row.name) for row in sensorUtils.queryAreaChoices(1)] + if form.validate_on_submit(): + dev = nbiotDevice( + name=form.name.data, + device_id=form.device_id.data, + imsi=form.imsi.data, + iccid=form.iccid.data, + ip=form.ip.data, + port=form.port.data, + registration_date=form.registration_date.data, + activation_date=form.activation_date.data, + deactivation_date=form.deactivation_date.data, + user_id=form.user_id.data, + status_id=form.status_id.data, + type_id=form.type_id.data, + area_id=form.area_id.data) + dbUtils.dbAddAndCommit(dev) + flash('Device has been successfully added', 'success') + + return render_template('sensor/account.html', + theme=theme, + form=form) diff --git a/web/minibase/blueprints/sensor/templates/sensor/account.html b/web/minibase/blueprints/sensor/templates/sensor/account.html new file mode 100644 index 00000000..c4116c30 --- /dev/null +++ b/web/minibase/blueprints/sensor/templates/sensor/account.html @@ -0,0 +1,27 @@ +{% extends "base.html" %} +{% block content %} + +
+
+
+
+ + +
+
+
+ +
+
+ {% include 'form.html' %} +
+
+ +
+
+ {{ info }} +
+
+
+
+{% endblock content %} diff --git a/web/minibase/blueprints/sensor/templates/sensor/index.html b/web/minibase/blueprints/sensor/templates/sensor/index.html new file mode 100644 index 00000000..17a2ec48 --- /dev/null +++ b/web/minibase/blueprints/sensor/templates/sensor/index.html @@ -0,0 +1,8 @@ +{% extends "base.html" %} + +{% block title %}iot{% endblock %} + +{% block content %} +

Hompage of iot

+{{ info }} +{% endblock %} diff --git a/web/minibase/blueprints/sensor/utils.py b/web/minibase/blueprints/sensor/utils.py new file mode 100644 index 00000000..b51bfb79 --- /dev/null +++ b/web/minibase/blueprints/sensor/utils.py @@ -0,0 +1,22 @@ +from iot.blueprints.sensor.models import nbiotDevice, nbiotDeviceStatus, nbiotDeviceType, nbiotDeviceArea +from sqlalchemy import case + + + +def queryById(id): + return nbiotDevice.query.filter_by(id=id).first() + + +def queryStatusChoices(curretnId): + choices = nbiotDeviceStatus.query.order_by(case((nbiotDeviceStatus.id == curretnId, 0),else_=1),nbiotDeviceStatus.name.asc()) + return choices + + +def queryTypeChoices(curretnId): + choices = nbiotDeviceType.query.order_by(case((nbiotDeviceType.id == curretnId, 0),else_=1),nbiotDeviceType.name.asc()) + return choices + + +def queryAreaChoices(curretnId): + choices = nbiotDeviceArea.query.order_by(case((nbiotDeviceArea.id == curretnId, 0),else_=1),nbiotDeviceArea.name.asc()) + return choices diff --git a/web/minibase/menuDictionary.py b/web/minibase/menuDictionary.py new file mode 100644 index 00000000..d449c09c --- /dev/null +++ b/web/minibase/menuDictionary.py @@ -0,0 +1,29 @@ +import os + +def generate_blueprint_structure(root_dir): + blueprint = {} + + # Traverse the directory structure starting from the root_dir + for root, dirs, files in os.walk(root_dir): + # Identify the relative path to the current directory + relative_path = os.path.relpath(root, root_dir) + # Skip the root directory itself + if relative_path == ".": + continue + # Split the relative path into its components + path_parts = relative_path.split(os.sep) + # Check if we're in a directory like user/templates/user/ + if len(path_parts) >= 3: + if path_parts[0] == path_parts[2]: + blueprint_name = path_parts[2] + # Initialize the dictionary for the blueprint if it doesn't exist + if blueprint_name not in blueprint: + blueprint[blueprint_name] = {"directory": [], "html_files": []} + blueprint[blueprint_name]["directory"].append(blueprint_name) + + # Process files, specifically .html files, and add them to the "html_files" list + for f in files: + if f.endswith(".html"): + blueprint[blueprint_name]["html_files"].append(os.path.splitext(f)[0]) + return blueprint + diff --git a/web/minibase/templates/form.html b/web/minibase/templates/form.html index 57920858..2854705e 100644 --- a/web/minibase/templates/form.html +++ b/web/minibase/templates/form.html @@ -5,33 +5,12 @@ {% if item.id == 'submit' %} {% elif item.id == 'csrf_token' %} {% else %} - {% if item.type == 'BooleanField' %} -
- {{ item.label(class=theme.form.check_label_class, style=theme.form.check_label_style) }} - {% else %} - {{ item.label(class=theme.form.input_label_class, style=theme.form.input_label_style) }} - {% endif %} - - {% if item.errors %} - {{ item(class=theme.form.input_error_class) }} -
- {% for error in item.errors %} - {{ error }} - {% endfor %} -
- {% else %} - {% if item.type == 'BooleanField' %} - {{ item(class=theme.form.check_class) }} - {% else %} - {{ item(class=theme.form.input_class) }} - {% endif %} - {% endif %} + {% include 'form/stringField.html' %} + {% include 'form/selectFieldVer.html' %} + {% include 'form/dateField.html' %} + {% include 'form/boolField.html' %} {% endif %} {% endfor %} -
-
- {{ form.submit(class=theme.form.submit_class, style=theme.form.submit_style) }} -
-
+
{% include 'form/submitField.html' %}
diff --git a/web/minibase/templates/form/boolField.html b/web/minibase/templates/form/boolField.html new file mode 100644 index 00000000..aa69cfc5 --- /dev/null +++ b/web/minibase/templates/form/boolField.html @@ -0,0 +1,15 @@ +{% if item.type == 'BooleanField' %} + {{ item.label(class=theme.form.check_label_class, style=theme.form.check_label_style) }} +{% endif %} +{% if item.errors %} + {{ item(class=theme.form.input_error_class) }} +
+ {% for error in item.errors %} + {{ error }} + {% endfor %} +
+{% else %} + {% if item.type == 'BooleanField' %} + {{ item(class=theme.form.check_class) }} + {% endif %} +{% endif %} diff --git a/web/minibase/templates/form/boolFields.html b/web/minibase/templates/form/boolFields.html new file mode 100644 index 00000000..0649be71 --- /dev/null +++ b/web/minibase/templates/form/boolFields.html @@ -0,0 +1,23 @@ +{% for item in form %} + {% if item.id == 'submit' %} + {% elif item.id == 'csrf_token' %} + {% else %} + {% if item.type == 'BooleanField' %} +
+ {{ item.label(class=theme.form.check_label_class, style=theme.form.check_label_style) }} + {% endif %} + {% if item.errors %} + {{ item(class=theme.form.input_error_class) }} +
+ {% for error in item.errors %} + {{ error }} + {% endfor %} +
+ {% else %} + {% if item.type == 'BooleanField' %} +
+ {{ item(class=theme.form.check_class) }} + {% endif %} + {% endif %} + {% endif %} +{% endfor %} diff --git a/web/minibase/templates/form/dateField.html b/web/minibase/templates/form/dateField.html new file mode 100644 index 00000000..a350e9da --- /dev/null +++ b/web/minibase/templates/form/dateField.html @@ -0,0 +1,15 @@ +{% if item.type in ['DateField', 'DateTimeField'] %} + {{ item.label(class=theme.form.input_label_class, style=theme.form.input_label_style) }} +{% endif %} +{% if item.errors %} + {{ item(class=theme.form.input_error_class) }} +
+ {% for error in item.errors %} + {{ error }} + {% endfor %} +
+{% else %} + {% if item.type in ['DateField', 'DateTimeField'] %} + {{ item(class=theme.form.input_class, type=theme.form.date_type) }} + {% endif %} +{% endif %} diff --git a/web/minibase/templates/form/dateFields.html b/web/minibase/templates/form/dateFields.html new file mode 100644 index 00000000..ea6a0c85 --- /dev/null +++ b/web/minibase/templates/form/dateFields.html @@ -0,0 +1,23 @@ +{% for item in form %} + {% if item.id == 'submit' %} + {% elif item.id == 'csrf_token' %} + {% else %} + {% if item.type in ['DateField', 'DateTimeField'] %} +
+ {{ item.label(class=theme.form.input_label_class, style=theme.form.input_label_style) }} + {% endif %} + {% if item.errors %} + {{ item(class=theme.form.input_error_class) }} +
+ {% for error in item.errors %} + {{ error }} + {% endfor %} +
+ {% else %} + {% if item.type in ['DateField', 'DateTimeField'] %} +
+ {{ item(class=theme.form.input_class, type=theme.form.date_type) }} + {% endif %} + {% endif %} + {% endif %} +{% endfor %} diff --git a/web/minibase/templates/form/formError.html b/web/minibase/templates/form/formError.html new file mode 100644 index 00000000..fb6de25d --- /dev/null +++ b/web/minibase/templates/form/formError.html @@ -0,0 +1,6 @@ +{{ item(class=theme.form.input_error_class) }} +
+ {% for error in item.errors %} + {{ error }} + {% endfor %} +
diff --git a/web/minibase/templates/form/integerField.html b/web/minibase/templates/form/integerField.html new file mode 100644 index 00000000..128d4dcd --- /dev/null +++ b/web/minibase/templates/form/integerField.html @@ -0,0 +1,15 @@ +{% if item.type in ['IntegerField', 'DecimalField', 'FloatField'] %} + {{ item.label(class=theme.form.input_label_class, style=theme.form.input_label_style) }} +{% endif %} +{% if item.errors %} + {{ item(class=theme.form.input_error_class) }} +
+ {% for error in item.errors %} + {{ error }} + {% endfor %} +
+{% else %} +{% if item.type in ['IntegerField', 'DecimalField', 'FloatField'] %} + {{ item(class=theme.form.input_class) }} + {% endif %} +{% endif %} diff --git a/web/minibase/templates/form/selectFieldHor.html b/web/minibase/templates/form/selectFieldHor.html new file mode 100644 index 00000000..e3f2590c --- /dev/null +++ b/web/minibase/templates/form/selectFieldHor.html @@ -0,0 +1,15 @@ +{% if item.type in ['SelectField'] %} + {{ item.label(class=theme.form.input_label_class, style=theme.form.input_label_style) }} +{% endif %} +{% if item.errors %} + {{ item(class=theme.form.input_error_class) }} +
+ {% for error in item.errors %} + {{ error }} + {% endfor %} +
+{% else %} + {% if item.type in ['SelectField'] %} + {{ item(class=theme.form.select_class, type=theme.form.select_type, style=theme.form.select_style) }} + {% endif %} +{% endif %} diff --git a/web/minibase/templates/form/selectFieldVer.html b/web/minibase/templates/form/selectFieldVer.html new file mode 100644 index 00000000..fd8227e4 --- /dev/null +++ b/web/minibase/templates/form/selectFieldVer.html @@ -0,0 +1,17 @@ +{% if item.type in ['SelectField'] %} + {{ item.label(class=theme.form.input_label_class, style=theme.form.input_label_style) }} +
+{% endif %} +{% if item.errors %} + {{ item(class=theme.form.input_error_class) }} +
+ {% for error in item.errors %} + {{ error }} + {% endfor %} +
+{% else %} + {% if item.type in ['SelectField'] %} + {{ item(class=theme.form.select_class, type=theme.form.select_type, style=theme.form.select_style) }} +
+ {% endif %} +{% endif %} diff --git a/web/minibase/templates/form/selectFields.html b/web/minibase/templates/form/selectFields.html new file mode 100644 index 00000000..456e0a39 --- /dev/null +++ b/web/minibase/templates/form/selectFields.html @@ -0,0 +1,23 @@ +{% for item in form %} + {% if item.id == 'submit' %} + {% elif item.id == 'csrf_token' %} + {% else %} + {% if item.type in ['SelectField'] %} +
+ {{ item.label(class=theme.form.input_label_class, style=theme.form.input_label_style) }} + {% endif %} + {% if item.errors %} + {{ item(class=theme.form.input_error_class) }} +
+ {% for error in item.errors %} + {{ error }} + {% endfor %} +
+ {% else %} + {% if item.type in ['SelectField'] %} +
+ {{ item(class=theme.form.select_class, type=theme.form.select_type, style=theme.form.select_style) }} + {% endif %} + {% endif %} + {% endif %} +{% endfor %} diff --git a/web/minibase/templates/form/stringField.html b/web/minibase/templates/form/stringField.html new file mode 100644 index 00000000..060fd3a7 --- /dev/null +++ b/web/minibase/templates/form/stringField.html @@ -0,0 +1,15 @@ +{% if item.type in ['StringField', 'TextAreaField', 'PasswordField'] %} + {{ item.label(class=theme.form.input_label_class, style=theme.form.input_label_style) }} +{% endif %} +{% if item.errors %} + {{ item(class=theme.form.input_error_class) }} +
+ {% for error in item.errors %} + {{ error }} + {% endfor %} +
+{% else %} + {% if item.type in ['StringField', 'TextAreaField', 'PasswordField'] %} + {{ item(class=theme.form.input_class) }} + {% endif %} +{% endif %} diff --git a/web/minibase/templates/form/stringFields.html b/web/minibase/templates/form/stringFields.html new file mode 100644 index 00000000..26e5e47f --- /dev/null +++ b/web/minibase/templates/form/stringFields.html @@ -0,0 +1,21 @@ +{% for item in form %} + {% if item.id == 'submit' %} + {% elif item.id == 'csrf_token' %} + {% else %} + {% if item.type in ['StringField', 'TextAreaField', 'PasswordField'] %} + {{ item.label(class=theme.form.input_label_class, style=theme.form.input_label_style) }} + {% endif %} + {% if item.errors %} + {{ item(class=theme.form.input_error_class) }} +
+ {% for error in item.errors %} + {{ error }} + {% endfor %} +
+ {% else %} + {% if item.type in ['StringField', 'TextAreaField', 'PasswordField'] %} + {{ item(class=theme.form.input_class) }} + {% endif %} + {% endif %} + {% endif %} +{% endfor %} diff --git a/web/minibase/templates/form/submitField.html b/web/minibase/templates/form/submitField.html new file mode 100644 index 00000000..9c91323b --- /dev/null +++ b/web/minibase/templates/form/submitField.html @@ -0,0 +1,5 @@ +
+
+ {{ form.submit(class=theme.form.submit_class, style=theme.form.submit_style) }} +
+
diff --git a/web/minibase/templates/formAddress.html b/web/minibase/templates/formAddress.html new file mode 100644 index 00000000..856c7194 --- /dev/null +++ b/web/minibase/templates/formAddress.html @@ -0,0 +1,34 @@ +
+ {{ form.hidden_tag() }} +
+ {% if itemList | length == 1 %} +
+
+ {% include 'form.html' %} +
+
+ {% else %} + {% for labelItems in itemList %} +
+
+ {% for item in form %} + {% if item.id == 'submit' %} + {% elif item.id == 'csrf_token' %} + {% else %} + {% for label in labelItems %} + {% if label == item.name %} + {% include 'form/stringField.html' %} + {% include 'form/selectFieldVer.html' %} + {% include 'form/dateField.html' %} + {% include 'form/boolField.html' %} + {% endif %} + {% endfor %} + {% endif %} + {% endfor %} +
+
+ {% endfor %} + {% endif %} +
+
{% include 'form/submitField.html' %}
+
diff --git a/web/minibase/templates/formDiv.html b/web/minibase/templates/formDiv.html new file mode 100644 index 00000000..d3979c9d --- /dev/null +++ b/web/minibase/templates/formDiv.html @@ -0,0 +1,10 @@ +
+ {{ form.hidden_tag() }} +
+
{% include 'form/stringFields.html' %}
+
{% include 'form/selectFields.html' %}
+
{% include 'form/dateFields.html' %}
+
{% include 'form/boolFields.html' %}
+
+
{% include 'form/submitField.html' %}
+
diff --git a/web/minibase/templates/navbar.html b/web/minibase/templates/navbar.html index a59783d0..2726ba78 100644 --- a/web/minibase/templates/navbar.html +++ b/web/minibase/templates/navbar.html @@ -14,7 +14,7 @@ {% if item.sublinks %}