diff --git a/cps/config_sql.py b/cps/config_sql.py index a00b4217..97c05067 100644 --- a/cps/config_sql.py +++ b/cps/config_sql.py @@ -70,7 +70,7 @@ class _Settings(_Base): config_remote_login = Column(Boolean, default=False) config_default_role = Column(SmallInteger, default=0) - config_default_show = Column(SmallInteger, default=6143) + config_default_show = Column(SmallInteger, default=38911) config_columns_to_ignore = Column(String) config_restricted_tags = Column(String, default="") diff --git a/cps/constants.py b/cps/constants.py index a78c31b3..e0d56922 100644 --- a/cps/constants.py +++ b/cps/constants.py @@ -80,9 +80,10 @@ MATURE_CONTENT = 1 << 11 SIDEBAR_PUBLISHER = 1 << 12 SIDEBAR_RATING = 1 << 13 SIDEBAR_FORMAT = 1 << 14 +SIDEBAR_ARCHIVED = 1 << 15 ADMIN_USER_ROLES = sum(r for r in ALL_ROLES.values()) & ~ROLE_EDIT_SHELFS & ~ROLE_ANONYMOUS -ADMIN_USER_SIDEBAR = (SIDEBAR_FORMAT << 1) - 1 +ADMIN_USER_SIDEBAR = (SIDEBAR_ARCHIVED << 1) - 1 UPDATE_STABLE = 0 << 0 AUTO_UPDATE_STABLE = 1 << 0 diff --git a/cps/helper.py b/cps/helper.py index 93ce1b07..a1265f73 100644 --- a/cps/helper.py +++ b/cps/helper.py @@ -683,7 +683,19 @@ def render_task_status(tasklist): # Language and content filters for displaying in the UI -def common_filters(): +def common_filters(allow_show_archived=False): + if not allow_show_archived: + archived_books = ( + ub.session.query(ub.ArchivedBook) + .filter(ub.ArchivedBook.user_id == int(current_user.id)) + .filter(ub.ArchivedBook.is_archived == True) + .all() + ) + archived_book_ids = [archived_book.book_id for archived_book in archived_books] + archived_filter = db.Books.id.notin_(archived_book_ids) + else: + archived_filter = true() + if current_user.filter_language() != "all": lang_filter = db.Books.languages.any(db.Languages.lang_code == current_user.filter_language()) else: @@ -708,7 +720,7 @@ def common_filters(): pos_content_cc_filter = true() neg_content_cc_filter = false() return and_(lang_filter, pos_content_tags_filter, ~neg_content_tags_filter, - pos_content_cc_filter, ~neg_content_cc_filter) + pos_content_cc_filter, ~neg_content_cc_filter, archived_filter) def tags_filters(): @@ -765,15 +777,19 @@ def order_authors(entry): # Fill indexpage with all requested data from database def fill_indexpage(page, database, db_filter, order, *join): + return fill_indexpage_with_archived_books(page, database, db_filter, order, False, *join) + + +def fill_indexpage_with_archived_books(page, database, db_filter, order, allow_show_archived, *join): if current_user.show_detail_random(): - randm = db.session.query(db.Books).filter(common_filters())\ + randm = db.session.query(db.Books).filter(common_filters(allow_show_archived))\ .order_by(func.random()).limit(config.config_random_books) else: randm = false() off = int(int(config.config_books_per_page) * (page - 1)) pagination = Pagination(page, config.config_books_per_page, - len(db.session.query(database).filter(db_filter).filter(common_filters()).all())) - entries = db.session.query(database).join(*join, isouter=True).filter(db_filter).filter(common_filters()).\ + len(db.session.query(database).filter(db_filter).filter(common_filters(allow_show_archived)).all())) + entries = db.session.query(database).join(*join, isouter=True).filter(db_filter).filter(common_filters(allow_show_archived)).\ order_by(*order).offset(off).limit(config.config_books_per_page).all() for book in entries: book = order_authors(book) diff --git a/cps/static/js/caliBlur.js b/cps/static/js/caliBlur.js index 1bd5f69c..9313ee94 100644 --- a/cps/static/js/caliBlur.js +++ b/cps/static/js/caliBlur.js @@ -216,6 +216,8 @@ if ( $( 'body.book' ).length > 0 ) { .prependTo( '[aria-label^="Download, send"]' ); $( '#have_read_cb' ) .after( '' ); + $( '#archived_cb' ) + .after( '' ); $( '#shelf-actions' ).prependTo( '[aria-label^="Download, send"]' ); @@ -586,6 +588,20 @@ $( '#have_read_cb:checked' ).attr({ 'data-viewport': '.btn-toolbar' }) .addClass('readunread-btn-tooltip'); + $( '#archived_cb' ).attr({ + 'data-toggle': 'tooltip', + 'title': $( '#archived_cb').attr('data-unchecked'), + 'data-placement': 'bottom', + 'data-viewport': '.btn-toolbar' }) + .addClass('readunread-btn-tooltip'); + + $( '#archived_cb:checked' ).attr({ + 'data-toggle': 'tooltip', + 'title': $( '#archived_cb').attr('data-checked'), + 'data-placement': 'bottom', + 'data-viewport': '.btn-toolbar' }) + .addClass('readunread-btn-tooltip'); + $( 'button#delete' ).attr({ 'data-toggle-two': 'tooltip', 'title': $( 'button#delete' ).text(), //'Delete' @@ -601,6 +617,14 @@ $( '#have_read_cb' ).click(function() { } }); +$( '#archived_cb' ).click(function() { + if ( $( '#archived_cb:checked' ).length > 0 ) { + $( this ).attr('data-original-title', $('#archived_cb').attr('data-checked')); + } else { + $( this).attr('data-original-title', $('#archived_cb').attr('data-unchecked')); + } +}); + $( '.btn-group[aria-label="Edit/Delete book"] a' ).attr({ 'data-toggle': 'tooltip', 'title': $( '#edit_book' ).text(), // 'Edit' diff --git a/cps/static/js/details.js b/cps/static/js/details.js index 491d23bb..395518cb 100644 --- a/cps/static/js/details.js +++ b/cps/static/js/details.js @@ -25,6 +25,14 @@ $("#have_read_cb").on("change", function() { $(this).closest("form").submit(); }); +$(function() { + $("#archived_form").ajaxForm(); +}); + +$("#archived_cb").on("change", function() { + $(this).closest("form").submit(); +}); + (function() { var templates = { add: _.template( diff --git a/cps/templates/detail.html b/cps/templates/detail.html index b76a8afa..214a0738 100644 --- a/cps/templates/detail.html +++ b/cps/templates/detail.html @@ -202,6 +202,14 @@
++
+ {% endif %} diff --git a/cps/ub.py b/cps/ub.py index 7ebd287c..62ba82af 100644 --- a/cps/ub.py +++ b/cps/ub.py @@ -97,10 +97,13 @@ def get_sidebar_config(kwargs=None): sidebar.append({"glyph": "glyphicon-file", "text": _('File formats'), "link": 'web.formats_list', "id": "format", "visibility": constants.SIDEBAR_FORMAT, 'public': True, "page": "format", "show_text": _('Show file formats selection'), "config_show":True}) + sidebar.append( + {"glyph": "glyphicon-trash", "text": _('Archived Books'), "link": 'web.books_list', "id": "archived", + "visibility": constants.SIDEBAR_ARCHIVED, 'public': (not g.user.is_anonymous), "page": "archived", + "show_text": _('Show archived books'), "config_show": True}) return sidebar - class UserBase: @property diff --git a/cps/web.py b/cps/web.py index 5c535e8d..d01b4e1a 100644 --- a/cps/web.py +++ b/cps/web.py @@ -46,10 +46,10 @@ from werkzeug.security import generate_password_hash, check_password_hash from . import constants, config, logger, isoLanguages, services, worker from . import searched_ids, lm, babel, db, ub, config, get_locale, app from .gdriveutils import getFileFromEbooksFolder, do_gdrive_download -from .helper import common_filters, get_search_results, fill_indexpage, speaking_language, check_valid_domain, \ - order_authors, get_typeahead, render_task_status, json_serial, get_cc_columns, \ - get_book_cover, get_download_link, send_mail, generate_random_password, send_registration_mail, \ - check_send_to_kindle, check_read_formats, lcase, tags_filters, reset_password +from .helper import common_filters, get_search_results, fill_indexpage, fill_indexpage_with_archived_books, \ + speaking_language, check_valid_domain, order_authors, get_typeahead, render_task_status, json_serial, \ + get_cc_columns, get_book_cover, get_download_link, send_mail, generate_random_password, \ + send_registration_mail, check_send_to_kindle, check_read_formats, lcase, tags_filters, reset_password from .pagination import Pagination from .redirect import redirect_back @@ -342,6 +342,23 @@ def toggle_read(book_id): return "" +@web.route("/ajax/togglearchived/