Files
classifieds/app/services/moderation.py
T
2026-06-16 13:29:32 -04:00

44 lines
1.6 KiB
Python

"""Admin listing moderation: flag queue + approve/hide/remove actions.
Each action mutates the listing + calls audit.log_action; caller commits
(mirrors services/admin_users.py).
"""
from app.extensions import db
from app.models.listing import Listing
from app.models.enums import ListingStatus
from app.services import audit
# A listing is in the moderation queue if it's already flagged, or it's
# still active but has accumulated reports below the auto-flag threshold.
QUEUE_FILTER = db.or_(
Listing.status == ListingStatus.flagged,
db.and_(Listing.status == ListingStatus.active, Listing.flag_count > 0),
)
def flag_queue(*, page=1, per_page=25):
return (Listing.query.filter(QUEUE_FILTER)
.order_by(Listing.flag_count.desc(), Listing.updated_at.desc())
.paginate(page=page, per_page=per_page, error_out=False))
def approve(listing, *, actor):
"""Clear flags, restore to active. Caller commits."""
old = listing.flag_count
listing.status = ListingStatus.active
listing.flag_count = 0
audit.log_action(actor, "listing.approved", "listing", listing.id,
meta={"cleared_flags": old})
def hide(listing, *, actor):
"""Manually flag for review without removing. Caller commits."""
listing.status = ListingStatus.flagged
audit.log_action(actor, "listing.hidden", "listing", listing.id)
def remove(listing, *, actor):
"""Permanently remove from the marketplace (status flip, not a hard delete). Caller commits."""
listing.status = ListingStatus.removed
audit.log_action(actor, "listing.removed", "listing", listing.id)