Add Profile/Channel entities with CRUD and remove legacy parser builder.
Introduce reusable ParserProfile and ParseChannel, pair jobs with enqueue flatten, Events admin CRUD, and drop inline/legacy parser-builder UI and aliases. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -92,6 +92,38 @@ class EventRead(BaseModel):
|
||||
metadata: dict[str, Any] | None = Field(validation_alias="metadata_")
|
||||
|
||||
|
||||
class EventCreate(BaseModel):
|
||||
source_type: str = Field(default="manual", min_length=1, max_length=50)
|
||||
source_url: str = Field(min_length=1, max_length=512)
|
||||
raw_text: str = ""
|
||||
title: str = ""
|
||||
description: str = ""
|
||||
locality: str = ""
|
||||
latitude: float | None = Field(default=None, ge=-90, le=90)
|
||||
longitude: float | None = Field(default=None, ge=-180, le=180)
|
||||
event_date: datetime | None = None
|
||||
region: str | None = None
|
||||
topic: str | None = None
|
||||
tags: list[str] | None = None
|
||||
metadata: dict[str, Any] | None = None
|
||||
|
||||
|
||||
class EventUpdate(BaseModel):
|
||||
source_type: str | None = Field(default=None, min_length=1, max_length=50)
|
||||
source_url: str | None = Field(default=None, min_length=1, max_length=512)
|
||||
raw_text: str | None = None
|
||||
title: str | None = None
|
||||
description: str | None = None
|
||||
locality: str | None = None
|
||||
latitude: float | None = Field(default=None, ge=-90, le=90)
|
||||
longitude: float | None = Field(default=None, ge=-180, le=180)
|
||||
event_date: datetime | None = None
|
||||
region: str | None = None
|
||||
topic: str | None = None
|
||||
tags: list[str] | None = None
|
||||
metadata: dict[str, Any] | None = None
|
||||
|
||||
|
||||
class IngestEventItem(BaseModel):
|
||||
source_type: str = "telegram"
|
||||
source_url: str
|
||||
@@ -127,9 +159,62 @@ class IngestResponse(BaseModel):
|
||||
map_objects_synced: int
|
||||
|
||||
|
||||
class ParserProfileCreate(BaseModel):
|
||||
name: str = Field(min_length=1, max_length=255)
|
||||
sample_post: str = ""
|
||||
heuristic_profile: dict[str, Any] | None = None
|
||||
status: str | None = None
|
||||
|
||||
|
||||
class ParserProfileUpdate(BaseModel):
|
||||
name: str | None = Field(default=None, min_length=1, max_length=255)
|
||||
sample_post: str | None = None
|
||||
heuristic_profile: dict[str, Any] | None = None
|
||||
status: str | None = None
|
||||
|
||||
|
||||
class ParserProfileRead(BaseModel):
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
id: int
|
||||
name: str
|
||||
sample_post: str
|
||||
heuristic_profile: dict[str, Any] | None
|
||||
status: str
|
||||
created_at: datetime
|
||||
|
||||
|
||||
class ParseChannelCreate(BaseModel):
|
||||
name: str = Field(min_length=1, max_length=255)
|
||||
source_type: str = "telegram"
|
||||
channel: str = Field(min_length=1, max_length=255)
|
||||
is_active: bool = True
|
||||
|
||||
|
||||
class ParseChannelUpdate(BaseModel):
|
||||
name: str | None = Field(default=None, min_length=1, max_length=255)
|
||||
source_type: str | None = None
|
||||
channel: str | None = Field(default=None, min_length=1, max_length=255)
|
||||
is_active: bool | None = None
|
||||
|
||||
|
||||
class ParseChannelRead(BaseModel):
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
id: int
|
||||
name: str
|
||||
source_type: str
|
||||
channel: str
|
||||
is_active: bool
|
||||
created_at: datetime
|
||||
|
||||
|
||||
class ParseJobCreate(BaseModel):
|
||||
source_type: str = "telegram"
|
||||
source_config: dict[str, Any] = Field(default_factory=dict)
|
||||
profile_id: int | None = None
|
||||
channel_id: int | None = None
|
||||
limit: int = Field(default=100, ge=1, le=1000)
|
||||
schedule: str | None = None
|
||||
interval_seconds: int = Field(default=3600, ge=60, le=604800)
|
||||
is_active: bool = True
|
||||
@@ -137,6 +222,9 @@ class ParseJobCreate(BaseModel):
|
||||
|
||||
class ParseJobUpdate(BaseModel):
|
||||
source_config: dict[str, Any] | None = None
|
||||
profile_id: int | None = None
|
||||
channel_id: int | None = None
|
||||
limit: int | None = Field(default=None, ge=1, le=1000)
|
||||
interval_seconds: int | None = Field(default=None, ge=60, le=604800)
|
||||
is_active: bool | None = None
|
||||
|
||||
@@ -147,6 +235,8 @@ class ParseJobRead(BaseModel):
|
||||
id: int
|
||||
source_type: str
|
||||
source_config: dict[str, Any]
|
||||
profile_id: int | None = None
|
||||
channel_id: int | None = None
|
||||
schedule: str | None
|
||||
interval_seconds: int
|
||||
is_active: bool
|
||||
@@ -154,6 +244,9 @@ class ParseJobRead(BaseModel):
|
||||
last_run_at: datetime | None
|
||||
last_error: str | None
|
||||
created_at: datetime
|
||||
profile_name: str | None = None
|
||||
channel_name: str | None = None
|
||||
channel_handle: str | None = None
|
||||
|
||||
|
||||
class ConsumerCreate(BaseModel):
|
||||
|
||||
Reference in New Issue
Block a user