diff --git a/BUGs b/BUGs index 71d902e..5f36f48 100644 --- a/BUGs +++ b/BUGs @@ -2,7 +2,6 @@ #### BUGS (next-23) BUG-21: parent series now showing all books (thomas covenant series) -BUG-23: saving a book with a sub? or maybe just saving more than once? is complaining about removing from a series that we have never added ### DB/back-end diff --git a/main.py b/main.py index ba3b21f..dfd755f 100644 --- a/main.py +++ b/main.py @@ -99,8 +99,12 @@ class Book_Series_Link(db.Model): return "".format(self.book_id, self.series_id, self.book_num) def SeriesBookNum(series_id, book_id): - bsl=Book_Series_Link.query.filter( Book_Series_Link.book_id==book_id, Book_Series_Link.series_id==series_id ).all() - return bsl[0].book_num + bsl=Book_Series_Link.query.filter( Book_Series_Link.book_id==book_id, Book_Series_Link.series_id==series_id ).first() + if bsl: + return bsl.book_num + else: + print( f"WARNING: tried to find book number in this series for: book_id={book_id}, series_id={series_id} but no db data for it" ) + return 0 class Book_Sub_Book_Link(db.Model): __tablename__ = "book_sub_book_link" @@ -119,7 +123,7 @@ class Book(db.Model): genre = db.relationship('Genre', secondary=book_genre_link ) loan = db.relationship('Loan', secondary=Book_Loan_Link.__table__); series = db.relationship('Series', secondary=Book_Series_Link.__table__); - bsl = db.relationship('Book_Series_Link' ) + bsl = db.relationship('Book_Series_Link', overlaps="series" ) year_published = db.Column(db.Integer) condition = db.Column(db.Integer, db.ForeignKey('condition.id')) covertype = db.Column(db.Integer, db.ForeignKey('covertype.id')) @@ -133,7 +137,7 @@ class Book(db.Model): # take actual parent book as there is no real associated sub_book_num data and can just use it parent = db.relationship('Book', secondary=Book_Sub_Book_Link.__table__, primaryjoin="Book.id==Book_Sub_Book_Link.sub_book_id", secondaryjoin="Book.id==Book_Sub_Book_Link.book_id" ) # but use child_ref as sub_book_num is per book, and I can't connect an empty array of sub_book_nums to a child book array in "child" - child_ref = db.relationship('Book_Sub_Book_Link', secondary=Book_Sub_Book_Link.__table__, primaryjoin="Book.id==Book_Sub_Book_Link.book_id", secondaryjoin="Book.id==Book_Sub_Book_Link.sub_book_id", order_by="Book_Sub_Book_Link.sub_book_num" ) + child_ref = db.relationship('Book_Sub_Book_Link', secondary=Book_Sub_Book_Link.__table__, primaryjoin="Book.id==Book_Sub_Book_Link.book_id", secondaryjoin="Book.id==Book_Sub_Book_Link.sub_book_id", order_by="Book_Sub_Book_Link.sub_book_num", overlaps="parent" ) def IsParent(self): @@ -590,6 +594,11 @@ def new_book(): @login_required def book(id): book_form = BookForm(request.form) + book_form.publisher.choices = [(c.id, c.name) for c in Publisher.query.order_by('name')] + book_form.owned.choices=[(c.id, c.name) for c in Owned.query.order_by('id')] + book_form.covertype.choices=[(c.id, c.name) for c in Covertype.query.order_by('id')] + book_form.condition.choices=[(c.id, c.name) for c in Condition.query.order_by('id')] + book_form.rating.choices=[(c.id, c.name) for c in Rating.query.order_by('id')] page_title='Edit Book' CheckSeriesChange=None if request.method == 'POST': @@ -670,9 +679,11 @@ def book(id): child_book.condition=book.condition child_book.blurb=book.blurb - if book.IsChild() or (book.IsParent() and not still_in_series): + # if removing_series has something in it, then handle it + if (len(removing_series) > 0) and (book.IsChild() or (book.IsParent() and not still_in_series)): print ("okay should raise DBox") print ("{}".format( removing_series )) + print (f"still_in_series={still_in_series}" ) if book.IsParent(): CheckSeriesChange={'type':'parent', 'pid': book.id, 'bid': book.id, 'removing_series': removing_series } else: @@ -717,6 +728,11 @@ def book(id): return render_template("base.html", alert=st.GetAlert(), message=st.GetMessage()) book_form=BookForm(obj=book) + book_form.publisher.choices = [(c.id, c.name) for c in Publisher.query.order_by('name')] + book_form.owned.choices=[(c.id, c.name) for c in Owned.query.order_by('id')] + book_form.covertype.choices=[(c.id, c.name) for c in Covertype.query.order_by('id')] + book_form.condition.choices=[(c.id, c.name) for c in Condition.query.order_by('id')] + book_form.rating.choices=[(c.id, c.name) for c in Rating.query.order_by('id')] author_list = GetAuthors() genre_list = GetGenres() @@ -802,14 +818,12 @@ def books_on_shelf(): books = Book.query.join(Owned).filter(Owned.name=='Currently Owned').all() RemSubs(books) - # now we order them (they are in author order, but not inside that authors list) - # because a book can be in multiple series, without any ordering we need to find # any book that is in a series, then go through each series to find the one with # the most books in it. THEN we need to get all those books and put them in the # ordered_books array, and remove them from the books array ordered_books=[] - handle_parent=[] + processed=[] currently_owned = Owned.query.filter(Owned.name=='Currently Owned').one() for b in books: if b.series: @@ -829,14 +843,15 @@ def books_on_shelf(): continue if tmp_b.IsChild(): # this child book wont be in books, but its parent will -> use it instead - if tmp_b.parent[0].id not in handle_parent: - books.remove(tmp_b.parent[0]) + # mark parent from books so we dont process it twice + if tmp_b.parent[0].id not in processed: + processed.append(tmp_b.id) + processed.append(tmp_b.parent[0].id) ordered_books.append(tmp_b.parent[0]) - handle_parent.append(tmp_b.parent[0].id) else: - if tmp_b.id not in handle_parent: - books.remove(tmp_b) + if tmp_b.id not in processed: ordered_books.append(tmp_b) + processed.append(tmp_b.id) else: # book not in a series or a sub-book, so just add this book to the ordered list ordered_books.append(b)