diff --git a/web/init/static/csv/.~lock.nbiotDevice.csv# b/web/init/static/csv/.~lock.nbiotDevice.csv# new file mode 100644 index 00000000..fbdda0be --- /dev/null +++ b/web/init/static/csv/.~lock.nbiotDevice.csv# @@ -0,0 +1 @@ +,key,devbian,16.08.2024 16:53,file:///home/key/.config/libreoffice/4; \ No newline at end of file diff --git a/web/init/static/csv/nbiotDevice.csv b/web/init/static/csv/nbiotDevice.csv index e45ca2a1..80770a60 100644 --- a/web/init/static/csv/nbiotDevice.csv +++ b/web/init/static/csv/nbiotDevice.csv @@ -1,2 +1,3 @@ -name,device_id,serial_no,imsi,iccid,ip,port,device_user_id,device_owner_id,company_manufacturer_id,status_id,type_id,area_id,company_owner_id -miniUni,24070580,24070576,901405710203483,898822800001074,10.128.24.42,50000,1,1,1,1,1,1,3 +name,model,device_id,serial_no,imsi,iccid,ip,port,device_user_id,device_owner_id,company_manufacturer_id,status_id,type_id,area_id,company_owner_id +miniUni,NB-MU-CON-IP65,24070580,24070576,901405710203483,89882280000107407542,10.128.24.42,50000,1,1,1,1,1,1,1 +miniUni,NB-MU-CON-IP65,24070578,24070574,901405710203484,89882280000107407559,10.128.24.43,50000,1,1,1,1,1,1,1 diff --git a/web/init/static/csv/nbiotDeviceType.csv b/web/init/static/csv/nbiotDeviceType.csv index 4ef5686b..c623ecdc 100644 --- a/web/init/static/csv/nbiotDeviceType.csv +++ b/web/init/static/csv/nbiotDeviceType.csv @@ -1,2 +1,4 @@ name,description -WaterDetector,Sensor for detection water levels. +Water,Sensor for detection water levels. +Humidity,Sensor for detection humidity levels. +Pressure,Sensor for detection pressure levels. diff --git a/web/instance/test.db b/web/instance/test.db index e118a4ab..e6b860de 100644 Binary files a/web/instance/test.db and b/web/instance/test.db differ diff --git a/web/minibase/__pycache__/app.cpython-311.pyc b/web/minibase/__pycache__/app.cpython-311.pyc index 9c2b29a7..fe4b1f25 100644 Binary files a/web/minibase/__pycache__/app.cpython-311.pyc and b/web/minibase/__pycache__/app.cpython-311.pyc differ diff --git a/web/minibase/app.py b/web/minibase/app.py index 57ffcadd..efb63720 100644 --- a/web/minibase/app.py +++ b/web/minibase/app.py @@ -24,6 +24,11 @@ mail = Mail() # So that we can send mails # (SESSION) Starts the curren flask session session = Session() +# Definition of custom filter for Jinja2 +def get_attr(obj, attr): + print(obj) + print(attr) + return(getattr(obj, attr.strip(), None) ) def create_app(): # (APP) Definition @@ -39,10 +44,10 @@ def create_app(): # (EMAIL AGENT) Initialisation mail.init_app(app) # Session for variable manipulation on server side - + # (DATABASE) Linking the app and the Database Migrate(app, db) - + # (BLUEPRINTS) Importing the blueprints. # Include are made here to awoid the Circular import issues from minibase.blueprints.main.routes import main @@ -51,7 +56,8 @@ def create_app(): from minibase.blueprints.company.routes import company from minibase.blueprints.geography.routes import geography from minibase.blueprints.sensor.routes import sensor - + from minibase.blueprints.database.routes import database + # (BLUEPRINTS) Registering the blueprints. # Giving them theie ulr_prefixes that will define their links on the webBrowser. app.register_blueprint(main, url_prefix='/') @@ -60,6 +66,10 @@ def create_app(): app.register_blueprint(company, url_prefix='/company') app.register_blueprint(geography, url_prefix='/geography') app.register_blueprint(sensor, url_prefix='/sensor') + app.register_blueprint(database, url_prefix='/database') + + # Addinf the custom get_attr() filter to Jinja2 template engine + app.add_template_filter(get_attr) # (APP) Returning the initialised app return app diff --git a/web/minibase/blueprints/company/__pycache__/forms.cpython-311.pyc b/web/minibase/blueprints/company/__pycache__/forms.cpython-311.pyc index 2f1c87a7..00a63282 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 5a8b1904..5e1cbd05 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 5fea3b3f..ad6edccc 100644 --- a/web/minibase/blueprints/company/forms.py +++ b/web/minibase/blueprints/company/forms.py @@ -31,8 +31,10 @@ class companyForm(FlaskForm): # Defines the form class to be used for the user image_file = FileField('Update company Picture', validators=[FileAllowed(['jpg', 'png'])]) submit = SubmitField() - + def populate_for_updating(self, company): + self.originalModel = company + print(f"company.name={company.name}") self.submit.label.text = "Update" self.country_id.choices = [(row.id, row.name) for row in geoUtils.queryCountryNamesWithDefault(company.country_id)] @@ -51,10 +53,10 @@ class companyForm(FlaskForm): # Defines the form class to be used for the user self.status_id.choices = [(row.id, row.name) for row in companyUtils.queryStatusNamesWithDefault(company.status_id)] def populate_for_adding(self, company): + self.originalModel = company self.submit.label.text = "Add" del self.image_file - self.country_id.choices = [(row.id, row.name) for row in geoUtils.queryCountryNames()] # This is for the htmx implementation. please be careful how of there is data we switch the funtion needed @@ -71,8 +73,9 @@ class companyForm(FlaskForm): # Defines the form class to be used for the user self.relation_id.choices = [(row.id, row.name) for row in companyUtils.queryRelationNames()] self.status_id.choices = [(row.id, row.name) for row in companyUtils.queryStatusNames()] - # Queries to be made in order to validate the form : If username exists - def validate_companyName(self, company_name): - company = companyUtils.queryByNameFirst(company_name) - if company: - raise ValidationError('That username is taken please choose another one') + #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 (Companies.query.filter(Companies.name.ilike(f'%{input.data}%')).first()): + raise ValidationError('This Company already registered') + diff --git a/web/minibase/blueprints/database/__pycache__/routes.cpython-311.pyc b/web/minibase/blueprints/database/__pycache__/routes.cpython-311.pyc new file mode 100644 index 00000000..b08b6cbe Binary files /dev/null and b/web/minibase/blueprints/database/__pycache__/routes.cpython-311.pyc differ diff --git a/web/minibase/blueprints/database/__pycache__/utils.cpython-311.pyc b/web/minibase/blueprints/database/__pycache__/utils.cpython-311.pyc index c988bdbb..766b0cf5 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/routes.py b/web/minibase/blueprints/database/routes.py new file mode 100644 index 00000000..85dc49b9 --- /dev/null +++ b/web/minibase/blueprints/database/routes.py @@ -0,0 +1,31 @@ +from flask import render_template, Blueprint, request, flash, redirect, url_for, jsonify +from minibase.blueprints.company.models import Companies + +database = Blueprint('database', __name__, template_folder='templates') + +@database.route('/search////', methods=['GET']) +def search_auto(field_name, table_name, key_name, ret_name): + keyLike = request.args.get('modalReqArg', '') + + MODEL_MAP = { + 'Companies': Companies, + } + + table = MODEL_MAP.get(table_name) + if table is None: + return f"Error: Table '{table_name}' not found.", 400 + + column = getattr(table, key_name.strip(), None) + + if column is None: + return f"Error: Column '{key_name}' not found in table '{table_name}'.", 400 + + # Proceed with filtering if the column is found + results = table.query.filter(column.ilike(f'%{keyLike}%')).all() + + return render_template('database/search_results.html', field_name=field_name, results=results, returnAttr=ret_name) + + +@database.route('/select///', methods=['GET']) +def select_field(field_name, result_id, result_content): + return f'' diff --git a/web/minibase/blueprints/database/templates/database/search_results.html b/web/minibase/blueprints/database/templates/database/search_results.html new file mode 100644 index 00000000..96b4aa6b --- /dev/null +++ b/web/minibase/blueprints/database/templates/database/search_results.html @@ -0,0 +1,12 @@ + diff --git a/web/minibase/blueprints/sensor/__pycache__/forms.cpython-311.pyc b/web/minibase/blueprints/sensor/__pycache__/forms.cpython-311.pyc index aa521cc7..3394b3eb 100644 Binary files a/web/minibase/blueprints/sensor/__pycache__/forms.cpython-311.pyc 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 index c427c599..bcb4bb72 100644 Binary files a/web/minibase/blueprints/sensor/__pycache__/models.cpython-311.pyc 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 index d83ead71..587e7cbf 100644 Binary files a/web/minibase/blueprints/sensor/__pycache__/routes.cpython-311.pyc and b/web/minibase/blueprints/sensor/__pycache__/routes.cpython-311.pyc differ diff --git a/web/minibase/blueprints/sensor/forms.py b/web/minibase/blueprints/sensor/forms.py index aaaeec6d..135ba538 100644 --- a/web/minibase/blueprints/sensor/forms.py +++ b/web/minibase/blueprints/sensor/forms.py @@ -10,6 +10,7 @@ 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)]) @@ -19,71 +20,75 @@ class nbiotDeviceForm(FlaskForm): # Defines the self class to be used for the u 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') + 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()]) - manufacturer_id = SelectField('Manufacturer', validators=[DataRequired()], - render_kw={ - 'hx-target': '#manufacturer_id', # Target div or modal for the popup - 'hx-swap': 'outerHTML' # Swap the outer HTML of the target element - }) - company_id = SelectField('Managed By', 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.user_id.choices = [(row.id, row.username) for row in userUtils.queryUserNamesWithDefault(device.device_user_id)] - self.owner_id.choices = [(row.id, row.username) for row in userUtils.queryUserNamesWithDefault(device.device_owner_id)] - self.manufacturer_id.choices = [(row.id, row.name) for row in companyUtils.queryNamesWithDefault(device.company_manufacturer_id)] - self.company_id.choices = [(row.id, row.name) for row in companyUtils.queryNamesWithDefault(device.company_owner_id)] + 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.manufacturer_id.data: - self.manufacturer_id.choices = [(row.id, row.name) for row in companyUtils.queryNamesWithDefault(self.manufacturer_id.data)] + 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.user_id.choices = [(row.id, row.username) for row in userUtils.queryUserNamesWithDefault(device.device_user_id)] - self.owner_id.choices = [(row.id, row.username) for row in userUtils.queryUserNamesWithDefault(device.device_owner_id)] - self.manufacturer_id.choices = [(row.id, row.name) for row in companyUtils.queryNamesWithDefault(device.company_manufacturer_id)] - self.company_id.choices = [(row.id, row.name) for row in companyUtils.queryNamesWithDefault(device.company_owner_id)] + 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.name: - content = nbiotDevice.query.filter_by(name=input.data).first() - if content: - raise ValidationError('That device name is taken please choose another one') + 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_device_id(self, input): - if input.data != self.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_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.imsi: - content = nbiotDevice.query.filter_by(imsi=input.data).first() - if content: - raise ValidationError('That IMSI id is taken please choose another one') + 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.iccid: - content = nbiotDevice.query.filter_by(iccid=input.data).first() - if content: - raise ValidationError('That ICCID id is taken please choose another one') + 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.ip: - content = nbiotDevice.query.filter_by(ip=input.data).first() - if content: - raise ValidationError('That IP id is taken please choose another one') + 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') diff --git a/web/minibase/blueprints/sensor/models.py b/web/minibase/blueprints/sensor/models.py index b43d65e0..4fe4aa32 100644 --- a/web/minibase/blueprints/sensor/models.py +++ b/web/minibase/blueprints/sensor/models.py @@ -6,6 +6,7 @@ class nbiotDevice(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50), nullable=False) + model = db.Column(db.String(50), nullable=False) serial_no = db.Column(db.String(50), nullable=False) device_id = db.Column(db.String(30), nullable=False) imsi = db.Column(db.String(30), nullable=False) diff --git a/web/minibase/blueprints/sensor/routes.py b/web/minibase/blueprints/sensor/routes.py index a427686c..910c785d 100644 --- a/web/minibase/blueprints/sensor/routes.py +++ b/web/minibase/blueprints/sensor/routes.py @@ -80,15 +80,15 @@ def edit(deviceId): form.populate_for_updating(device) _accountInfo = mainUtils.accountInfo( title=device.name, - description=device.legal_entity.name, - short=device.website, - status=device.type.name, + description=device.company_owner.name, + short=device.device_owner.username, + status=device.status.name, image_file=mainUtils.imageFileLink(device.image_file) ) if form.validate_on_submit(): - if form.picture.data: - picture_file = mainUtils.save_picture(form.picture.data) + if form.image_file.data: + picture_file = mainUtils.save_picture(form.image_file.data) device.image_file = picture_file mainUtils.fill_model(device, form) @@ -127,22 +127,3 @@ def add(): return render_template('edit.html', theme=theme, form=form) - -@sensor.route('/search/', methods=['GET']) -def search_field(field_name): - query = request.args.get('modalQueryArg', '') - # Assuming field_name corresponds to a model field, you would add conditional logic here to query the correct model. - if field_name == 'manufacturer_id': - results = Companies.query.filter(Companies.name.ilike(f'%{query}%')).all() - # Add more conditions for other fields as needed - return render_template('sensor/manufacturer_search_results.html', results=results, field_name=field_name) - - -@sensor.route('/select//', methods=['GET']) -def select_field(field_name, result_id): - # Return the selected option - # This is a simplified example, you'll need to adapt this to your specific model fields and logic. - if field_name == 'manufacturer_id': - selected = Companies.query.get(result_id) - return render_template("sensor/manufacturer_options.html", selected=selected) - diff --git a/web/minibase/blueprints/sensor/templates/sensor/manufacturer_options.html b/web/minibase/blueprints/sensor/templates/sensor/manufacturer_options.html deleted file mode 100644 index fb4d2fab..00000000 --- a/web/minibase/blueprints/sensor/templates/sensor/manufacturer_options.html +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/web/minibase/blueprints/sensor/templates/sensor/manufacturer_search_results.html b/web/minibase/blueprints/sensor/templates/sensor/manufacturer_search_results.html deleted file mode 100644 index 636c830c..00000000 --- a/web/minibase/blueprints/sensor/templates/sensor/manufacturer_search_results.html +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/web/minibase/blueprints/user/__pycache__/models.cpython-311.pyc b/web/minibase/blueprints/user/__pycache__/models.cpython-311.pyc index eca98c8f..df776b20 100644 Binary files a/web/minibase/blueprints/user/__pycache__/models.cpython-311.pyc and b/web/minibase/blueprints/user/__pycache__/models.cpython-311.pyc differ diff --git a/web/minibase/blueprints/user/models.py b/web/minibase/blueprints/user/models.py index c19cac18..fdc2d516 100644 --- a/web/minibase/blueprints/user/models.py +++ b/web/minibase/blueprints/user/models.py @@ -13,15 +13,23 @@ def load_user(user_id): class Users(db.Model, UserMixin): __tablename__ = 'users' - id = db.Column(db.Integer, primary_key=True) - username = db.Column(db.String(20), unique=True, nullable=False) - email_account = db.Column(db.String(120), unique=True, nullable=False) - email_comm = db.Column(db.String(120), unique=False, nullable=False) - role = db.Column(db.String(120), unique=False, nullable=False, default='user') - image_file = db.Column(db.String(20), nullable=False, default='def_avatar.png') - password = db.Column(db.String(60), nullable=False) - upload_date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) - last_update_date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow) + id = db.Column(db.Integer, primary_key=True) + username = db.Column(db.String(30), unique=True, nullable=False) + name = db.Column(db.String(30), nullable=False) + surname = db.Column(db.String(30), nullable=False) + email_account = db.Column(db.String(120), unique=True, nullable=False) + email_comm = db.Column(db.String(120), unique=False, nullable=False) + role = db.Column(db.String(120), unique=False, nullable=False, default='user') + street = db.Column(db.String(100), nullable=False) + street_no = db.Column(db.Integer, nullable=False) + post_code = db.Column(db.Integer, nullable=False) + city_id = db.Column(db.Integer, db.ForeignKey('cities.id'), nullable=False) + state_id = db.Column(db.Integer, db.ForeignKey('states.id'), nullable=False) + country_id = db.Column(db.Integer, db.ForeignKey('countries.id'), nullable=False) + image_file = db.Column(db.String(20), nullable=False, default='def_avatar.png') + password = db.Column(db.String(60), nullable=False) + upload_date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) + last_update_date= db.Column(db.DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow) # Relations One To Many notes = db.relationship('Notes', backref='author', lazy='dynamic') diff --git a/web/minibase/templates/edit.html b/web/minibase/templates/edit.html index eb4c26fb..bdef555a 100644 --- a/web/minibase/templates/edit.html +++ b/web/minibase/templates/edit.html @@ -5,7 +5,7 @@

{{ title }}

- {% include 'formModal.html' %} + {% include 'form.html' %} {% if extraButtons %}
diff --git a/web/minibase/templates/editModal.html b/web/minibase/templates/editModal.html deleted file mode 100644 index bdef555a..00000000 --- a/web/minibase/templates/editModal.html +++ /dev/null @@ -1,21 +0,0 @@ -{% extends "base.html" %} -{% block title %}{{ title }}{% endblock %} -{% block content %} -
-

{{ title }}

-
-
- {% include 'form.html' %} - {% if extraButtons %} -
-
-
-
- {% for button in extraButtons %} -
  • {{ button.name }} - {% endfor %} -
    -
  • - {% endif %} -
    -{% endblock content %} diff --git a/web/minibase/templates/form/allFieldsModal.html b/web/minibase/templates/form/allFieldsModal.html deleted file mode 100644 index 342a5ecb..00000000 --- a/web/minibase/templates/form/allFieldsModal.html +++ /dev/null @@ -1,7 +0,0 @@ -{% include 'form/stringField.html' %} -{% include 'form/selectFieldModal.html' %} -{% include 'form/dateField.html' %} -{% include 'form/boolField.html' %} -{% include 'form/fileField.html' %} -{% include 'form/urlField.html' %} -{% include 'form/integerField.html' %} diff --git a/web/minibase/templates/form/selectField.html b/web/minibase/templates/form/selectField.html index c73e3524..360ed9d8 100644 --- a/web/minibase/templates/form/selectField.html +++ b/web/minibase/templates/form/selectField.html @@ -1,6 +1,12 @@ {% if item.type in ['SelectField'] %} -
    {{ item.label(class=theme.form.select_label_class, style=theme.form.select_label_style) }} -
    + {% if item.render_kw['custom_option'] == 'search_field' %} +
    + {{ item(class=theme.form.select_class, type=theme.form.select_type, style=theme.form.select_style)}} + +
    + {% include 'htmx/popup.html' %} + {% else %} {{ 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/selectFieldModal.html b/web/minibase/templates/form/selectFieldModal.html deleted file mode 100644 index 22e34208..00000000 --- a/web/minibase/templates/form/selectFieldModal.html +++ /dev/null @@ -1,33 +0,0 @@ -{% if item.type in ['SelectField'] %} -
    - {{ item.label(class=theme.form.select_label_class, style=theme.form.select_label_style) }} -
    -
    - {{ item(class=theme.form.select_class, type=theme.form.select_type, style=theme.form.select_style)}} - -
    - -{% endif %} diff --git a/web/minibase/templates/formModal.html b/web/minibase/templates/formModal.html deleted file mode 100644 index 433d0856..00000000 --- a/web/minibase/templates/formModal.html +++ /dev/null @@ -1,18 +0,0 @@ -
    - {{ form.hidden_tag() }} -
    - {% for item in form %} - {% if item.id == 'submit' %} - {% elif item.id == 'csrf_token' %} - {% else %} - {% include 'form/allFieldsModal.html' %} - {% if item.errors %} - {% include 'form/formError.html' %} - {% endif %} - {% endif %} - {% endfor %} -
    -
    - {% include 'form/submitField.html' %} -
    -
    diff --git a/web/minibase/templates/htmx/popup.html b/web/minibase/templates/htmx/popup.html new file mode 100644 index 00000000..f922159b --- /dev/null +++ b/web/minibase/templates/htmx/popup.html @@ -0,0 +1,28 @@ + diff --git a/web/prepare_db.py b/web/prepare_db.py index 5c1c3d04..603b410c 100644 --- a/web/prepare_db.py +++ b/web/prepare_db.py @@ -53,13 +53,11 @@ def initDatabase(): uploadCsvOnlyName(nbiotDevice) hashed_pw = bcrypt.generate_password_hash('pass').decode('utf-8') - user = Users(username="Admin", email_account="admin@kynsight.com", email_comm="admin@kynsight.com", password=hashed_pw, role_id=1) + user = Users(username="Admin", name="Kerem", surname="Yollu", email_account="admin@kynsight.com", email_comm="admin@kynsight.com", password=hashed_pw, role_id=1, street="Meierackerstrasse", street_no="10", city_id="1", post_code="6810", state_id="1", country_id="1") db.session.add(user) - hashed_pw = bcrypt.generate_password_hash('pass').decode('utf-8') - user = Users(username="KeremYollu", email_account="kerem.yollu@gmail.com", email_comm="kerem.yollu@gmail.com", password=hashed_pw, role_id=2) + user = Users(username="KeremYollu", name="Kerem", surname="Yollu", email_account="kerem.yollu@gmail.com", email_comm="kerem.yollu@gmail.com", password=hashed_pw, role_id=2, street="Meierackerstrasse", street_no="10", post_code="8610", city_id="1", state_id="1", country_id="1") db.session.add(user) - hashed_pw = bcrypt.generate_password_hash('pass').decode('utf-8') - user = Users(username="Kynsight", email_account="kerem.yollu@kynsight.com", email_comm="kerem.yollu@kynsight.com", password=hashed_pw, role_id=3) + user = Users(username="Dadasli", name="Suleyman", surname="Yozgat", email_account="suleyman.yozgat@gmail.com", email_comm="suleyman.yozgat@gmail.com", password=hashed_pw, role_id=3, street="Kuskonmaz Sok.", street_no="11a", post_code="3451", city_id="1", state_id="1", country_id="1") db.session.add(user) db.session.commit()