Add GWR advance ticket availability date

Closes: #33
This commit is contained in:
Edward Betts 2023-10-29 14:59:03 +00:00
parent 4547febe0e
commit b2b2291664
2 changed files with 48 additions and 1 deletions

View file

@ -2,6 +2,7 @@ import configparser
import json
import operator
import os
import re
import typing
import warnings
from datetime import date, datetime, timedelta, timezone
@ -54,6 +55,43 @@ access_key = config.get("exchangerate", "access_key")
data_dir = config.get("data", "dir")
def extract_weekday_date(html: str) -> date | None:
"""Furthest date of GWR advance ticket booking."""
# Compile a regular expression pattern to match the relevant table row
pattern = re.compile(
r"<tr>\s*<td>Weekdays</td>\s*<td>(.*?)</td>\s*</tr>", re.DOTALL
)
# Search the HTML for the pattern
if not (match := pattern.search(html)):
return None
date_str = match.group(1)
# If the year is missing, use the current year
if not date_str[-1].isdigit():
date_str += f" {date.today().year}"
return datetime.strptime(date_str, "%A %d %B %Y").date()
def get_gwr_advance_tickets_page_html(ttl: int = 3600) -> str:
"""Get advance-tickets web page HTML with cache."""
filename = os.path.join(data_dir, "advance-tickets.html")
url = "https://www.gwr.com/your-tickets/choosing-your-ticket/advance-tickets"
mtime = os.path.getmtime(filename) if os.path.exists(filename) else 0
if (unixtime() - mtime) < ttl: # use cache
return open(filename).read()
r = requests.get(url)
open(filename, "w").write(r.text)
return r.text
def find_gwr_advance_ticket_date() -> date | None:
"""Get GWR advance tickets date with cache."""
html = get_gwr_advance_tickets_page_html()
return extract_weekday_date(html)
def next_uk_mothers_day(input_date: date) -> date:
"""Calculate the date of the next UK Mother's Day from the current date."""
current_year = input_date.year
@ -420,7 +458,7 @@ def waste_collection_events() -> list[Event]:
return events
def get_data(now: datetime) -> dict[str, str | object]:
def get_data(now: datetime) -> typing.Mapping[str, str | object]:
"""Get data to display on agenda dashboard."""
rocket_dir = os.path.join(data_dir, "thespacedevs")
today = now.date()
@ -439,6 +477,7 @@ def get_data(now: datetime) -> dict[str, str | object]:
"fathers_day": next_uk_fathers_day(today),
"uk_financial_year_end": uk_financial_year_end(today),
"xmas_last_posting_dates": xmas_last_posting_dates,
"gwr_advance_tickets": find_gwr_advance_ticket_date(),
"rockets": thespacedevs.get_launches(rocket_dir, limit=40),
}

View file

@ -24,6 +24,7 @@
"xmas_day": "Christmas day",
"next_up_series": "Next Up documentary",
"waste_schedule": "Waste schedule",
"gwr_advance_tickets": "GWR advance tickets",
}
%}
@ -46,6 +47,13 @@
<ul>
<li>Today is {{now.strftime("%A, %-d %b %Y")}}</li>
<li>GBPUSD: {{"{:,.3f}".format(gbpusd)}}</li>
<li>GWR advance ticket furthest date:
{% if gwr_advance_tickets %}
{{ gwr_advance_tickets.strftime("%A, %-d %b %Y") }}
{% else %}
unknown
{% endif %}
</li>
</ul>
<table class="table table-hover w-auto">