From 3487b6639332f39094ca09405ef2216bd4e02fdd Mon Sep 17 00:00:00 2001 From: Felix Bauckholt Date: Sat, 12 Mar 2016 20:58:51 -0500 Subject: [PATCH] Categorizing and uncategorizing based on selection Now, in any book browser window, you can add every selected book to one category. When you are browsing the books in a category, you can remove every selected book from that category. --- TODO | 4 +- library/database.py | 27 +++++++++++ library/interface/.browser.py.swp | Bin 0 -> 32768 bytes library/interface/browser.py | 74 ++++++++++++++++++++++++++++-- 4 files changed, 97 insertions(+), 8 deletions(-) create mode 100644 library/interface/.browser.py.swp diff --git a/TODO b/TODO index 3525d2f..8389e32 100644 --- a/TODO +++ b/TODO @@ -1,8 +1,5 @@ _List of Desired Features_ -Categories work based on selection, not just highlight - - i.e. assign categories to multiple books at once - - this may involve extra logic if books don't have the same categories beforehand Regex Search Choose shown columns in browser Support for multiple copies @@ -33,6 +30,7 @@ Error checking out an already checked out book _Implemented Features_ +Categories work based on selection, not just highlight Sort by column in browser Support UTF-8 for everything Search ignores Case (for lowercase search strings) diff --git a/library/database.py b/library/database.py index 0940ba6..9da5950 100644 --- a/library/database.py +++ b/library/database.py @@ -268,6 +268,22 @@ def categorizeBook(book, cats): conn.commit() c.close() +@permissions.check_permissions(permissions.PERMISSION_LIBCOM) +def categorizeBooks(cat, books): + conn = sqlite3.connect(_catalogue_db_file) + c = conn.cursor() + query = ("INSERT OR IGNORE INTO "+_book_category_table+ + " (id,cat_id) VALUES (?, ?);") + exists_query = "SELECT * FROM "+_book_category_table+" WHERE (id = ? AND cat_id = ?);" + for book in books: + args = (book['id'],cat['id']) + c.execute(exists_query, args) + if len(c.fetchall()) == 0: + c.execute(query,args) + conn.commit() + c.close() + + @permissions.check_permissions(permissions.PERMISSION_LIBCOM) def uncategorizeBook(book, cats): conn = sqlite3.connect(_catalogue_db_file) @@ -279,6 +295,17 @@ def uncategorizeBook(book, cats): conn.commit() c.close() +@permissions.check_permissions(permissions.PERMISSION_LIBCOM) +def uncategorizeBooks(books, cat): + conn = sqlite3.connect(_catalogue_db_file) + c = conn.cursor() + query = "DELETE FROM "+_book_category_table+" WHERE (id = ? AND cat_id = ?);" + for book in books: + args = (book['id'],cat['id']) + c.execute(query,args) + conn.commit() + c.close() + def getCategories(): conn = sqlite3.connect(_catalogue_db_file) c = conn.cursor() diff --git a/library/interface/.browser.py.swp b/library/interface/.browser.py.swp new file mode 100644 index 0000000000000000000000000000000000000000..a9cee10920065a5b4efb543e5d884d523e361247 GIT binary patch literal 32768 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