Skip to content

Commit

Permalink
Update WAS Wolfsburg
Browse files Browse the repository at this point in the history
  • Loading branch information
Kenodai committed Jan 27, 2025
1 parent de87e35 commit b1de9c0
Showing 1 changed file with 19 additions and 64 deletions.
Original file line number Diff line number Diff line change
@@ -1,19 +1,18 @@
from datetime import date, datetime

import requests
from bs4 import BeautifulSoup, Tag
from waste_collection_schedule import Collection # type: ignore[attr-defined]

TITLE = "Wolfsburger Abfallwirtschaft und Straßenreinigung"
DESCRIPTION = "Source for waste collections for WAS-Wolfsburg, Germany."
URL = "https://was-wolfsburg.de"
TEST_CASES = {
"Barnstorf": {"city": "Barnstorf", "street": "Bahnhofspassage"},
"Sülfeld": {"city": "Sülfeld", "street": "Bärheide"},
"Barnstorf": {"street": "Bahnhofspassage"},
"Sülfeld": {"street": "Bärheide"},
}

ICON_MAP = {
"Gelber Sack": "mdi:recycle",
"gelber Sack": "mdi:recycle",
"Bioabfall": "mdi:leaf",
"Restabfall": "mdi:trash-can",
"Altpapier": "mdi:file-document-outline",
Expand All @@ -22,75 +21,31 @@
PARAM_TRANSLATIONS = {
"de": {
"street": "Straße",
"city": "Ort",
}
}


class Source:
def __init__(self, street: str | None, city: str | None):
def __init__(self, street: str | None):
self._street = street
self._city = city
if street is None and city is None:
raise ValueError("Either street or city must be set")

def get_date(self, tag: Tag, gelber_sack: bool) -> date | None:
if gelber_sack:
date_tag = tag.select_one("div.single-termin-date")
if not date_tag:
return None
date_string = "".join(
[t for t in date_tag.contents if isinstance(t, str)]
).strip()
else:
date_tag = tag.select_one("div.single-termin-day")
if not date_tag:
return None
# remove all inner tags
date_string = (
"".join([t for t in date_tag.contents if isinstance(t, str)])
.split(",")[1]
.strip()
)

return datetime.strptime(date_string, "%d.%m.%Y").date()

def get_data(
self, soup: BeautifulSoup, gelber_sack: bool = False
) -> list[Collection]:
entries = []
for entry in soup.select("div.single-termin"):
d = self.get_date(entry, gelber_sack)
if not gelber_sack:
bin_type_tag = entry.select_one("div.single-termin-abfall")
if not bin_type_tag or not d:
continue
bin_type = bin_type_tag.text.strip()
else:
bin_type = "Gelber Sack"

entries.append(Collection(date=d, t=bin_type, icon=ICON_MAP.get(bin_type)))
return entries
if street is None:
raise ValueError("Street must be set")

def fetch(self) -> list[Collection]:
entries = []
if self._street is not None:
data = {"loc": self._street}
r = requests.post(
"https://was-wolfsburg.de/wp-content/themes/astra-child/search_restabfall/search.php",
data=data,
)
answer = r.json()
soup = BeautifulSoup(answer["string"], "html.parser")
entries += self.get_data(soup)
if self._city is not None:
data = {"loc": self._city}
r = requests.post(
"https://was-wolfsburg.de/wp-content/themes/astra-child/search_gelbersack/search.php",
data=data,
r = requests.get(
"https://abfuhrtermine.waswob.de/php/abfuhrtermineeingabe.php",
{"k": self._street}
)
answer = r.json()

for a in answer:
entries.append(
Collection(
date = datetime.strptime(a['date'], "%d.%m.%Y").date(),
t = a['waste'],
icon=ICON_MAP.get(a['waste'])
)
)
answer = r.json()
soup = BeautifulSoup(answer["string"], "html.parser")
entries += self.get_data(soup, True)

return entries

0 comments on commit b1de9c0

Please sign in to comment.