feat: add admin media label search
This commit is contained in:
@@ -92,7 +92,10 @@ 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, media_role: str | None = None) -> list[dict]:
|
def review_assets(
|
||||||
|
entity_type: str | None = None, status: str | None = None, media_role: str | None = None,
|
||||||
|
query: 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", []):
|
||||||
@@ -103,6 +106,8 @@ def review_assets(entity_type: str | None = None, status: str | None = None, med
|
|||||||
continue
|
continue
|
||||||
if media_role and item.get("media_role") != media_role:
|
if media_role and item.get("media_role") != media_role:
|
||||||
continue
|
continue
|
||||||
|
if query and query.casefold() not in str(item.get("label") or "").casefold():
|
||||||
|
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
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ def admin_media_catalog(
|
|||||||
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)$"),
|
media_role: str | None = Query(None, pattern="^(waterbody_cover|waterbody_map|waterbody_depth_map|waterbody_screenshot|tackle_card|tackle_detail|rig_diagram|tackle_screenshot)$"),
|
||||||
|
q: str | None = Query(None, max_length=100),
|
||||||
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]:
|
||||||
@@ -45,7 +46,7 @@ def admin_media_catalog(
|
|||||||
raise HTTPException(status_code=422, detail="unknown media role")
|
raise HTTPException(status_code=422, detail="unknown media role")
|
||||||
if media_role and (not entity_type or media_role not in MEDIA_ROLES_BY_ENTITY.get(entity_type, set())):
|
if media_role and (not entity_type or media_role not in MEDIA_ROLES_BY_ENTITY.get(entity_type, set())):
|
||||||
raise HTTPException(status_code=422, detail="media role is incompatible with entity type")
|
raise HTTPException(status_code=422, detail="media role is incompatible with entity type")
|
||||||
return review_assets(entity_type, status, media_role)[offset:offset + limit]
|
return review_assets(entity_type, status, media_role, q.strip() if q else None)[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)
|
||||||
|
|||||||
Reference in New Issue
Block a user