diff --git a/main.py b/main.py index f161770..add620e 100644 --- a/main.py +++ b/main.py @@ -16,6 +16,7 @@ ma = Marshmallow(app) Bootstrap(app) from author import Author, AuthorForm, AuthorSchema +from publisher import Publisher, PublisherForm, PublisherSchema ####################################### CLASSES / DB model ####################################### book_author_link = db.Table('book_author_link', db.Model.metadata, @@ -64,12 +65,12 @@ class Book(db.Model): def __repr__(self): return "".format(self.id, self.author, self.title, self.year_published, self.rating, self.condition, self.owned, self.covertype, self.notes, self.blurb, self.created, self.modified, self.publisher ) -class Publisher(db.Model): - id = db.Column(db.Integer, unique=True, nullable=False, primary_key=True) - name = db.Column(db.String(50), unique=False, nullable=False) - - def __repr__(self): - return "".format(self.id, self.name) +#$class Publisher(db.Model): +# id = db.Column(db.Integer, unique=True, nullable=False, primary_key=True) +# name = db.Column(db.String(50), unique=False, nullable=False) +# +# def __repr__(self): +# return "".format(self.id, self.name) class Genre_Lst(db.Model): __tablename__ = "genre_lst" @@ -79,8 +80,8 @@ class Genre_Lst(db.Model): def __repr__(self): return "".format(self.id, self.genre) -class PublisherSchema(ma.SQLAlchemyAutoSchema): - class Meta: model = Publisher +#class PublisherSchema(ma.SQLAlchemyAutoSchema): +# class Meta: model = Publisher class Genre_LstSchema(ma.SQLAlchemyAutoSchema): class Meta: model = Genre_Lst diff --git a/publisher.py b/publisher.py new file mode 100644 index 0000000..b33e824 --- /dev/null +++ b/publisher.py @@ -0,0 +1,64 @@ +from wtforms import SubmitField, StringField, HiddenField, validators, Form +from flask import request, render_template +from __main__ import db, app, ma + +################################################################################ +# Class describing Publisher in the database, and via sqlalchemy, connected to the DB as well +################################################################################ +class Publisher(db.Model): + id = db.Column(db.Integer, unique=True, nullable=False, primary_key=True) + name = db.Column(db.String(50), unique=False, nullable=False) + + def __repr__(self): + return "".format(self.id,self.name) + +################################################################################ +# Helper class that inherits a .dump() method to turn class Publisher into json / useful in jinja2 +################################################################################ +class PublisherSchema(ma.SQLAlchemyAutoSchema): + class Meta: model = Publisher + +################################################################################ +# Helper class that defines a form for publisher, used to make html
, with field validation (via wtforms) +################################################################################ +class PublisherForm(Form): + id = HiddenField() + name = StringField('Name:', [validators.DataRequired()]) + submit = SubmitField('Save' ) + delete = SubmitField('Delete' ) + +################################################################################ +# Routes for publisher data +# +# /publishers -> GET only -> prints out list of all publishers +################################################################################ +@app.route("/publishers", methods=["GET"]) +def publishers(): + publishers = Publisher.query.all() + return render_template("publishers.html", publishers=publishers) + +################################################################################ +# /publisher/ -> GET/POST(save or delete) -> shows/edits/delets a single publisher +################################################################################ +@app.route("/publisher/", methods=["GET", "POST"]) +def publisher(id): + ### DDP: should this be request.form or request.values? + alert="Success" + publisher_form = PublisherForm(request.form) + if request.method == 'POST' and publisher_form.validate(): + id = request.form['id'] + publisher = Publisher.query.get(id) + try: + request.form['submit'] + except: + message="Sorry, Deleting unsupported at present" + alert="Danger" + else: + publisher.name = request.form['name'] + db.session.commit() + message="Successfully Updated Publisher (id={})".format(id) + else: + publisher = Publisher.query.get(id) + publisher_form = PublisherForm(request.values, obj=publisher) + message="" + return render_template("publisher.html", publisher=publisher, alert=alert, message=message, publisher_form=publisher_form) diff --git a/templates/base.html b/templates/base.html index 09d883f..1f1a88f 100644 --- a/templates/base.html +++ b/templates/base.html @@ -36,7 +36,7 @@ diff --git a/templates/publisher.html b/templates/publisher.html new file mode 100644 index 0000000..363b40e --- /dev/null +++ b/templates/publisher.html @@ -0,0 +1,24 @@ +{% extends "base.html" %} {% block main_content %} +

Publisher

+
+ + {% if message|length %} +
+ {{message}} +
+ {% endif %} +
+ + {{ wtf.form_field( publisher_form.id, form_type='inline' ) }} +
+ {{ wtf.form_field( publisher_form.name, form_type='horizontal', horizontal_columns=('xl', 2, 10), style="width:100%" ) }} +
+
+

+
+ {{ wtf.form_field( publisher_form.submit, horizontal_columns=('xl', 2, 2), class="btn btn-primary offset-xl-1 col-xl-2" )}} + {{ wtf.form_field( publisher_form.delete, horizontal_columns=('xl', 2, 2), class="btn btn-danger offset-xl-1 col-xl-2" )}} + +
+
+{% endblock main_content %} diff --git a/templates/publishers.html b/templates/publishers.html new file mode 100644 index 0000000..89b73fd --- /dev/null +++ b/templates/publishers.html @@ -0,0 +1,15 @@ +{% extends "base.html" %} + +{% block main_content %} +

Publishers

+ + + + + + {% for publisher in publishers %} + + {% endfor %} + +
SurnameFirstname(s)
{{publisher.name}}
+{% endblock main_content %}