You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
4.8 KiB
Python
94 lines
4.8 KiB
Python
from datetime import date, datetime
|
|
from typing import Optional
|
|
|
|
from sqlalchemy import Boolean, Date, DateTime, Integer, String, Text, UniqueConstraint
|
|
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
|
|
|
|
|
|
class Base(DeclarativeBase):
|
|
pass
|
|
|
|
|
|
class JobPosting(Base):
|
|
__tablename__ = "job_postings"
|
|
|
|
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
|
site_id: Mapped[str] = mapped_column(String(64), nullable=False, index=True)
|
|
external_job_id: Mapped[Optional[str]] = mapped_column(String(256), nullable=True)
|
|
title: Mapped[str] = mapped_column(String(512), nullable=False)
|
|
company: Mapped[Optional[str]] = mapped_column(String(256), nullable=True)
|
|
location: Mapped[Optional[str]] = mapped_column(String(256), nullable=True)
|
|
posted_text: Mapped[Optional[str]] = mapped_column(String(128), nullable=True)
|
|
posted_at_normalized: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True)
|
|
job_url: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
|
|
salary_text: Mapped[Optional[str]] = mapped_column(String(256), nullable=True)
|
|
employment_type: Mapped[Optional[str]] = mapped_column(String(128), nullable=True)
|
|
raw_text: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
|
|
fingerprint: Mapped[str] = mapped_column(String(64), nullable=False, unique=True)
|
|
run_date: Mapped[date] = mapped_column(Date, nullable=False, index=True)
|
|
first_seen_at: Mapped[datetime] = mapped_column(DateTime, nullable=False)
|
|
last_seen_at: Mapped[datetime] = mapped_column(DateTime, nullable=False)
|
|
is_new: Mapped[bool] = mapped_column(Boolean, nullable=False, default=True)
|
|
is_active: Mapped[bool] = mapped_column(Boolean, nullable=False, default=True)
|
|
|
|
|
|
class SiteRun(Base):
|
|
__tablename__ = "site_runs"
|
|
|
|
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
|
site_id: Mapped[str] = mapped_column(String(64), nullable=False, index=True)
|
|
started_at: Mapped[datetime] = mapped_column(DateTime, nullable=False)
|
|
ended_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True)
|
|
status: Mapped[str] = mapped_column(String(32), nullable=False)
|
|
items_found: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
|
|
new_items: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
|
|
error_summary: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
|
|
failure_classification: Mapped[Optional[str]] = mapped_column(String(64), nullable=True)
|
|
trace_path: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
|
|
screenshot_path: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
|
|
dom_snapshot_path: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
|
|
|
|
|
|
class SiteConfig(Base):
|
|
__tablename__ = "site_configs"
|
|
|
|
site_id: Mapped[str] = mapped_column(String(64), primary_key=True)
|
|
enabled: Mapped[bool] = mapped_column(Boolean, nullable=False, default=True)
|
|
repair_needed: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False)
|
|
consecutive_failures: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
|
|
last_success_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True)
|
|
last_failure_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True)
|
|
notes: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
|
|
|
|
|
|
class SiteManifestVersion(Base):
|
|
__tablename__ = "site_manifest_versions"
|
|
|
|
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
|
site_id: Mapped[str] = mapped_column(String(64), nullable=False, index=True)
|
|
version: Mapped[int] = mapped_column(Integer, nullable=False, default=1)
|
|
generated_by: Mapped[str] = mapped_column(String(64), nullable=False, default="manual")
|
|
created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False)
|
|
notes: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
|
|
|
|
|
|
class Summary(Base):
|
|
__tablename__ = "summaries"
|
|
|
|
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
|
run_date: Mapped[date] = mapped_column(Date, nullable=False, index=True)
|
|
content: Mapped[str] = mapped_column(Text, nullable=False)
|
|
model_used: Mapped[str] = mapped_column(String(128), nullable=False)
|
|
created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False)
|
|
|
|
|
|
class NotificationLog(Base):
|
|
__tablename__ = "notification_logs"
|
|
|
|
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
|
run_date: Mapped[date] = mapped_column(Date, nullable=False, index=True)
|
|
provider: Mapped[str] = mapped_column(String(64), nullable=False)
|
|
status: Mapped[str] = mapped_column(String(32), nullable=False)
|
|
error_message: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
|
|
sent_at: Mapped[datetime] = mapped_column(DateTime, nullable=False)
|