41 lines
2.0 KiB
Python
41 lines
2.0 KiB
Python
from sqlalchemy import Boolean, Column, DateTime, Float, Index, JSON, String, Text
|
|
from sqlalchemy.sql import func
|
|
|
|
from app.db.session import Base
|
|
|
|
|
|
class EarthNewsItem(Base):
|
|
__tablename__ = "earth_news_items"
|
|
|
|
id = Column(String(160), primary_key=True)
|
|
title = Column(String(500), nullable=False)
|
|
summary = Column(Text, nullable=False, default="")
|
|
content_language = Column(String(32), nullable=False, default="en")
|
|
localizations = Column(JSON, nullable=False, default=dict)
|
|
url = Column(Text, nullable=False)
|
|
source = Column(String(255), nullable=False, default="")
|
|
feed_name = Column(String(255), nullable=False, default="")
|
|
region = Column(String(80), nullable=False, index=True)
|
|
homepage_url = Column(Text, nullable=False, default="")
|
|
published_at = Column(DateTime(timezone=True), nullable=True, index=True)
|
|
|
|
latitude = Column(Float, nullable=False)
|
|
longitude = Column(Float, nullable=False)
|
|
location_label = Column(String(255), nullable=False)
|
|
location_source = Column(String(80), nullable=False, default="region_anchor")
|
|
verified = Column(Boolean, nullable=False, default=False, index=True)
|
|
location_meta = Column(JSON, nullable=False, default=dict)
|
|
|
|
first_seen_at = Column(DateTime(timezone=True), server_default=func.now(), nullable=False)
|
|
last_seen_at = Column(DateTime(timezone=True), server_default=func.now(), nullable=False, index=True)
|
|
resolved_at = Column(DateTime(timezone=True), nullable=True, index=True)
|
|
enrichment_status = Column(String(80), nullable=False, default="pending", index=True)
|
|
enrichment_error = Column(Text, nullable=True)
|
|
enriched_at = Column(DateTime(timezone=True), nullable=True, index=True)
|
|
updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now())
|
|
|
|
__table_args__ = (
|
|
Index("idx_earth_news_region_published", "region", "published_at"),
|
|
Index("idx_earth_news_region_seen", "region", "last_seen_at"),
|
|
)
|