From 57d37ffba8ba0a8fbb6429af4f7350dbd8fb3fc1 Mon Sep 17 00:00:00 2001 From: Michael Shavit Date: Sat, 1 Feb 2020 16:45:34 -0500 Subject: [PATCH] Add schema support for more reading states to the ReadBook table. --- cps/ub.py | 15 ++++++++++++++- cps/web.py | 12 ++++++++---- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/cps/ub.py b/cps/ub.py index 21dc6e3c..1e39af7e 100644 --- a/cps/ub.py +++ b/cps/ub.py @@ -34,8 +34,9 @@ except ImportError: from sqlalchemy import create_engine, exc, exists from sqlalchemy import Column, ForeignKey from sqlalchemy import String, Integer, SmallInteger, Boolean, DateTime -from sqlalchemy.orm import relationship, sessionmaker +from sqlalchemy.orm import foreign, relationship, remote, sessionmaker from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.sql.expression import and_ from werkzeug.security import generate_password_hash from . import constants # , config @@ -284,10 +285,15 @@ class BookShelf(Base): class ReadBook(Base): __tablename__ = 'book_read_link' + STATUS_UNREAD = 0 + STATUS_FINISHED = 1 + STATUS_IN_PROGRESS = 2 + id = Column(Integer, primary_key=True) book_id = Column(Integer, unique=False) user_id = Column(Integer, ForeignKey('user.id'), unique=False) is_read = Column(Boolean, unique=False) + read_status = Column(Integer, unique=False, default=STATUS_UNREAD) class Bookmark(Base): @@ -373,6 +379,13 @@ def migrate_Database(session): conn.execute("ALTER TABLE remote_auth_token ADD column 'token_type' INTEGER DEFAULT 0") conn.execute("update remote_auth_token set 'token_type' = 0") session.commit() + try: + session.query(exists().where(ReadBook.read_status)).scalar() + except exc.OperationalError: # Database is not compatible, some columns are missing + conn = engine.connect() + conn.execute("ALTER TABLE book_read_link ADD column 'read_status' INTEGER DEFAULT 0") + conn.execute("UPDATE book_read_link SET 'read_status' = 1 WHERE is_read") + session.commit() # Handle table exists, but no content cnt = session.query(Registration).count() diff --git a/cps/web.py b/cps/web.py index 35cc5d97..a2aa047f 100644 --- a/cps/web.py +++ b/cps/web.py @@ -314,12 +314,15 @@ def toggle_read(book_id): book = ub.session.query(ub.ReadBook).filter(and_(ub.ReadBook.user_id == int(current_user.id), ub.ReadBook.book_id == book_id)).first() if book: - book.is_read = not book.is_read + if book.read_status == ub.ReadBook.STATUS_FINISHED: + book.read_status = ub.ReadBook.STATUS_UNREAD + else: + book.read_status = ub.ReadBook.STATUS_FINISHED else: readBook = ub.ReadBook() readBook.user_id = int(current_user.id) readBook.book_id = book_id - readBook.is_read = True + readBook.read_status = ub.ReadBook.STATUS_FINISHED book = readBook ub.session.merge(book) ub.session.commit() @@ -980,7 +983,7 @@ def render_read_books(page, are_read, as_xml=False, order=None, *args, **kwargs) order = order or [] if not config.config_read_column: readBooks = ub.session.query(ub.ReadBook).filter(ub.ReadBook.user_id == int(current_user.id))\ - .filter(ub.ReadBook.is_read == True).all() + .filter(ub.ReadBook.read_status == ub.ReadBook.STATUS_FINISHED).all() readBookIds = [x.book_id for x in readBooks] else: try: @@ -1448,7 +1451,8 @@ def show_book(book_id): if not config.config_read_column: matching_have_read_book = ub.session.query(ub.ReadBook).\ filter(and_(ub.ReadBook.user_id == int(current_user.id), ub.ReadBook.book_id == book_id)).all() - have_read = len(matching_have_read_book) > 0 and matching_have_read_book[0].is_read + have_read = len( + matching_have_read_book) > 0 and matching_have_read_book[0].read_status == ub.ReadBook.STATUS_FINISHED else: try: matching_have_read_book = getattr(entries, 'custom_column_'+str(config.config_read_column))