43 lines
1.4 KiB
Python
43 lines
1.4 KiB
Python
from datetime import datetime, timezone
|
|
from typing import Optional
|
|
from sqlmodel import SQLModel, Field, Column
|
|
import sqlalchemy as sa
|
|
|
|
|
|
class Dataset(SQLModel, table=True):
|
|
id: Optional[int] = Field(default=None, primary_key=True)
|
|
name: str
|
|
raw_filename: str
|
|
feature_count: int = 0
|
|
bbox_json: Optional[str] = None # JSON string [minLng, minLat, maxLng, maxLat]
|
|
created_at: datetime = Field(
|
|
default_factory=lambda: datetime.now(timezone.utc),
|
|
sa_column=Column(sa.DateTime(timezone=True), default=sa.func.now()),
|
|
)
|
|
|
|
|
|
class Feature(SQLModel, table=True):
|
|
id: Optional[int] = Field(default=None, primary_key=True)
|
|
dataset_id: int = Field(foreign_key="dataset.id", index=True)
|
|
geometry_json: str # GeoJSON geometry as JSON string
|
|
properties_json: str # GeoJSON properties as JSON string
|
|
|
|
|
|
class FeatureVersion(SQLModel, table=True):
|
|
id: Optional[int] = Field(default=None, primary_key=True)
|
|
feature_id: int = Field(foreign_key="feature.id", index=True)
|
|
before_json: str
|
|
after_json: str
|
|
timestamp: datetime = Field(
|
|
default_factory=lambda: datetime.now(timezone.utc),
|
|
sa_column=Column(sa.DateTime(timezone=True), default=sa.func.now()),
|
|
)
|
|
|
|
|
|
class MapSettings(SQLModel, table=True):
|
|
id: Optional[int] = Field(default=None, primary_key=True)
|
|
center_lng: float = 2.35
|
|
center_lat: float = 48.85
|
|
zoom: float = 5.0
|
|
base_layer: str = "vector"
|