feat: filter admin media by role

This commit is contained in:
ik
2026-09-21 20:39:49 +07:00
parent 8f03eec76a
commit ad69f90e43
2 changed files with 8 additions and 3 deletions
+3 -1
View File
@@ -91,7 +91,7 @@ def published_file(digest: str) -> tuple[Path, str] | None:
return target, str(media_type or "application/octet-stream") return target, str(media_type or "application/octet-stream")
def review_assets(entity_type: str | None = None, status: str | None = None) -> list[dict]: def review_assets(entity_type: str | None = None, status: str | None = None, media_role: str | None = None) -> list[dict]:
manifest = json.loads((MEDIA_ROOT / "manifest.json").read_text(encoding="utf-8")) manifest = json.loads((MEDIA_ROOT / "manifest.json").read_text(encoding="utf-8"))
result = [] result = []
for item in manifest.get("assets", []): for item in manifest.get("assets", []):
@@ -100,6 +100,8 @@ def review_assets(entity_type: str | None = None, status: str | None = None) ->
continue continue
if entity_type and item.get("entity_type") != entity_type: if entity_type and item.get("entity_type") != entity_type:
continue continue
if media_role and item.get("media_role") != media_role:
continue
digest = str(item.get("sha256") or "") digest = str(item.get("sha256") or "")
if len(digest) != 64 or not item.get("local_path"): if len(digest) != 64 or not item.get("local_path"):
continue continue
+5 -2
View File
@@ -17,7 +17,7 @@ from ..dependencies import Db
from ..importer import ImportAlreadyRunning, ImportSourceError, import_records from ..importer import ImportAlreadyRunning, ImportSourceError, import_records
from rf4_research.media_assets import publish_quality_upgrades, rollback_quality_upgrade from rf4_research.media_assets import publish_quality_upgrades, rollback_quality_upgrade
from ..media_catalog import MEDIA_ROOT, review_assets, review_file from ..media_catalog import KNOWN_MEDIA_ROLES, MEDIA_ROOT, review_assets, review_file
from ..models import CatchReport, CommunityImportRun, DataSource, ExternalObservation, Fish, ModerationEvent, ModerationStatus, OfficialRecordImport, SourceType, Waterbody from ..models import CatchReport, CommunityImportRun, DataSource, ExternalObservation, Fish, ModerationEvent, ModerationStatus, OfficialRecordImport, SourceType, Waterbody
from ..public_cache import public_cache from ..public_cache import public_cache
from ..schemas import AdminCatchReportOut, AdminMediaDecision, AdminMediaReviewOut, AdminMediaRollback, AdminModerationHistoryOut, AdminSourceStatusOut, CatchReportCreated, ExternalAliasSuggestionOut, ExternalObservationAction, ExternalObservationBulkAction, ExternalObservationBulkDecision, ExternalObservationBulkMapping, ExternalObservationBulkResult, ExternalObservationDecision, ExternalObservationMapping, ExternalObservationOut, ExternalObservationPublished, ImportRunOut, ModerationBulkResult, ModerationBulkUpdate, ModerationUpdate from ..schemas import AdminCatchReportOut, AdminMediaDecision, AdminMediaReviewOut, AdminMediaRollback, AdminModerationHistoryOut, AdminSourceStatusOut, CatchReportCreated, ExternalAliasSuggestionOut, ExternalObservationAction, ExternalObservationBulkAction, ExternalObservationBulkDecision, ExternalObservationBulkMapping, ExternalObservationBulkResult, ExternalObservationDecision, ExternalObservationMapping, ExternalObservationOut, ExternalObservationPublished, ImportRunOut, ModerationBulkResult, ModerationBulkUpdate, ModerationUpdate
@@ -37,10 +37,13 @@ def admin_media_catalog(
_: Annotated[str, Depends(_admin)], _: Annotated[str, Depends(_admin)],
entity_type: str | None = Query(None, pattern="^(fish|waterbody|tackle|reference)$"), entity_type: str | None = Query(None, pattern="^(fish|waterbody|tackle|reference)$"),
status: str | None = Query(None, pattern="^(approved|upgrade_queued|upgrade_stored)$"), status: str | None = Query(None, pattern="^(approved|upgrade_queued|upgrade_stored)$"),
media_role: str | None = Query(None, pattern="^(waterbody_cover|waterbody_map|waterbody_depth_map|waterbody_screenshot|tackle_card|tackle_detail|rig_diagram|tackle_screenshot)$"),
limit: int = Query(50, ge=1, le=100), limit: int = Query(50, ge=1, le=100),
offset: int = Query(0, ge=0), offset: int = Query(0, ge=0),
) -> list[AdminMediaReviewOut]: ) -> list[AdminMediaReviewOut]:
return review_assets(entity_type, status)[offset:offset + limit] if media_role and media_role not in KNOWN_MEDIA_ROLES:
raise HTTPException(status_code=422, detail="unknown media role")
return review_assets(entity_type, status, media_role)[offset:offset + limit]
@router.get("/api/v1/admin/media/assets/{digest}", response_class=FileResponse) @router.get("/api/v1/admin/media/assets/{digest}", response_class=FileResponse)