Skip to content

Commit a498e48

Browse files
committed
udpate feed status on validation report
1 parent 24ceb1d commit a498e48

3 files changed

Lines changed: 85 additions & 76 deletions

File tree

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
import logging
2+
from datetime import datetime, timezone
3+
from sqlalchemy import text
4+
from shared.database_gen.sqlacodegen_models import Gtfsdataset, Feed, t_feedsearch
5+
from shared.database.database import refresh_materialized_view
6+
7+
# query to update the status of the feeds based on the service date range of the latest dataset
8+
def update_feed_statuses_query(session: "Session", stable_feed_ids: list[str]):
9+
today_utc = datetime.now(timezone.utc).date()
10+
11+
latest_dataset_subq = (
12+
session.query(
13+
Gtfsdataset.feed_id,
14+
Gtfsdataset.service_date_range_start,
15+
Gtfsdataset.service_date_range_end,
16+
)
17+
.filter(
18+
Gtfsdataset.latest.is_(True),
19+
Gtfsdataset.service_date_range_start.isnot(None),
20+
Gtfsdataset.service_date_range_end.isnot(None),
21+
)
22+
.subquery()
23+
)
24+
25+
status_conditions = [
26+
(
27+
latest_dataset_subq.c.service_date_range_end < today_utc,
28+
"inactive",
29+
),
30+
(
31+
latest_dataset_subq.c.service_date_range_start > today_utc,
32+
"future",
33+
),
34+
(
35+
(latest_dataset_subq.c.service_date_range_start <= today_utc)
36+
& (latest_dataset_subq.c.service_date_range_end >= today_utc),
37+
"active",
38+
),
39+
]
40+
41+
try:
42+
diff_counts: dict[str, int] = {}
43+
44+
filters = [
45+
Feed.id == latest_dataset_subq.c.feed_id,
46+
Feed.status != text("'deprecated'::status"),
47+
Feed.status != text("'development'::status"),
48+
# We filter out feeds that already have the status so that the
49+
# update count reflects the number of feeds that actually
50+
# changed status.
51+
Feed.status != text("'%s'::status" % status),
52+
service_date_conditions,
53+
]
54+
55+
if len(stable_feed_ids) > 0:
56+
filters.append(Feed.stable_feed_id.in_(stable_feed_ids))
57+
58+
for service_date_conditions, status in status_conditions:
59+
diff_counts[status] = (
60+
session.query(Feed)
61+
.filter(*filters)
62+
.update({Feed.status: status}, synchronize_session=False)
63+
)
64+
except Exception as e:
65+
logging.error(f"Error updating feed statuses: {e}")
66+
raise Exception(f"Error updating feed statuses: {e}")
67+
68+
try:
69+
session.commit()
70+
refresh_materialized_view(session, t_feedsearch.name)
71+
logging.info("Feed Database changes for status committed.")
72+
session.close()
73+
return diff_counts
74+
except Exception as e:
75+
logging.error("Error committing changes:", e)
76+
session.rollback()
77+
session.close()
78+
raise Exception(f"Error creating dataset: {e}")

functions-python/process_validation_report/src/main.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
)
3535
from shared.helpers.logger import Logger
3636
from shared.helpers.transform import get_nested_value
37+
from shared.helpers.feed_status import update_feed_statuses_query
3738

3839
logging.basicConfig(level=logging.INFO)
3940

@@ -269,8 +270,10 @@ def create_validation_report_entities(
269270
db_session.add(entity)
270271
logging.info(f"Committing {len(entities)} entities to the database.")
271272
db_session.commit()
272-
273273
logging.info("Entities committed successfully.")
274+
275+
update_feed_statuses_query(db_session, [feed_stable_id])
276+
274277
return f"Created {len(entities)} entities.", 200
275278
except Exception as error:
276279
logging.error(f"Error creating validation report entities: {error}")

functions-python/update_feed_status/src/main.py

Lines changed: 3 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,95 +1,23 @@
11
import logging
22
import functions_framework
3-
from datetime import datetime, timezone
43
from shared.helpers.logger import Logger
4+
from shared.helpers.feed_status import update_feed_statuses_query
55
from typing import TYPE_CHECKING
6-
from sqlalchemy import text
7-
from shared.database_gen.sqlacodegen_models import Gtfsdataset, Feed, t_feedsearch
8-
from shared.database.database import refresh_materialized_view, with_db_session
6+
from shared.database.database import with_db_session
97

108
if TYPE_CHECKING:
119
from sqlalchemy.orm import Session
1210

1311
logging.basicConfig(level=logging.INFO)
1412

15-
16-
# query to update the status of the feeds based on the service date range of the latest dataset
17-
def update_feed_statuses_query(session: "Session"):
18-
today_utc = datetime.now(timezone.utc).date()
19-
20-
latest_dataset_subq = (
21-
session.query(
22-
Gtfsdataset.feed_id,
23-
Gtfsdataset.service_date_range_start,
24-
Gtfsdataset.service_date_range_end,
25-
)
26-
.filter(
27-
Gtfsdataset.latest.is_(True),
28-
Gtfsdataset.service_date_range_start.isnot(None),
29-
Gtfsdataset.service_date_range_end.isnot(None),
30-
)
31-
.subquery()
32-
)
33-
34-
status_conditions = [
35-
(
36-
latest_dataset_subq.c.service_date_range_end < today_utc,
37-
"inactive",
38-
),
39-
(
40-
latest_dataset_subq.c.service_date_range_start > today_utc,
41-
"future",
42-
),
43-
(
44-
(latest_dataset_subq.c.service_date_range_start <= today_utc)
45-
& (latest_dataset_subq.c.service_date_range_end >= today_utc),
46-
"active",
47-
),
48-
]
49-
50-
try:
51-
diff_counts: dict[str, int] = {}
52-
53-
for service_date_conditions, status in status_conditions:
54-
diff_counts[status] = (
55-
session.query(Feed)
56-
.filter(
57-
Feed.id == latest_dataset_subq.c.feed_id,
58-
Feed.status != text("'deprecated'::status"),
59-
Feed.status != text("'development'::status"),
60-
# We filter out feeds that already have the status so that the
61-
# update count reflects the number of feeds that actually
62-
# changed status.
63-
Feed.status != text("'%s'::status" % status),
64-
service_date_conditions,
65-
)
66-
.update({Feed.status: status}, synchronize_session=False)
67-
)
68-
except Exception as e:
69-
logging.error(f"Error updating feed statuses: {e}")
70-
raise Exception(f"Error updating feed statuses: {e}")
71-
72-
try:
73-
session.commit()
74-
refresh_materialized_view(session, t_feedsearch.name)
75-
logging.info("Feed Database changes committed.")
76-
session.close()
77-
return diff_counts
78-
except Exception as e:
79-
logging.error("Error committing changes:", e)
80-
session.rollback()
81-
session.close()
82-
raise Exception(f"Error creating dataset: {e}")
83-
84-
8513
@with_db_session
8614
@functions_framework.http
8715
def update_feed_status(_, db_session):
8816
"""Updates the Feed status based on the latets dataset service date range."""
8917
Logger.init_logger()
9018
try:
9119
logging.info("Database session started.")
92-
diff_counts = update_feed_statuses_query(db_session)
20+
diff_counts = update_feed_statuses_query(db_session, [])
9321
return diff_counts, 200
9422

9523
except Exception as error:

0 commit comments

Comments
 (0)