Dataclass models have parent back-references (TrackLayout→Circuit→ Locality→Country) causing infinite recursion in dataclasses.asdict(). Add to_dict() methods that exclude parent refs, use them in API endpoints.
47 lines
1.3 KiB
Python
47 lines
1.3 KiB
Python
from dataclasses import dataclass
|
|
from typing import TYPE_CHECKING
|
|
from .track_layout import TrackLayout
|
|
|
|
if TYPE_CHECKING:
|
|
from .locality import Locality
|
|
|
|
@dataclass
|
|
class URLs:
|
|
wikipedia: str
|
|
fandom: str
|
|
|
|
|
|
@dataclass
|
|
class Circuit:
|
|
slug: str
|
|
name: str
|
|
urls: URLs
|
|
locality: 'Locality'
|
|
layouts: dict[str, TrackLayout]
|
|
|
|
def to_dict(self) -> dict:
|
|
return {
|
|
"slug": self.slug,
|
|
"name": self.name,
|
|
"urls": {"wikipedia": self.urls.wikipedia, "fandom": self.urls.fandom},
|
|
"layouts": {k: v.to_dict() for k, v in self.layouts.items()},
|
|
}
|
|
|
|
@classmethod
|
|
def from_dict(cls, locality: 'Locality', slug: str, data: dict) -> 'Circuit':
|
|
circuit = cls(
|
|
slug=slug,
|
|
name=data["name"],
|
|
urls=URLs(**data["urls"]),
|
|
locality=locality,
|
|
layouts={}
|
|
)
|
|
circuit.layouts = {layout_slug: TrackLayout.from_dict(circuit, layout_slug, layout_data) for
|
|
layout_slug, layout_data in data["layouts"].items()}
|
|
return circuit
|
|
|
|
def load_geo_json_data(self):
|
|
"""Load data for all layouts"""
|
|
for track_layout in self.layouts.values():
|
|
track_layout.load_geo_json_data()
|