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

This commit is contained in:
2021-07-04 20:06:17 +10:00
parent d3df3ad754
commit d608531cab

View File

@@ -1,12 +1,17 @@
from wtforms import SubmitField, StringField, HiddenField, validators, Form from wtforms import SubmitField, StringField, HiddenField, validators, Form
from flask_wtf import FlaskForm 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 main import db, app, ma
from sqlalchemy import Sequence from sqlalchemy import Sequence
from sqlalchemy.exc import SQLAlchemyError from sqlalchemy.exc import SQLAlchemyError
from status import st, Status from status import st, Status
from refimg import Refimg from refimg import Refimg
from flask_login import login_required, current_user 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 # pylint: disable=no-member
@@ -48,7 +53,7 @@ class PersonForm(FlaskForm):
tag = StringField('Tag (searchable name):', [validators.DataRequired()]) tag = StringField('Tag (searchable name):', [validators.DataRequired()])
firstname = StringField('FirstName(s):', [validators.DataRequired()]) firstname = StringField('FirstName(s):', [validators.DataRequired()])
surname = StringField('Surname:', [validators.DataRequired()]) surname = StringField('Surname:', [validators.DataRequired()])
submit = SubmitField('Save' ) save = SubmitField('Save' )
delete = SubmitField('Delete' ) delete = SubmitField('Delete' )
################################################################################ ################################################################################
@@ -71,10 +76,9 @@ def persons():
def new_person(): def new_person():
form = PersonForm(request.form) form = PersonForm(request.form)
page_title='Create new Person' page_title='Create new Person'
reference_imgs = Refimg.query.all()
if 'surname' not in request.form: 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: else:
person = Person( tag=request.form["tag"], surname=request.form["surname"], firstname=request.form["firstname"] ) person = Person( tag=request.form["tag"], surname=request.form["surname"], firstname=request.form["firstname"] )
try: try:
@@ -86,7 +90,7 @@ def new_person():
except SQLAlchemyError as e: except SQLAlchemyError as e:
st.SetAlert( "danger" ) st.SetAlert( "danger" )
st.SetMessage( "<b>Failed to add Person:</b>&nbsp;{}".format(e.orig) ) st.SetMessage( "<b>Failed to add Person:</b>&nbsp;{}".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/<id> -> GET/POST(save or delete) -> shows/edits/delets a single # /person/<id> -> GET/POST(save or delete) -> shows/edits/delets a single
@@ -97,34 +101,77 @@ def new_person():
def person(id): def person(id):
form = PersonForm(request.form) form = PersonForm(request.form)
page_title='Edit Person' page_title='Edit Person'
reference_imgs = Refimg.query.all()
if request.method == 'POST': if request.method == 'POST':
try: try:
person = Person.query.get(id) person = Person.query.get(id)
if 'delete' in request.form: if 'delete' in request.form:
st.SetMessage("Successfully deleted Person: ({})".format( person.tag ) ) 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() 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) ) st.SetMessage("Successfully Updated Person: (From: {}, {}, {})".format(person.tag, person.firstname, person.surname) )
person.tag = request.form['tag'] person.tag = request.form['tag']
person.surname = request.form['surname'] person.surname = request.form['surname']
person.firstname = request.form['firstname'] person.firstname = request.form['firstname']
person.refimg =[] new_refs=[]
for ref_img in reference_imgs: for ref_img in person.refimg:
if "ref-img-id-{}".format(ref_img.id) in request.form: if "ref-img-id-{}".format(ref_img.id) in request.form:
print('{} was checked, id: {}'.format(ref_img.fname, ref_img.id)) 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) ) st.AppendMessage(" To: ({}, {}, {})".format(person.tag, person.firstname, person.surname) )
db.session.commit() db.session.commit()
return redirect( '/persons' ) return redirect( f'/person/{person.id}' )
except SQLAlchemyError as e: except SQLAlchemyError as e:
st.SetAlert( "danger" ) st.SetAlert( "danger" )
st.SetMessage( "<b>Failed to modify Person:</b>&nbsp;{}".format(e) ) st.SetMessage( "<b>Failed to modify Person:</b>&nbsp;{}".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: else:
person = Person.query.get(id) person = Person.query.get(id)
print(person) print(person)
form = PersonForm(request.values, obj=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"<b>Failed to add Refimg:</b>&nbsp;{e.orig}" )
except Exception as e:
st.SetAlert( "danger" )
st.SetMessage( f"<b>Failed to modify Refimg:</b>&nbsp;{e}" )
return redirect( url_for( 'person', id=person.id) )