diff --git a/stockcli/books.py b/stockcli/books.py new file mode 100644 --- /dev/null +++ b/stockcli/books.py @@ -0,0 +1,120 @@ +import logging + +import isbnlib +from rich.panel import Panel +from rich.table import Table + +from . import utils +from .console import DEFAULT_PADDING, console, int_prompt, prompt +from .style import GreenBoldText + + +def add_book_by_barcode(barcode: str) -> None: + + canonical_isbn = isbnlib.canonical(barcode) + if not (isbnlib.is_isbn10(canonical_isbn) or isbnlib.is_isbn13(canonical_isbn)): + logging.error(f"{barcode} is not a valid ISBN!") + error_console.print(f"{barcode} is not a valid ISBN!") + return + + userentity = utils.get_request("objects/userentities?query[]=name=books") + userentity_id = userentity[0]["id"] + + all_books = utils.get_request( + f"objects/userobjects?query[]=userentity_id={userentity_id}" + ) + + for book in all_books: + book_metadata = utils.get_request( + f"userfields/userentity-books/{book['id']}", cached=True + ) + if isbnlib.canonical(book_metadata["isbn"]) == canonical_isbn: + + book_metadata = utils.get_request( + f"userfields/userentity-books/{book['id']}", cached=False + ) + + grid = Table.grid(padding=DEFAULT_PADDING) + grid.add_column(justify="right", no_wrap=True) + grid.add_column(justify="left", style="cyan", no_wrap=True) + grid.add_row(GreenBoldText("Title:"), book_metadata["title"]) + grid.add_row(GreenBoldText("Amount:"), book_metadata["amount"]) + console.print( + Panel(grid, title="[green bold]Book already found[/green bold]") + ) + + add_to_amount = bool( + int_prompt.ask("Add? (Enter 0 to abort)", choices=["0", "1"], default=0) + ) + if not add_to_amount: + logging.debug("User aborted task!") + return + else: + book_metadata["amount"] = str(int(book_metadata["amount"]) + 1) + response = utils.put_request( + f"userfields/userentity-books/{book['id']}", + book_metadata, + cached=True, + ) + console.print("Successfully updated!") + return + + metadata = isbnlib.meta(canonical_isbn, "worldcat") + + grid = Table.grid(padding=DEFAULT_PADDING) + grid.add_column(justify="right", no_wrap=True) + grid.add_column(justify="left", style="cyan", no_wrap=True) + grid.add_row(GreenBoldText("Title:"), metadata["Title"]) + grid.add_row(GreenBoldText("Author(s)"), ", ".join(metadata["Authors"])) + console.print(Panel(grid, title="[green bold]Book Info[/green bold]")) + + ok = bool( + int_prompt.ask( + "Is the metadata correct? (Enter 0 to abort)", choices=["0", "1"], default=0 + ) + ) + if not ok: + logging.debug("User aborted task!") + return + new_book_id = utils.post_request( + "objects/userobjects", {"userentity_id": userentity_id} + )["created_object_id"] + + response = utils.put_request( + f"userfields/userentity-books/{new_book_id}", + { + "title": metadata["Title"], + "isbn": isbnlib.mask(canonical_isbn), + "authors": "\n".join(metadata["Authors"]), + "amount": "1", + "categories": None, + }, + ) + console.print("Successfully added!") + return + + +def update_isbn(barcode: str) -> None: + userentity = utils.get_request("objects/userentities?query[]=name=books") + userentity_id = userentity[0]["id"] + + all_books = utils.get_request( + f"objects/userobjects?query[]=userentity_id={userentity_id}" + ) + + for book in all_books: + book_metadata = utils.get_request( + f"userfields/userentity-books/{book['id']}", cached=False + ) + console.print("Handling") + console.print(book_metadata) + try: + book_metadata["isbn"] = isbnlib.mask( + isbnlib.canonical(book_metadata["isbn"]) + ) + response = utils.put_request( + f"userfields/userentity-books/{book['id']}", + book_metadata, + ) + except: + continue