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 "".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 "".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
, 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, alert=st.GetAlert(), message=st.GetMessage() ) ################################################################################ # /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( "Failed to add Person: {}".format(e.orig) ) return render_template("person.html", object=person, form=form, reference_imgs=reference_imgs, page_title = page_title, alert=st.GetAlert(), message=st.GetMessage() ) ################################################################################ # /person/ -> GET/POST(save or delete) -> shows/edits/delets a single # person ################################################################################ @app.route("/person/", 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( "Failed to modify Person: {}".format(e) ) return render_template("person.html", form=form, reference_imgs="test", page_title=page_title, alert=st.GetAlert(), message=st.GetMessage() ) 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, alert=st.GetAlert(), message=st.GetMessage() )