From aa268e8852cf5e3d25a85cedecf3b6af4348e461 Mon Sep 17 00:00:00 2001
From: h7x4 <h7x4@nani.wtf>
Date: Fri, 17 May 2024 21:42:21 +0200
Subject: [PATCH] cli/main: add command to show borrowed/queued items, move
 `list_bookcases` to advanced

---
 worblehat/cli/main.py                     | 68 +++++++++++++----------
 worblehat/cli/subclis/advanced_options.py | 24 ++++++++
 2 files changed, 64 insertions(+), 28 deletions(-)

diff --git a/worblehat/cli/main.py b/worblehat/cli/main.py
index 05cc32b..3095b0f 100644
--- a/worblehat/cli/main.py
+++ b/worblehat/cli/main.py
@@ -61,26 +61,6 @@ class WorblehatCli(NumberedCmd):
                     exit(0)
 
 
-    def do_list_bookcases(self, _: str):
-        bookcase_shelfs = self.sql_session.scalars(
-            select(BookcaseShelf)
-            .join(Bookcase)
-            .order_by(
-              Bookcase.name,
-              BookcaseShelf.column,
-              BookcaseShelf.row,
-            )
-        ).all()
-
-        bookcase_uid = None
-        for shelf in bookcase_shelfs:
-            if shelf.bookcase.uid != bookcase_uid:
-                print(shelf.bookcase.short_str())
-                bookcase_uid = shelf.bookcase.uid
-
-            print(f'  {shelf.short_str()} - {sum(i.amount for i in shelf.items)} items')
-
-
     def do_show_bookcase(self, arg: str):
         bookcase_selector = InteractiveItemSelector(
             cls = Bookcase,
@@ -95,6 +75,35 @@ class WorblehatCli(NumberedCmd):
                 print(f'  {item.name} - {item.amount} copies')
 
 
+    def do_show_borrowed_queued(self, _: str):
+        borrowed_items = self.sql_session.scalars(
+            select(BookcaseItemBorrowing)
+            .where(BookcaseItemBorrowing.delivered.is_(None))
+            .order_by(BookcaseItemBorrowing.end_time),
+        ).all()
+
+        if len(borrowed_items) == 0:
+            print('No borrowed items found.')
+        else:
+          print('Borrowed items:')
+          for item in borrowed_items:
+              print(f'- {item.username} - {item.item.name} - to be delivered by {item.end_time.strftime("%Y-%m-%d")}')
+
+        print()
+
+        queued_items = self.sql_session.scalars(
+            select(BookcaseItemBorrowingQueue)
+            .order_by(BookcaseItemBorrowingQueue.entered_queue_time),
+        ).all()
+
+        if len(queued_items) == 0:
+            print('No queued items found.')
+        else:
+          print('Users in queue:')
+          for item in queued_items:
+              print(f'- {item.username} - {item.item.name} - entered queue at {item.entered_queue_time.strftime("%Y-%m-%d")}')
+
+
     def _create_bookcase_item(self, isbn: str):
         bookcase_item = create_bookcase_item_from_isbn(isbn, self.sql_session)
         if bookcase_item is None:
@@ -149,6 +158,8 @@ class WorblehatCli(NumberedCmd):
         if (existing_item := self.sql_session.scalars(
             select(BookcaseItem)
             .where(BookcaseItem.isbn == isbn)
+            .join(BookcaseItemBorrowing)
+            .join(BookcaseItemBorrowingQueue)
         ).one_or_none()) is not None:
             print(f'\nFound existing item for isbn "{isbn}"')
             BookcaseItemCli(
@@ -185,11 +196,12 @@ class WorblehatCli(NumberedCmd):
         ).all()
 
         if len(slubberter) == 0:
-            print('No slubberts found. Yay!')
+            print('No slubberts found. Life is good.')
             return
 
         for slubbert in slubberter:
-            print(f'{slubbert.username} - {slubbert.item.name} - {slubbert.end_time.strftime("%Y-%m-%d")}')
+            print('Slubberter:')
+            print(f'- {slubbert.username} - {slubbert.item.name} - {slubbert.end_time.strftime("%Y-%m-%d")}')
 
 
     def do_advanced(self, _: str):
@@ -225,20 +237,20 @@ class WorblehatCli(NumberedCmd):
             'doc': 'Choose / Add item with its ISBN',
         },
         1: {
-            'f': do_list_bookcases,
-            'doc': 'List all bookcases',
-        },
-        2: {
             'f': do_search,
             'doc': 'Search',
         },
-        3: {
+        2: {
             'f': do_show_bookcase,
             'doc': 'Show a bookcase, and its items',
         },
+        3: {
+            'f': do_show_borrowed_queued,
+            'doc': 'Show borrowed/queued items',
+        },
         4: {
             'f': do_show_slabbedasker,
-            'doc': 'Show a slabbedasker, and their wicked ways',
+            'doc': 'Show slabbedasker',
         },
         5: {
             'f': do_save,
diff --git a/worblehat/cli/subclis/advanced_options.py b/worblehat/cli/subclis/advanced_options.py
index 6cd7f1c..c727092 100644
--- a/worblehat/cli/subclis/advanced_options.py
+++ b/worblehat/cli/subclis/advanced_options.py
@@ -91,6 +91,26 @@ class AdvancedOptionsCli(NumberedCmd):
         self.sql_session.flush()
 
 
+    def do_list_bookcases(self, _: str):
+        bookcase_shelfs = self.sql_session.scalars(
+            select(BookcaseShelf)
+            .join(Bookcase)
+            .order_by(
+              Bookcase.name,
+              BookcaseShelf.column,
+              BookcaseShelf.row,
+            )
+        ).all()
+
+        bookcase_uid = None
+        for shelf in bookcase_shelfs:
+            if shelf.bookcase.uid != bookcase_uid:
+                print(shelf.bookcase.short_str())
+                bookcase_uid = shelf.bookcase.uid
+
+            print(f'  {shelf.short_str()} - {sum(i.amount for i in shelf.items)} items')
+
+
     def do_done(self, _: str):
         return True
 
@@ -104,6 +124,10 @@ class AdvancedOptionsCli(NumberedCmd):
             'f': do_add_bookcase_shelf,
             'doc': 'Add bookcase shelf',
         },
+        3: {
+            'f': do_list_bookcases,
+            'doc': 'List all bookcases',
+        },
         9: {
             'f': do_done,
             'doc': 'Done',