feat(postcard): profile country, country_from, per-user card number uniqueness, public page overhaul - Profile: add country field for default origin country - Postcard: add country_from field, auto-fill from profile.country on create - card_number uniqueness: change from global to per-user (profile_id + card_number) - Public pages: remove card_number display, only show cards with image_front - Public pages: show country as from→to format - Index page: no time display, add register button, fix lightbox with prev/next - Infinite scroll: add /api/public/cards endpoints and IntersectionObserver - Internal pages: update postcards list/detail for country_from display - i18n: add profiles.country_ph, pc_form.country_from, pc_detail.route

This commit is contained in:
2026-07-07 12:32:24 +08:00
parent bd664d23be
commit a071b3dde4
12 changed files with 414 additions and 90 deletions

View File

@@ -7,11 +7,18 @@ from pydantic import BaseModel
class ProfileCreate(BaseModel):
nickname: str
country: str | None = None
class ProfileUpdate(BaseModel):
nickname: str | None = None
country: str | None = None
class ProfileOut(BaseModel):
id: int
nickname: str
country: str | None
created_at: datetime
model_config = {"from_attributes": True}
@@ -24,6 +31,7 @@ class PostcardCreate(BaseModel):
status: str
recipient_name: str | None = None
country: str | None = None
country_from: str | None = None
send_time: datetime | None = None
arrival_time: datetime | None = None
sender_name: str | None = None
@@ -35,6 +43,7 @@ class PostcardUpdate(BaseModel):
status: str | None = None
recipient_name: str | None = None
country: str | None = None
country_from: str | None = None
send_time: datetime | None = None
arrival_time: datetime | None = None
sender_name: str | None = None
@@ -48,6 +57,7 @@ class PostcardOut(BaseModel):
status: str
recipient_name: str | None
country: str | None
country_from: str | None
send_time: datetime | None
arrival_time: datetime | None
sender_name: str | None