| import uuid |
| from datetime import datetime |
|
|
| from sqlalchemy import ( |
| Boolean, |
| DateTime, |
| Index, |
| String, |
| Text, |
| func, |
| ) |
| from sqlalchemy.dialects.postgresql import UUID |
| from sqlalchemy.orm import Mapped, mapped_column, relationship |
|
|
| from app.db.base import Base |
|
|
|
|
| class Source(Base): |
| __tablename__ = "sources" |
|
|
| id: Mapped[uuid.UUID] = mapped_column( |
| UUID(as_uuid=True), |
| primary_key=True, |
| default=uuid.uuid4, |
| ) |
|
|
| name: Mapped[str] = mapped_column( |
| String(180), |
| nullable=False, |
| unique=True, |
| ) |
|
|
| slug: Mapped[str] = mapped_column( |
| String(180), |
| nullable=False, |
| unique=True, |
| ) |
|
|
| organization_type: Mapped[str] = mapped_column( |
| String(50), |
| nullable=False, |
| default="organization", |
| server_default="organization", |
| ) |
|
|
| base_url: Mapped[str] = mapped_column( |
| Text, |
| nullable=False, |
| ) |
|
|
| opportunities_url: Mapped[str | None] = mapped_column( |
| Text, |
| nullable=True, |
| ) |
|
|
| feed_url: Mapped[str | None] = mapped_column( |
| Text, |
| nullable=True, |
| ) |
|
|
| logo_url: Mapped[str | None] = mapped_column( |
| Text, |
| nullable=True, |
| ) |
|
|
| country_code: Mapped[str | None] = mapped_column( |
| String(2), |
| nullable=True, |
| ) |
|
|
| source_tier: Mapped[str] = mapped_column( |
| String(1), |
| nullable=False, |
| default="B", |
| server_default="B", |
| ) |
|
|
| is_official: Mapped[bool] = mapped_column( |
| Boolean, |
| nullable=False, |
| default=True, |
| server_default="true", |
| ) |
|
|
| is_active: Mapped[bool] = mapped_column( |
| Boolean, |
| nullable=False, |
| default=True, |
| server_default="true", |
| ) |
|
|
| last_checked_at: Mapped[datetime | None] = mapped_column( |
| DateTime(timezone=True), |
| nullable=True, |
| ) |
|
|
| created_at: Mapped[datetime] = mapped_column( |
| DateTime(timezone=True), |
| nullable=False, |
| server_default=func.now(), |
| ) |
|
|
| updated_at: Mapped[datetime] = mapped_column( |
| DateTime(timezone=True), |
| nullable=False, |
| server_default=func.now(), |
| onupdate=func.now(), |
| ) |
|
|
| opportunities = relationship( |
| "Opportunity", |
| back_populates="source", |
| lazy="selectin", |
| ) |
|
|
| __table_args__ = ( |
| Index("ix_sources_slug", "slug"), |
| Index( |
| "ix_sources_active_official", |
| "is_active", |
| "is_official", |
| ), |
| ) |