Add user catch submission and moderation workflow

This commit is contained in:
ik
2026-09-02 20:33:58 +07:00
parent d3a45248ef
commit 6d536d0ade
13 changed files with 227 additions and 8 deletions
+57 -1
View File
@@ -3,7 +3,7 @@ from __future__ import annotations
from datetime import datetime
from uuid import UUID
from pydantic import BaseModel, ConfigDict
from pydantic import BaseModel, ConfigDict, Field, field_validator
class FishOut(BaseModel):
@@ -98,3 +98,59 @@ class ImportRunOut(BaseModel):
rows_created: int
rows_updated: int
error_summary: str | None
class CatchReportCreate(BaseModel):
fish_slug: str
waterbody_slug: str
x: int = Field(ge=-10_000, le=10_000)
y: int = Field(ge=-10_000, le=10_000)
weight_g: int = Field(gt=0, le=3_000_000)
bait_name: str | None = Field(default=None, max_length=200)
fishing_method: str | None = Field(default=None, max_length=50)
rig_type: str | None = Field(default=None, max_length=100)
retrieve_method: str | None = Field(default=None, max_length=100)
retrieve_speed: int | None = Field(default=None, ge=0, le=100)
caught_at: datetime | None = None
player_name: str | None = Field(default=None, max_length=100)
source_url: str | None = Field(default=None, max_length=1000)
comment: str | None = Field(default=None, max_length=1000)
website: str = Field(default="", max_length=200)
@field_validator("fish_slug", "waterbody_slug")
@classmethod
def nonempty_slug(cls, value: str) -> str:
value = value.strip()
if not value:
raise ValueError("must not be empty")
return value
class CatchReportCreated(BaseModel):
id: UUID
moderation_status: str
class AdminCatchReportOut(BaseModel):
id: UUID
fish: str
waterbody: str
coordinates: str
weight_g: int
bait: str | None
player_name: str | None
reported_at: datetime
moderation_status: str
comment: str | None
class ModerationUpdate(BaseModel):
status: str
reason: str | None = Field(default=None, max_length=1000)
@field_validator("status")
@classmethod
def known_status(cls, value: str) -> str:
if value not in {"approved", "rejected", "pending"}:
raise ValueError("unknown moderation status")
return value