✨ Add ConnectionArea and StopShape models + Stop-ConnectionArea relationship
This commit is contained in:
@@ -1,6 +1,14 @@
|
|||||||
from .line import Line, LinePicto
|
from .line import Line, LinePicto
|
||||||
from .stop import Stop, StopArea
|
from .stop import ConnectionArea, Stop, StopArea, StopShape
|
||||||
from .user import UserLastStopSearchResults
|
from .user import UserLastStopSearchResults
|
||||||
|
|
||||||
|
|
||||||
__all__ = ["Line", "LinePicto", "Stop", "StopArea", "UserLastStopSearchResults"]
|
__all__ = [
|
||||||
|
"ConnectionArea",
|
||||||
|
"Line",
|
||||||
|
"LinePicto",
|
||||||
|
"Stop",
|
||||||
|
"StopArea",
|
||||||
|
"StopShape",
|
||||||
|
"UserLastStopSearchResults",
|
||||||
|
]
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from typing import Iterable, Self, Sequence, TYPE_CHECKING
|
from typing import Iterable, Sequence, TYPE_CHECKING
|
||||||
|
|
||||||
from sqlalchemy import (
|
from sqlalchemy import (
|
||||||
BigInteger,
|
BigInteger,
|
||||||
@@ -8,6 +8,8 @@ from sqlalchemy import (
|
|||||||
Enum,
|
Enum,
|
||||||
Float,
|
Float,
|
||||||
ForeignKey,
|
ForeignKey,
|
||||||
|
Integer,
|
||||||
|
JSON,
|
||||||
select,
|
select,
|
||||||
String,
|
String,
|
||||||
Table,
|
Table,
|
||||||
@@ -48,19 +50,26 @@ class _Stop(Base):
|
|||||||
postal_region = mapped_column(String, nullable=False)
|
postal_region = mapped_column(String, nullable=False)
|
||||||
xepsg2154 = mapped_column(BigInteger, nullable=False)
|
xepsg2154 = mapped_column(BigInteger, nullable=False)
|
||||||
yepsg2154 = mapped_column(BigInteger, nullable=False)
|
yepsg2154 = mapped_column(BigInteger, nullable=False)
|
||||||
|
|
||||||
version = mapped_column(String, nullable=False)
|
version = mapped_column(String, nullable=False)
|
||||||
created_ts = mapped_column(BigInteger)
|
created_ts = mapped_column(BigInteger)
|
||||||
changed_ts = mapped_column(BigInteger, nullable=False)
|
changed_ts = mapped_column(BigInteger, nullable=False)
|
||||||
|
|
||||||
lines: Mapped[list[Line]] = relationship(
|
lines: Mapped[list[Line]] = relationship(
|
||||||
"Line",
|
"Line",
|
||||||
secondary="line_stop_association_table",
|
secondary="line_stop_association_table",
|
||||||
back_populates="stops",
|
back_populates="stops",
|
||||||
# lazy="joined",
|
|
||||||
lazy="selectin",
|
lazy="selectin",
|
||||||
)
|
)
|
||||||
areas: Mapped[list["StopArea"]] = relationship(
|
areas: Mapped[list["StopArea"]] = relationship(
|
||||||
"StopArea", secondary=stop_area_stop_association_table, back_populates="stops"
|
"StopArea", secondary=stop_area_stop_association_table, back_populates="stops"
|
||||||
)
|
)
|
||||||
|
connection_area_id: Mapped[int] = mapped_column(
|
||||||
|
ForeignKey("connection_areas.id"), nullable=True
|
||||||
|
)
|
||||||
|
connection_area: Mapped["ConnectionArea"] = relationship(
|
||||||
|
back_populates="stops", lazy="selectin"
|
||||||
|
)
|
||||||
|
|
||||||
__tablename__ = "_stops"
|
__tablename__ = "_stops"
|
||||||
__mapper_args__ = {"polymorphic_identity": "_stops", "polymorphic_on": kind}
|
__mapper_args__ = {"polymorphic_identity": "_stops", "polymorphic_on": kind}
|
||||||
@@ -108,6 +117,7 @@ class Stop(_Stop):
|
|||||||
accessibility = mapped_column(Enum(IdfmState), nullable=False)
|
accessibility = mapped_column(Enum(IdfmState), nullable=False)
|
||||||
visual_signs_available = mapped_column(Enum(IdfmState), nullable=False)
|
visual_signs_available = mapped_column(Enum(IdfmState), nullable=False)
|
||||||
audible_signs_available = mapped_column(Enum(IdfmState), nullable=False)
|
audible_signs_available = mapped_column(Enum(IdfmState), nullable=False)
|
||||||
|
|
||||||
record_id = mapped_column(String, nullable=False)
|
record_id = mapped_column(String, nullable=False)
|
||||||
record_ts = mapped_column(BigInteger, nullable=False)
|
record_ts = mapped_column(BigInteger, nullable=False)
|
||||||
|
|
||||||
@@ -173,3 +183,78 @@ class StopArea(_Stop):
|
|||||||
await session.commit()
|
await session.commit()
|
||||||
|
|
||||||
return found
|
return found
|
||||||
|
|
||||||
|
|
||||||
|
class StopShape(Base):
|
||||||
|
|
||||||
|
db = db
|
||||||
|
|
||||||
|
id = mapped_column(BigInteger, primary_key=True) # Same id than ConnectionArea
|
||||||
|
type = mapped_column(Integer, nullable=False)
|
||||||
|
bounding_box = mapped_column(JSON)
|
||||||
|
points = mapped_column(JSON)
|
||||||
|
|
||||||
|
__tablename__ = "stop_shapes"
|
||||||
|
|
||||||
|
|
||||||
|
class ConnectionArea(Base):
|
||||||
|
|
||||||
|
db = db
|
||||||
|
|
||||||
|
id = mapped_column(BigInteger, primary_key=True)
|
||||||
|
|
||||||
|
name = mapped_column(String, nullable=False)
|
||||||
|
town_name = mapped_column(String, nullable=False)
|
||||||
|
postal_region = mapped_column(String, nullable=False)
|
||||||
|
xepsg2154 = mapped_column(BigInteger, nullable=False)
|
||||||
|
yepsg2154 = mapped_column(BigInteger, nullable=False)
|
||||||
|
transport_mode = mapped_column(Enum(StopAreaType), nullable=False)
|
||||||
|
|
||||||
|
version = mapped_column(String, nullable=False)
|
||||||
|
created_ts = mapped_column(BigInteger)
|
||||||
|
changed_ts = mapped_column(BigInteger, nullable=False)
|
||||||
|
|
||||||
|
stops: Mapped[list["_Stop"]] = relationship(back_populates="connection_area")
|
||||||
|
|
||||||
|
__tablename__ = "connection_areas"
|
||||||
|
|
||||||
|
# TODO: Merge with StopArea.add_stops
|
||||||
|
@classmethod
|
||||||
|
async def add_stops(
|
||||||
|
cls, conn_area_to_stop_ids: Iterable[tuple[int, int]]
|
||||||
|
) -> int | None:
|
||||||
|
session = cls.db.session
|
||||||
|
if session is None:
|
||||||
|
return None
|
||||||
|
|
||||||
|
conn_area_ids, stop_ids = set(), set()
|
||||||
|
for conn_area_id, stop_id in conn_area_to_stop_ids:
|
||||||
|
conn_area_ids.add(conn_area_id)
|
||||||
|
stop_ids.add(stop_id)
|
||||||
|
|
||||||
|
conn_area_res = await session.execute(
|
||||||
|
select(ConnectionArea)
|
||||||
|
.where(ConnectionArea.id.in_(conn_area_ids))
|
||||||
|
.options(selectinload(ConnectionArea.stops))
|
||||||
|
)
|
||||||
|
conn_areas: dict[int, ConnectionArea] = {
|
||||||
|
conn.id: conn for conn in conn_area_res.scalars()
|
||||||
|
}
|
||||||
|
|
||||||
|
stop_res = await session.execute(select(_Stop).where(_Stop.id.in_(stop_ids)))
|
||||||
|
stops: dict[int, _Stop] = {stop.id: stop for stop in stop_res.scalars()}
|
||||||
|
|
||||||
|
found = 0
|
||||||
|
for conn_area_id, stop_id in conn_area_to_stop_ids:
|
||||||
|
if (conn_area := conn_areas.get(conn_area_id)) is not None:
|
||||||
|
if (stop := stops.get(stop_id)) is not None:
|
||||||
|
conn_area.stops.append(stop)
|
||||||
|
found += 1
|
||||||
|
else:
|
||||||
|
print(f"No stop found for {stop_id} id")
|
||||||
|
else:
|
||||||
|
print(f"No connection area found for {conn_area_id}")
|
||||||
|
|
||||||
|
await session.commit()
|
||||||
|
|
||||||
|
return found
|
||||||
|
Reference in New Issue
Block a user