diff --git a/config-template.toml b/config-template.toml index ce0a8a7..af7abd9 100644 --- a/config-template.toml +++ b/config-template.toml @@ -3,7 +3,7 @@ debug = true debug_sql = false [database] -# One of (sqlite, postgres) +# One of (sqlite, postgresql) type = 'sqlite' [database.sqlite] @@ -38,3 +38,6 @@ dryrun = false warn_days_before_borrowing_deadline = [ 5, 1 ] days_before_queue_position_expires = 14 warn_days_before_expiring_queue_position_deadline = [ 3, 1 ] + +[general] +quit_allowed = true diff --git a/src/worblehat/cli/main.py b/src/worblehat/cli/main.py index 24fe1d9..d2f31a8 100644 --- a/src/worblehat/cli/main.py +++ b/src/worblehat/cli/main.py @@ -16,6 +16,7 @@ from worblehat.models import * from worblehat.services import ( create_bookcase_item_from_isbn, is_valid_isbn, + Config, ) from .subclis import ( @@ -47,26 +48,13 @@ class WorblehatCli(NumberedCmd): self.sql_session_dirty = False self.prompt_header = None - @classmethod - def run_with_safe_exit_wrapper(cls, sql_session: Session) -> None: - tool = cls(sql_session) + def run_with_safe_exit_wrapper(self) -> None: while True: try: - tool.cmdloop() - except KeyboardInterrupt: - if not tool.sql_session_dirty: - exit(0) - try: - print() - if prompt_yes_no( - "Are you sure you want to exit without saving?", - default=False, - ): - raise KeyboardInterrupt - except KeyboardInterrupt: - if tool.sql_session is not None: - tool.sql_session.rollback() - exit(0) + self.cmdloop() + except KeyboardInterrupt: + print("\n\n-----------------\n") + self.do_exit("Exit") def do_show_bookcase(self, arg: str) -> None: bookcase_selector = InteractiveItemSelector( @@ -133,35 +121,36 @@ class WorblehatCli(NumberedCmd): """), ) - print("Please select the bookcase where the item is placed:") - bookcase_selector = InteractiveItemSelector( - cls=Bookcase, - sql_session=self.sql_session, - ) - bookcase_selector.cmdloop() - bookcase = bookcase_selector.result - if bookcase == None: - return + with self.sql_session.no_autoflush: + print("Please select the bookcase where the item is placed:") + bookcase_selector = InteractiveItemSelector( + cls=Bookcase, + sql_session=self.sql_session, + ) + bookcase_selector.cmdloop() + bookcase = bookcase_selector.result + if bookcase == None: + return - bookcase_item.shelf = select_bookcase_shelf(bookcase, self.sql_session) + bookcase_item.shelf = select_bookcase_shelf(bookcase, self.sql_session) - print("Please select the items media type:") - media_type_selector = InteractiveItemSelector( - cls=MediaType, - sql_session=self.sql_session, - default=self.sql_session.scalars( - select(MediaType).where(MediaType.name.ilike("book")), - ).one(), - ) + print("Please select the items media type:") + media_type_selector = InteractiveItemSelector( + cls=MediaType, + sql_session=self.sql_session, + default=self.sql_session.scalars( + select(MediaType).where(MediaType.name.ilike("book")), + ).one(), + ) - media_type_selector.cmdloop() - bookcase_item.media_type = media_type_selector.result - if bookcase_item.media_type == None: - return + media_type_selector.cmdloop() + bookcase_item.media_type = media_type_selector.result + if bookcase_item.media_type == None: + return - username = input("Who owns this book? [PVV]> ") - if username != "": - bookcase_item.owner = username + username = input("Who owns this book? [PVV]> ") + if username != "": + bookcase_item.owner = username self.sql_session.add(bookcase_item) self.sql_session.flush() @@ -246,7 +235,8 @@ class WorblehatCli(NumberedCmd): self.sql_session.commit() else: self.sql_session.rollback() - exit(0) + if Config["general.quit_allowed"]: + exit(0) funcs = { 0: { diff --git a/src/worblehat/main.py b/src/worblehat/main.py index adff47a..844e6c0 100644 --- a/src/worblehat/main.py +++ b/src/worblehat/main.py @@ -65,7 +65,8 @@ def main() -> None: if args.command == "cli": sql_session = _connect_to_database(echo=Config["logging.debug_sql"]) - WorblehatCli.run_with_safe_exit_wrapper(sql_session) + worblehat = WorblehatCli(sql_session) + worblehat.run_with_safe_exit_wrapper() exit(0) if args.command == "create-db":