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' %}
-
-
{% 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 %}
+
+
+
+
+
+
{{ current_user.username }}
+ {{ current_user.email_account }}
+
+
+
+
+
+
+ {% include 'form.html' %}
+
+
+
+
+
+
+{% 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 @@
+
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 @@
+
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 %}
- {{item.text}}
+ {{item.menuName}}
{% elif item.url %}
- {{item.text}}
+ {{item.menuName}}
{% elif item.decoration %}
{% endif %}
@@ -48,7 +48,7 @@
{% if item.sublinks %}
- {{item.text}}
+ {{item.menuName}}
{% elif item.url %}
- {{item.text}}
+ {{item.menuName}}
{% endif %}
{% endif %}
@@ -72,7 +72,7 @@
{% if item.sublinks %}
- {{item.text}}
+ {{item.menuName}}
{% elif item.url %}
- {{item.text}}
+ {{item.menuName}}
{% endif %}
{% endif %}
diff --git a/web/minibase/theme.py b/web/minibase/theme.py
index b5dd0e73..d3e0fc0e 100644
--- a/web/minibase/theme.py
+++ b/web/minibase/theme.py
@@ -1,3 +1,4 @@
+from minibase.menuDictionary import generate_blueprint_structure
# Color pallette of kynsight
black = "#191717"
@@ -11,25 +12,35 @@ yellow = "#f8cb66"
class maineTheme:
div_style = "background-color:" + yellow
+
class form:
div_style = "background-color:" + black + "; " +" width:98%;"
div_class = "container rounded p-4 py-4"
div_error_class = "invalid-feedback"
+
input_label_class = "col-form-label"
input_label_style = "color:" + orange + "; font-size: 14pt; font-weight: bold;"
+ input_class = "form-control form-control-lg"
+ input_error_class = input_class+ " is-invalid"
+
check_label_class = "form-check-label"
- check_label_style = input_label_style
+ check_label_style = "input_label_style"
check_class = "form-check-input"
+
submit_class = "btn btn-outline-info mb-2 mt-2"
submit_style = ""
- input_error_class = "form-control form-control-lg is-invalid"
- input_class = "form-control form-control-lg"
+
+
+ date_type = "date"
+ select_class = "btn btn-lg dropdown-toggle"
+ select_style = "color:" + black + "; font-size: 14pt; background-color: " + white + ";"
class menu:
+ menuDict = generate_blueprint_structure('minibase/blueprints')
navbar_items_navigation = [
- {"text": "Relations",
+ {"menuName":"Company",
"sublinks": [
- {"text": "Companies", "url": "main.index"},
+ {"text": "List", "url": "company.list"},
{"text": "Presons", "url": "main.index"},
{"decoration": "line"},
{"text": "Create Company", "url": "main.index"},
@@ -41,20 +52,20 @@ class menu:
]
navbar_items_user = [
- {"text": "Login", "url": "user.login", "show":"not_logged"},
- {"text": "Register", "url": "user.register", "show":"not_logged"},
- {"text": "Account", "url": "user.account", "show":"logged"},
- {"text": "Logout", "url": "user.logout", "show":"logged"}
+ {"menuName": "Login", "url": "user.login", "show":"not_logged"},
+ {"menuName": "Register", "url": "user.register", "show":"not_logged"},
+ {"menuName": "Account", "url": "user.account", "show":"logged"},
+ {"menuName": "Logout", "url": "user.logout", "show":"logged"}
]
navbar_items_admin = [
- {"text": "Admin",
+ {"menuName": "Admin",
"sublinks": [
{"text": "Create User", "url": "main.index"},
{"text": "Delete User", "url": "main.index"},
{"text": "Update User", "url": "main.index"},
],},
- {"text": "Database",
+ {"menuName": "Database",
"sublinks": [
{"text": "Tables", "url": "main.index"},
{"text": "Entires", "url": "main.index"},