uk_bin_collection 0.141.0__tar.gz → 0.141.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/PKG-INFO +1 -1
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/pyproject.toml +1 -1
- uk_bin_collection-0.141.1/uk_bin_collection/uk_bin_collection/councils/AshfordBoroughCouncil.py +135 -0
- uk_bin_collection-0.141.1/uk_bin_collection/uk_bin_collection/councils/EastHertsCouncil.py +128 -0
- uk_bin_collection-0.141.1/uk_bin_collection/uk_bin_collection/councils/HertsmereBoroughCouncil.py +171 -0
- uk_bin_collection-0.141.1/uk_bin_collection/uk_bin_collection/councils/SwaleBoroughCouncil.py +146 -0
- uk_bin_collection-0.141.1/uk_bin_collection/uk_bin_collection/councils/WindsorAndMaidenheadCouncil.py +62 -0
- uk_bin_collection-0.141.0/uk_bin_collection/uk_bin_collection/councils/AshfordBoroughCouncil.py +0 -124
- uk_bin_collection-0.141.0/uk_bin_collection/uk_bin_collection/councils/EastHertsCouncil.py +0 -117
- uk_bin_collection-0.141.0/uk_bin_collection/uk_bin_collection/councils/HertsmereBoroughCouncil.py +0 -161
- uk_bin_collection-0.141.0/uk_bin_collection/uk_bin_collection/councils/SwaleBoroughCouncil.py +0 -135
- uk_bin_collection-0.141.0/uk_bin_collection/uk_bin_collection/councils/WindsorAndMaidenheadCouncil.py +0 -50
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/LICENSE +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/README.md +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/README.rst +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/tests/check_selenium_url_in_input.json.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/tests/council_feature_input_parity.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/tests/features/environment.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/tests/features/validate_council_outputs.feature +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/tests/input.json +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/tests/output.schema +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/tests/step_defs/step_helpers/file_handler.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/tests/step_defs/test_validate_council.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/tests/test_collect_data.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/tests/test_common_functions.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/tests/test_conftest.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/tests/test_get_data.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/collect_data.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/common.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/AberdeenCityCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/AberdeenshireCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/AdurAndWorthingCouncils.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/AmberValleyBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/AntrimAndNewtonabbeyCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/ArdsAndNorthDownCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/ArgyllandButeCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/ArmaghBanbridgeCraigavonCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/ArunCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/AshfieldDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/AylesburyValeCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/BCPCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/BaberghDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/BarnetCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/BarnsleyMBCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/BasildonCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/BasingstokeCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/BathAndNorthEastSomersetCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/BedfordBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/BedfordshireCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/BelfastCityCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/BexleyCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/BirminghamCityCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/BlabyDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/BlackburnCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/BlaenauGwentCountyBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/BolsoverCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/BoltonCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/BostonBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/BracknellForestCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/BradfordMDC.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/BraintreeDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/BrecklandCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/BrentCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/BrightonandHoveCityCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/BristolCityCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/BroadlandDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/BromleyBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/BromsgroveDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/BroxbourneCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/BroxtoweBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/BuckinghamshireCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/BurnleyBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/BuryCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/CalderdaleCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/CambridgeCityCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/CannockChaseDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/CanterburyCityCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/CardiffCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/CarmarthenshireCountyCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/CastlepointDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/CeredigionCountyCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/CharnwoodBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/ChelmsfordCityCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/CheltenhamBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/CherwellDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/CheshireEastCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/CheshireWestAndChesterCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/ChesterfieldBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/ChichesterDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/ChorleyCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/ColchesterCityCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/ConwyCountyBorough.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/CopelandBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/CornwallCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/CotswoldDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/CoventryCityCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/CrawleyBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/CroydonCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/CumberlandAllerdaleCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/CumberlandCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/DacorumBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/DartfordBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/DenbighshireCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/DerbyCityCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/DerbyshireDalesDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/DoncasterCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/DorsetCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/DoverDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/DudleyCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/DundeeCityCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/DurhamCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/EalingCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/EastAyrshireCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/EastCambridgeshireCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/EastDevonDC.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/EastLindseyDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/EastLothianCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/EastRenfrewshireCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/EastRidingCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/EastStaffordshireBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/EastSuffolkCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/EastleighBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/EdinburghCityCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/ElmbridgeBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/EnfieldCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/EnvironmentFirst.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/EppingForestDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/EpsomandEwellBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/ErewashBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/ExeterCityCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/FalkirkCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/FarehamBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/FenlandDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/FifeCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/FlintshireCountyCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/FolkstoneandHytheDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/ForestOfDeanDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/FyldeCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/GatesheadCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/GedlingBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/GlasgowCityCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/GloucesterCityCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/GooglePublicCalendarCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/GraveshamBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/GuildfordCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/GwyneddCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/HackneyCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/HaltonBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/HarboroughDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/HaringeyCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/HarrogateBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/HartDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/HartlepoolBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/HastingsBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/HerefordshireCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/HighPeakCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/HighlandCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/HinckleyandBosworthBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/HounslowCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/HullCityCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/HuntingdonDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/IpswichBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/IslingtonCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/KingsLynnandWestNorfolkBC.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/KingstonUponThamesCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/KirkleesCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/KnowsleyMBCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/LancasterCityCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/LeedsCityCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/LeicesterCityCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/LichfieldDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/LincolnCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/LisburnCastlereaghCityCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/LiverpoolCityCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughEaling.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughHarrow.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughHavering.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughHounslow.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughLambeth.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughLewisham.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughOfRichmondUponThames.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughRedbridge.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughSutton.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/LutonBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/MaldonDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/MalvernHillsDC.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/ManchesterCityCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/MansfieldDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/MedwayCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/MertonCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/MidAndEastAntrimBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/MidDevonCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/MidSuffolkDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/MidSussexDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/MiddlesbroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/MidlothianCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/MiltonKeynesCityCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/MoleValleyDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/MonmouthshireCountyCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/MorayCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/NeathPortTalbotCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/NewForestCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/NewarkAndSherwoodDC.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/NewcastleCityCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/NewcastleUnderLymeCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/NewhamCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/NewportCityCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/NorthAyrshireCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/NorthDevonCountyCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/NorthEastDerbyshireDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/NorthEastLincs.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/NorthHertfordshireDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/NorthKestevenDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/NorthLanarkshireCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/NorthLincolnshireCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/NorthNorfolkDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/NorthNorthamptonshireCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/NorthSomersetCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/NorthTynesideCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/NorthWestLeicestershire.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/NorthYorkshire.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/NorthumberlandCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/NorwichCityCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/NottinghamCityCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/NuneatonBedworthBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/OadbyAndWigstonBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/OldhamCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/OxfordCityCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/PerthAndKinrossCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/PeterboroughCityCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/PlymouthCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/PortsmouthCityCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/PowysCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/PrestonCityCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/ReadingBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/RedcarandClevelandCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/RedditchBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/ReigateAndBansteadBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/RenfrewshireCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/RhonddaCynonTaffCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/RochdaleCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/RochfordCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/RotherDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/RotherhamCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/RoyalBoroughofGreenwich.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/RugbyBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/RunnymedeBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/RushcliffeBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/RushmoorCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/SalfordCityCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/SandwellBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/SeftonCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/SevenoaksDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/SheffieldCityCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/ShropshireCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/SolihullCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/SomersetCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/SouthAyrshireCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/SouthCambridgeshireCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/SouthDerbyshireDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/SouthGloucestershireCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/SouthHamsDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/SouthHollandDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/SouthKestevenDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/SouthLanarkshireCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/SouthNorfolkCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/SouthOxfordshireCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/SouthRibbleCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/SouthStaffordshireDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/SouthTynesideCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/SouthamptonCityCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/SouthwarkCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/SpelthorneBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/StAlbansCityAndDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/StHelensBC.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/StaffordBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/StaffordshireMoorlandsDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/StevenageBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/StockportBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/StocktonOnTeesCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/StokeOnTrentCityCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/StratfordUponAvonCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/StroudDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/SunderlandCityCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/SurreyHeathBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/SwanseaCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/SwindonBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/TamesideMBCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/TandridgeDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/TeignbridgeCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/TelfordAndWrekinCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/TendringDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/TestValleyBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/ThanetDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/ThreeRiversDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/ThurrockCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/TonbridgeAndMallingBC.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/TorbayCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/TorridgeDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/TunbridgeWellsCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/UttlesfordDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/ValeofGlamorganCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/ValeofWhiteHorseCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/WakefieldCityCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/WalsallCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/WalthamForest.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/WandsworthCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/WarringtonBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/WarwickDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/WatfordBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/WaverleyBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/WealdenDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/WelhatCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/WestBerkshireCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/WestDunbartonshireCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/WestLancashireBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/WestLindseyDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/WestLothianCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/WestMorlandAndFurness.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/WestNorthamptonshireCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/WestOxfordshireDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/WestSuffolkCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/WiganBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/WiltshireCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/WinchesterCityCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/WirralCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/WokingBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/WokinghamBoroughCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/WolverhamptonCityCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/WorcesterCityCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/WychavonDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/WyreCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/WyreForestDistrictCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/YorkCouncil.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/councils/council_class_template/councilclasstemplate.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/create_new_council.py +0 -0
- {uk_bin_collection-0.141.0 → uk_bin_collection-0.141.1}/uk_bin_collection/uk_bin_collection/get_bin_data.py +0 -0
uk_bin_collection-0.141.1/uk_bin_collection/uk_bin_collection/councils/AshfordBoroughCouncil.py
ADDED
@@ -0,0 +1,135 @@
|
|
1
|
+
from datetime import datetime
|
2
|
+
|
3
|
+
import requests
|
4
|
+
from bs4 import BeautifulSoup
|
5
|
+
from selenium.webdriver.common.by import By
|
6
|
+
from selenium.webdriver.support import expected_conditions as EC
|
7
|
+
from selenium.webdriver.support.ui import Select
|
8
|
+
from selenium.webdriver.support.wait import WebDriverWait
|
9
|
+
|
10
|
+
from uk_bin_collection.uk_bin_collection.common import *
|
11
|
+
from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
|
12
|
+
|
13
|
+
|
14
|
+
class CouncilClass(AbstractGetBinDataClass):
|
15
|
+
"""
|
16
|
+
Concrete classes have to implement all abstract operations of the
|
17
|
+
base class. They can also override some operations with a default
|
18
|
+
implementation.
|
19
|
+
"""
|
20
|
+
|
21
|
+
def parse_data(self, page: str, **kwargs) -> dict:
|
22
|
+
driver = None
|
23
|
+
try:
|
24
|
+
# Get and check UPRN
|
25
|
+
user_uprn = kwargs.get("uprn")
|
26
|
+
user_postcode = kwargs.get("postcode")
|
27
|
+
check_uprn(user_uprn)
|
28
|
+
check_postcode(user_postcode)
|
29
|
+
web_driver = kwargs.get("web_driver")
|
30
|
+
headless = kwargs.get("headless")
|
31
|
+
bindata = {"bins": []}
|
32
|
+
|
33
|
+
API_URL = "https://secure.ashford.gov.uk/waste/collectiondaylookup/"
|
34
|
+
|
35
|
+
# Create Selenium webdriver
|
36
|
+
driver = create_webdriver(web_driver, headless, None, __name__)
|
37
|
+
driver.get(API_URL)
|
38
|
+
|
39
|
+
# Wait for the postcode field to appear then populate it
|
40
|
+
inputElement_postcode = WebDriverWait(driver, 30).until(
|
41
|
+
EC.presence_of_element_located(
|
42
|
+
(By.ID, "ContentPlaceHolder1_CollectionDayLookup2_TextBox_PostCode")
|
43
|
+
)
|
44
|
+
)
|
45
|
+
inputElement_postcode.send_keys(user_postcode)
|
46
|
+
|
47
|
+
# Click search button
|
48
|
+
findAddress = WebDriverWait(driver, 10).until(
|
49
|
+
EC.presence_of_element_located(
|
50
|
+
(
|
51
|
+
By.ID,
|
52
|
+
"ContentPlaceHolder1_CollectionDayLookup2_Button_PostCodeSearch",
|
53
|
+
)
|
54
|
+
)
|
55
|
+
)
|
56
|
+
findAddress.click()
|
57
|
+
|
58
|
+
# Wait for the 'Select your property' dropdown to appear and select the first result
|
59
|
+
dropdown = WebDriverWait(driver, 10).until(
|
60
|
+
EC.element_to_be_clickable(
|
61
|
+
(
|
62
|
+
By.ID,
|
63
|
+
"ContentPlaceHolder1_CollectionDayLookup2_DropDownList_Addresses",
|
64
|
+
)
|
65
|
+
)
|
66
|
+
)
|
67
|
+
|
68
|
+
# Create a 'Select' for it, then select the first address in the list
|
69
|
+
# (Index 0 is "Make a selection from the list")
|
70
|
+
dropdownSelect = Select(dropdown)
|
71
|
+
dropdownSelect.select_by_value(str(user_uprn))
|
72
|
+
|
73
|
+
# Click search button
|
74
|
+
findAddress = WebDriverWait(driver, 10).until(
|
75
|
+
EC.presence_of_element_located(
|
76
|
+
(By.ID, "ContentPlaceHolder1_CollectionDayLookup2_Button_SelectAddress")
|
77
|
+
)
|
78
|
+
)
|
79
|
+
findAddress.click()
|
80
|
+
|
81
|
+
h4_element = WebDriverWait(driver, 10).until(
|
82
|
+
EC.presence_of_element_located(
|
83
|
+
(By.XPATH, "//h4[contains(text(), 'Collection Dates')]")
|
84
|
+
)
|
85
|
+
)
|
86
|
+
|
87
|
+
soup = BeautifulSoup(driver.page_source, features="html.parser")
|
88
|
+
|
89
|
+
bin_tables = soup.find_all("table")
|
90
|
+
|
91
|
+
for bin_table in bin_tables:
|
92
|
+
bin_text = bin_table.find("td", id=re.compile("CollectionDayLookup2_td_"))
|
93
|
+
if not bin_text:
|
94
|
+
continue
|
95
|
+
|
96
|
+
bin_type_soup = bin_text.find("b")
|
97
|
+
|
98
|
+
if not bin_type_soup:
|
99
|
+
continue
|
100
|
+
bin_type: str = bin_type_soup.text.strip().split(" (")[0]
|
101
|
+
|
102
|
+
date_soup = bin_text.find(
|
103
|
+
"span", id=re.compile(r"CollectionDayLookup2_Label_\w*_Date")
|
104
|
+
)
|
105
|
+
if not date_soup or (
|
106
|
+
" " not in date_soup.text.strip()
|
107
|
+
and date_soup.text.strip().lower() != "today"
|
108
|
+
):
|
109
|
+
continue
|
110
|
+
date_str: str = date_soup.text.strip()
|
111
|
+
try:
|
112
|
+
if date_soup.text.strip().lower() == "today":
|
113
|
+
date = datetime.now().date()
|
114
|
+
else:
|
115
|
+
date = datetime.strptime(date_str.split(" ")[1], "%d/%m/%Y").date()
|
116
|
+
|
117
|
+
except ValueError:
|
118
|
+
continue
|
119
|
+
|
120
|
+
dict_data = {
|
121
|
+
"type": bin_type,
|
122
|
+
"collectionDate": date.strftime("%d/%m/%Y"),
|
123
|
+
}
|
124
|
+
bindata["bins"].append(dict_data)
|
125
|
+
|
126
|
+
except Exception as e:
|
127
|
+
# Here you can log the exception if needed
|
128
|
+
print(f"An error occurred: {e}")
|
129
|
+
# Optionally, re-raise the exception if you want it to propagate
|
130
|
+
raise
|
131
|
+
finally:
|
132
|
+
# This block ensures that the driver is closed regardless of an exception
|
133
|
+
if driver:
|
134
|
+
driver.quit()
|
135
|
+
return bindata
|
@@ -0,0 +1,128 @@
|
|
1
|
+
from bs4 import BeautifulSoup
|
2
|
+
from selenium.webdriver.common.by import By
|
3
|
+
from selenium.webdriver.support import expected_conditions as EC
|
4
|
+
from selenium.webdriver.support.wait import WebDriverWait
|
5
|
+
|
6
|
+
from uk_bin_collection.uk_bin_collection.common import *
|
7
|
+
from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
|
8
|
+
|
9
|
+
|
10
|
+
class CouncilClass(AbstractGetBinDataClass):
|
11
|
+
"""
|
12
|
+
Concrete classes have to implement all abstract operations of the
|
13
|
+
base class. They can also override some operations with a default
|
14
|
+
implementation.
|
15
|
+
"""
|
16
|
+
|
17
|
+
def parse_data(self, page: str, **kwargs) -> dict:
|
18
|
+
# Get and check UPRN
|
19
|
+
driver = None
|
20
|
+
try:
|
21
|
+
user_postcode = kwargs.get("postcode")
|
22
|
+
user_paon = kwargs.get("paon")
|
23
|
+
check_paon(user_paon)
|
24
|
+
check_postcode(user_postcode)
|
25
|
+
web_driver = kwargs.get("web_driver")
|
26
|
+
headless = kwargs.get("headless")
|
27
|
+
bindata = {"bins": []}
|
28
|
+
|
29
|
+
API_URL = "https://uhte-wrp.whitespacews.com"
|
30
|
+
|
31
|
+
# Create Selenium webdriver
|
32
|
+
driver = create_webdriver(web_driver, headless, None, __name__)
|
33
|
+
driver.get(API_URL)
|
34
|
+
|
35
|
+
# Click Find my bin collection day button
|
36
|
+
collectionButton = WebDriverWait(driver, 10).until(
|
37
|
+
EC.element_to_be_clickable((By.LINK_TEXT, "Find my bin collection day"))
|
38
|
+
)
|
39
|
+
collectionButton.click()
|
40
|
+
|
41
|
+
main_content = WebDriverWait(driver, 10).until(
|
42
|
+
EC.presence_of_element_located((By.ID, "main-content"))
|
43
|
+
)
|
44
|
+
|
45
|
+
# Wait for the property number field to appear then populate it
|
46
|
+
inputElement_number = WebDriverWait(driver, 10).until(
|
47
|
+
EC.element_to_be_clickable(
|
48
|
+
(
|
49
|
+
By.ID,
|
50
|
+
"address_name_number",
|
51
|
+
)
|
52
|
+
)
|
53
|
+
)
|
54
|
+
inputElement_number.send_keys(user_paon)
|
55
|
+
|
56
|
+
# Wait for the postcode field to appear then populate it
|
57
|
+
inputElement_postcode = WebDriverWait(driver, 10).until(
|
58
|
+
EC.element_to_be_clickable(
|
59
|
+
(
|
60
|
+
By.ID,
|
61
|
+
"address_postcode",
|
62
|
+
)
|
63
|
+
)
|
64
|
+
)
|
65
|
+
inputElement_postcode.send_keys(user_postcode)
|
66
|
+
|
67
|
+
# Click search button
|
68
|
+
continueButton = WebDriverWait(driver, 10).until(
|
69
|
+
EC.element_to_be_clickable(
|
70
|
+
(
|
71
|
+
By.ID,
|
72
|
+
"Submit",
|
73
|
+
)
|
74
|
+
)
|
75
|
+
)
|
76
|
+
continueButton.click()
|
77
|
+
|
78
|
+
# Wait for the 'Search Results' to appear and select the first result
|
79
|
+
property = WebDriverWait(driver, 10).until(
|
80
|
+
EC.element_to_be_clickable(
|
81
|
+
(
|
82
|
+
By.CSS_SELECTOR,
|
83
|
+
"li.app-subnav__section-item a",
|
84
|
+
# "app-subnav__link govuk-link clicker colordarkblue fontfamilyArial fontsize12rem",
|
85
|
+
# "//a[starts-with(@aria-label, '{user_paon}')]",
|
86
|
+
)
|
87
|
+
)
|
88
|
+
)
|
89
|
+
property.click()
|
90
|
+
|
91
|
+
upcoming_scheduled_collections = WebDriverWait(driver, 10).until(
|
92
|
+
EC.presence_of_element_located((By.ID, "upcoming-scheduled-collections"))
|
93
|
+
)
|
94
|
+
|
95
|
+
soup = BeautifulSoup(driver.page_source, features="html.parser")
|
96
|
+
|
97
|
+
collections = []
|
98
|
+
for collection in soup.find_all(
|
99
|
+
"u1",
|
100
|
+
class_="displayinlineblock justifycontentleft alignitemscenter margin0 padding0",
|
101
|
+
):
|
102
|
+
date = collection.find(
|
103
|
+
"p", string=lambda text: text and "/" in text
|
104
|
+
).text.strip() # Extract date
|
105
|
+
service = collection.find(
|
106
|
+
"p", string=lambda text: text and "Collection Service" in text
|
107
|
+
).text.strip() # Extract service type
|
108
|
+
collections.append({"date": date, "service": service})
|
109
|
+
|
110
|
+
# Print the parsed data
|
111
|
+
for item in collections:
|
112
|
+
|
113
|
+
dict_data = {
|
114
|
+
"type": item["service"],
|
115
|
+
"collectionDate": item["date"],
|
116
|
+
}
|
117
|
+
bindata["bins"].append(dict_data)
|
118
|
+
|
119
|
+
except Exception as e:
|
120
|
+
# Here you can log the exception if needed
|
121
|
+
print(f"An error occurred: {e}")
|
122
|
+
# Optionally, re-raise the exception if you want it to propagate
|
123
|
+
raise
|
124
|
+
finally:
|
125
|
+
# This block ensures that the driver is closed regardless of an exception
|
126
|
+
if driver:
|
127
|
+
driver.quit()
|
128
|
+
return bindata
|
uk_bin_collection-0.141.1/uk_bin_collection/uk_bin_collection/councils/HertsmereBoroughCouncil.py
ADDED
@@ -0,0 +1,171 @@
|
|
1
|
+
import re
|
2
|
+
import time
|
3
|
+
|
4
|
+
import requests
|
5
|
+
from bs4 import BeautifulSoup
|
6
|
+
from selenium.webdriver.common.by import By
|
7
|
+
from selenium.webdriver.support import expected_conditions as EC
|
8
|
+
from selenium.webdriver.support.ui import Select
|
9
|
+
from selenium.webdriver.support.wait import WebDriverWait
|
10
|
+
|
11
|
+
from uk_bin_collection.uk_bin_collection.common import *
|
12
|
+
from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
|
13
|
+
|
14
|
+
|
15
|
+
# import the wonderful Beautiful Soup and the URL grabber
|
16
|
+
class CouncilClass(AbstractGetBinDataClass):
|
17
|
+
"""
|
18
|
+
Concrete classes have to implement all abstract operations of the
|
19
|
+
base class. They can also override some operations with a default
|
20
|
+
implementation.
|
21
|
+
"""
|
22
|
+
|
23
|
+
def parse_data(self, page: str, **kwargs) -> dict:
|
24
|
+
driver = None
|
25
|
+
try:
|
26
|
+
user_paon = kwargs.get("paon")
|
27
|
+
user_postcode = kwargs.get("postcode")
|
28
|
+
web_driver = kwargs.get("web_driver")
|
29
|
+
headless = kwargs.get("headless")
|
30
|
+
check_paon(user_paon)
|
31
|
+
check_postcode(user_postcode)
|
32
|
+
bindata = {"bins": []}
|
33
|
+
|
34
|
+
URI_1 = "https://www.hertsmere.gov.uk/Environment-Refuse-and-Recycling/Recycling--Waste/Bin-collections/Collections-and-calendar.aspx"
|
35
|
+
URI_2 = "https://hertsmere-services.onmats.com/w/webpage/round-search"
|
36
|
+
|
37
|
+
# Create Selenium webdriver
|
38
|
+
driver = create_webdriver(web_driver, headless, None, __name__)
|
39
|
+
driver.get(URI_1)
|
40
|
+
|
41
|
+
soup = BeautifulSoup(driver.page_source, "html.parser")
|
42
|
+
|
43
|
+
current_week = (soup.find("li", class_="current")).text.strip()
|
44
|
+
|
45
|
+
strong = soup.find_all("strong", text=re.compile(r"^Week"))
|
46
|
+
|
47
|
+
bin_weeks = []
|
48
|
+
for tag in strong:
|
49
|
+
parent = tag.parent
|
50
|
+
bin_type = (
|
51
|
+
(parent.text).split("-")[1].strip().replace("\xa0", " ").split(" and ")
|
52
|
+
)
|
53
|
+
for bin in bin_type:
|
54
|
+
dict_data = {
|
55
|
+
"week": tag.text.replace("\xa0", " "),
|
56
|
+
"bin_type": bin,
|
57
|
+
}
|
58
|
+
bin_weeks.append(dict_data)
|
59
|
+
|
60
|
+
driver.get(URI_2)
|
61
|
+
|
62
|
+
# Wait for the postcode field to appear then populate it
|
63
|
+
inputElement_postcode = WebDriverWait(driver, 30).until(
|
64
|
+
EC.presence_of_element_located(
|
65
|
+
(
|
66
|
+
By.CLASS_NAME,
|
67
|
+
"relation_path_type_ahead_search",
|
68
|
+
)
|
69
|
+
)
|
70
|
+
)
|
71
|
+
inputElement_postcode.send_keys(user_postcode)
|
72
|
+
|
73
|
+
WebDriverWait(driver, 10).until(
|
74
|
+
EC.element_to_be_clickable(
|
75
|
+
(
|
76
|
+
By.XPATH,
|
77
|
+
f"//ul[@class='result_list']/li[starts-with(@aria-label, '{user_paon}')]",
|
78
|
+
)
|
79
|
+
)
|
80
|
+
).click()
|
81
|
+
|
82
|
+
WebDriverWait(driver, timeout=10).until(
|
83
|
+
EC.element_to_be_clickable(
|
84
|
+
(
|
85
|
+
By.CSS_SELECTOR,
|
86
|
+
"input.fragment_presenter_template_edit.btn.bg-primary.btn-medium[type='submit']",
|
87
|
+
)
|
88
|
+
)
|
89
|
+
).click()
|
90
|
+
|
91
|
+
WebDriverWait(driver, timeout=10).until(
|
92
|
+
EC.presence_of_element_located(
|
93
|
+
(By.XPATH, "//h3[contains(text(), 'Collection days')]")
|
94
|
+
)
|
95
|
+
)
|
96
|
+
|
97
|
+
soup = BeautifulSoup(driver.page_source, "html.parser")
|
98
|
+
|
99
|
+
table = soup.find("table", class_="table listing table-striped")
|
100
|
+
|
101
|
+
# Check if the table was found
|
102
|
+
if table:
|
103
|
+
# Extract table rows and cells
|
104
|
+
table_data = []
|
105
|
+
for row in table.find("tbody").find_all("tr"):
|
106
|
+
# Extract cell data from each <td> tag
|
107
|
+
row_data = [cell.get_text(strip=True) for cell in row.find_all("td")]
|
108
|
+
table_data.append(row_data)
|
109
|
+
|
110
|
+
else:
|
111
|
+
print("Table not found.")
|
112
|
+
|
113
|
+
collection_day = (table_data[0])[1]
|
114
|
+
|
115
|
+
current_week_bins = [bin for bin in bin_weeks if bin["week"] == current_week]
|
116
|
+
next_week_bins = [bin for bin in bin_weeks if bin["week"] != current_week]
|
117
|
+
|
118
|
+
days_of_week = [
|
119
|
+
"Monday",
|
120
|
+
"Tuesday",
|
121
|
+
"Wednesday",
|
122
|
+
"Thursday",
|
123
|
+
"Friday",
|
124
|
+
"Saturday",
|
125
|
+
"Sunday",
|
126
|
+
]
|
127
|
+
|
128
|
+
today = datetime.now()
|
129
|
+
today_idx = today.weekday() # Monday is 0 and Sunday is 6
|
130
|
+
target_idx = days_of_week.index(collection_day)
|
131
|
+
|
132
|
+
days_until_target = (target_idx - today_idx) % 7
|
133
|
+
if days_until_target == 0:
|
134
|
+
next_day = today
|
135
|
+
else:
|
136
|
+
next_day = today + timedelta(days=days_until_target)
|
137
|
+
|
138
|
+
current_week_dates = get_dates_every_x_days(next_day, 14, 7)
|
139
|
+
next_week_date = next_day + timedelta(days=7)
|
140
|
+
next_week_dates = get_dates_every_x_days(next_week_date, 14, 7)
|
141
|
+
|
142
|
+
for date in current_week_dates:
|
143
|
+
for bin in current_week_bins:
|
144
|
+
dict_data = {
|
145
|
+
"type": bin["bin_type"],
|
146
|
+
"collectionDate": date,
|
147
|
+
}
|
148
|
+
bindata["bins"].append(dict_data)
|
149
|
+
|
150
|
+
for date in next_week_dates:
|
151
|
+
for bin in next_week_bins:
|
152
|
+
dict_data = {
|
153
|
+
"type": bin["bin_type"],
|
154
|
+
"collectionDate": date,
|
155
|
+
}
|
156
|
+
bindata["bins"].append(dict_data)
|
157
|
+
|
158
|
+
bindata["bins"].sort(
|
159
|
+
key=lambda x: datetime.strptime(x.get("collectionDate"), "%d/%m/%Y")
|
160
|
+
)
|
161
|
+
|
162
|
+
except Exception as e:
|
163
|
+
# Here you can log the exception if needed
|
164
|
+
print(f"An error occurred: {e}")
|
165
|
+
# Optionally, re-raise the exception if you want it to propagate
|
166
|
+
raise
|
167
|
+
finally:
|
168
|
+
# This block ensures that the driver is closed regardless of an exception
|
169
|
+
if driver:
|
170
|
+
driver.quit()
|
171
|
+
return bindata
|
@@ -0,0 +1,146 @@
|
|
1
|
+
from bs4 import BeautifulSoup
|
2
|
+
from selenium.webdriver.common.by import By
|
3
|
+
from selenium.webdriver.support import expected_conditions as EC
|
4
|
+
from selenium.webdriver.support.wait import WebDriverWait
|
5
|
+
|
6
|
+
from uk_bin_collection.uk_bin_collection.common import *
|
7
|
+
from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
|
8
|
+
|
9
|
+
|
10
|
+
def parse_collection_date(date_string) -> datetime:
|
11
|
+
now = datetime.now()
|
12
|
+
if date_string == "is due today":
|
13
|
+
return now
|
14
|
+
|
15
|
+
parsed_date = datetime.strptime(date_string, "%A, %d %B").replace(year=now.year)
|
16
|
+
|
17
|
+
if now.month == 12 and parsed_date.month < 12:
|
18
|
+
parsed_date = parsed_date.replace(year=(now.year + 1))
|
19
|
+
|
20
|
+
return parsed_date
|
21
|
+
|
22
|
+
|
23
|
+
class CouncilClass(AbstractGetBinDataClass):
|
24
|
+
"""
|
25
|
+
Concrete classes have to implement all abstract operations of the
|
26
|
+
base class. They can also override some operations with a default
|
27
|
+
implementation.
|
28
|
+
"""
|
29
|
+
|
30
|
+
def parse_data(self, page: str, **kwargs) -> dict:
|
31
|
+
driver = None
|
32
|
+
try:
|
33
|
+
# Get postcode and UPRN from kwargs
|
34
|
+
user_postcode = kwargs.get("postcode")
|
35
|
+
user_paon = kwargs.get("paon")
|
36
|
+
web_driver = kwargs.get("web_driver")
|
37
|
+
headless = kwargs.get("headless")
|
38
|
+
check_postcode(user_postcode)
|
39
|
+
check_paon(user_paon)
|
40
|
+
|
41
|
+
# Build URL to parse
|
42
|
+
council_url = "https://swale.gov.uk/bins-littering-and-the-environment/bins/check-your-bin-day"
|
43
|
+
|
44
|
+
# Create Selenium webdriver
|
45
|
+
driver = create_webdriver(web_driver, headless, None, __name__)
|
46
|
+
driver.get(council_url)
|
47
|
+
|
48
|
+
# Wait for the postcode field to appear then populate it
|
49
|
+
try:
|
50
|
+
inputElement_postcode = WebDriverWait(driver, 10).until(
|
51
|
+
EC.presence_of_element_located((By.ID, "q485476_q1"))
|
52
|
+
)
|
53
|
+
inputElement_postcode.send_keys(user_postcode)
|
54
|
+
except Exception:
|
55
|
+
print("Page failed to load. Probably due to Cloudflare robot check!")
|
56
|
+
|
57
|
+
# Click search button
|
58
|
+
findAddress = WebDriverWait(driver, 10).until(
|
59
|
+
EC.presence_of_element_located((By.ID, "form_email_485465_submit"))
|
60
|
+
)
|
61
|
+
driver.execute_script("arguments[0].click();", findAddress)
|
62
|
+
|
63
|
+
# Wait for the 'Select address' dropdown to appear and select option matching the house name/number
|
64
|
+
WebDriverWait(driver, 10).until(
|
65
|
+
EC.element_to_be_clickable(
|
66
|
+
(
|
67
|
+
By.XPATH,
|
68
|
+
"//select[@name='q485480:q1']//option[contains(., '"
|
69
|
+
+ user_paon
|
70
|
+
+ "')]",
|
71
|
+
)
|
72
|
+
)
|
73
|
+
).click()
|
74
|
+
|
75
|
+
# Click search button
|
76
|
+
getBins = WebDriverWait(driver, 10).until(
|
77
|
+
EC.presence_of_element_located((By.ID, "form_email_485465_submit"))
|
78
|
+
)
|
79
|
+
driver.execute_script("arguments[0].click();", getBins)
|
80
|
+
|
81
|
+
BinTable = WebDriverWait(driver, 30).until(
|
82
|
+
EC.presence_of_element_located((By.ID, "SBCYBDSummary"))
|
83
|
+
)
|
84
|
+
|
85
|
+
soup = BeautifulSoup(driver.page_source, features="html.parser")
|
86
|
+
soup.prettify()
|
87
|
+
|
88
|
+
data = {"bins": []}
|
89
|
+
|
90
|
+
current_year = datetime.now().year
|
91
|
+
next_year = current_year + 1
|
92
|
+
|
93
|
+
next_collection_date = soup.find(
|
94
|
+
"strong", id="SBC-YBD-collectionDate"
|
95
|
+
).text.strip()
|
96
|
+
|
97
|
+
# Extract bins for the next collection
|
98
|
+
next_bins = [li.text.strip() for li in soup.select("#SBCFirstBins ul li")]
|
99
|
+
|
100
|
+
# Extract future collection details
|
101
|
+
future_collection_date_tag = soup.find(
|
102
|
+
"p", text=lambda t: t and "starting from" in t
|
103
|
+
)
|
104
|
+
future_collection_date = (
|
105
|
+
future_collection_date_tag.text.split("starting from")[-1].strip()
|
106
|
+
if future_collection_date_tag
|
107
|
+
else "No future date found"
|
108
|
+
)
|
109
|
+
|
110
|
+
future_bins = [li.text.strip() for li in soup.select("#FirstFutureBins li")]
|
111
|
+
|
112
|
+
for bin in next_bins:
|
113
|
+
collection_date = datetime.strptime(next_collection_date, "%A, %d %B")
|
114
|
+
if (datetime.now().month == 12) and (collection_date.month == 1):
|
115
|
+
collection_date = collection_date.replace(year=next_year)
|
116
|
+
else:
|
117
|
+
collection_date = collection_date.replace(year=current_year)
|
118
|
+
|
119
|
+
dict_data = {
|
120
|
+
"type": bin,
|
121
|
+
"collectionDate": collection_date.strftime(date_format),
|
122
|
+
}
|
123
|
+
data["bins"].append(dict_data)
|
124
|
+
|
125
|
+
for bin in future_bins:
|
126
|
+
collection_date = datetime.strptime(future_collection_date, "%A, %d %B")
|
127
|
+
if (datetime.now().month == 12) and (collection_date.month == 1):
|
128
|
+
collection_date = collection_date.replace(year=next_year)
|
129
|
+
else:
|
130
|
+
collection_date = collection_date.replace(year=current_year)
|
131
|
+
dict_data = {
|
132
|
+
"type": bin,
|
133
|
+
"collectionDate": collection_date.strftime(date_format),
|
134
|
+
}
|
135
|
+
data["bins"].append(dict_data)
|
136
|
+
|
137
|
+
except Exception as e:
|
138
|
+
# Here you can log the exception if needed
|
139
|
+
print(f"An error occurred: {e}")
|
140
|
+
# Optionally, re-raise the exception if you want it to propagate
|
141
|
+
raise
|
142
|
+
finally:
|
143
|
+
# This block ensures that the driver is closed regardless of an exception
|
144
|
+
if driver:
|
145
|
+
driver.quit()
|
146
|
+
return data
|
@@ -0,0 +1,62 @@
|
|
1
|
+
from datetime import datetime
|
2
|
+
|
3
|
+
import dateutil.parser
|
4
|
+
from bs4 import BeautifulSoup
|
5
|
+
|
6
|
+
from uk_bin_collection.uk_bin_collection.common import *
|
7
|
+
from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
|
8
|
+
|
9
|
+
|
10
|
+
# import the wonderful Beautiful Soup and the URL grabber
|
11
|
+
class CouncilClass(AbstractGetBinDataClass):
|
12
|
+
"""
|
13
|
+
Concrete classes have to implement all abstract operations of the
|
14
|
+
base class. They can also override some operations with a default
|
15
|
+
implementation.
|
16
|
+
"""
|
17
|
+
|
18
|
+
def parse_data(self, page: str, **kwargs) -> dict:
|
19
|
+
driver = None
|
20
|
+
try:
|
21
|
+
data = {"bins": []}
|
22
|
+
user_uprn = kwargs.get("uprn")
|
23
|
+
web_driver = kwargs.get("web_driver")
|
24
|
+
headless = kwargs.get("headless")
|
25
|
+
check_uprn(user_uprn)
|
26
|
+
|
27
|
+
root_url = "https://forms.rbwm.gov.uk/bincollections?uprn="
|
28
|
+
api_url = root_url + user_uprn
|
29
|
+
|
30
|
+
# Create Selenium webdriver
|
31
|
+
driver = create_webdriver(web_driver, headless, None, __name__)
|
32
|
+
driver.get(api_url)
|
33
|
+
|
34
|
+
soup = BeautifulSoup(driver.page_source, features="html.parser")
|
35
|
+
soup.prettify()
|
36
|
+
|
37
|
+
# Get collections div
|
38
|
+
next_collection_div = soup.find("div", {"class": "widget-bin-collections"})
|
39
|
+
|
40
|
+
for tbody in next_collection_div.find_all("tbody"):
|
41
|
+
for tr in tbody.find_all("tr"):
|
42
|
+
td = tr.find_all("td")
|
43
|
+
next_collection_type = td[0].get_text()
|
44
|
+
next_collection_date = dateutil.parser.parse(td[1].get_text())
|
45
|
+
print(next_collection_date)
|
46
|
+
dict_data = {
|
47
|
+
"type": next_collection_type,
|
48
|
+
"collectionDate": next_collection_date.strftime("%d/%m/%Y"),
|
49
|
+
}
|
50
|
+
data["bins"].append(dict_data)
|
51
|
+
|
52
|
+
except Exception as e:
|
53
|
+
# Here you can log the exception if needed
|
54
|
+
print(f"An error occurred: {e}")
|
55
|
+
# Optionally, re-raise the exception if you want it to propagate
|
56
|
+
raise
|
57
|
+
finally:
|
58
|
+
# This block ensures that the driver is closed regardless of an exception
|
59
|
+
if driver:
|
60
|
+
driver.quit()
|
61
|
+
return data
|
62
|
+
|