from wtforms import SubmitField, StringField, FloatField, HiddenField, validators, Form, SelectField from flask_wtf import FlaskForm from flask import request, render_template, redirect from main import db, app, ma from sqlalchemy import Sequence from sqlalchemy.exc import SQLAlchemyError from status import st, Status from flask_login import login_required, current_user # pylint: disable=no-member ################################################################################ # Class describing AI_MODEL in the database, and via sqlalchemy, connected to the DB as well ################################################################################ class AI_Model(db.Model): __tablename__ = "ai_model" id = db.Column(db.Integer, primary_key=True ) name = db.Column(db.String) def __repr__(self): return f"" ################################################################################ # Class describing Settings in the database, and via sqlalchemy, connected to the DB as well ################################################################################ class Settings(db.Model): id = db.Column(db.Integer, db.Sequence('settings_id_seq'), primary_key=True ) import_path = db.Column(db.String) storage_path = db.Column(db.String) recycle_bin_path = db.Column(db.String) default_model = db.Column(db.Integer,db.ForeignKey('ai_model.id'), unique=True, nullable=False) default_threshold = db.Column(db.Integer) def __repr__(self): return f"" ################################################################################ # Helper class that inherits a .dump() method to turn class Settings into json / useful in jinja2 ################################################################################ class SettingsSchema(ma.SQLAlchemyAutoSchema): class Meta: model = Settings ordered = True settings_schema = SettingsSchema(many=True) ################################################################################ # Helper class that defines a form for Settings, used to make html
# with field validation (via wtforms) ################################################################################ class SettingsForm(FlaskForm): id = HiddenField() import_path = StringField('Path(s) to import from:', [validators.DataRequired()]) storage_path = StringField('Path to store sorted images to:', [validators.DataRequired()]) recycle_bin_path = StringField('Path to temporarily store deleted images in:', [validators.DataRequired()]) default_model = SelectField( 'default_model', choices=[(c.id, c.name) for c in AI_Model.query.order_by('id')] ) default_threshold = StringField('Face Distance threshold (below is a match):', [validators.DataRequired()]) submit = SubmitField('Save' ) ################################################################################ # /settings -> show current settings ################################################################################ @app.route("/settings", methods=["GET", "POST"]) @login_required def settings(): form = SettingsForm(request.form) page_title='Settings' if request.method == 'POST' and form.validate(): try: # HACK, I don't really need an id here, but sqlalchemy get weird # without one, so just grab the id of the only row there, it will # do... id = Settings.query.all()[0].id s = Settings.query.get(id) if 'submit' in request.form: st.SetMessage("Successfully Updated Settings" ) s.import_path = request.form['import_path'] s.storage_path = request.form['storage_path'] s.recycle_bin_path = request.form['recycle_bin_path'] s.default_model = request.form['default_model'] s.default_threshold = request.form['default_threshold'] db.session.commit() return redirect( '/settings' ) except SQLAlchemyError as e: st.SetAlert( "danger" ) st.SetMessage( "Failed to modify Setting: {}".format(e.orig) ) return render_template("settings.html", form=form, page_title=page_title) else: form = SettingsForm( obj=Settings.query.first() ) return render_template("settings.html", form=form, page_title = page_title)