Feature: Moderation History — Log für alle 4 Bereiche, resolved_by/at Migration, SW by-v590
This commit is contained in:
parent
e2cd32a550
commit
87039994ce
6 changed files with 125 additions and 43 deletions
|
|
@ -1,4 +1,5 @@
|
|||
"""BAN YARO — Moderations-Panel Backend"""
|
||||
from datetime import datetime
|
||||
from fastapi import APIRouter, Depends, HTTPException
|
||||
from database import db
|
||||
from auth import get_current_user
|
||||
|
|
@ -69,17 +70,19 @@ async def mod_stats(user=Depends(require_moderator)):
|
|||
async def mod_reports(user=Depends(require_moderator)):
|
||||
with db() as conn:
|
||||
rows = conn.execute("""
|
||||
SELECT r.id, r.target_type, r.target_id, r.grund, r.resolved, r.created_at,
|
||||
u.name AS melder_name,
|
||||
SELECT r.id, r.target_type, r.target_id, r.grund, r.resolved,
|
||||
r.created_at, r.resolved_at,
|
||||
u.name AS melder_name,
|
||||
m.name AS resolved_by_name,
|
||||
CASE r.target_type
|
||||
WHEN 'thread' THEN (SELECT t.titel FROM forum_threads t WHERE t.id=r.target_id)
|
||||
WHEN 'post' THEN (SELECT SUBSTR(p.text,1,80) FROM forum_posts p WHERE p.id=r.target_id)
|
||||
END AS content_preview
|
||||
FROM forum_reports r
|
||||
LEFT JOIN users u ON u.id=r.user_id
|
||||
WHERE r.resolved=0
|
||||
ORDER BY r.created_at DESC
|
||||
LIMIT 100
|
||||
LEFT JOIN users m ON m.id=r.resolved_by
|
||||
ORDER BY r.resolved ASC, r.created_at DESC
|
||||
LIMIT 200
|
||||
""").fetchall()
|
||||
return [dict(r) for r in rows]
|
||||
|
||||
|
|
@ -97,8 +100,12 @@ async def mod_resolve_report(rid: int, user=Depends(require_moderator)):
|
|||
raise HTTPException(404, "Meldung nicht gefunden.")
|
||||
new_state = 0 if r["resolved"] else 1
|
||||
conn.execute(
|
||||
"UPDATE forum_reports SET resolved=? WHERE id=?",
|
||||
(new_state, rid)
|
||||
"""UPDATE forum_reports SET resolved=?, resolved_by=?, resolved_at=?
|
||||
WHERE id=?""",
|
||||
(new_state,
|
||||
user["id"] if new_state else None,
|
||||
datetime.utcnow().isoformat() if new_state else None,
|
||||
rid)
|
||||
)
|
||||
return {"ok": True}
|
||||
|
||||
|
|
@ -189,17 +196,19 @@ async def mod_patch_user(uid: int, data: dict, user=Depends(require_moderator)):
|
|||
async def mod_fotos(user=Depends(require_moderator)):
|
||||
with db() as conn:
|
||||
rows = conn.execute("""
|
||||
SELECT s.id, s.foto_url, s.created_at,
|
||||
SELECT s.id, s.foto_url, s.status, s.created_at,
|
||||
s.reviewed_at, s.reject_reason,
|
||||
COALESCE(s.rights_confirmed, 0) AS rights_confirmed,
|
||||
u.name AS user_name,
|
||||
r.name AS rasse_name, r.slug AS rasse_slug,
|
||||
u.name AS user_name,
|
||||
m.name AS reviewed_by_name,
|
||||
r.name AS rasse_name, r.slug AS rasse_slug,
|
||||
r.foto_url AS aktuell_foto
|
||||
FROM wiki_foto_submissions s
|
||||
LEFT JOIN users u ON u.id = s.user_id
|
||||
LEFT JOIN users m ON m.id = s.reviewed_by
|
||||
LEFT JOIN wiki_rassen r ON r.id = s.rasse_id
|
||||
WHERE s.status = 'pending'
|
||||
ORDER BY s.created_at ASC
|
||||
LIMIT 50
|
||||
ORDER BY s.status ASC, s.created_at ASC
|
||||
LIMIT 200
|
||||
""").fetchall()
|
||||
return [dict(r) for r in rows]
|
||||
|
||||
|
|
@ -228,11 +237,13 @@ async def mod_poi_edits(user=Depends(require_moderator)):
|
|||
SELECT e.id, e.osm_id, e.poi_name, e.field,
|
||||
e.old_value, e.new_value, e.status,
|
||||
e.created_at, e.resolved_at,
|
||||
u.name AS einreicher_name
|
||||
u.name AS einreicher_name,
|
||||
m.name AS mod_name
|
||||
FROM osm_poi_edits e
|
||||
JOIN users u ON u.id = e.user_id
|
||||
LEFT JOIN users m ON m.id = e.mod_id
|
||||
ORDER BY e.status ASC, e.created_at DESC
|
||||
LIMIT 100
|
||||
LIMIT 200
|
||||
""").fetchall()
|
||||
return [dict(r) for r in rows]
|
||||
|
||||
|
|
|
|||
|
|
@ -694,11 +694,12 @@ async def list_zuchter_pending(user=Depends(get_current_user)):
|
|||
raise HTTPException(403, "Nur Moderatoren.")
|
||||
with db() as conn:
|
||||
rows = conn.execute(
|
||||
"""SELECT z.*, u.name AS user_name
|
||||
"""SELECT z.*, u.name AS user_name, m.name AS verified_by_name
|
||||
FROM wiki_zuchter z
|
||||
LEFT JOIN users u ON u.id = z.user_id
|
||||
WHERE z.verified=0
|
||||
ORDER BY z.created_at ASC""",
|
||||
LEFT JOIN users m ON m.id = z.verified_by
|
||||
ORDER BY z.verified ASC, z.created_at ASC
|
||||
LIMIT 200""",
|
||||
).fetchall()
|
||||
return [dict(r) for r in rows]
|
||||
|
||||
|
|
@ -716,8 +717,10 @@ async def verify_zuchter(zuchter_id: int, user=Depends(get_current_user)):
|
|||
).fetchone()
|
||||
if not row:
|
||||
raise HTTPException(404, "Züchter nicht gefunden.")
|
||||
from datetime import datetime
|
||||
conn.execute(
|
||||
"UPDATE wiki_zuchter SET verified=1 WHERE id=?", (zuchter_id,)
|
||||
"UPDATE wiki_zuchter SET verified=1, verified_by=?, verified_at=? WHERE id=?",
|
||||
(user["id"], datetime.utcnow().isoformat(), zuchter_id)
|
||||
)
|
||||
result = conn.execute(
|
||||
"SELECT * FROM wiki_zuchter WHERE id=?", (zuchter_id,)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue