7 Commits

Author SHA1 Message Date
vegardbm 10bffd53e8 handle quitters 2026-06-06 02:27:59 +02:00
vegardbm a91aa3c617 fix config-template comment for db type 2026-06-06 01:22:18 +02:00
vegardbm 779312cd9f fix autoflush SA warning 2026-06-06 01:21:53 +02:00
vegardbm fb89b86dba cli: let me quit 2026-05-31 00:07:39 +02:00
vegardbm 0871a319f5 Merge pull request 'fix_stable_deps' (#27) from fix_stable_deps into main
Reviewed-on: #27
2026-03-19 16:07:27 +01:00
vegardbm 7d723eeb0d strip from password file 2026-03-18 19:53:38 +01:00
vegardbm 9e67d1bd6f allow using stable dep versions 2026-03-18 19:53:23 +01:00
6 changed files with 50 additions and 52 deletions
+4 -1
View File
@@ -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
Generated
+4 -4
View File
@@ -7,11 +7,11 @@
]
},
"locked": {
"lastModified": 1769338528,
"narHash": "sha256-t18ZoSt9kaI1yde26ok5s7aFLkap1Q9+/2icVh2zuaE=",
"lastModified": 1780178524,
"narHash": "sha256-2PcNyNqbGCWBpAMdCU1HxSQmhQiG6evdjxVnPA7w5bQ=",
"ref": "refs/heads/main",
"rev": "7218348163fd8d84df4a6f682c634793e67a3fed",
"revCount": 13,
"rev": "2406de41ce9d0a1404cbf4e55537e3f720f37f23",
"revCount": 15,
"type": "git",
"url": "https://git.pvv.ntnu.no/Projects/libdib.git"
},
+36 -40
View File
@@ -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(
@@ -75,6 +63,8 @@ class WorblehatCli(NumberedCmd):
)
bookcase_selector.cmdloop()
bookcase = bookcase_selector.result
if bookcase == None:
return
for shelf in bookcase.shelfs:
print(shelf.short_str())
@@ -131,31 +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
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
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()
@@ -240,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: {
@@ -384,6 +384,8 @@ 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)
+2 -1
View File
@@ -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":
+2 -6
View File
@@ -2,7 +2,7 @@ import tomllib
from pathlib import Path
from pprint import pformat
from typing import Any
import os
class Config:
"""
@@ -38,14 +38,10 @@ class Config:
@staticmethod
def read_password(password_field: str) -> str:
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]):
if Path(password_field).is_file():
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