from dataclasses import dataclass, field from typing import Optional from core import Utils from core.Utils import initDataclass from core.domain.map.GeoLocation import GeoLocation from core.domain.optimization.OptimizationPoint import OptimizationPoint from core.domain.optimization.OptimizationVehicle import OptimizationVehicle @dataclass class OptimizationRoute: name: str isExtra: bool index: int distance: float duration: int cost: float vehicle: OptimizationVehicle points: list[OptimizationPoint] steps: list[GeoLocation] hash: str = field(default_factory=str) averageDistance: Optional[float] = None averageDuration: Optional[int] = None @staticmethod def fromJson(**kwargs) -> 'OptimizationRoute': kwargs['vehicle'] = OptimizationVehicle(**kwargs['vehicle']) kwargs['points'] = [OptimizationPoint.fromJson(**point) for point in kwargs['points']] kwargs['steps'] = [GeoLocation(**stepDict) for stepDict in kwargs['steps']] return initDataclass(OptimizationRoute, **kwargs) def setHash(self): self.hash = self.__calculateHash() @property def isDirty(self): return self.__calculateHash() != self.hash def __calculateHash(self) -> str: return Utils.hash("".join([str(point.crnPoint.hisa) for point in self.points]))