Files
photoassistant/person.py

127 lines
6.1 KiB
Python

from wtforms import SubmitField, StringField, HiddenField, validators, Form
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 files import File
from refimg import Refimg
from refimg import Person_Refimg_Link
################################################################################
# Class describing Person in the database, and via sqlalchemy, connected to the DB as well
################################################################################
class Person(db.Model):
id = db.Column(db.Integer, db.Sequence('person_id_seq'), primary_key=True )
tag = db.Column(db.String(48), unique=False, nullable=False)
surname = db.Column(db.String(48), unique=False, nullable=False)
firstname = db.Column(db.String(48), unique=False, nullable=False)
refimg = db.relationship('Refimg', secondary=Person_Refimg_Link.__table__)
def __repr__(self):
return "<tag: {}, firstname: {}, surname: {}, refimg: {}>".format(self.tag,self.firstname, self.surname, self.refimg)
class File_Person_Link(db.Model):
__tablename__ = "file_person_link"
file_id = db.Column(db.Integer, db.ForeignKey('file.id'), unique=True, nullable=False, primary_key=True)
person_id = db.Column(db.Integer, db.ForeignKey('person.id'), unique=True, nullable=False, primary_key=True)
def __repr__(self):
return "<file_id: {}, person_id: {}>".format(self.file_id, self.person_id)
################################################################################
# Helper class that inherits a .dump() method to turn class Person into json / useful in jinja2
################################################################################
class PersonSchema(ma.SQLAlchemyAutoSchema):
class Meta:
model = Person
ordered = True
################################################################################
# Helper class that defines a form for person, used to make html <form>, with field validation (via wtforms)
################################################################################
class PersonForm(FlaskForm):
id = HiddenField()
tag = StringField('Tag (searchable name):', [validators.DataRequired()])
firstname = StringField('FirstName(s):', [validators.DataRequired()])
surname = StringField('Surname:', [validators.DataRequired()])
submit = SubmitField('Save' )
delete = SubmitField('Delete' )
################################################################################
# Routes for person data
#
# /persons -> GET only -> prints out list of all persons
################################################################################
@app.route("/persons", methods=["GET"])
def persons():
persons = Person.query.all()
return render_template("persons.html", persons=persons)
################################################################################
# /person -> GET/POST -> creates a new person type and when created, takes you back to /persons
################################################################################
@app.route("/person", methods=["GET", "POST"])
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 )
else:
person = Person( tag=request.form["tag"], surname=request.form["surname"], firstname=request.form["firstname"] )
try:
db.session.add(person)
db.session.commit()
print(person)
st.SetMessage( "Created new Person ({})".format(person.tag) )
return redirect( '/persons' )
except SQLAlchemyError as e:
st.SetAlert( "danger" )
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)
################################################################################
# /person/<id> -> GET/POST(save or delete) -> shows/edits/delets a single
# person
################################################################################
@app.route("/person/<id>", methods=["GET", "POST"])
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 ) )
person = Person.query.filter(Person.id==id).delete()
if 'submit' in 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:
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)
st.AppendMessage(" To: ({}, {}, {})".format(person.tag, person.firstname, person.surname) )
db.session.commit()
return redirect( '/persons' )
except SQLAlchemyError as e:
st.SetAlert( "danger" )
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)
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)