diff --git a/web/instance/test.db b/web/instance/test.db index 9093c0e8..6c8dc64d 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 6df611c3..a3156b42 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/__pycache__/config.cpython-311.pyc b/web/minibase/__pycache__/config.cpython-311.pyc index a24e87ae..20683378 100644 Binary files a/web/minibase/__pycache__/config.cpython-311.pyc and b/web/minibase/__pycache__/config.cpython-311.pyc differ diff --git a/web/minibase/__pycache__/theme.cpython-311.pyc b/web/minibase/__pycache__/theme.cpython-311.pyc index 120340d5..2417cc84 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/app.py b/web/minibase/app.py index f2850a04..da08c40e 100644 --- a/web/minibase/app.py +++ b/web/minibase/app.py @@ -57,6 +57,7 @@ def create_app(): from minibase.blueprints.geography.routes import geography from minibase.blueprints.sensor.routes import sensor from minibase.blueprints.database.routes import database + #from minibase.blueprints.item.routes import item # (BLUEPRINTS) Registering the blueprints. # Giving them theie ulr_prefixes that will define their links on the webBrowser. diff --git a/web/minibase/blueprints/company/__pycache__/forms.cpython-311.pyc b/web/minibase/blueprints/company/__pycache__/forms.cpython-311.pyc index de13d23c..4ff18854 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__/models.cpython-311.pyc b/web/minibase/blueprints/company/__pycache__/models.cpython-311.pyc index e4befeed..f1272085 100644 Binary files a/web/minibase/blueprints/company/__pycache__/models.cpython-311.pyc and b/web/minibase/blueprints/company/__pycache__/models.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 5e1cbd05..5ab4ff88 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 81fb665f..dbe4a649 100644 --- a/web/minibase/blueprints/company/forms.py +++ b/web/minibase/blueprints/company/forms.py @@ -5,20 +5,13 @@ from wtforms.validators import DataRequired, Length, Email, EqualTo, ValidationE import minibase.blueprints.company.utils as companyUtils import minibase.blueprints.geography.utils as geoUtils import minibase.blueprints.main.utils as mainUtils +import minibase.blueprints.database.utils as dbUtils import minibase.theme as theme from wtforms_alchemy import ModelForm from minibase.blueprints.company.models import Companies from minibase.blueprints.sensor.models import nbiotDevice from minibase.blueprints.user.models import Users -fields = { - "city_id": SelectField( - 'City', - validators=[DataRequired()], - render_kw={"hx-get": "/geography/get_states", "hx-target": "#state_id"} - ), -} - class companyForm(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)]) @@ -34,11 +27,10 @@ class companyForm(FlaskForm): # Defines the form class to be used for the user relation_id = SelectField('Relation', validators=[DataRequired()]) status_id = SelectField('Status', validators=[DataRequired()]) comment = StringField('Comment', validators=[DataRequired(), Length(min=3, max=400)]) - image_file = FileField('Update company Picture', validators=[FileAllowed(['jpg', 'png'])]) submit = SubmitField() - + def populate_for_updating(self, company): self.originalModel = company self.submit.label.text = "Update" @@ -52,7 +44,7 @@ class companyForm(FlaskForm): # Defines the form class to be used for the user self.city_id.choices = [(row.id, row.name) for row in geoUtils.queryCityNamesWithCountryIdWithDefault(company.city_id, company.country_id)] self.state_id.choices = [(row.id, row.name) for row in geoUtils.queryStateNamesWithCountryIdWithDefault(company.state_id, company.country_id)] - self.industry_id.choices = [(row.id, row.name) for row in mainUtils.queryIndustryNamesWithDefault(company.industry_id)] + self.industry_id.choices = [(row.id, row.name) for row in dbUtils.queryWithDefaultAttrOrderBy(Companies, Companies.industry_id,company.industry_id)] self.legal_entity_id.choices = [(row.id, row.name) for row in companyUtils.queryLegalEntityNamesWithDefault(company.legal_entity_id)] self.type_id.choices = [(row.id, row.name) for row in companyUtils.queryTypeNamesWithDefault(company.type_id)] self.relation_id.choices = [(row.id, row.name) for row in companyUtils.queryRelationNamesWithDefault(company.relation_id)] @@ -82,6 +74,6 @@ class companyForm(FlaskForm): # Defines the form class to be used for the user #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') + if (dbUtils.queryIlikeFromTable(Companies, Companies.name, input.data)): + raise ValidationError(f'This {self.name.name} already exists.') diff --git a/web/minibase/blueprints/company/models.py b/web/minibase/blueprints/company/models.py index 720e6249..42cbc22f 100644 --- a/web/minibase/blueprints/company/models.py +++ b/web/minibase/blueprints/company/models.py @@ -12,7 +12,7 @@ class Companies(db.Model): last_update_date= db.Column(db.DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow) #Own Fields - name = db.Column(db.String(100), nullable=False) + name = db.Column(db.String(100), nullable=False, unique=True) website = db.Column(db.String(100), nullable=True, default='') street = db.Column(db.String(100), nullable=False) street_no = db.Column(db.Integer, nullable=False) diff --git a/web/minibase/blueprints/company/routes.py b/web/minibase/blueprints/company/routes.py index f9057c0f..de08618d 100644 --- a/web/minibase/blueprints/company/routes.py +++ b/web/minibase/blueprints/company/routes.py @@ -4,6 +4,7 @@ import minibase.theme as theme from minibase.blueprints.company.models import Companies import minibase.blueprints.database.utils as dbUtils import minibase.blueprints.main.utils as mainUtils +import minibase.blueprints.main.forms as NoteForm from minibase.blueprints.company.forms import companyForm # Declaring a blueprint @@ -13,7 +14,7 @@ company = Blueprint('company', __name__, template_folder='templates') @company.route("/list", methods=['GET', 'POST']) def list(): page=request.args.get('page', 1, type=int) - table=dbUtils.table_printable_paginate(Companies, page, 20, 'account/', 'id') + table=dbUtils.table_printable_paginate(Companies, page, 5, 'account/', 'id') return(render_template('view.html', theme=theme, table=table, title="Companies")) @@ -24,6 +25,7 @@ def account(companyId): company = Companies.query.get_or_404(companyId) form = companyForm() form.populate_for_updating(company) + _accountInfo = mainUtils.accountInfo( title=company.name, description=company.legal_entity.name, @@ -45,7 +47,9 @@ def account(companyId): elif request.method == 'GET': mainUtils.populate_form(form, company) - return render_template('account.html', theme=theme, accountInfo=_accountInfo, form=form) + return render_template('account.html', theme=theme, + accountInfo=_accountInfo, + form=form) else: flash('You need to select a company id', 'alarm') return redirect(url_for('company.list')) diff --git a/web/minibase/blueprints/database/__pycache__/utils.cpython-311.pyc b/web/minibase/blueprints/database/__pycache__/utils.cpython-311.pyc index 4aee1835..fa496b67 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 e2750ed9..e91a65aa 100644 --- a/web/minibase/blueprints/database/utils.py +++ b/web/minibase/blueprints/database/utils.py @@ -19,20 +19,44 @@ 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 + return table.query.order_by(case((table.id == defId, 0),else_=1),table.name.asc()) + + +def queryWithDefaultAttrOrderBy(table, attribute, default, order_by): + return table.query.order_by(case((attribute == default, 0),else_=1),order_by.asc()) + def queryItemWithId(table,defId): - choices = table.query.order_by(case((table.id == defId, 0),else_=1),table.name.asc()) - return choices + return table.query.order_by(case((table.id == defId, 0),else_=1),table.name.asc()) + + +def queryIlikeFromTable(table, attribute, data): + return table.query.filter(attribute.ilike(f'%{data}%')).first() + + +# Queries Items from table using an attribute, and ordered by the attribute, ascenting or descending +def queryWithAttrOrder(table, attribute, desc=0): + if desc: + return table.query.order_by(attribute.desc()).all() + else: + return table.query.order_by(attribute.asc()).all() + #return table.query.filter_by(attribute=data).order_by(order_by.asc()).all() + + +def queryItemFromTableDateDesc(table, attribute): + return table.query.order_by(attribute.asc()) + 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/item/__init__.py b/web/minibase/blueprints/item/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/web/minibase/blueprints/item/models.py b/web/minibase/blueprints/item/models.py new file mode 100644 index 00000000..ab56b46d --- /dev/null +++ b/web/minibase/blueprints/item/models.py @@ -0,0 +1,33 @@ +from minibase.app import db +from datetime import datetime + + +# End of the line model for CORE. +class item(db.Model): + __tablename__ = 'item' + id = db.Column(db.Integer, primary_key=True) + created = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) + updated = db.Column(db.DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow) + + # Foreign Keys + user_creator_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) + user_update_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) + + category_id = db.Column(db.Integer, db.ForeignKey('itemCategory.id'), nullable=False) + # item_id = db.Column(db.Integer, db.ForeignKey('item.id'), nullable=False) #DefinedByUser + + +class itemCategory(db.Model): + __tablename__ = 'itemCategory' + id = db.Column(db.Integer, primary_key=True) + + name = db.Column(db.String(50), nullable=False, unique=True) + level = db.Column(db.Integer, nullable=False, unique=True) + description = db.Column(db.String(250), nullable=True, unique=True) + created = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) + updated = db.Column(db.DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow) + + # Foreign Keys + user_creator_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) + user_update_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) + user_responsible_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) diff --git a/web/minibase/blueprints/main/__pycache__/forms.cpython-311.pyc b/web/minibase/blueprints/main/__pycache__/forms.cpython-311.pyc new file mode 100644 index 00000000..141574da Binary files /dev/null and b/web/minibase/blueprints/main/__pycache__/forms.cpython-311.pyc differ diff --git a/web/minibase/blueprints/main/__pycache__/models.cpython-311.pyc b/web/minibase/blueprints/main/__pycache__/models.cpython-311.pyc index 9fd89c63..b1936cec 100644 Binary files a/web/minibase/blueprints/main/__pycache__/models.cpython-311.pyc and b/web/minibase/blueprints/main/__pycache__/models.cpython-311.pyc differ diff --git a/web/minibase/blueprints/main/__pycache__/utils.cpython-311.pyc b/web/minibase/blueprints/main/__pycache__/utils.cpython-311.pyc index 44f35ea4..4acf2dfd 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/forms.py b/web/minibase/blueprints/main/forms.py new file mode 100644 index 00000000..6cc86062 --- /dev/null +++ b/web/minibase/blueprints/main/forms.py @@ -0,0 +1,8 @@ +from flask_wtf import FlaskForm +from wtforms import SubmitField, TextAreaField +from wtforms.validators import DataRequired, Length + + +class NoteForm(FlaskForm): + content = TextAreaField('Content', validators=[DataRequired(), Length(min=1, max=5000)]) + submit = SubmitField('Add Note') diff --git a/web/minibase/blueprints/main/models.py b/web/minibase/blueprints/main/models.py index e5b20d96..decc7f4b 100644 --- a/web/minibase/blueprints/main/models.py +++ b/web/minibase/blueprints/main/models.py @@ -23,7 +23,7 @@ class Notes(db.Model): last_update_date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow) user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False) - company_id = db.Column(db.Integer, db.ForeignKey('companies.id'), nullable=False) + company_id = db.Column(db.Integer, db.ForeignKey('companies.id'), nullable=True) class Todos(db.Model): diff --git a/web/minibase/blueprints/main/utils.py b/web/minibase/blueprints/main/utils.py index 78dd6f17..1867c99a 100644 --- a/web/minibase/blueprints/main/utils.py +++ b/web/minibase/blueprints/main/utils.py @@ -28,6 +28,7 @@ def populate_form(form, cur_model): item.data = formFill(item, cur_model) +#Fills the form with def formFill(item, cur_model): if item.type not in ["SubmitField", "CSRFTokenField"]: # Cheking if the arrtibute exitst, otherwise ignoring @@ -35,13 +36,15 @@ def formFill(item, cur_model): return getattr(cur_model, item.name) +# Fills the model with the data from the Form, if an attribute doesn't exist, the value of that +# Attribute will be filled with the existing data (May be an extra step, overkill?) def modelFill(cur_model, item): if hasattr(cur_model, item.name): if item.type not in ["SubmitField", "CSRFTokenField"]: if item.type == "FileField": if item.data == "None": print(f"File field found with no data -> item name {item.name}") - print(f"It will be filled with the existin tbale data -> item name {getattr(cur_model, item.name)}") + print(f"It will be filled with the existin table data -> item name {getattr(cur_model, item.name)}") setattr(cur_model, item.name, getattr(cur_model, item.name)) else: setattr(cur_model, item.name, item.data) @@ -91,9 +94,7 @@ def send_sensor_email(email, data): # QUERIES def queryIndustryNames(): - choices = Industries.query.order_by(Industries.name.asc()) - return choices + return dbUtils.queryWithAttrOrder(Industries, Industries.name, 1) def queryIndustryNamesWithDefault(defId): - choices = dbUtils.queryNameWithDefaultId(Industries,defId) - return choices + return dbUtils.queryNameWithDefaultId(Industries,defId) diff --git a/web/minibase/blueprints/sensor/__pycache__/forms.cpython-311.pyc b/web/minibase/blueprints/sensor/__pycache__/forms.cpython-311.pyc index 3394b3eb..e3efb694 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 bcb4bb72..7ce85698 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 bc7cb19c..3eacb588 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 135ba538..e98a8dd8 100644 --- a/web/minibase/blueprints/sensor/forms.py +++ b/web/minibase/blueprints/sensor/forms.py @@ -6,6 +6,7 @@ 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 +import minibase.blueprints.database.utils as dbUtils from datetime import date class nbiotDeviceForm(FlaskForm): # Defines the self class to be used for the user update @@ -70,25 +71,25 @@ class nbiotDeviceForm(FlaskForm): # Defines the self class to be used for the u #custom validators specific naming convention: validate_. This is how Flask-WTF knows which field the validator is associated with. def validate_name(self, input): if input.data != self.originalModel.name: - if (nbiotDevice.query.filter(nbiotDevice.name.ilike(f'%{input.data}%')).first()): - raise ValidationError('This Name already exists. Please choose a different one.') + if (dbUtils.queryIlikeFromTable(nbiotDevice, nbiotDevice.name, input.data)): + raise ValidationError(f'This {self.name.name} already exists.') 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.') + if (dbUtils.queryIlikeFromTable(nbiotDevice, nbiotDevice.serial_no, input.data)): + raise ValidationError(f'This {self.serial_no.name} already exists.') def validate_imsi(self, input): if input.data != self.originalModel.imsi: - if (nbiotDevice.query.filter(nbiotDevice.imsi.ilike(f'%{input.data}%')).first()): - raise ValidationError('This IMSI no is already registered.') + if (dbUtils.queryIlikeFromTable(nbiotDevice, nbiotDevice.imsi, input.data)): + raise ValidationError(f'This {self.imsi.name} already exists.') def validate_iccid(self, input): if input.data != self.originalModel.iccid: - if (nbiotDevice.query.filter(nbiotDevice.iccid.ilike(f'%{input.data}%')).first()): - raise ValidationError('This ICCID no is already registered.') + if (dbUtils.queryIlikeFromTable(nbiotDevice, nbiotDevice.iccid, input.data)): + raise ValidationError(f'This {self.iccid.name} already exists.') def validate_ip(self, input): if input.data != self.originalModel.ip: - if (nbiotDevice.query.filter(nbiotDevice.ip.ilike(f'%{input.data}%')).first()): - raise ValidationError('A devie already has this IP') + if (dbUtils.queryIlikeFromTable(nbiotDevice, nbiotDevice.ip, input.data)): + raise ValidationError(f'This {self.ip.name} already exists.') diff --git a/web/minibase/blueprints/sensor/models.py b/web/minibase/blueprints/sensor/models.py index 4fe4aa32..17453469 100644 --- a/web/minibase/blueprints/sensor/models.py +++ b/web/minibase/blueprints/sensor/models.py @@ -5,30 +5,33 @@ class nbiotDevice(db.Model): __tablename__ = 'nbiotDevice' id = db.Column(db.Integer, primary_key=True) - name = db.Column(db.String(50), nullable=False) + name = db.Column(db.String(50), nullable=False, unique=True) 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) - iccid = db.Column(db.String(50), nullable=False) - ip = db.Column(db.String(20), nullable=True) + serial_no = db.Column(db.String(50), nullable=False, unique=True) + device_id = db.Column(db.String(30), nullable=False, unique=True) + imsi = db.Column(db.String(30), nullable=False, unique=True) + iccid = db.Column(db.String(50), nullable=False, unique=True) + ip = db.Column(db.String(20), nullable=True, unique=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) + image_file = db.Column(db.String(20), nullable=False, default='def_sensor.png') + created = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) updated = db.Column(db.DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow) + + # Foreign Keys 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) - - # Foreign Keys company_manufacturer_id = db.Column(db.Integer, db.ForeignKey('companies.id')) company_owner_id = db.Column(db.Integer, db.ForeignKey('companies.id')) device_user_id = db.Column(db.Integer, db.ForeignKey('users.id')) device_owner_id = db.Column(db.Integer, db.ForeignKey('users.id')) + item_id = db.Column(db.Integer, db.ForeignKey('item.id'), nullable=False) #DefinedByUser # Relationships company_manufacturer = db.relationship("Companies", foreign_keys=[company_manufacturer_id], back_populates="manufactured_devices") diff --git a/web/minibase/blueprints/sensor/routes.py b/web/minibase/blueprints/sensor/routes.py index dbed622c..3c0723a4 100644 --- a/web/minibase/blueprints/sensor/routes.py +++ b/web/minibase/blueprints/sensor/routes.py @@ -53,7 +53,7 @@ def callback(): sensor = sensorUtils.queryByImsi(src_imsi) mail=userUtils.queryMailById(sensor.device_user_id) print(f"Sensor Model: {sensor.model}, user e-mail: {mail}") - #mainUtils.send_sensor_email(mail, data) + #mainUtils.send_sensor_email(mail, response_data) return jsonify(response_data), 200 diff --git a/web/minibase/blueprints/user/__pycache__/forms.cpython-311.pyc b/web/minibase/blueprints/user/__pycache__/forms.cpython-311.pyc index d634aae1..aa5b386e 100644 Binary files a/web/minibase/blueprints/user/__pycache__/forms.cpython-311.pyc and b/web/minibase/blueprints/user/__pycache__/forms.cpython-311.pyc differ diff --git a/web/minibase/blueprints/user/__pycache__/models.cpython-311.pyc b/web/minibase/blueprints/user/__pycache__/models.cpython-311.pyc index 4b17b730..58fc753d 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/__pycache__/routes.cpython-311.pyc b/web/minibase/blueprints/user/__pycache__/routes.cpython-311.pyc index e148eabe..d2acdf22 100644 Binary files a/web/minibase/blueprints/user/__pycache__/routes.cpython-311.pyc and b/web/minibase/blueprints/user/__pycache__/routes.cpython-311.pyc differ diff --git a/web/minibase/blueprints/user/forms.py b/web/minibase/blueprints/user/forms.py index 76521eb1..96fc900c 100644 --- a/web/minibase/blueprints/user/forms.py +++ b/web/minibase/blueprints/user/forms.py @@ -5,14 +5,14 @@ from wtforms.validators import DataRequired, Length, Email, EqualTo, ValidationE from flask_login import current_user from minibase.blueprints.user.models import Users, User_Roles import minibase.blueprints.geography.utils as geoUtils - +import minibase.blueprints.database.utils as dbUtils class registrationForm(FlaskForm): # Defines the form class to be used for the user registretion # Decalarion of the fields for the form and it's propereties - username = StringField('User Name', validators=[DataRequired(), Length(min=4, max=20)]) + username = StringField('User Name', validators=[DataRequired(), Length(min=4, max=20)], unique=True) name = StringField('Name', validators=[DataRequired(), Length(min=4, max=20)]) surname = StringField('Surname', validators=[DataRequired(), Length(min=4, max=20)]) - email_account = StringField('Email: Account', validators=[DataRequired(), Email()]) + email_account = StringField('Email: Account', validators=[DataRequired(), Email()], unique=True) email_comm = StringField('Email: Communication', validators=[DataRequired(), Email()]) street = StringField('Street', validators=[DataRequired()]) street_no = IntegerField('No', validators=[DataRequired()]) @@ -40,14 +40,14 @@ class registrationForm(FlaskForm): # Defines the form class to be used for the # Queries to be made in order to validate the form : If username exists def validate_username(self, input): if input.data != self.originalModel.username: - if (Users.query.filter(Users.username.ilike(f'%{input.data}%')).first()): - raise ValidationError('This User Name is alredy registered') + if (dbUtils.queryIlikeFromTable(Users, Users.username, input.data)): + raise ValidationError(f'This {self.username.name} already exists.') # Queries to be made in order to validate the form : If username exists def validate_email_account(self, input): if input.data != self.originalModel.email_account: - if (Users.query.filter(Users.email_account.ilike(f'%{input.data}%')).first()): - raise ValidationError('This E-mail is alredy registered') + if (dbUtils.queryIlikeFromTable(Users, Users.email_account, input.data)): + raise ValidationError(f'This {self.email_account.name} already exists.') class accountUpdateForm(FlaskForm): # Defines the form class to be used for the user registretion @@ -84,53 +84,31 @@ class accountUpdateForm(FlaskForm): # Defines the form class to be used for the # Queries to be made in order to validate the form : If username exists def validate_username(self, input): if input.data != self.originalModel.username: - if (Users.query.filter(Users.username.ilike(f'%{input.data}%')).first()): - raise ValidationError('This User Name is alredy registered') + if (dbUtils.queryIlikeFromTable(Users, Users.username, input.data)): + raise ValidationError(f'This {self.username.name} already exists.') # Queries to be made in order to validate the form : If username exists def validate_email_account(self, input): if input.data != self.originalModel.email_account: - if (Users.query.filter(Users.email_account.ilike(f'%{input.data}%')).first()): - raise ValidationError('This E-mail is alredy registered') + if (dbUtils.queryIlikeFromTable(Users, Users.email_account, input.data)): + raise ValidationError(f'This {self.email_account.name} already exists.') class loginForm(FlaskForm): # Defines the form class to be used for the user login - email = StringField('Email', validators=[DataRequired(), Email()]) + email = StringField('Email: Account', validators=[DataRequired(), Email()]) password = PasswordField('Password', validators=[DataRequired()]) remember = BooleanField('Remember Me') submit = SubmitField('Log In') -class updateAccountForm(FlaskForm): # Defines the form class to be used for the user update - username = StringField('User Name', validators=[DataRequired(), Length(min=3, max=20)]) - email_account = StringField('Email Account', validators=[DataRequired(), Email()]) - email_comm = StringField('Email Communication', validators=[DataRequired(), Email()]) - picture = FileField('Update Profile Picture', validators=[FileAllowed(['jpg', 'png'])]) - submit = SubmitField('Update') - - # Queries to be made in order to validate the form : If username exists - def validate_username(self, username): - if username.data != current_user.username: - user = Users.query.filter_by(username=username.data).first() - if user: - raise ValidationError('That username is taken please choose another one') - - # Queries to be made in order to validate the form : If Email exists - def validate_email(self, email): - if email.data != current_user.email_account: - email = Users.query.filter_by(email_account=email.data).first() - if email: - raise ValidationError('That email is taken do you have an acocunt ?') - class requestResetForm(FlaskForm): # Defines the form class to be used for the reset form - email = StringField('Email', validators=[DataRequired(), Email()]) + email = StringField('Email: Account', validators=[DataRequired(), Email()]) submit = SubmitField('Request Password Reset') # Queries to be made in order to validate the form : If Email exists - def validate_email(self, email): - email = Users.query.filter_by(email_account=email.data).first() - if email is None: - raise ValidationError('There is no Account with this email your must register first.') + def validate_email(self, input): + if (dbUtils.queryIlikeFromTable(Users, Users.email_account, input.data)) is None: + raise ValidationError(f"This {self.email.name} doesn't exists.") class resetPasswordForm(FlaskForm): # Defines the form class to be used for password reset form diff --git a/web/minibase/blueprints/user/routes.py b/web/minibase/blueprints/user/routes.py index 6f19a85d..ab04db5f 100644 --- a/web/minibase/blueprints/user/routes.py +++ b/web/minibase/blueprints/user/routes.py @@ -5,7 +5,7 @@ import minibase.theme as theme from minibase.blueprints.user.models import Users, User_Roles import minibase.blueprints.database.utils as dbUtils import minibase.blueprints.user.utils as UserUtils -from minibase.blueprints.user.forms import registrationForm, loginForm, updateAccountForm, resetPasswordForm, requestResetForm, updateRoleForm, accountUpdateForm +from minibase.blueprints.user.forms import registrationForm, loginForm, resetPasswordForm, requestResetForm, updateRoleForm, accountUpdateForm import minibase.blueprints.main.utils as mainUtils # Declaring a blueprint diff --git a/web/minibase/templates/account.html b/web/minibase/templates/account.html index 47587270..1b4a6842 100644 --- a/web/minibase/templates/account.html +++ b/web/minibase/templates/account.html @@ -14,18 +14,21 @@ -
-
+
+ {% include 'form.html' %}
+
+ + {% include 'notes_form.html' %} +
+
{% endblock content %} - - diff --git a/web/minibase/templates/form.html b/web/minibase/templates/form.html index 12101bed..0edf8a6d 100644 --- a/web/minibase/templates/form.html +++ b/web/minibase/templates/form.html @@ -6,9 +6,6 @@ {% elif item.id == 'csrf_token' %} {% else %} {% include 'form/allFields.html' %} - {% if item.errors %} - {% include 'form/formError.html' %} - {% endif %} {% endif %} {% endfor %} diff --git a/web/minibase/templates/form/boolField.html b/web/minibase/templates/form/boolField.html index 052869ae..9c80a553 100644 --- a/web/minibase/templates/form/boolField.html +++ b/web/minibase/templates/form/boolField.html @@ -2,5 +2,9 @@
{{ item.label(class=theme.form.check_label_class, style=theme.form.check_label_style) }}
- {{ item(class=theme.form.check_class) }} + {% if item.errors %} + {% include 'form/formError.html' %} + {% else %} + {{ item(class=theme.form.check_class) }} + {% endif %} {% endif %} diff --git a/web/minibase/templates/form/dateField.html b/web/minibase/templates/form/dateField.html index 0efc2acd..78b44928 100644 --- a/web/minibase/templates/form/dateField.html +++ b/web/minibase/templates/form/dateField.html @@ -2,5 +2,9 @@
{{ item.label(class=theme.form.date_label_class, style=theme.form.date_label_style) }}
- {{ item(class=theme.form.date_class, style=theme.form.date_style, type=theme.form.date_type) }} + {% if item.errors %} + {% include 'form/formError.html' %} + {% else %} + {{ item(class=theme.form.date_class, style=theme.form.date_style, type=theme.form.date_type) }} + {% endif %} {% endif %} diff --git a/web/minibase/templates/form/fileField.html b/web/minibase/templates/form/fileField.html index 8396962b..001d4537 100644 --- a/web/minibase/templates/form/fileField.html +++ b/web/minibase/templates/form/fileField.html @@ -2,5 +2,9 @@
{{ item.label(class=theme.form.file_label_class, style=theme.form.file_label_style) }}
- {{ item(class=theme.form.file_class, type=theme.form.file_type, style=theme.form.file_style) }} + {% if item.errors %} + {% include 'form/formError.html' %} + {% else %} + {{ item(class=theme.form.file_class, type=theme.form.file_type, style=theme.form.file_style) }} + {% endif %} {% endif %} diff --git a/web/minibase/templates/form/integerField.html b/web/minibase/templates/form/integerField.html index 76d240c4..3481fc81 100644 --- a/web/minibase/templates/form/integerField.html +++ b/web/minibase/templates/form/integerField.html @@ -2,5 +2,9 @@
{{ item.label(class=theme.form.integer_label_class, style=theme.form.integer_label_style) }}
- {{ item(class=theme.form.integer_class, style=theme.form.integer_style) }} + {% if item.errors %} + {% include 'form/formError.html' %} + {% else %} + {{ item(class=theme.form.integer_class, style=theme.form.integer_style) }} + {% endif %} {% endif %} diff --git a/web/minibase/templates/form/selectField.html b/web/minibase/templates/form/selectField.html index 360ed9d8..e23a30d3 100644 --- a/web/minibase/templates/form/selectField.html +++ b/web/minibase/templates/form/selectField.html @@ -7,6 +7,10 @@ {% include 'htmx/popup.html' %} {% else %} - {{ item(class=theme.form.select_class, type=theme.form.select_type, style=theme.form.select_style)}} + {% if item.errors %} + {% include 'form/formError.html' %} + {% else %} + {{ item(class=theme.form.select_class, type=theme.form.select_type, style=theme.form.select_style)}} + {% endif %} {% endif %} {% endif %} diff --git a/web/minibase/templates/form/stringField.html b/web/minibase/templates/form/stringField.html index f22c0f24..83cef404 100644 --- a/web/minibase/templates/form/stringField.html +++ b/web/minibase/templates/form/stringField.html @@ -2,5 +2,9 @@
{{ item.label(class=theme.form.input_label_class, style=theme.form.input_label_style) }}
- {{ item(class=theme.form.input_class, style=theme.form.input_style) }} + {% if item.errors %} + {% include 'form/formError.html' %} + {% else %} + {{ item(class=theme.form.input_class, style=theme.form.input_style) }} + {% endif %} {% endif %} diff --git a/web/minibase/templates/form/urlField.html b/web/minibase/templates/form/urlField.html index f4d432f7..6671e689 100644 --- a/web/minibase/templates/form/urlField.html +++ b/web/minibase/templates/form/urlField.html @@ -2,5 +2,9 @@
{{ item.label(class=theme.form.url_label_class, style=theme.form.url_label_style) }}
- {{ item(class=theme.form.url_class, type=theme.form.url_type, style=theme.form.url_style) }} + {% if item.errors %} + {% include 'form/formError.html' %} + {% else %} + {{ item(class=theme.form.url_class, type=theme.form.url_type, style=theme.form.url_style) }} + {% endif %} {% endif %} diff --git a/web/minibase/templates/notes_form.html b/web/minibase/templates/notes_form.html new file mode 100644 index 00000000..42066805 --- /dev/null +++ b/web/minibase/templates/notes_form.html @@ -0,0 +1,28 @@ +
+
+
+
+ + +
+
+
+

Type your note, and hit enter to add it

+ +
+
+ avatar +

Martha

+
+
+

Upvote?

+ +

3

+
+
+
+
+
+
+
diff --git a/web/minibase/theme.py b/web/minibase/theme.py index 4d0920cd..c796a745 100644 --- a/web/minibase/theme.py +++ b/web/minibase/theme.py @@ -25,12 +25,14 @@ class form: default_label_style = "color:" + orange + "; font-size: " + label_font_size + "; font-weight: bold;" default_field_style = "color:" + black + "; font-size: " + field_font_size + "; background-color: " + white + ";" default_error_class = "form-control is-invalid" + default_error_id = "disabledTextInput" input_label_class = default_label_class input_label_style = default_label_style input_class = "form-control" input_style = default_field_style input_error_class = default_error_class + input_error_id = default_error_id check_label_class = "form-check-label" check_label_style = "input_label_style" @@ -81,7 +83,7 @@ class menu: {"text": "Remove", "url": "main.index"}, ],}, - {"menuName":"Sensor", + {"menuName":"Sensor", "sublinks": [ {"text": "List", "url": "sensor.list"}, {"decoration": "line"}, @@ -89,6 +91,15 @@ class menu: {"decoration": "line"}, {"text": "Edit", "url": "main.index"}, ],}, + + {"menuName":"Lager", + "sublinks": [ + {"text": "Names", "url": "sensor.list"}, + {"decoration": "line"}, + {"text": "Add", "url": "sensor.add"}, + {"decoration": "line"}, + {"text": "Take", "url": "main.index"}, + ],}, ] navbar_items_user = [