feat: add location and categories fields, simplify event creation
Some checks failed
lint.yml / feat: add location and categories fields, simplify event creation (pull_request) Failing after 0s

- Add location (text) and categories (JSON list) to Event model
- Make most CreateEvent fields optional: only title + start date required
- Default end_date to start_date, closing_date to end_date
- Categories stored as JSON text, parsed via validator
- NIP-52 publisher includes location tag and t tags for categories
- Migration m011 adds location and categories columns

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Padreug 2026-04-27 18:05:25 +02:00
commit 29045163a3
4 changed files with 48 additions and 15 deletions

View file

@ -1,3 +1,4 @@
import json
from datetime import datetime
from typing import Optional
@ -29,15 +30,17 @@ class EventExtra(BaseModel):
class CreateEvent(BaseModel):
wallet: Optional[str] = None
name: str
info: str
closing_date: str
event_start_date: str
event_end_date: str
name: str # title (required)
info: str = "" # description (optional, visible by default)
closing_date: Optional[str] = None # defaults to event_end_date or event_start_date
event_start_date: str # required
event_end_date: Optional[str] = None # defaults to event_start_date
currency: str = "sat"
amount_tickets: int = Query(..., ge=0)
price_per_ticket: float = Query(..., ge=0)
banner: Optional[str] = None
amount_tickets: int = 0 # 0 = unlimited / not ticketed
price_per_ticket: float = 0 # 0 = free
banner: Optional[str] = None # image URL (optional, visible by default)
location: Optional[str] = None # venue/address (optional, visible by default)
categories: list[str] = Field(default_factory=list) # NIP-52 't' tags
extra: EventExtra = Field(default_factory=EventExtra)
status: str = "approved" # proposed, approved, rejected
@ -67,22 +70,30 @@ class Event(BaseModel):
id: str
wallet: str
name: str
info: str
closing_date: str
info: str = ""
closing_date: str | None = None
canceled: bool = False
event_start_date: str
event_end_date: str
currency: str
amount_tickets: int
price_per_ticket: float
event_end_date: str | None = None
currency: str = "sat"
amount_tickets: int = 0
price_per_ticket: float = 0
time: datetime
sold: int = 0
banner: str | None = None
location: str | None = None
categories: list[str] = Field(default_factory=list)
extra: EventExtra = Field(default_factory=EventExtra)
status: str = "approved" # proposed, approved, rejected
nostr_event_id: str | None = None
nostr_event_created_at: int | None = None
@validator("categories", pre=True)
def parse_categories(cls, v):
if isinstance(v, str):
return json.loads(v) if v else []
return v or []
class EventsSettings(BaseModel):
"""Extension-level settings for the events extension."""