Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f4ae9f6c9e | |||
| 9e0065d849 | |||
| b996be7c7f | |||
| a0da34de7e | |||
| c564ee0b99 | |||
| 9bdaaf6c51 |
@@ -3,7 +3,7 @@ debug = true
|
||||
debug_sql = false
|
||||
|
||||
[database]
|
||||
# One of (sqlite, postgresql)
|
||||
# One of (sqlite, postgres)
|
||||
type = 'sqlite'
|
||||
|
||||
[database.sqlite]
|
||||
@@ -38,6 +38,3 @@ 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
|
||||
|
||||
Generated
+4
-4
@@ -7,11 +7,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1780178524,
|
||||
"narHash": "sha256-2PcNyNqbGCWBpAMdCU1HxSQmhQiG6evdjxVnPA7w5bQ=",
|
||||
"lastModified": 1769338528,
|
||||
"narHash": "sha256-t18ZoSt9kaI1yde26ok5s7aFLkap1Q9+/2icVh2zuaE=",
|
||||
"ref": "refs/heads/main",
|
||||
"rev": "2406de41ce9d0a1404cbf4e55537e3f720f37f23",
|
||||
"revCount": 15,
|
||||
"rev": "7218348163fd8d84df4a6f682c634793e67a3fed",
|
||||
"revCount": 13,
|
||||
"type": "git",
|
||||
"url": "https://git.pvv.ntnu.no/Projects/libdib.git"
|
||||
},
|
||||
|
||||
+40
-36
@@ -16,7 +16,6 @@ from worblehat.models import *
|
||||
from worblehat.services import (
|
||||
create_bookcase_item_from_isbn,
|
||||
is_valid_isbn,
|
||||
Config,
|
||||
)
|
||||
|
||||
from .subclis import (
|
||||
@@ -48,13 +47,26 @@ class WorblehatCli(NumberedCmd):
|
||||
self.sql_session_dirty = False
|
||||
self.prompt_header = None
|
||||
|
||||
def run_with_safe_exit_wrapper(self) -> None:
|
||||
@classmethod
|
||||
def run_with_safe_exit_wrapper(cls, sql_session: Session) -> None:
|
||||
tool = cls(sql_session)
|
||||
while True:
|
||||
try:
|
||||
self.cmdloop()
|
||||
except KeyboardInterrupt:
|
||||
print("\n\n-----------------\n")
|
||||
self.do_exit("Exit")
|
||||
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)
|
||||
|
||||
def do_show_bookcase(self, arg: str) -> None:
|
||||
bookcase_selector = InteractiveItemSelector(
|
||||
@@ -63,8 +75,6 @@ class WorblehatCli(NumberedCmd):
|
||||
)
|
||||
bookcase_selector.cmdloop()
|
||||
bookcase = bookcase_selector.result
|
||||
if bookcase == None:
|
||||
return
|
||||
|
||||
for shelf in bookcase.shelfs:
|
||||
print(shelf.short_str())
|
||||
@@ -121,36 +131,31 @@ class WorblehatCli(NumberedCmd):
|
||||
"""),
|
||||
)
|
||||
|
||||
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
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
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()
|
||||
@@ -235,8 +240,7 @@ class WorblehatCli(NumberedCmd):
|
||||
self.sql_session.commit()
|
||||
else:
|
||||
self.sql_session.rollback()
|
||||
if Config["general.quit_allowed"]:
|
||||
exit(0)
|
||||
exit(0)
|
||||
|
||||
funcs = {
|
||||
0: {
|
||||
|
||||
@@ -384,8 +384,6 @@ class EditBookcaseCli(NumberedCmd):
|
||||
)
|
||||
bookcase_selector.cmdloop()
|
||||
bookcase = bookcase_selector.result
|
||||
if bookcase == None:
|
||||
return
|
||||
assert isinstance(bookcase, Bookcase)
|
||||
|
||||
shelf = select_bookcase_shelf(bookcase, self.sql_session)
|
||||
|
||||
@@ -65,8 +65,7 @@ def main() -> None:
|
||||
|
||||
if args.command == "cli":
|
||||
sql_session = _connect_to_database(echo=Config["logging.debug_sql"])
|
||||
worblehat = WorblehatCli(sql_session)
|
||||
worblehat.run_with_safe_exit_wrapper()
|
||||
WorblehatCli.run_with_safe_exit_wrapper(sql_session)
|
||||
exit(0)
|
||||
|
||||
if args.command == "create-db":
|
||||
|
||||
@@ -2,7 +2,7 @@ import tomllib
|
||||
from pathlib import Path
|
||||
from pprint import pformat
|
||||
from typing import Any
|
||||
|
||||
import os
|
||||
|
||||
class Config:
|
||||
"""
|
||||
@@ -38,10 +38,14 @@ class Config:
|
||||
|
||||
@staticmethod
|
||||
def read_password(password_field: str) -> str:
|
||||
if Path(password_field).is_file():
|
||||
file: Path = Path(password_field)
|
||||
if file.is_file() and any([file.stat().st_mode & 0o400 and file.stat().st_uid == os.getuid(), file.stat().st_mode & 0o040 and file.stat().st_gid == os.getgid(), file.stat().st_mode & 0o004]):
|
||||
with Path(password_field).open() as f:
|
||||
return f.read().strip()
|
||||
else:
|
||||
raise RuntimeError(
|
||||
f"Testing, should only use file. {password_field}",
|
||||
)
|
||||
return password_field
|
||||
|
||||
@classmethod
|
||||
|
||||
Reference in New Issue
Block a user