Skip to content

Commit

Permalink
Merge pull request #325 from rosset-nocpes/feat/edit-todo-manga-novel
Browse files Browse the repository at this point in the history
feat(edit-todo): add support for manga & novel
  • Loading branch information
Darky2020 authored Jul 11, 2024
2 parents 865cbe2 + 9514532 commit 9e9919d
Show file tree
Hide file tree
Showing 4 changed files with 81 additions and 37 deletions.
4 changes: 2 additions & 2 deletions app/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -230,8 +230,8 @@
UPLOAD_COVER = "cover"

# Todo types
TODO_ANIME_SYNOPSIS_UA = "synopsis_ua"
TODO_ANIME_TITLE_UA = "title_ua"
TODO_SYNOPSIS_UA = "synopsis_ua"
TODO_TITLE_UA = "title_ua"

# Log types
LOG_FAVOURITE = "favourite_add"
Expand Down
25 changes: 17 additions & 8 deletions app/edit/router.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
from sqlalchemy.ext.asyncio import AsyncSession
from app.manga.schemas import MangaPaginationResponse
from app.novel.schemas import NovelPaginationResponse
from app.schemas import AnimePaginationResponse
from fastapi import APIRouter, Depends
from app.database import get_session
Expand Down Expand Up @@ -40,10 +42,11 @@
)

from .schemas import (
ContentToDoEnum,
EditContentToDoEnum,
EditContentTypeEnum,
EditListResponse,
EditSearchArgs,
AnimeToDoEnum,
EditResponse,
EditArgs,
)
Expand Down Expand Up @@ -135,21 +138,27 @@ async def deny_edit(
return await service.deny_pending_edit(session, edit, moderator)


@router.get("/todo/anime/{todo_type}", response_model=AnimePaginationResponse)
async def get_edit_todo(
todo_type: AnimeToDoEnum,
@router.get(
"/todo/{content_type}/{todo_type}",
response_model=AnimePaginationResponse
| MangaPaginationResponse
| NovelPaginationResponse,
)
async def get_content_edit_todo(
content_type: EditContentToDoEnum,
todo_type: ContentToDoEnum,
session: AsyncSession = Depends(get_session),
request_user: User | None = Depends(auth_required(optional=True)),
page: int = Depends(get_page),
size: int = Depends(get_size),
):
limit, offset = pagination(page, size)
total = await service.anime_todo_total(session, todo_type)
anime = await service.anime_todo(
session, todo_type, request_user, limit, offset
total = await service.content_todo_total(session, content_type, todo_type)
content = await service.content_todo(
session, content_type, todo_type, request_user, limit, offset
)

return {
"pagination": pagination_dict(total, page, limit),
"list": anime.unique().all(),
"list": content.unique().all(),
}
12 changes: 9 additions & 3 deletions app/edit/schemas.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,15 @@


# Enums
class AnimeToDoEnum(str, Enum):
synopsis_ua = constants.TODO_ANIME_SYNOPSIS_UA
title_ua = constants.TODO_ANIME_TITLE_UA
class ContentToDoEnum(str, Enum):
synopsis_ua = constants.TODO_SYNOPSIS_UA
title_ua = constants.TODO_TITLE_UA


class EditContentToDoEnum(str, Enum):
content_anime = constants.CONTENT_ANIME
content_manga = constants.CONTENT_MANGA
content_novel = constants.CONTENT_NOVEL


class EditContentTypeEnum(str, Enum):
Expand Down
77 changes: 53 additions & 24 deletions app/edit/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
from sqlalchemy.sql.selectable import Select
from sqlalchemy.orm import with_expression
from sqlalchemy.orm import joinedload

from app.models.list.read import MangaRead, NovelRead
from .utils import calculate_before
from app.utils import utcnow
from app import constants
Expand All @@ -17,9 +19,10 @@
)

from .schemas import (
ContentToDoEnum,
EditContentToDoEnum,
EditContentTypeEnum,
EditSearchArgs,
AnimeToDoEnum,
EditArgs,
)

Expand Down Expand Up @@ -140,7 +143,8 @@ async def edits_search_filter(
query = query.filter(Edit.status == args.status)

query = query.filter(
Edit.system_edit == False, Edit.hidden == False # noqa: E712
Edit.system_edit == False, # noqa: E712
Edit.hidden == False, # noqa: E712
)

return query
Expand Down Expand Up @@ -405,54 +409,79 @@ async def deny_pending_edit(
return edit


async def anime_todo_total(
async def content_todo_total(
session: AsyncSession,
todo_type: AnimeToDoEnum,
content_type: EditContentToDoEnum,
todo_type: ContentToDoEnum,
):
query = select(func.count(Anime.id)).filter(
~Anime.media_type.in_([constants.MEDIA_TYPE_MUSIC]),
Anime.deleted == False, # noqa: E712
match content_type:
case constants.CONTENT_ANIME:
content_type = Anime
case constants.CONTENT_MANGA:
content_type = Manga
case constants.CONTENT_NOVEL:
content_type = Novel

query = select(func.count(content_type.id)).filter(
~content_type.media_type.in_([constants.MEDIA_TYPE_MUSIC]),
content_type.deleted == False, # noqa: E712
)

if todo_type == constants.TODO_ANIME_TITLE_UA:
query = query.filter(Anime.title_ua == None) # noqa: E711
if todo_type == constants.TODO_TITLE_UA:
query = query.filter(content_type.title_ua == None) # noqa: E711

if todo_type == constants.TODO_ANIME_SYNOPSIS_UA:
query = query.filter(Anime.synopsis_ua == None) # noqa: E711
if todo_type == constants.TODO_SYNOPSIS_UA:
query = query.filter(content_type.synopsis_ua == None) # noqa: E711

return await session.scalar(query)


async def anime_todo(
async def content_todo(
session: AsyncSession,
todo_type: AnimeToDoEnum,
content_type: EditContentTypeEnum,
todo_type: ContentToDoEnum,
request_user: User | None,
limit: int,
offset: int,
):
match content_type:
case constants.CONTENT_ANIME:
content_type = Anime
option = AnimeWatch
case constants.CONTENT_MANGA:
content_type = Manga
option = MangaRead
case constants.CONTENT_NOVEL:
content_type = Novel
option = NovelRead

# Load request user watch statuses here
load_options = [
joinedload(Anime.watch),
joinedload(
content_type.read if content_type != Anime else content_type.watch
),
with_loader_criteria(
AnimeWatch,
AnimeWatch.user_id == request_user.id if request_user else None,
option,
option.user_id == request_user.id if request_user else None,
),
]

query = select(Anime).filter(
~Anime.media_type.in_([constants.MEDIA_TYPE_MUSIC]),
Anime.deleted == False, # noqa: E712
query = select(content_type).filter(
~content_type.media_type.in_([constants.MEDIA_TYPE_MUSIC]),
content_type.deleted == False, # noqa: E712
)

if todo_type == constants.TODO_ANIME_TITLE_UA:
query = query.filter(Anime.title_ua == None) # noqa: E711
if todo_type == constants.TODO_TITLE_UA:
query = query.filter(content_type.title_ua == None) # noqa: E711

if todo_type == constants.TODO_ANIME_SYNOPSIS_UA:
query = query.filter(Anime.synopsis_ua == None) # noqa: E711
if todo_type == constants.TODO_SYNOPSIS_UA:
query = query.filter(content_type.synopsis_ua == None) # noqa: E711

return await session.scalars(
query.order_by(
desc(Anime.score), desc(Anime.scored_by), desc(Anime.content_id)
desc(content_type.score),
desc(content_type.scored_by),
desc(content_type.content_id),
)
.options(*load_options)
.limit(limit)
Expand Down

0 comments on commit 9e9919d

Please sign in to comment.