Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/build-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: checkout
uses: actions/checkout@v5
uses: actions/checkout@v6

- name: set up Docker buildx
uses: docker/setup-buildx-action@v3
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/lint-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ jobs:

steps:
- name: checkout
uses: actions/checkout@v5
uses: actions/checkout@v6

- name: pip install
run: pip install -r requirements.txt -r requirements-dev.txt
Expand All @@ -33,7 +33,7 @@ jobs:

steps:
- name: checkout
uses: actions/checkout@v5
uses: actions/checkout@v6

- name: pip install
run: pip install -r requirements.txt -r requirements-dev.txt
Expand Down Expand Up @@ -65,7 +65,7 @@ jobs:

steps:
- name: checkout
uses: actions/checkout@v5
uses: actions/checkout@v6

- name: pip install
run: pip install -r requirements.txt -r requirements-dev.txt
Expand Down
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ openpyxl~=3.1.5
opening-hours-py~=1.1.5
kombu~=5.5.4
lxml~=6.0.2
parkapi-sources~=0.31.0
parkapi-sources~=0.32.0
isodate~=0.7.2
shapely~=2.1.2
urllib3~=2.5.0
Expand Down
1 change: 1 addition & 0 deletions webapp/admin_rest_api/parking_spots/parking_spot_schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
properties={
'uid': StringField(minLength=1, maxLength=256),
'name': StringField(minLength=1, maxLength=256, required=False, nullable=True),
'parking_site_uid': StringField(minLength=1, maxLength=256, required=False),
'address': StringField(maxLength=256, required=False, nullable=True),
'purpose': EnumField(enum=PurposeType, default=PurposeType.CAR, required=False),
'type': EnumField(enum=ParkingSpotType, required=False, nullable=True),
Expand Down
1 change: 1 addition & 0 deletions webapp/dependencies.py
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,7 @@ def get_generic_parking_site_import_service(self) -> GenericParkingSiteImportSer
def get_generic_parking_spot_import_service(self) -> GenericParkingSpotImportService:
return GenericParkingSpotImportService(
source_repository=self.get_source_repository(),
parking_site_repository=self.get_parking_site_repository(),
parking_spot_repository=self.get_parking_spot_repository(),
**self.get_base_service_dependencies(),
)
Expand Down
2 changes: 1 addition & 1 deletion webapp/models/parking_site.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ class ParkingSite(BaseModel):
parking_spots: Mapped[list['ParkingSpot']] = relationship(
'ParkingSpot',
back_populates='parking_site',
cascade='all, delete-orphan',
cascade='all',
)
restrictions: Mapped[list['ParkingRestriction']] = relationship(
'ParkingRestriction',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ def __init__(
self.generic_import_service = generic_import_service

def start(self):
if self.config_helper.get('PREVENT_AUTO_IMPORT'):
return
for source_uid in self.generic_import_service.park_api_sources.converter_by_uid.keys():
# Don't try to pull push-endpoints
if not isinstance(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,23 +124,24 @@ def save_static_or_combined_parking_site_input(
self.set_related_objects(parking_site_input, parking_site)

# Legacy mapping
for restriction_input in parking_site_input.restrictions:
if restriction_input.type not in RESTRICTION_MAPPING:
continue
setattr(parking_site, RESTRICTION_MAPPING[restriction_input.type], restriction_input.capacity)

# Don't overwrite realtime data in case of static data
if isinstance(parking_site_input, CombinedParkingSiteInput):
setattr(
parking_site,
f'realtime_{RESTRICTION_MAPPING[restriction_input.type]}',
restriction_input.realtime_capacity,
)
setattr(
parking_site,
f'realtime_free_{RESTRICTION_MAPPING[restriction_input.type]}',
restriction_input.realtime_free_capacity,
)
if parking_site_input.restrictions:
for restriction_input in parking_site_input.restrictions:
if restriction_input.type not in RESTRICTION_MAPPING:
continue
setattr(parking_site, RESTRICTION_MAPPING[restriction_input.type], restriction_input.capacity)

# Don't overwrite realtime data in case of static data
if isinstance(parking_site_input, CombinedParkingSiteInput):
setattr(
parking_site,
f'realtime_{RESTRICTION_MAPPING[restriction_input.type]}',
restriction_input.realtime_capacity,
)
setattr(
parking_site,
f'realtime_free_{RESTRICTION_MAPPING[restriction_input.type]}',
restriction_input.realtime_free_capacity,
)

if parking_site_input.group_uid:
try:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
from webapp.models import ParkingSpot, Source
from webapp.models.source import SourceStatus
from webapp.repositories import (
ParkingSiteRepository,
ParkingSpotRepository,
SourceRepository,
)
Expand All @@ -27,12 +28,19 @@

class GenericParkingSpotImportService(GenericBaseImportService):
source_repository: SourceRepository
parking_site_repository: ParkingSiteRepository
parking_spot_repository: ParkingSpotRepository
park_api_sources: ParkAPISources

def __init__(self, *args, parking_spot_repository: ParkingSpotRepository, **kwargs):
def __init__(
self,
*args,
parking_site_repository: ParkingSiteRepository,
parking_spot_repository: ParkingSpotRepository,
**kwargs,
):
super().__init__(*args, **kwargs)

self.parking_site_repository = parking_site_repository
self.parking_spot_repository = parking_spot_repository

def handle_static_import_results(
Expand Down Expand Up @@ -103,11 +111,24 @@ def save_static_or_combined_parking_spot_input(
'external_identifiers',
'restrictions',
'tags',
'parking_site_uid',
]:
continue
setattr(parking_spot, key, value)

self.set_related_objects(parking_spot_input, parking_spot)
self.set_related_objects(parking_spot_input, parking_spot)

if parking_spot_input.parking_site_uid:
try:
parking_site = self.parking_site_repository.fetch_parking_site_by_source_id_and_external_uid(
source_id=source.id,
original_uid=parking_spot_input.parking_site_uid,
)
parking_spot.parking_site = parking_site
except ObjectNotFoundException:
parking_spot.parking_site_id = None
else:
parking_spot.parking_site_id = None

self.parking_spot_repository.save_parking_spot(parking_spot)

Expand Down
2 changes: 2 additions & 0 deletions webapp/shared/parking_spot/parking_spot_schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,8 @@
},
)


parking_spot_example = {}


parking_spot_component = Schema('ParkingSpot', parking_spot_schema, parking_spot_example)