Skip to content
Merged
Show file tree
Hide file tree
Changes from 8 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
1 change: 1 addition & 0 deletions api/.openapi-generator/FILES
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ src/feeds_gen/models/bounding_box.py
src/feeds_gen/models/external_id.py
src/feeds_gen/models/extra_models.py
src/feeds_gen/models/feed.py
src/feeds_gen/models/feed_related_link.py
src/feeds_gen/models/gbfs_endpoint.py
src/feeds_gen/models/gbfs_feed.py
src/feeds_gen/models/gbfs_validation_report.py
Expand Down
2 changes: 2 additions & 0 deletions api/src/feeds/impl/models/feed_impl.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from feeds.impl.models.basic_feed_impl import BaseFeedImpl
from feeds.impl.models.feed_related_link_impl import FeedRelatedLinkImpl
from feeds_gen.models.feed import Feed
from shared.database_gen.sqlacodegen_models import Feed as FeedOrm

Expand All @@ -24,4 +25,5 @@ def from_orm(cls, feed_orm: FeedOrm | None) -> Feed | None:
feed.official_updated_at = feed_orm.official_updated_at
feed.feed_name = feed_orm.feed_name
feed.note = feed_orm.note
feed.related_links = [FeedRelatedLinkImpl.from_orm(related_link) for related_link in feed_orm.feedrelatedlinks]
return feed
23 changes: 23 additions & 0 deletions api/src/feeds/impl/models/feed_related_link_impl.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
from feeds_gen.models.feed_related_link import FeedRelatedLink
from shared.database_gen.sqlacodegen_models import Feedrelatedlink


class FeedRelatedLinkImpl(FeedRelatedLink):
"""Implementation of the FeedRelatedLink model."""

class Config:
"""Pydantic configuration.
Enabling `from_orm` method to create a model instance from a SQLAlchemy row object."""

from_attributes = True

@classmethod
def from_orm(cls, feed_related_link_orm: Feedrelatedlink) -> FeedRelatedLink | None:
if not feed_related_link_orm:
return None
return cls(
code=feed_related_link_orm.code,
url=feed_related_link_orm.url,
description=feed_related_link_orm.description,
created_at=feed_related_link_orm.created_at,
)
1 change: 1 addition & 0 deletions api/src/shared/common/db_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -379,6 +379,7 @@ def get_joinedload_options(include_extracted_location_entities: bool = False) ->
return joinedload_options + [
joinedload(Feed.locations),
joinedload(Feed.externalids),
joinedload(Feed.feedrelatedlinks),
joinedload(Feed.redirectingids).joinedload(Redirectingid.target),
joinedload(Feed.officialstatushistories),
]
Expand Down
2 changes: 2 additions & 0 deletions api/tests/unittest/models/test_basic_feed_impl.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@
feed_name="feed_name",
note="note",
feed_contact_email="feed_contact_email",
related_links=[],
source_info=SourceInfo(
producer_url="producer_url",
authentication_type=1,
Expand Down Expand Up @@ -149,6 +150,7 @@ def test_from_orm_empty_fields(self):
external_ids=[],
redirects=[],
source_info=SourceInfo(),
related_links=[],
)
empty_result = FeedImpl.from_orm(empty_feed_orm)
assert empty_result == expected_empty_feed
Expand Down
2 changes: 2 additions & 0 deletions api/tests/unittest/models/test_gbfs_feed_impl.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ def test_from_orm_all_fields(self):
expected = GbfsFeedImpl(
id="feed_stable_1",
system_id="sys1",
related_links=[],
data_type="gbfs",
created_at=datetime(2024, 1, 1, 10, 0, 0),
external_ids=[],
Expand Down Expand Up @@ -88,6 +89,7 @@ def test_from_orm_empty_fields(self):
redirects=[],
locations=[],
versions=[],
related_links=[],
bounding_box=None,
bounding_box_generated_at=None,
source_info=SourceInfo(
Expand Down
2 changes: 2 additions & 0 deletions api/tests/unittest/models/test_gtfs_feed_impl.py
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@ def create_test_notice(notice_code: str, total_notices: int, severity: str):
feed_name="feed_name",
note="note",
feed_contact_email="feed_contact_email",
related_links=[],
source_info=SourceInfo(
producer_url="producer_url",
authentication_type=1,
Expand Down Expand Up @@ -226,6 +227,7 @@ def test_from_orm_empty_fields(self):
provider=None,
feed_name="",
note=None,
related_links=[],
feed_contact_email=None,
source_info=SourceInfo(
producer_url=None,
Expand Down
1 change: 1 addition & 0 deletions api/tests/unittest/models/test_gtfs_rt_feed_impl.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@
id="id",
data_type="gtfs_rt",
status="active",
related_links=[],
external_ids=[ExternalIdImpl(external_id="associated_id", source="source")],
provider="provider",
feed_name="feed_name",
Expand Down
1 change: 1 addition & 0 deletions api/tests/unittest/test_feeds.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@
"producer_url": "test_producer_url",
},
external_ids=[{"external_id": "test_associated_id", "source": "test_source"}],
related_links=[],
redirects=[{"comment": "Some comment", "target_id": "test_target_id"}],
).model_dump_json()
)
Expand Down
31 changes: 30 additions & 1 deletion docs/DatabaseCatalogAPI.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -454,7 +454,36 @@ components:
note:
description: A note to clarify complex use cases for consumers.
type: string

related_links:
description: >
A list of related links for the feed.
type: array
items:
$ref: '#/components/schemas/FeedRelatedLink'
FeedRelatedLink:
type: object
properties:
code:
description: >
A short code to identify the type of link.
type: string
example: next_1
description:
description: >
A description of the link.
type: string
example: The next feed URL after the current one
url:
description: >
The URL of the related link.
type: string
format: url
created_at:
description: >
The date and time the related link was created, in ISO 8601 date-time format.
type: string
example: 2023-07-10T22:06:00Z
format: date-time
GtfsFeed:
allOf:
- $ref: "#/components/schemas/Feed"
Expand Down
1 change: 1 addition & 0 deletions functions-python/helpers/locations.py
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ def create_or_get_location(
municipality=city_name,
)
session.add(location)
session.flush()
logging.debug(f"Created new location: {location_id}")

return location
Expand Down
1 change: 1 addition & 0 deletions functions-python/tasks_executor/requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,4 @@ google-cloud-storage

# Configuration
python-dotenv==1.0.0
pycountry
5 changes: 5 additions & 0 deletions functions-python/tasks_executor/src/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
from tasks.geojson.update_geojson_files_precision import (
update_geojson_files_precision_handler,
)
from tasks.data_import.import_jbda_feeds import import_jbda_handler

init_logger()
LIST_COMMAND: Final[str] = "list"
Expand Down Expand Up @@ -77,6 +78,10 @@
"description": "Rebuilds missing visualization files for GTFS datasets.",
"handler": rebuild_missing_visualization_files_handler,
},
"jbda_import": {
"description": "Imports JBDA data into the system.",
"handler": import_jbda_handler,
},
}


Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import os
from shared.database_gen.sqlacodegen_models import Feed
import logging
import json
from google.cloud import pubsub_v1

PROJECT_ID = os.getenv("PROJECT_ID")
DATASET_BATCH_TOPIC = os.getenv("DATASET_PROCESSING_TOPIC_NAME")


def trigger_dataset_download(
feed: Feed, execution_id: str, publisher: pubsub_v1.PublisherClient
) -> None:
"""Publishes the feed to the configured Pub/Sub topic."""
topic_path = publisher.topic_path(PROJECT_ID, DATASET_BATCH_TOPIC)
logging.debug(f"Publishing to Pub/Sub topic: {topic_path}")

message_data = {
"execution_id": execution_id,
"producer_url": feed.producer_url,
"feed_stable_id": feed.stable_id,
"feed_id": feed.id,
"dataset_id": None,
"dataset_hash": None,
"authentication_type": feed.authentication_type,
"authentication_info_url": feed.authentication_info_url,
"api_key_parameter_name": feed.api_key_parameter_name,
}

try:
# Convert to JSON string
json_message = json.dumps(message_data)
future = publisher.publish(topic_path, data=json_message.encode("utf-8"))
future.add_done_callback(
lambda _: logging.info(
"Published feed %s to dataset batch topic", feed.stable_id
)
)
future.result()
logging.info("Message published for feed %s", feed.stable_id)
except Exception as e:
logging.error("Error publishing to dataset batch topic: %s", str(e))
raise
Loading
Loading