Skip to content

Commit

Permalink
feat: Adding Blaenau Gwent County Borough Council
Browse files Browse the repository at this point in the history
  • Loading branch information
m26dvd committed Dec 22, 2024
1 parent 2d5be37 commit 5c7c86e
Show file tree
Hide file tree
Showing 3 changed files with 137 additions and 0 deletions.
9 changes: 9 additions & 0 deletions uk_bin_collection/tests/input.json
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,15 @@
"wiki_name": "Blackburn Council",
"wiki_note": "You will need to use [FindMyAddress](https://www.findmyaddress.co.uk/search) to find the UPRN."
},
"BlaenauGwentCountyBoroughCouncil": {
"uprn": "100100471367",
"postcode": "NP23 7TE",
"skip_get_url": false,
"url": "https://www.blaenau-gwent.gov.uk",
"web_driver": "http://selenium:4444",
"wiki_name": "Blaenau Gwent County Borough Council",
"wiki_note": "You will need to use [FindMyAddress](https://www.findmyaddress.co.uk/search) to find the UPRN."
},
"BoltonCouncil": {
"postcode": "BL1 5PQ",
"skip_get_url": true,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
from bs4 import BeautifulSoup
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.wait import WebDriverWait

from uk_bin_collection.uk_bin_collection.common import *
from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass


# import the wonderful Beautiful Soup and the URL grabber
class CouncilClass(AbstractGetBinDataClass):
"""
Concrete classes have to implement all abstract operations of the
base class. They can also override some operations with a default
implementation.
"""

def parse_data(self, page: str, **kwargs) -> dict:
driver = None
try:
data = {"bins": []}
user_uprn = kwargs.get("uprn")
user_postcode = kwargs.get("postcode")
web_driver = kwargs.get("web_driver")
headless = kwargs.get("headless")
check_uprn(user_uprn)
check_postcode(user_postcode)

# Create Selenium webdriver
driver = create_webdriver(web_driver, headless, None, __name__)
driver.get(
"https://iportal.itouchvision.com/icollectionday/collection-day/?uuid=238D5F9796C12643D190E3505931401A8C003F0D&lang=en"
)

# Wait for the postcode field to appear then populate it
inputElement_postcode = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "postcodeSearch"))
)
inputElement_postcode.send_keys(user_postcode)

# Click search button
findAddress = WebDriverWait(driver, 10).until(
EC.presence_of_element_located(
(By.XPATH, '//button[@class="govuk-button mt-4"]')
)
)
findAddress.click()

# Wait for the dropdown to be visible
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "addressSelect"))
)

dropdown = Select(driver.find_element(By.ID, "addressSelect"))
dropdown.select_by_value(user_uprn)

# Wait for the collections table to appear
WebDriverWait(driver, 10).until(
EC.presence_of_element_located(
(
By.XPATH,
'//div[@class="ant-row d-flex justify-content-between mb-4 mt-2 css-2rgkd4"]',
)
)
)

soup = BeautifulSoup(driver.page_source, features="html.parser")

recyclingcalendar = soup.find(
"div",
{
"class": "ant-row d-flex justify-content-between mb-4 mt-2 css-2rgkd4"
},
)

rows = recyclingcalendar.find_all(
"div",
{
"class": "ant-col ant-col-xs-12 ant-col-sm-12 ant-col-md-12 ant-col-lg-12 ant-col-xl-12 css-2rgkd4"
},
)

current_year = datetime.now().year
current_month = datetime.now().month

for row in rows:
BinType = row.find("h3").text
collectiondate = datetime.strptime(
row.find("div", {"class": "text-white fw-bold"}).text,
"%A %d %B",
)
if (current_month > 10) and (collectiondate.month < 3):
collectiondate = collectiondate.replace(year=(current_year + 1))
else:
collectiondate = collectiondate.replace(year=current_year)

dict_data = {
"type": BinType,
"collectionDate": collectiondate.strftime("%d/%m/%Y"),
}
data["bins"].append(dict_data)

except Exception as e:
# Here you can log the exception if needed
print(f"An error occurred: {e}")
# Optionally, re-raise the exception if you want it to propagate
raise
finally:
# This block ensures that the driver is closed regardless of an exception
if driver:
driver.quit()
return data
15 changes: 15 additions & 0 deletions wiki/Councils.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ This document is still a work in progress, don't worry if your council isn't lis
- [Birmingham City Council](#birmingham-city-council)
- [Blaby District Council](#blaby-district-council)
- [Blackburn Council](#blackburn-council)
- [Blaenau Gwent County Borough Council](#blaenau-gwent-county-borough-council)
- [Bolton Council](#bolton-council)
- [Bracknell Forest Council](#bracknell-forest-council)
- [Bradford MDC](#bradford-mdc)
Expand Down Expand Up @@ -589,6 +590,20 @@ Note: You will need to use [FindMyAddress](https://www.findmyaddress.co.uk/searc

---

### Blaenau Gwent County Borough Council
```commandline
python collect_data.py BlaenauGwentCountyBoroughCouncil https://www.blaenau-gwent.gov.uk -s -u XXXXXXXX -p "XXXX XXX" -w http://HOST:PORT/
```
Additional parameters:
- `-s` - skip get URL
- `-u` - UPRN
- `-p` - postcode
- `-w` - remote Selenium web driver URL (required for Home Assistant)

Note: You will need to use [FindMyAddress](https://www.findmyaddress.co.uk/search) to find the UPRN.

---

### Bolton Council
```commandline
python collect_data.py BoltonCouncil https://carehomes.bolton.gov.uk/bins.aspx -s -u XXXXXXXX -p "XXXX XXX" -w http://HOST:PORT/
Expand Down

0 comments on commit 5c7c86e

Please sign in to comment.