From e880238cb9765f03ae0627c4478b5637d17dbd18 Mon Sep 17 00:00:00 2001 From: Ozzie Isaacs Date: Sun, 21 Nov 2021 16:19:32 +0100 Subject: [PATCH 1/2] Add missing filter for current user in KoboSyncedBooks queries --- cps/kobo.py | 3 -- cps/kobo_sync_status.py | 65 +++++++++++++++++++++++------------------ 2 files changed, 36 insertions(+), 32 deletions(-) diff --git a/cps/kobo.py b/cps/kobo.py index 8a395821..ee2317ba 100644 --- a/cps/kobo.py +++ b/cps/kobo.py @@ -142,9 +142,6 @@ def HandleSyncRequest(): if not current_app.wsgi_app.is_proxied: log.debug('Kobo: Received unproxied request, changed request port to external server port') - # TODO: Limit the number of books return per sync call, and rely on the sync-continuatation header - # instead so that the device triggers another sync. - new_books_last_modified = sync_token.books_last_modified new_books_last_created = sync_token.books_last_created new_reading_state_last_modified = sync_token.reading_state_last_modified diff --git a/cps/kobo_sync_status.py b/cps/kobo_sync_status.py index f4a66604..b88cb6ac 100644 --- a/cps/kobo_sync_status.py +++ b/cps/kobo_sync_status.py @@ -22,25 +22,31 @@ from . import ub import datetime from sqlalchemy.sql.expression import or_ - +# Add the current book id to kobo_synced_books table for current user, if entry is already present, +# do nothing (safety precaution) def add_synced_books(book_id): - synced_book = ub.KoboSyncedBooks() - synced_book.user_id = current_user.id - synced_book.book_id = book_id - ub.session.add(synced_book) - ub.session_commit() + is_present = ub.session.query(ub.KoboSyncedBooks).filter(ub.KoboSyncedBooks.book_id == book_id)\ + .filter(ub.KoboSyncedBooks.user_id == current_user.id).count() + if not is_present: + synced_book = ub.KoboSyncedBooks() + synced_book.user_id = current_user.id + synced_book.book_id = book_id + ub.session.add(synced_book) + ub.session_commit() +# Select all entries of current book in kobo_synced_books table, which are from current user and delete them def remove_synced_book(book_id): - ub.session.query(ub.KoboSyncedBooks).filter(ub.KoboSyncedBooks.book_id == book_id).delete() + ub.session.query(ub.KoboSyncedBooks).filter(ub.KoboSyncedBooks.book_id == book_id) \ + .filter(ub.KoboSyncedBooks.user_id == current_user.id).delete() ub.session_commit() + def add_archived_books(book_id): - archived_book = ( - ub.session.query(ub.ArchivedBook) - .filter(ub.ArchivedBook.book_id == book_id) - .first() - ) + archived_book = (ub.session.query(ub.ArchivedBook) + .filter(ub.ArchivedBook.book_id == book_id) + .filter(ub.ArchivedBook.user_id == current_user.id) + .first()) if not archived_book: archived_book = ub.ArchivedBook(user_id=current_user.id, book_id=book_id) archived_book.is_archived = True @@ -50,22 +56,23 @@ def add_archived_books(book_id): ub.session_commit() - # select all books which are synced by the current user and do not belong to a synced shelf and them to archive -# select all shelfs from current user which are synced and do not belong to the "only sync" shelfs -def update_on_sync_shelfs(content_id): - books_to_archive = (ub.session.query(ub.KoboSyncedBooks) - .join(ub.BookShelf, ub.KoboSyncedBooks.book_id == ub.BookShelf.book_id, isouter=True) - .join(ub.Shelf, ub.Shelf.user_id == content_id, isouter=True) - .filter(or_(ub.Shelf.kobo_sync == 0, ub.Shelf.kobo_sync == None)) - .filter(ub.KoboSyncedBooks.user_id == content_id).all()) - for b in books_to_archive: - add_archived_books(b.book_id) - ub.session.query(ub.KoboSyncedBooks).filter(ub.KoboSyncedBooks.book_id == b.book_id).filter(ub.KoboSyncedBooks.user_id == content_id).delete() - ub.session_commit() +# select all shelves from current user which are synced and do not belong to the "only sync" shelves +def update_on_sync_shelfs(user_id): + books_to_archive = (ub.session.query(ub.KoboSyncedBooks) + .join(ub.BookShelf, ub.KoboSyncedBooks.book_id == ub.BookShelf.book_id, isouter=True) + .join(ub.Shelf, ub.Shelf.user_id == user_id, isouter=True) + .filter(or_(ub.Shelf.kobo_sync == 0, ub.Shelf.kobo_sync == None)) + .filter(ub.KoboSyncedBooks.user_id == user_id).all()) + for b in books_to_archive: + add_archived_books(b.book_id) + ub.session.query(ub.KoboSyncedBooks) \ + .filter(ub.KoboSyncedBooks.book_id == b.book_id) \ + .filter(ub.KoboSyncedBooks.user_id == user_id).delete() + ub.session_commit() - shelfs_to_archive = ub.session.query(ub.Shelf).filter(ub.Shelf.user_id == content_id).filter( - ub.Shelf.kobo_sync == 0).all() - for a in shelfs_to_archive: - ub.session.add(ub.ShelfArchive(uuid=a.uuid, user_id=content_id)) - ub.session_commit() + shelves_to_archive = ub.session.query(ub.Shelf).filter(ub.Shelf.user_id == user_id).filter( + ub.Shelf.kobo_sync == 0).all() + for a in shelves_to_archive: + ub.session.add(ub.ShelfArchive(uuid=a.uuid, user_id=user_id)) + ub.session_commit() From d084a06e635b7228279e308aeb5ba5dddafa4502 Mon Sep 17 00:00:00 2001 From: Ozzie Isaacs Date: Sun, 21 Nov 2021 16:21:27 +0100 Subject: [PATCH 2/2] Bugfix create shelf for users not allowed to create public shelfs --- cps/shelf.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/cps/shelf.py b/cps/shelf.py index 97147a71..5f6a66bf 100644 --- a/cps/shelf.py +++ b/cps/shelf.py @@ -224,12 +224,8 @@ def remove_from_shelf(shelf_id, book_id): @shelf.route("/shelf/create", methods=["GET", "POST"]) @login_required def create_shelf(): - if not current_user.role_edit_shelfs() and request.method == 'POST': - flash(_(u"Sorry you are not allowed to create a public shelf"), category="error") - return redirect(url_for('web.index')) - else: - shelf = ub.Shelf() - return create_edit_shelf(shelf, page_title=_(u"Create a Shelf"), page="shelfcreate") + shelf = ub.Shelf() + return create_edit_shelf(shelf, page_title=_(u"Create a Shelf"), page="shelfcreate") @@ -249,6 +245,9 @@ def create_edit_shelf(shelf, page_title, page, shelf_id=False): # calibre_db.session.query(ub.Shelf).filter(ub.Shelf.user_id == current_user.id).filter(ub.Shelf.kobo_sync).count() if request.method == "POST": to_save = request.form.to_dict() + if not current_user.role_edit_shelfs() and to_save.get("is_public") == "on": + flash(_(u"Sorry you are not allowed to create a public shelf"), category="error") + return redirect(url_for('web.index')) shelf.is_public = 1 if to_save.get("is_public") else 0 if config.config_kobo_sync: shelf.kobo_sync = True if to_save.get("kobo_sync") else False