Skip to content

Commit

Permalink
better freiburg static data approach, update freiburg data
Browse files Browse the repository at this point in the history
  • Loading branch information
the-infinity committed Jun 10, 2024
1 parent 31371fb commit 071d673
Show file tree
Hide file tree
Showing 4 changed files with 85 additions and 519 deletions.
44 changes: 37 additions & 7 deletions src/parkapi_sources/converters/freiburg/converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from validataclass.exceptions import ValidationError
from validataclass.validators import DataclassValidator

from parkapi_sources.converters.base_converter.pull import PullConverter, StaticGeojsonDataMixin
from parkapi_sources.converters.base_converter.pull import GeojsonInput, PullConverter, StaticGeojsonDataMixin
from parkapi_sources.exceptions import ImportParkingSiteException, ImportSourceException
from parkapi_sources.models import RealtimeParkingSiteInput, SourceInfo, StaticParkingSiteInput

Expand All @@ -29,17 +29,49 @@ class FreiburgPullConverter(PullConverter, StaticGeojsonDataMixin):
)

def get_static_parking_sites(self) -> tuple[list[StaticParkingSiteInput], list[ImportParkingSiteException]]:
return self._get_static_parking_site_inputs_and_exceptions(source_uid=self.source_info.uid)
static_parking_site_inputs, import_parking_site_exceptions = self._get_static_parking_site_inputs_and_exceptions(
source_uid=self.source_info.uid,
)

realtime_freiburg_inputs, import_realtime_parking_site_exceptions = self._get_raw_realtime_parking_sites()
import_parking_site_exceptions += import_realtime_parking_site_exceptions

static_parking_site_inputs_by_uid: dict[str, StaticParkingSiteInput] = {}
for static_parking_site_input in static_parking_site_inputs:
static_parking_site_inputs_by_uid[static_parking_site_input.uid] = static_parking_site_input

for realtime_freiburg_input in realtime_freiburg_inputs:
# If the uid is not known in our static data: ignore the realtime data
parking_site_uid = str(realtime_freiburg_input.properties.obs_parkid)
if parking_site_uid not in static_parking_site_inputs_by_uid:
continue

# Extend static data with realtime data
realtime_freiburg_input.extend_static_parking_site_input(
static_parking_site_inputs_by_uid[parking_site_uid],
)

return static_parking_site_inputs, import_parking_site_exceptions

def get_realtime_parking_sites(self) -> tuple[list[RealtimeParkingSiteInput], list[ImportParkingSiteException]]:
realtime_parking_site_inputs: list[RealtimeParkingSiteInput] = []

realtime_freiburg_inputs, import_parking_site_exceptions = self._get_raw_realtime_parking_sites()

for realtime_freiburg_input in realtime_freiburg_inputs:
realtime_parking_site_inputs.append(realtime_freiburg_input.to_realtime_parking_site_input())

return realtime_parking_site_inputs, import_parking_site_exceptions

def _get_raw_realtime_parking_sites(self) -> tuple[list[FreiburgFeatureInput], list[ImportParkingSiteException]]:
realtime_freiburg_inputs: list[FreiburgFeatureInput] = []
import_parking_site_exceptions: list[ImportParkingSiteException] = []

response = requests.get(self.source_info.source_url, timeout=30)
response_data = response.json()

try:
realtime_input = self.geojson_validator.validate(response_data)
realtime_input: GeojsonInput = self.geojson_validator.validate(response_data)
except ValidationError as e:
raise ImportSourceException(
source_uid=self.source_info.uid,
Expand All @@ -48,7 +80,7 @@ def get_realtime_parking_sites(self) -> tuple[list[RealtimeParkingSiteInput], li

for update_dict in realtime_input.features:
try:
update_input = self.freiburg_realtime_feature_validator.validate(update_dict)
realtime_freiburg_inputs.append(self.freiburg_realtime_feature_validator.validate(update_dict))
except ValidationError as e:
import_parking_site_exceptions.append(
ImportParkingSiteException(
Expand All @@ -60,6 +92,4 @@ def get_realtime_parking_sites(self) -> tuple[list[RealtimeParkingSiteInput], li
)
continue

realtime_parking_site_inputs.append(update_input.to_realtime_parking_site_input())

return realtime_parking_site_inputs, import_parking_site_exceptions
return realtime_freiburg_inputs, import_parking_site_exceptions
12 changes: 9 additions & 3 deletions src/parkapi_sources/converters/freiburg/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@
"""

from datetime import datetime, timezone
from typing import Optional
from zoneinfo import ZoneInfo

from validataclass.dataclasses import validataclass
from validataclass.validators import DataclassValidator, IntegerValidator, StringValidator
from validataclass.validators import DataclassValidator, IntegerValidator, StringValidator, UrlValidator

from parkapi_sources.models import RealtimeParkingSiteInput
from parkapi_sources.models import RealtimeParkingSiteInput, StaticParkingSiteInput
from parkapi_sources.models.enums import OpeningStatus
from parkapi_sources.validators import SpacedDateTimeValidator
from parkapi_sources.validators import ExcelNoneable, SpacedDateTimeValidator


@validataclass
Expand All @@ -27,12 +28,17 @@ class FreiburgPropertiesInput:
)
park_name: str = StringValidator()
park_id: str = StringValidator()
park_url: Optional[str] = ExcelNoneable(UrlValidator())


@validataclass
class FreiburgFeatureInput:
properties: FreiburgPropertiesInput = DataclassValidator(FreiburgPropertiesInput)

def extend_static_parking_site_input(self, static_parking_site_input: StaticParkingSiteInput):
static_parking_site_input.capacity = self.properties.obs_max
static_parking_site_input.public_url = self.properties.park_url

def to_realtime_parking_site_input(self) -> RealtimeParkingSiteInput:
return RealtimeParkingSiteInput(
uid=str(self.properties.obs_parkid),
Expand Down
Loading

0 comments on commit 071d673

Please sign in to comment.