Files @ d74c0da6d370
Branch filter:

Location: ChaosStuff/stockcli/stockcli/books.py

Dennis Fink
Simplify book handling
import logging
from typing import Dict, Optional, Tuple

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 book_already_in_database(
    isbn: str, userentity_id: int
) -> Tuple[bool, Optional[int]]:
    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"]) == isbn:
            return True, book["id"]

    return False, None


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"]

    already_in_database, book_id = book_already_in_database(
        canonical_isbn, userentity_id
    )
    if already_in_database:
        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"])

        if book_metadata["authors"] is not None:
            grid.add_row(
                GreenBoldText("Authors:"),
                ", ".join(book_metadata["authors"].split("\n")),
            )
        grid.add_row(GreenBoldText("Amount:"), book_metadata["amount"])

        if book_metadata["categories"] is not None:
            grid.add_row(
                GreenBoldText("Categories:"),
                book_metadata["categories"].replace(",", ", "),
            )

        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

    try:
        metadata = isbnlib.meta(canonical_isbn, "worldcat")
        if metadata["Title"] is None and metadata["Authors"] is None:
            metadata = isbnlib.meta(canonical_isbn, "default")
    except:
        metadata = isbnlib.meta(canonical_isbn, "default")

    grid = Table.grid(padding=DEFAULT_PADDING)
    grid.add_column(justify="right", no_wrap=True)
    grid.add_column(justify="left", style="cyan", no_wrap=False)
    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=1
        )
    )
    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