From d608531cab82bb2f96c6fba02db874f5ce9d25d7 Mon Sep 17 00:00:00 2001 From: Damien De Paoli Date: Sun, 4 Jul 2021 20:06:17 +1000 Subject: [PATCH] reference images are now added in person.py (and removed) as buttons on person page. Will need to re-think the whole of refimg.py --- person.py | 75 ++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 61 insertions(+), 14 deletions(-) diff --git a/person.py b/person.py index 7d00668..e987fe3 100644 --- a/person.py +++ b/person.py @@ -1,12 +1,17 @@ from wtforms import SubmitField, StringField, HiddenField, validators, Form from flask_wtf import FlaskForm -from flask import request, render_template, redirect +from flask import request, render_template, redirect, url_for from main import db, app, ma from sqlalchemy import Sequence from sqlalchemy.exc import SQLAlchemyError from status import st, Status from refimg import Refimg from flask_login import login_required, current_user +from werkzeug import secure_filename +from shared import GenFace, GenThumb +from face import FaceRefimgLink +import os + # pylint: disable=no-member @@ -48,7 +53,7 @@ class PersonForm(FlaskForm): tag = StringField('Tag (searchable name):', [validators.DataRequired()]) firstname = StringField('FirstName(s):', [validators.DataRequired()]) surname = StringField('Surname:', [validators.DataRequired()]) - submit = SubmitField('Save' ) + save = SubmitField('Save' ) delete = SubmitField('Delete' ) ################################################################################ @@ -71,10 +76,9 @@ def persons(): def new_person(): form = PersonForm(request.form) page_title='Create new Person' - reference_imgs = Refimg.query.all() if 'surname' not in request.form: - return render_template("person.html", reference_imgs=reference_imgs, form=form, page_title=page_title ) + return render_template("person.html", person=None, form=form, page_title=page_title ) else: person = Person( tag=request.form["tag"], surname=request.form["surname"], firstname=request.form["firstname"] ) try: @@ -86,7 +90,7 @@ def new_person(): except SQLAlchemyError as e: st.SetAlert( "danger" ) st.SetMessage( "Failed to add Person: {}".format(e.orig) ) - return render_template("person.html", object=person, form=form, reference_imgs=reference_imgs, page_title = page_title) + return render_template("person.html", person=person, form=form, page_title = page_title) ################################################################################ # /person/ -> GET/POST(save or delete) -> shows/edits/delets a single @@ -97,34 +101,77 @@ def new_person(): def person(id): form = PersonForm(request.form) page_title='Edit Person' - reference_imgs = Refimg.query.all() if request.method == 'POST': try: person = Person.query.get(id) if 'delete' in request.form: st.SetMessage("Successfully deleted Person: ({})".format( person.tag ) ) + # do the linkage tables by hand + db.session.execute( f"delete from face_refimg_link frl where refimg_id in ( select refimg_id from person_refimg_link where person_id = {id} )" ) + db.session.execute( f"delete from person_refimg_link where person_id = {id}" ) person = Person.query.filter(Person.id==id).delete() - if 'submit' in request.form and form.validate(): + db.session.commit() + return redirect( f'/persons' ) + elif request.form and form.validate(): st.SetMessage("Successfully Updated Person: (From: {}, {}, {})".format(person.tag, person.firstname, person.surname) ) person.tag = request.form['tag'] person.surname = request.form['surname'] person.firstname = request.form['firstname'] - person.refimg =[] - for ref_img in reference_imgs: + new_refs=[] + for ref_img in person.refimg: if "ref-img-id-{}".format(ref_img.id) in request.form: print('{} was checked, id: {}'.format(ref_img.fname, ref_img.id)) - person.refimg.append(ref_img) - + new_refs.append(ref_img) + person.refimg = new_refs + db.session.add(person) st.AppendMessage(" To: ({}, {}, {})".format(person.tag, person.firstname, person.surname) ) db.session.commit() - return redirect( '/persons' ) + return redirect( f'/person/{person.id}' ) except SQLAlchemyError as e: st.SetAlert( "danger" ) st.SetMessage( "Failed to modify Person: {}".format(e) ) - return render_template("person.html", form=form, reference_imgs="test", page_title=page_title) + return render_template("person.html", form=form, page_title=page_title) else: person = Person.query.get(id) print(person) form = PersonForm(request.values, obj=person) - return render_template("person.html", object=person, form=form, reference_imgs=reference_imgs, page_title = page_title) + return render_template("person.html", person=person, form=form, page_title = page_title) + +################################################################################ +# /add_refimg -> POST(add new refimg to a person) +################################################################################ +@app.route("/add_refimg", methods=["POST"]) +@login_required +def add_refimg(): + # now save into the DB + person = Person.query.get(request.form['person_id']); + print( f"person={person}" ) + if not person: + raise Exception("could not find person to add reference image too!") + f=request.files['refimg_file'] + refimg = Refimg( fname="new"+f.filename ) + try: + # save the actual uploaded image to reference_images/ + fname=secure_filename(f.filename) + print( f"fname={fname}" ) + if fname == "": + raise Exception("invalid filename") + + fname = f"/tmp/{fname}" + f.save( fname ) + refimg.thumbnail = GenThumb( fname ) + refimg.face = GenFace( fname ) + os.remove(fname) + person.refimg.append(refimg) + db.session.add(person) + db.session.add(refimg) + db.session.commit() + st.SetMessage( f"Associated new Refimg ({refimg.fname}) with person: {person.tag}" ) + except SQLAlchemyError as e: + st.SetAlert( "danger" ) + st.SetMessage( f"Failed to add Refimg: {e.orig}" ) + except Exception as e: + st.SetAlert( "danger" ) + st.SetMessage( f"Failed to modify Refimg: {e}" ) + return redirect( url_for( 'person', id=person.id) )