Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions backend/src/cms_backend/api/routes/books.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

from fastapi import APIRouter, Depends, Path, Query
from fastapi.responses import JSONResponse
from pydantic import Field
from sqlalchemy.orm import Session as OrmSession

from cms_backend.api.routes.dependencies import get_current_account, require_permission
Expand All @@ -26,13 +27,18 @@
from cms_backend.db.book import revert_book as db_revert_book
from cms_backend.db.book import update_book as db_update_book
from cms_backend.db.book import update_book_issues as db_update_book_issues
from cms_backend.db.book_actions import (
apply_book_promotion_actions,
get_book_promotion_actions,
)
from cms_backend.db.books import get_book_flavours as db_get_book_flavours
from cms_backend.db.books import get_book_languages as db_get_book_languages
from cms_backend.db.books import get_books as db_get_books
from cms_backend.db.books import get_zim_urls as db_get_zim_urls
from cms_backend.db.models import Account
from cms_backend.schemas import BaseModel
from cms_backend.schemas.models import (
BaseBookPromotionAction,
BookLanguagesSchema,
BookUpdateSchema,
ZimUrlsSchema,
Expand Down Expand Up @@ -230,6 +236,44 @@ def get_book_issues(
)


class PromoteBook(BaseModel):
actions: list[BaseBookPromotionAction] = Field(default_factory=list) # pyright: ignore[reportUnknownVariableType]


@router.patch(
"/{book_id}/promote",
dependencies=[
Depends(require_permission(namespace="book", name="update")),
Depends(require_permission(namespace="title", name="update")),
],
)
def promote_book(
book_id: Annotated[UUID, Path()],
request: PromoteBook,
session: Annotated[OrmSession, Depends(gen_dbsession)],
current_account: Account = Depends(get_current_account),
*,
dry_run: Annotated[bool, Query()] = True,
) -> JSONResponse:
if dry_run:
actions = get_book_promotion_actions(session, book_id=book_id)
return JSONResponse(
content={"actions": [action.model_dump(mode="json") for action in actions]},
status_code=HTTPStatus.OK,
)
else:
apply_book_promotion_actions(
session,
book_id=book_id,
author_id=current_account.id,
actions=request.actions,
)
return JSONResponse(
content={"actions": []},
status_code=HTTPStatus.OK,
)


@router.get(
"/{book_id}/history",
dependencies=[Depends(require_permission(namespace="book", name="update"))],
Expand Down
11 changes: 5 additions & 6 deletions backend/src/cms_backend/api/routes/titles.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

from fastapi import APIRouter, Depends, Path, Query, Response
from fastapi.responses import JSONResponse
from pydantic import Field
from sqlalchemy.orm import Session as OrmSession

from cms_backend.api.routes.dependencies import (
Expand Down Expand Up @@ -41,7 +40,11 @@
from cms_backend.db.title import revert_title as db_revert_title
from cms_backend.db.title import update_title as db_update_title
from cms_backend.schemas import BaseModel
from cms_backend.schemas.models import TitleCreateSchema, TitleUpdateSchema
from cms_backend.schemas.models import (
RestoreTitlesSchema,
TitleCreateSchema,
TitleUpdateSchema,
)
from cms_backend.schemas.orms import (
TitleFullSchema,
TitleHistorySchema,
Expand All @@ -60,10 +63,6 @@ class TitlesGetSchema(BaseModel):
archived: bool = False


class RestoreTitlesSchema(BaseModel):
title_names: list[NotEmptyString] = Field(default_factory=list)


class RevertTitleSchema(BaseModel):
comment: NotEmptyString | None = None

Expand Down
15 changes: 10 additions & 5 deletions backend/src/cms_backend/db/book.py
Original file line number Diff line number Diff line change
Expand Up @@ -691,6 +691,15 @@ def get_book_media_count_issues(*, book: Book, latest_book: Book) -> list[str]:
return []


def get_book_unsupported_languages(book: Book) -> list[str]:

unknown_languages: list[str] = []
for language_code in book.zim_metadata["Language"].split(","):
if pycountry.languages.get(alpha_3=language_code) is None: # pyright: ignore[reportUnknownMemberType]
unknown_languages.append(language_code)
return unknown_languages


def get_book_issues(
session: OrmSession, book: Book, *, raise_exceptions: bool = False
) -> dict[str, list[str]]:
Expand All @@ -700,11 +709,7 @@ def get_book_issues(
Makes the same assumptions as the update_book_issues function
"""
issues: dict[str, list[str]] = {}
unknown_languages: list[str] = []
for language_code in book.zim_metadata["Language"].split(","):
if pycountry.languages.get(alpha_3=language_code) is None: # pyright: ignore[reportUnknownMemberType]
unknown_languages.append(language_code)

unknown_languages = get_book_unsupported_languages(book)
if unknown_languages:
issues["invalid language code"] = [
f"book has unknown language code(s) {','.join(unknown_languages)}"
Expand Down
Loading