Added tennis.py file

main
Jef Roosens 2021-08-11 13:09:44 +02:00
parent b49e154a95
commit 4e4f78334a
Signed by: Jef Roosens
GPG Key ID: 955C0660072F691F
2 changed files with 73 additions and 0 deletions

View File

73
padel/tennis.py 100644
View File

@ -0,0 +1,73 @@
import requests
from bs4 import BeautifulSoup
from datetime import date, time, timedelta, datetime
BASE_URL = "https://www.tennisvlaanderen.be/terreinreservatie-dagplanning"
def extract_timeslots(tbody, column_headers):
counters = [0] * len(column_headers)
timeslots = []
for tr in tbody.findAll("tr"):
# Determine time for row
time_str = tr.find("th").text
hour, minute = map(int, time_str.split(":"))
start_time = time(hour=hour, minute=minute)
# Iterate over each column
for td in tr.findAll("td"):
# Find first empty counter
counter_index = next((i for i in range(len(counters)) if counters[i] <= 0), None)
# this means there's no empty counters atm
if counter_index is None:
break
block_length = int(td["rowspan"])
counters[counter_index] += block_length
# By default, a slot is just not available for hire
code = 2
length = timedelta(minutes=15 * block_length)
if td.find("div", class_="reservation-detail free"):
code = 0
elif td.find("div", class_="reservation-detail regular-reservation"):
code = 1
timeslots.append((column_headers[counter_index], code, start_time, length))
counters = [i - 1 for i in counters]
return timeslots
def extract_calendar(soup: BeautifulSoup, reservation_date):
reservation_date = reservation_date or date.today()
reservation_t = soup.find("div", class_="reservation-table")
# Get court names
header_trs_txts = reservation_t.find("thead").find("tr").findAll("th")
court_names = [th.text.strip() for th in header_trs_txts if th.text.strip()]
# the real stuff
tbody = reservation_t.find("tbody")
timeslots = extract_timeslots(tbody, court_names)
# Here, we convert the timeslots to datetime instead of time
return [(col, status, datetime.combine(reservation_date, start), duration) for col, status, start, duration in timeslots]
def get_time_slots(club_id: int, date: date = None):
params = {"clubId": club_id}
if date:
params["planningDay"] = date.strftime("%d-%m-%Y")
r = requests.get(BASE_URL, params=params)
soup = BeautifulSoup(r.content, "html.parser")
return extract_calendar(soup, date)