Started addinf a search button for every selecField. now its not well automated but it works. need to make it more proper and then we can concentrate on only funtional stuff

master
Kerem Yollu 10 months ago
parent 766f850d98
commit 55b9210990

Binary file not shown.

@ -32,7 +32,7 @@ class companyForm(FlaskForm): # Defines the form class to be used for the user
submit = SubmitField()
def populate_for_update(self, company):
def populate_for_updating(self, company):
self.submit.label.text = "Update"
self.country_id.choices = [(row.id, row.name) for row in geoUtils.queryCountryNamesWithDefault(company.country_id)]
@ -54,6 +54,7 @@ class companyForm(FlaskForm): # Defines the form class to be used for the user
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

@ -1,12 +1,9 @@
from flask import render_template, url_for, flash, redirect, request, Blueprint
from flask_login import login_required, current_user
from flask_login import login_required
import minibase.theme as theme
from minibase.blueprints.company.models import Companies
from minibase.blueprints.geography.models import City
import minibase.blueprints.database.utils as dbUtils
import minibase.blueprints.main.utils as mainUtils
import minibase.blueprints.geography.utils as geoUtils
import minibase.blueprints.company.utils as companyUtils
from minibase.blueprints.company.forms import companyForm
# Declaring a blueprint
@ -26,8 +23,7 @@ def account(companyId):
if companyId:
company = Companies.query.get_or_404(companyId)
form = companyForm()
form.populate_for_update(company)
form.populate_for_updating(company)
_accountInfo = mainUtils.accountInfo(
title=company.name,
description=company.legal_entity.name,
@ -55,7 +51,6 @@ def account(companyId):
return redirect(url_for('company.list'))
@company.route("/add", methods=['GET', 'POST'])
@login_required
def add():

@ -1,14 +1,17 @@
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 wtforms import StringField, SubmitField, BooleanField, URLField, IntegerField, DateField, SelectField
from wtforms.validators import DataRequired, Length, ValidationError
from minibase.blueprints.sensor.models import nbiotDevice
import minibase.blueprints.company.utils as companyUtils
import minibase.blueprints.user.utils as userUtils
import minibase.blueprints.sensor.utils as sensorUtils
from datetime import date
class updateNbioDeviceUpdateForm(FlaskForm): # Defines the form class to be used for the user update
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)])
device_id = StringField('Device Id', validators=[DataRequired(), Length(min=3, max=50)])
serial_no = StringField('Serial Number', validators=[DataRequired(), Length(min=3, max=50)])
device_id = StringField('Device Id', validators=[DataRequired(), Length(min=3, max=50)])
imsi = StringField('Imsi No', validators=[DataRequired(), Length(min=10, max=50)])
iccid = StringField('Iccid No', validators=[DataRequired(), Length(min=10, max=100)])
ip = StringField('Ip (ipv4)', validators=[DataRequired(), Length(min=7, max=15)])
@ -21,87 +24,66 @@ class updateNbioDeviceUpdateForm(FlaskForm): # Defines the form class to be use
status_id = SelectField('Status', validators=[DataRequired()])
type_id = SelectField('Type', validators=[DataRequired()])
area_id = SelectField('Area', validators=[DataRequired()])
manufacturer_id = SelectField('Manufacturer', 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()])
picture = FileField('Update Sensor Picture', validators=[FileAllowed(['jpg', 'png'])])
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)
image_file = FileField('Update Sensor Picture', validators=[FileAllowed(['jpg', 'png'])])
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')
submit = SubmitField()
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 populate_for_updating(self, 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.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 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')
def populate_for_adding(self, device):
self.submit.label.text = "Add"
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)])
serial_no = 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=[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()])
manufacturer_id = SelectField('Manufacturer', validators=[DataRequired()])
company_id = SelectField('Managed By', validators=[DataRequired()])
if self.manufacturer_id.data:
self.manufacturer_id.choices = [(row.id, row.name) for row in companyUtils.queryNamesWithDefault(self.manufacturer_id.data)]
submit = SubmitField(f'Add')
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.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 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')
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_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')
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')
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')

@ -1,11 +1,10 @@
from flask import render_template, Blueprint, request, flash, redirect, url_for, jsonify
import minibase.theme as theme
from minibase.blueprints.sensor.models import nbiotDevice
from minibase.blueprints.company.models import Companies
import minibase.blueprints.sensor.utils as sensorUtils
from minibase.blueprints.sensor.forms import updateNbioDeviceUpdateForm, updateNbioDeviceAddForm
from minibase.blueprints.sensor.forms import nbiotDeviceForm
import minibase.blueprints.database.utils as dbUtils
import minibase.blueprints.company.utils as companyUtils
import minibase.blueprints.user.utils as userUtils
import minibase.blueprints.main.utils as mainUtils
from minibase.app import db
import json
@ -13,6 +12,7 @@ import os
sensor = Blueprint('sensor', __name__, template_folder='templates')
_form = ()
DATA_FILE = 'data.json'
@ -76,60 +76,32 @@ def list():
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.queryUserNamesWithDefault(device.device_user_id)]
form.owner_id.choices = [(row.id, row.username) for row in userUtils.queryUserNamesWithDefault(device.device_owner_id)]
form.manufacturer_id.choices = [(row.id, row.name) for row in companyUtils.queryNamesWithDefault(device.company_manufacturer_id)]
form.company_id.choices = [(row.id, row.name) for row in companyUtils.queryNamesWithDefault(device.company_owner_id)]
form.status_id.choices = [(row.id, row.name) for row in sensorUtils.queryStatusNamesWithDefault(device.status_id)]
form.type_id.choices = [(row.id, row.name) for row in sensorUtils.queryTypeNamesWithDefault(device.type_id)]
form.area_id.choices = [(row.id, row.name) for row in sensorUtils.queryAreaNamesWithDefault(device.area_id)]
form = nbiotDeviceForm()
form.populate_for_updating(device)
_accountInfo = mainUtils.accountInfo(
title=device.name,
description=device.legal_entity.name,
short=device.website,
status=device.type.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)
device.image_file = picture_file
device.name=form.name.data
device.serial_no = form.serial_no.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.device_owner_id=form.owner_id.data
device.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
device.company_manufacturer_id = form.manufacturer_id.data
device.company_owner_id = form.company_id.data
mainUtils.fill_model(device, form)
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.serial_no.data = device.serial_no
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
form.user_id.data = device.device_user.username
form.owner_id.data = device.device_owner.username
form.manufacturer_id.data = device.company_manufacturer.name
form.company_id.data = device.company_owner.name
form.status_id.data = device.status.name
form.type_id.data = device.type.name
form.area_id.data = device.area.name
image_file = url_for('static', filename='pics/' + sensorUtils.queryImageById(deviceId))
return render_template('sensor/account.html',
mainUtils.populate_form(form, device)
return render_template('account.html',
theme=theme,
image_file=image_file,
accountInfo=_accountInfo,
form=form)
else:
flash('You need to select a Device id', 'alarm')
@ -138,29 +110,39 @@ def edit(deviceId):
@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)]
device = nbiotDevice()
form = nbiotDeviceForm()
print(f"Route : manufacturer_id : { form.manufacturer_id.data }")
form.populate_for_adding(device)
if request.method == 'GET':
form.populate_for_adding(device)
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)
mainUtils.fill_model(device, form)
#dbUtils.dbAddAndCommit(device)
flash('Device has been successfully added', 'success')
return render_template('sensor/account.html',
return render_template('edit.html',
theme=theme,
form=form)
@sensor.route('/search/<field_name>', 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/<field_name>/<int:result_id>', 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)

@ -0,0 +1,3 @@
<select class="btn btn-lg form-select" hx-get="/sensor/company_options" hx-swap="outerHTML" hx-target="#manufacturer_id" hx-trigger="click" id="manufacturer_id" name="manufacturer_id" required style="color:#191717; font-size: 14pt; background-color: #f1f1f1;" type="">
<option value="{{ selected.id }}" selected>{{ selected.name }}</option>
</select>

@ -0,0 +1,7 @@
<ul class="list-group">
{% for result in results %}
<li class="list-group-item">
<a href="#" hx-get="select/{{ field_name }}/{{ result.id }}" hx-target="#{{ field_name }}" hx-swap="outerHTML" class="text-decoration-none">{{ result.name }}</a>
</li>
{% endfor %}
</ul>

@ -5,7 +5,7 @@
<h1 class="account-heading" style="color: {{ theme.orange }};">{{ title }}</h1>
</div>
<div class="container rounded-3 " style="{{ theme.form.div_style }};">
{% include 'form.html' %}
{% include 'formModal.html' %}
{% if extraButtons %}
</div>
<div class="container text-left rounded-3 mt-2 mb-2" style="{{ theme.form.div_style }};">
@ -18,5 +18,4 @@
</div>
{% endif %}
</div>
{% endblock content %}

@ -0,0 +1,21 @@
{% extends "base.html" %}
{% block title %}{{ title }}{% endblock %}
{% block content %}
<div class="container text-center rounded-3 mt-2 mb-2" style="{{ theme.form.div_style }};">
<h1 class="account-heading" style="color: {{ theme.orange }};">{{ title }}</h1>
</div>
<div class="container rounded-3 " style="{{ theme.form.div_style }};">
{% include 'form.html' %}
{% if extraButtons %}
</div>
<div class="container text-left rounded-3 mt-2 mb-2" style="{{ theme.form.div_style }};">
<div class="btn-group">
<br>
{% for button in extraButtons %}
<li><a href ="{{ button.link }}" class="{{ theme.form.submit_class }}" style="{{ theme.form.submit_style }}">{{ button.name }}<a>
{% endfor %}
<br>
</div>
{% endif %}
</div>
{% endblock content %}

@ -0,0 +1,7 @@
{% 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' %}

@ -0,0 +1,33 @@
{% if item.type in ['SelectField'] %}
<br>
{{ item.label(class=theme.form.select_label_class, style=theme.form.select_label_style) }}
<br>
<div class="input-group mb-3">
{{ item(class=theme.form.select_class, type=theme.form.select_type, style=theme.form.select_style)}}
<button class="btn btn-outline-secondary" type="button" data-bs-toggle="modal" data-bs-target="#{{ item.name }}SearchModal">Search</button>
</div>
<div class="modal fade" id="{{ item.name }}SearchModal" tabindex="-1" aria-labelledby="{{ item.name }}SearchLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="{{ item.name }}SearchLabel">Search {{ item.label.text }}</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<input type="text"
name="modalReqArg"
id="searchInput{{ item.name }}"
class="form-control"
placeholder="Search for {{ item.label.text }}..."
hx-get="search/{{ item.name }}"
hx-trigger="keyup changed delay:500ms"
hx-target="#{{ item.name }}Results">
<div id="{{ item.name }}Results"></div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
{% endif %}

@ -0,0 +1,18 @@
<form method="POST" action="" enctype="multipart/form-data">
{{ form.hidden_tag() }}
<fieldset class="form-group">
{% 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 %}
</fieldset>
<div>
{% include 'form/submitField.html' %}
</div>
</form>
Loading…
Cancel
Save