From 1fcd0ed79754809b40dec8d66d37a72234cc6a81 Mon Sep 17 00:00:00 2001 From: Damien De Paoli Date: Fri, 6 Nov 2020 17:26:50 +1100 Subject: [PATCH] okay removed sub_book as a formal db.relationship, its too confusing, using raw sql for now. Still need to ensure ordering of sub_books based on book_id, sub_book_num AND need to pass enough sub_book fields that can vary so that jinja2 can show all subs of a book when editing any of them --- main.py | 45 ++++++++++++++++++-------------------------- templates/books.html | 9 ++++++++- 2 files changed, 26 insertions(+), 28 deletions(-) diff --git a/main.py b/main.py index 5205f85..6ef36b5 100644 --- a/main.py +++ b/main.py @@ -22,15 +22,6 @@ book_publisher_link = db.Table('book_publisher_link', db.Model.metadata, db.Column('publisher_id', db.Integer, db.ForeignKey('publisher.id')) ) -class Book_Sub_Book_Link(db.Model): - __tablename__ = 'book_sub_book_link' - book_id = db.Column( db.Integer, db.ForeignKey('book.id'), primary_key=True) - sub_book_id = db.Column( db.Integer, db.ForeignKey('book.id'), primary_key=True) - sub_book_num = db.Column( db.Integer ) - - def __repr__(self): - return "".format(self.book_id, self.sub_book_id, self.sub_book_num ) - class Book(db.Model): id = db.Column(db.Integer, unique=True, nullable=False, primary_key=True) title = db.Column(db.String(100), unique=True, nullable=False) @@ -46,11 +37,6 @@ class Book(db.Model): author = db.relationship('Author', secondary=book_author_link) publisher = db.relationship('Publisher', secondary=book_publisher_link) -# sub_book = db.relationship('Book', secondary="book_sub_book_link", -# primaryjoin="Book.id == Book_Sub_Book_Link.book_id", -# secondaryjoin="Book.id == Book_Sub_Book_Link.sub_book_id", -# backref="parent_book", -# ) def __repr__(self): return "".format(self.title, self.id, self.year_published, self.rating, self.condition, self.owned, self.covertype, self.notes, self.blurb, self.created, self.modified, self.publisher ) @@ -85,42 +71,47 @@ class PublisherSchema(ma.SQLAlchemyAutoSchema): include_relationships = True load_instance = True -class Book_Sub_Book_Link(ma.SQLAlchemyAutoSchema): +class BookSchema(ma.SQLAlchemyAutoSchema): + author = ma.Nested(AuthorSchema, many=True) + publisher = ma.Nested(PublisherSchema, many=True) class Meta: - model = Book_Sub_Book_Link + model = Book include_relationships = True load_instance = True -#class BookSchema(ma.SQLAlchemyAutoSchema): -# class Meta: -# model = Book -# include_relationships = True -# load_instance = True - author_schema = AuthorSchema() publisher_schema = PublisherSchema() -book_sub_book_link_schema = Book_Sub_Book_Link() -#book_schema = BookSchema() +book_schema = BookSchema() ####################################### ROUTES ####################################### @app.route("/books", methods=["GET"]) def books(): if request.form: print(request.form) -# books = Book.query.all() - #### quick hack - lets just return all the books not in the first 6, but should be those that are not in list of book_id's from book_sub_book_link - books = Book.query.filter( ~ Book.id.in_([0, 1, 2, 3, 4, 5, 6]) ).all() + + books = Book.query.all() + # want to get sub book info and patch it into the books object to at least reference sub_book_num and parent_book, + # then per book in jinja2, slide it into the right aprt of the table with the right markup to show its a sub book + subs = db.engine.execute ( "select * from book_sub_book_link" ) + for row in subs: + index = next((i for i, item in enumerate(books) if item.id == row.sub_book_id), -1) + books[index].parent_id = row.book_id + books[index].sub_book_num = row.sub_book_num + return render_template("books.html", books=books) @app.route("/book/", methods=["GET"]) def book(id): book = Book.query.get(id) book_s = book_schema.dump(book) + + # force sub books for jinja2 to be able to use subs = db.engine.execute ( "select book_id, sub_book_id, sub_book_num from book_sub_book_link where book_id = " + id ) sub_book=[] for row in subs: sub_book.append( { 'sub_book_id': row.sub_book_id, 'sub_book_num': row.sub_book_num } ) book_s['sub_book'] = sub_book + print( book_s ) return render_template("books.html", books=book_s ) diff --git a/templates/books.html b/templates/books.html index b99943a..aa21326 100644 --- a/templates/books.html +++ b/templates/books.html @@ -21,7 +21,11 @@ {% for book in books %} - {{book.title}} + {% if book.sub_book_num is defined %} +     {{book.title}} + {% else %} + {{book.title}} + {% endif %} {{ book.author[0]['surname'] }}, {{book.author[0]['firstnames']}} {{ book.publisher[0]['name']}} @@ -42,6 +46,9 @@ {% else %}

Book

{{books.title}}, {{ books.author[0]['surname'] }}, {{books.author[0]['firstnames']}}

+ {% if books.sub_book is defined %} +

sub_book is defined: {{books.sub_book}}

+ {% endif %} {% endif %}