from typing import Any from pydantic import BaseModel from sqlmodel import Field, String, JSON, Relationship from gisaf.models.models_base import Model from gisaf.models.category import CategoryGroup from gisaf.models.metadata import gisaf_map from gisaf.models.store import Store class BaseStyle(Model, table=True): __table_args__ = gisaf_map.table_args __tablename__: str = 'map_base_style' # type: ignore class Admin: menu = 'Other' flask_admin_model_view = 'MapBaseStyleModelView' id: int | None = Field(primary_key=True, default=None) name: str style: dict[str, Any] | None = Field(sa_type=JSON(none_as_null=True)) # type: ignore mbtiles: str = Field(sa_type=String(50)) # type: ignore static_tiles_url: str enabled: bool = True def __repr__(self): return f'' class BaseMap(Model, table=True): __table_args__ = gisaf_map.table_args __tablename__: str = 'base_map' # type: ignore class Admin: menu = 'Other' id: int | None = Field(primary_key=True, default=None) name: str layers: list['BaseMapLayer'] = Relationship(back_populates='base_map') def __repr__(self) -> str: return f'' def __str__(self) -> str: return self.name @classmethod def selectinload(cls) -> list[list['BaseMapLayer']]: return [ cls.layers ] class BaseMapLayer(Model, table=True): __table_args__ = gisaf_map.table_args __tablename__: str = 'base_map_layer' # type: ignore class Admin: menu = 'Other' id: int | None = Field(primary_key=True, default=None) base_map_id: int = Field(foreign_key=gisaf_map.table('base_map.id'), index=True) base_map: BaseMap = Relationship(back_populates='layers') store: str = Field(sa_type=String(100)) # type: ignore @classmethod def selectinload(cls): return [ cls.base_map ] def __repr__(self): return f"" def __str__(self): return f"{self.store or '':s}" class MapInitData(BaseModel): baseStyles: list[BaseStyle] = [] baseMaps: list[BaseMap] = [] groups: list[CategoryGroup] = [] stores: list[Store] = []