Files @ f5ed6b020878
Branch filter:

Location: ChaosStuff/stockcli/stockcli/books.py

Dennis Fink
Don't fail if the book has not isbn
import logging

import isbnlib
from rich.panel import Panel
from rich.table import Table

from . import utils
from .console import DEFAULT_PADDING, console, error_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 book_metadata["isbn"] is None:
            continue

        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.get("Title", None))
    grid.add_row(GreenBoldText("Author(s)"), ", ".join(metadata.get("Authors", None)))
    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