61 lines
3.0 KiB
Python
61 lines
3.0 KiB
Python
"""Staging for authorized external observations."""
|
|
from alembic import op
|
|
import sqlalchemy as sa
|
|
|
|
revision = "0008"
|
|
down_revision = "0007"
|
|
branch_labels = None
|
|
depends_on = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
op.create_table(
|
|
"data_source",
|
|
sa.Column("key", sa.String(50), primary_key=True),
|
|
sa.Column("name", sa.String(100), nullable=False),
|
|
sa.Column("base_url", sa.Text(), nullable=False),
|
|
sa.Column("default_confidence", sa.Integer(), nullable=False),
|
|
sa.Column("enabled", sa.Boolean(), nullable=False, server_default=sa.false()),
|
|
)
|
|
op.create_table(
|
|
"external_observation",
|
|
sa.Column("id", sa.Uuid(), primary_key=True),
|
|
sa.Column("source_system", sa.String(50), sa.ForeignKey("data_source.key"), nullable=False),
|
|
sa.Column("source_external_id", sa.String(200), nullable=False),
|
|
sa.Column("source_url", sa.Text(), nullable=False),
|
|
sa.Column("fish_name", sa.String(200), nullable=False),
|
|
sa.Column("fish_external_id", sa.String(200)),
|
|
sa.Column("waterbody_name", sa.String(200), nullable=False),
|
|
sa.Column("waterbody_external_id", sa.String(200)),
|
|
sa.Column("x", sa.Integer()),
|
|
sa.Column("y", sa.Integer()),
|
|
sa.Column("weight_g", sa.Integer()),
|
|
sa.Column("published_at", sa.DateTime(timezone=True)),
|
|
sa.Column("first_seen_at", sa.DateTime(timezone=True), nullable=False),
|
|
sa.Column("last_seen_at", sa.DateTime(timezone=True), nullable=False),
|
|
sa.Column("status", sa.String(30), nullable=False, server_default="staged"),
|
|
sa.Column("payload", sa.JSON(), nullable=False),
|
|
sa.UniqueConstraint("source_system", "source_external_id"),
|
|
)
|
|
op.create_index("ix_external_observation_source_system", "external_observation", ["source_system"])
|
|
op.create_index("ix_external_observation_last_seen_at", "external_observation", ["last_seen_at"])
|
|
op.create_index("ix_external_observation_status", "external_observation", ["status"])
|
|
sources = sa.table(
|
|
"data_source",
|
|
sa.column("key", sa.String), sa.column("name", sa.String), sa.column("base_url", sa.Text),
|
|
sa.column("default_confidence", sa.Integer), sa.column("enabled", sa.Boolean),
|
|
)
|
|
op.bulk_insert(sources, [
|
|
{"key": "rf4db", "name": "RF4DB", "base_url": "https://rf4db.com", "default_confidence": 70, "enabled": False},
|
|
{"key": "rf4stat-fishing", "name": "RF4-STAT fishing", "base_url": "https://rf4-stat.ru/fishing/", "default_confidence": 65, "enabled": False},
|
|
{"key": "rf4stat-post", "name": "RF4-STAT posts", "base_url": "https://rf4-stat.ru/posts/", "default_confidence": 60, "enabled": False},
|
|
])
|
|
|
|
|
|
def downgrade() -> None:
|
|
op.drop_index("ix_external_observation_status", table_name="external_observation")
|
|
op.drop_index("ix_external_observation_last_seen_at", table_name="external_observation")
|
|
op.drop_index("ix_external_observation_source_system", table_name="external_observation")
|
|
op.drop_table("external_observation")
|
|
op.drop_table("data_source")
|