From 296f98be3d673188616e6c4d0cc7edb680b13f82 Mon Sep 17 00:00:00 2001 From: volbil Date: Mon, 29 Jul 2024 17:21:21 +0300 Subject: [PATCH] Auto accept edits after update --- app/aggregator/info/manga.py | 8 ++-- app/constants.py | 1 + app/edit/dependencies.py | 6 +++ app/edit/service.py | 14 +++++-- tests/aggregator/test_import_manga_info.py | 2 + tests/edit/test_edit_create_auto.py | 11 +---- tests/edit/test_edit_update_auto.py | 48 ++++++++++++++++++++++ tests/manga/test_manga_info.py | 2 +- 8 files changed, 75 insertions(+), 17 deletions(-) create mode 100644 tests/edit/test_edit_update_auto.py diff --git a/app/aggregator/info/manga.py b/app/aggregator/info/manga.py index 1965b04f..ec6432e7 100644 --- a/app/aggregator/info/manga.py +++ b/app/aggregator/info/manga.py @@ -34,9 +34,11 @@ async def process_genres(session, manga, data): def process_translated_ua(data): - return ( - len(data["honey"]) > 0 or len(data["zenko"]) > 0 or len(data["miu"]) > 0 - ) + honey_count = len(data["honey"]) if "honey" in data else 0 + zenko_count = len(data["zenko"]) if "zenko" in data else 0 + miu_count = len(data["miu"]) if "miu" in data else 0 + + return honey_count > 0 or zenko_count > 0 or miu_count > 0 def process_external(data): diff --git a/app/constants.py b/app/constants.py index cba4a930..5243c3b9 100644 --- a/app/constants.py +++ b/app/constants.py @@ -254,6 +254,7 @@ LOG_EDIT_CLOSE = "edit_close" LOG_EDIT_ACCEPT = "edit_accept" LOG_EDIT_ACCEPT_AUTO = "edit_accept_auto" +LOG_EDIT_UPDATE_ACCEPT_AUTO = "edit_update_accept_auto" LOG_EDIT_DENY = "edit_deny" LOG_WATCH_CREATE = "watch_create" LOG_WATCH_UPDATE = "watch_update" diff --git a/app/edit/dependencies.py b/app/edit/dependencies.py index 655342f4..cd3978fc 100644 --- a/app/edit/dependencies.py +++ b/app/edit/dependencies.py @@ -148,6 +148,7 @@ async def validate_edit_create_args( async def validate_edit_update_args( args: EditArgs, edit: Edit = Depends(validate_edit_update), + author: User = Depends(auth_required()), ) -> EditArgs: """Validate update edit args""" @@ -158,6 +159,11 @@ async def validate_edit_update_args( if len(args.after) == 0: raise Abort("edit", "empty-edit") + if args.auto and not check_user_permissions( + author, [constants.PERMISSION_EDIT_AUTO] + ): + raise Abort("permission", "denied") + return args diff --git a/app/edit/service.py b/app/edit/service.py index 79357cc4..83331a28 100644 --- a/app/edit/service.py +++ b/app/edit/service.py @@ -252,6 +252,12 @@ async def update_pending_edit( }, ) + # If user marked edit as auto accept we should do that + if args.auto: + await accept_pending_edit( + session, edit, user, constants.LOG_EDIT_UPDATE_ACCEPT_AUTO + ) + return edit @@ -283,7 +289,7 @@ async def accept_pending_edit( session: AsyncSession, edit: Edit, moderator: User, - auto: bool = False, + log_type: str = constants.LOG_EDIT_ACCEPT, ) -> Edit: """Accept pending edit""" @@ -321,7 +327,7 @@ async def accept_pending_edit( await create_log( session, - constants.LOG_EDIT_ACCEPT_AUTO if auto else constants.LOG_EDIT_ACCEPT, + log_type, moderator, edit.id, ) @@ -366,7 +372,9 @@ async def create_pending_edit( # If user marked edit as auto accept we should do that if args.auto: await session.refresh(edit) - await accept_pending_edit(session, edit, author, True) + await accept_pending_edit( + session, edit, author, constants.LOG_EDIT_ACCEPT_AUTO + ) else: await create_log( diff --git a/tests/aggregator/test_import_manga_info.py b/tests/aggregator/test_import_manga_info.py index 4128bc9e..62d1afa4 100644 --- a/tests/aggregator/test_import_manga_info.py +++ b/tests/aggregator/test_import_manga_info.py @@ -54,6 +54,7 @@ async def test_import_manga_info( "external": [], "synonyms": [], "synopsis_en": None, + "translated_ua": False, } assert edit.after == { @@ -103,4 +104,5 @@ async def test_import_manga_info( "bodies with its power. However, their quest for the fated stone " "also leads them to unravel far darker secrets than they could ever " "imagine.\n\n[Written by MAL Rewrite]", + "translated_ua": True, } diff --git a/tests/edit/test_edit_create_auto.py b/tests/edit/test_edit_create_auto.py index 229c75a8..e1b852c8 100644 --- a/tests/edit/test_edit_create_auto.py +++ b/tests/edit/test_edit_create_auto.py @@ -1,16 +1,7 @@ from client_requests import request_create_edit -from sqlalchemy import select, desc, func -from app.models import Log from fastapi import status from app import constants -from app.models import ( - CharacterEdit, - PersonEdit, - AnimeEdit, - Edit, -) - async def test_edit_create_auto( client, @@ -40,7 +31,7 @@ async def test_edit_create_auto( # Check status and data assert response.status_code == status.HTTP_200_OK - # assert response.json()["status"] == constants.EDIT_ACCEPTED + assert response.json()["status"] == constants.EDIT_ACCEPTED async def test_edit_create_auto_bad_permission( diff --git a/tests/edit/test_edit_update_auto.py b/tests/edit/test_edit_update_auto.py new file mode 100644 index 00000000..5d304b60 --- /dev/null +++ b/tests/edit/test_edit_update_auto.py @@ -0,0 +1,48 @@ +from client_requests import request_create_edit +from client_requests import request_update_edit +from fastapi import status +from app import constants +import asyncio + + +async def test_edit_update_auto( + client, + aggregator_anime, + aggregator_anime_info, + create_test_user_moderator, + get_test_token, + test_session, +): + # Create edit for anime + response = await request_create_edit( + client, + get_test_token, + "anime", + "bocchi-the-rock-9e172d", + { + "description": "Brief description", + "after": {"title_en": "Bocchi The Rock!"}, + }, + ) + + # Check status + assert response.status_code == status.HTTP_200_OK + assert response.json()["created"] == response.json()["updated"] + + # Simulate delay between create/update + await asyncio.sleep(1) + + # Update created edit + response = await request_update_edit( + client, + get_test_token, + 18, + { + "description": "Brief description 2", + "after": {"title_en": "Bocchi The Rock!"}, + "auto": True, + }, + ) + + assert response.status_code == status.HTTP_200_OK + assert response.json()["status"] == constants.EDIT_ACCEPTED diff --git a/tests/manga/test_manga_info.py b/tests/manga/test_manga_info.py index 82fc7e2f..7f07ab74 100644 --- a/tests/manga/test_manga_info.py +++ b/tests/manga/test_manga_info.py @@ -24,7 +24,7 @@ async def test_manga_info( assert len(response.json()["external"]) == 4 assert len(response.json()["genres"]) == 6 - assert response.json()["translated_ua"] is False + assert response.json()["translated_ua"] is True assert response.json()["stats"] == { "dropped": 6393, "on_hold": 16941,