uk_bin_collection 0.79.0__tar.gz → 0.80.0__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.79.0 → uk_bin_collection-0.80.0}/PKG-INFO +1 -1
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/pyproject.toml +1 -1
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/tests/input.json +39 -1
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/common.py +23 -1
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/BedfordshireCouncil.py +2 -1
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/BirminghamCityCouncil.py +2 -1
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/BracknellForestCouncil.py +4 -4
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/BristolCityCouncil.py +2 -1
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/CrawleyBoroughCouncil.py +1 -1
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/CroydonCouncil.py +5 -4
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/DartfordBoroughCouncil.py +7 -9
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/EastCambridgeshireCouncil.py +2 -1
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/LancasterCityCouncil.py +6 -4
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/LisburnCastlereaghCityCouncil.py +1 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/ManchesterCityCouncil.py +2 -1
- uk_bin_collection-0.80.0/uk_bin_collection/uk_bin_collection/councils/NewForestCouncil.py +146 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/NewportCityCouncil.py +1 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/NorthTynesideCouncil.py +2 -1
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/SomersetCouncil.py +1 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/SouthCambridgeshireCouncil.py +1 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/StHelensBC.py +2 -1
- uk_bin_collection-0.80.0/uk_bin_collection/uk_bin_collection/councils/StaffordBoroughCouncil.py +69 -0
- uk_bin_collection-0.80.0/uk_bin_collection/uk_bin_collection/councils/SwanseaCouncil.py +70 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/TestValleyBoroughCouncil.py +1 -0
- uk_bin_collection-0.80.0/uk_bin_collection/uk_bin_collection/councils/ThreeRiversDistrictCouncil.py +140 -0
- uk_bin_collection-0.80.0/uk_bin_collection/uk_bin_collection/councils/UttlesfordDistrictCouncil.py +117 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/WaverleyBoroughCouncil.py +2 -1
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/WiganBoroughCouncil.py +2 -1
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/WindsorAndMaidenheadCouncil.py +2 -1
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/WokingBoroughCouncil.py +3 -1
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/LICENSE +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/README.md +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/README.rst +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/tests/council_feature_input_parity.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/tests/features/environment.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/tests/features/validate_council_outputs.feature +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/tests/output.schema +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/tests/step_defs/step_helpers/file_handler.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/tests/step_defs/test_validate_council.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/tests/test_collect_data.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/tests/test_common_functions.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/collect_data.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/AdurAndWorthingCouncils.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/ArunCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/AylesburyValeCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/BCPCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/BarnetCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/BarnsleyMBCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/BasingstokeCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/BathAndNorthEastSomersetCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/BedfordBoroughCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/BexleyCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/BlackburnCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/BoltonCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/BradfordMDC.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/BrightonandHoveCityCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/BromleyBoroughCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/BroxtoweBoroughCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/BuckinghamshireCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/BuryCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/CalderdaleCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/CannockChaseDistrictCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/CardiffCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/CastlepointDistrictCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/CharnwoodBoroughCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/ChelmsfordCityCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/CheshireEastCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/CheshireWestAndChesterCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/ChichesterDistrictCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/ChorleyCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/ConwyCountyBorough.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/DerbyshireDalesDistrictCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/DoncasterCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/DorsetCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/DoverDistrictCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/DurhamCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/EastDevonDC.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/EastLindseyDistrictCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/EastRidingCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/EastSuffolkCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/EastleighBoroughCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/EnvironmentFirst.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/EppingForestDistrictCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/ErewashBoroughCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/FarehamBoroughCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/FenlandDistrictCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/ForestOfDeanDistrictCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/GatesheadCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/GedlingBoroughCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/GlasgowCityCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/GuildfordCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/HaltonBoroughCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/HaringeyCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/HarrogateBoroughCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/HighPeakCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/HounslowCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/HullCityCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/HuntingdonDistrictCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/KingstonUponThamesCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/KirkleesCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/KnowsleyMBCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/LeedsCityCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/LiverpoolCityCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughHounslow.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughRedbridge.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/MaldonDistrictCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/MalvernHillsDC.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/MansfieldDistrictCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/MertonCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/MidAndEastAntrimBoroughCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/MidSussexDistrictCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/MiltonKeynesCityCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/MoleValleyDistrictCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/NeathPortTalbotCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/NewarkAndSherwoodDC.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/NewcastleCityCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/NewhamCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/NorthEastDerbyshireDistrictCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/NorthEastLincs.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/NorthKestevenDistrictCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/NorthLanarkshireCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/NorthLincolnshireCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/NorthNorfolkDistrictCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/NorthNorthamptonshireCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/NorthSomersetCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/NorthWestLeicestershire.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/NorthYorkshire.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/NorthumberlandCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/NottinghamCityCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/OldhamCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/PortsmouthCityCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/PrestonCityCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/ReadingBoroughCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/ReigateAndBansteadBoroughCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/RenfrewshireCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/RhonddaCynonTaffCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/RochdaleCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/RochfordCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/RugbyBoroughCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/RushcliffeBoroughCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/RushmoorCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/SalfordCityCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/SevenoaksDistrictCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/SheffieldCityCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/ShropshireCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/SolihullCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/SouthAyrshireCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/SouthGloucestershireCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/SouthKestevenDistrictCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/SouthLanarkshireCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/SouthNorfolkCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/SouthOxfordshireCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/SouthTynesideCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/StAlbansCityAndDistrictCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/StaffordshireMoorlandsDistrictCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/StockportBoroughCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/StokeOnTrentCityCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/StratfordUponAvonCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/StroudDistrictCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/SunderlandCityCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/SwaleBoroughCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/TamesideMBCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/TandridgeDistrictCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/TelfordAndWrekinCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/TendringDistrictCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/TonbridgeAndMallingBC.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/TorbayCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/TorridgeDistrictCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/ValeofGlamorganCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/ValeofWhiteHorseCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/WakefieldCityCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/WalthamForest.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/WarwickDistrictCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/WealdenDistrictCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/WelhatCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/WestBerkshireCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/WestLindseyDistrictCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/WestLothianCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/WestNorthamptonshireCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/WestSuffolkCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/WiltshireCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/WyreCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/YorkCouncil.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/council_class_template/councilclasstemplate.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/create_new_council.py +0 -0
- {uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/get_bin_data.py +0 -0
@@ -263,9 +263,9 @@
|
|
263
263
|
"wiki_name": "Croydon Council"
|
264
264
|
},
|
265
265
|
"DartfordBoroughCouncil": {
|
266
|
+
"uprn": "010094157511",
|
266
267
|
"url": "https://windmz.dartford.gov.uk/ufs/WS_CHECK_COLLECTIONS.eb?UPRN=010094157511",
|
267
268
|
"wiki_name": "DartfordBoroughCouncil",
|
268
|
-
"uprn": "010094157511",
|
269
269
|
"wiki_note": "Use https://uprn.uk/ to find your UPRN "
|
270
270
|
},
|
271
271
|
"DerbyshireDalesDistrictCouncil": {
|
@@ -602,6 +602,14 @@
|
|
602
602
|
"web_driver": "http://selenium:4444",
|
603
603
|
"wiki_name": "Neath Port Talbot Council"
|
604
604
|
},
|
605
|
+
"NewForestCouncil": {
|
606
|
+
"postcode": "SO41 0GJ",
|
607
|
+
"skip_get_url": true,
|
608
|
+
"uprn": "100060482345",
|
609
|
+
"url": "https://forms.newforest.gov.uk/id/FIND_MY_COLLECTION",
|
610
|
+
"web_driver": "http://selenium:4444",
|
611
|
+
"wiki_name": "New Forest Council"
|
612
|
+
},
|
605
613
|
"NewarkAndSherwoodDC": {
|
606
614
|
"url": "http://app.newark-sherwooddc.gov.uk/bincollection/calendar?pid=200004258529",
|
607
615
|
"wiki_command_url_override": "http://app.newark-sherwooddc.gov.uk/bincollection/calendar?pid=XXXXXXXX",
|
@@ -909,6 +917,12 @@
|
|
909
917
|
"url": "https://www.sthelens.gov.uk/",
|
910
918
|
"wiki_name": "St Helens Borough Council"
|
911
919
|
},
|
920
|
+
"StaffordBoroughCouncil": {
|
921
|
+
"uprn": "100032203010",
|
922
|
+
"url": "https://www.staffordbc.gov.uk/address/100032203010",
|
923
|
+
"wiki_name": "StaffordBoroughCouncil",
|
924
|
+
"wiki_note": "The URL needs to be https://www.staffordbc.gov.uk/address/<Your_UPRN>"
|
925
|
+
},
|
912
926
|
"StaffordshireMoorlandsDistrictCouncil": {
|
913
927
|
"postcode": "ST8 6HN",
|
914
928
|
"skip_get_url": true,
|
@@ -959,6 +973,13 @@
|
|
959
973
|
"url": "https://swale.gov.uk/bins-littering-and-the-environment/bins/collection-days",
|
960
974
|
"wiki_name": "Swale Borough Council"
|
961
975
|
},
|
976
|
+
"SwanseaCouncil": {
|
977
|
+
"postcode": "SA43PQ",
|
978
|
+
"skip_get_url": true,
|
979
|
+
"uprn": "100100324821",
|
980
|
+
"url": "https://www1.swansea.gov.uk/recyclingsearch/",
|
981
|
+
"wiki_name": "SwanseaCouncil"
|
982
|
+
},
|
962
983
|
"TamesideMBCouncil": {
|
963
984
|
"skip_get_url": true,
|
964
985
|
"uprn": "100012835362",
|
@@ -992,6 +1013,14 @@
|
|
992
1013
|
"url": "https://testvalley.gov.uk/wasteandrecycling/when-are-my-bins-collected",
|
993
1014
|
"wiki_name": "Test Valley Borough Council"
|
994
1015
|
},
|
1016
|
+
"ThreeRiversDistrictCouncil": {
|
1017
|
+
"postcode": "WD3 7AZ",
|
1018
|
+
"skip_get_url": true,
|
1019
|
+
"uprn": "100080913662",
|
1020
|
+
"url": "https://my.threerivers.gov.uk/en/AchieveForms/?mode=fill&consentMessage=yes&form_uri=sandbox-publish://AF-Process-52df96e3-992a-4b39-bba3-06cfaabcb42b/AF-Stage-01ee28aa-1584-442c-8d1f-119b6e27114a/definition.json&process=1&process_uri=sandbox-processes://AF-Process-52df96e3-992a-4b39-bba3-06cfaabcb42b&process_id=AF-Process-52df96e3-992a-4b39-bba3-06cfaabcb42b&noLoginPrompt=1",
|
1021
|
+
"web_driver": "http://selenium:4444",
|
1022
|
+
"wiki_name": "Three Rivers District Council"
|
1023
|
+
},
|
995
1024
|
"TonbridgeAndMallingBC": {
|
996
1025
|
"postcode": "ME19 4JS",
|
997
1026
|
"skip_get_url": true,
|
@@ -1011,6 +1040,15 @@
|
|
1011
1040
|
"url": "https://collections-torridge.azurewebsites.net/WebService2.asmx",
|
1012
1041
|
"wiki_name": "Torridge District Council"
|
1013
1042
|
},
|
1043
|
+
"UttlesfordDistrictCouncil": {
|
1044
|
+
"url": "https://bins.uttlesford.gov.uk/",
|
1045
|
+
"wiki_name": "UttlesfordDistrictCouncil",
|
1046
|
+
"skip_get_url": true,
|
1047
|
+
"postcode": "CM23 5QF",
|
1048
|
+
"uprn": "100090643434",
|
1049
|
+
"house_number": "72, Birchanger Lane",
|
1050
|
+
"web_driver": "http://selenium:4444"
|
1051
|
+
},
|
1014
1052
|
"ValeofGlamorganCouncil": {
|
1015
1053
|
"skip_get_url": true,
|
1016
1054
|
"uprn": "64029020",
|
{uk_bin_collection-0.79.0 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/common.py
RENAMED
@@ -5,7 +5,7 @@ import os
|
|
5
5
|
import pandas as pd
|
6
6
|
import re
|
7
7
|
import requests
|
8
|
-
from datetime import datetime
|
8
|
+
from datetime import datetime, timedelta
|
9
9
|
from dateutil.parser import parse
|
10
10
|
from enum import Enum
|
11
11
|
from selenium import webdriver
|
@@ -242,6 +242,28 @@ def save_data(file_path, data):
|
|
242
242
|
json.dump(data, file, sort_keys=True, indent=4)
|
243
243
|
|
244
244
|
|
245
|
+
def get_next_day_of_week(day_name):
|
246
|
+
days_of_week = [
|
247
|
+
"Monday",
|
248
|
+
"Tuesday",
|
249
|
+
"Wednesday",
|
250
|
+
"Thursday",
|
251
|
+
"Friday",
|
252
|
+
"Saturday",
|
253
|
+
"Sunday",
|
254
|
+
]
|
255
|
+
today = datetime.now()
|
256
|
+
today_idx = today.weekday() # Monday is 0 and Sunday is 6
|
257
|
+
target_idx = days_of_week.index(day_name)
|
258
|
+
|
259
|
+
days_until_target = (target_idx - today_idx) % 7
|
260
|
+
if days_until_target == 0:
|
261
|
+
days_until_target = 7 # Ensure it's the next instance of the day, not today if today is that day
|
262
|
+
|
263
|
+
next_day = today + timedelta(days=days_until_target)
|
264
|
+
return next_day.strftime(date_format)
|
265
|
+
|
266
|
+
|
245
267
|
def contains_date(string, fuzzy=False) -> bool:
|
246
268
|
"""
|
247
269
|
Return whether the string can be interpreted as a date.
|
@@ -2,6 +2,7 @@ from datetime import datetime
|
|
2
2
|
|
3
3
|
import requests
|
4
4
|
from bs4 import BeautifulSoup
|
5
|
+
|
5
6
|
from uk_bin_collection.uk_bin_collection.common import *
|
6
7
|
from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
|
7
8
|
|
@@ -22,7 +23,7 @@ class CouncilClass(AbstractGetBinDataClass):
|
|
22
23
|
|
23
24
|
# Start a new session to walk through the form
|
24
25
|
requests.packages.urllib3.disable_warnings()
|
25
|
-
s = requests.
|
26
|
+
s = requests.Session()
|
26
27
|
|
27
28
|
headers = {
|
28
29
|
"Origin": "https://www.centralbedfordshire.gov.uk",
|
@@ -1,5 +1,6 @@
|
|
1
|
-
from dateutil.relativedelta import relativedelta
|
2
1
|
from bs4 import BeautifulSoup
|
2
|
+
from dateutil.relativedelta import relativedelta
|
3
|
+
|
3
4
|
from uk_bin_collection.uk_bin_collection.common import *
|
4
5
|
from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
|
5
6
|
|
@@ -64,7 +64,7 @@ def get_csrf_token(s: requests.session, base_url: str) -> str:
|
|
64
64
|
"""
|
65
65
|
Gets a CSRF token
|
66
66
|
:rtype: str
|
67
|
-
:param s: requests.
|
67
|
+
:param s: requests.Session() to use
|
68
68
|
:param base_url: Base URL to use
|
69
69
|
:return: CSRF token
|
70
70
|
"""
|
@@ -95,7 +95,7 @@ def get_address_id(
|
|
95
95
|
"""
|
96
96
|
Gets the address ID
|
97
97
|
:rtype: str
|
98
|
-
:param s: requests.
|
98
|
+
:param s: requests.Session() to use
|
99
99
|
:param base_url: Base URL to use
|
100
100
|
:param csrf_token: CSRF token to use
|
101
101
|
:param postcode: Postcode to use
|
@@ -156,7 +156,7 @@ def get_collection_data(
|
|
156
156
|
"""
|
157
157
|
Gets the collection data
|
158
158
|
:rtype: str
|
159
|
-
:param s: requests.
|
159
|
+
:param s: requests.Session() to use
|
160
160
|
:param base_url: Base URL to use
|
161
161
|
:param csrf_token: CSRF token to use
|
162
162
|
:param address_id: Address id to use
|
@@ -203,7 +203,7 @@ class CouncilClass(AbstractGetBinDataClass):
|
|
203
203
|
|
204
204
|
def parse_data(self, page: str, **kwargs) -> dict:
|
205
205
|
requests.packages.urllib3.disable_warnings()
|
206
|
-
s = requests.
|
206
|
+
s = requests.Session()
|
207
207
|
base_url = "https://selfservice.mybfc.bracknell-forest.gov.uk"
|
208
208
|
paon = kwargs.get("paon")
|
209
209
|
postcode = kwargs.get("postcode")
|
@@ -2,6 +2,7 @@ import ast
|
|
2
2
|
|
3
3
|
import requests
|
4
4
|
from bs4 import BeautifulSoup
|
5
|
+
|
5
6
|
from uk_bin_collection.uk_bin_collection.common import *
|
6
7
|
from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
|
7
8
|
|
@@ -19,7 +20,7 @@ class CouncilClass(AbstractGetBinDataClass):
|
|
19
20
|
check_uprn(user_uprn)
|
20
21
|
|
21
22
|
requests.packages.urllib3.disable_warnings()
|
22
|
-
s = requests.
|
23
|
+
s = requests.Session()
|
23
24
|
|
24
25
|
service_type_headers = {
|
25
26
|
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,"
|
@@ -35,7 +35,7 @@ class CouncilClass(AbstractGetBinDataClass):
|
|
35
35
|
|
36
36
|
data = {"bins": []}
|
37
37
|
|
38
|
-
titles = [title.text for title in soup.select(".title")]
|
38
|
+
titles = [title.text for title in soup.select(".block-title")]
|
39
39
|
collection_tag = soup.body.find_all(
|
40
40
|
"div", {"class": "col-md-6 col-sm-6 col-xs-6"}, string="Next collection"
|
41
41
|
)
|
@@ -1,6 +1,7 @@
|
|
1
1
|
import time
|
2
2
|
|
3
3
|
from bs4 import BeautifulSoup
|
4
|
+
|
4
5
|
from uk_bin_collection.uk_bin_collection.common import *
|
5
6
|
from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
|
6
7
|
|
@@ -75,7 +76,7 @@ def get_csrf_token(s: requests.session, base_url: str) -> str:
|
|
75
76
|
"""
|
76
77
|
Gets a CSRF token
|
77
78
|
:rtype: str
|
78
|
-
:param s: requests.
|
79
|
+
:param s: requests.Session() to use
|
79
80
|
:param base_url: Base URL to use
|
80
81
|
:return: CSRF token
|
81
82
|
"""
|
@@ -106,7 +107,7 @@ def get_address_id(
|
|
106
107
|
"""
|
107
108
|
Gets the address ID
|
108
109
|
:rtype: str
|
109
|
-
:param s: requests.
|
110
|
+
:param s: requests.Session() to use
|
110
111
|
:param base_url: Base URL to use
|
111
112
|
:param csrf_token: CSRF token to use
|
112
113
|
:param postcode: Postcode to use
|
@@ -171,7 +172,7 @@ def get_collection_data(
|
|
171
172
|
"""
|
172
173
|
Gets the collection data
|
173
174
|
:rtype: str
|
174
|
-
:param s: requests.
|
175
|
+
:param s: requests.Session() to use
|
175
176
|
:param base_url: Base URL to use
|
176
177
|
:param csrf_token: CSRF token to use
|
177
178
|
:param address_id: Address id to use
|
@@ -240,7 +241,7 @@ class CouncilClass(AbstractGetBinDataClass):
|
|
240
241
|
|
241
242
|
def parse_data(self, page: str, **kwargs) -> dict:
|
242
243
|
requests.packages.urllib3.disable_warnings()
|
243
|
-
s = requests.
|
244
|
+
s = requests.Session()
|
244
245
|
base_url = "https://service.croydon.gov.uk"
|
245
246
|
paon = kwargs.get("paon")
|
246
247
|
postcode = kwargs.get("postcode")
|
@@ -17,27 +17,25 @@ class CouncilClass(AbstractGetBinDataClass):
|
|
17
17
|
soup.prettify()
|
18
18
|
|
19
19
|
# Extract data
|
20
|
-
bin_data = {
|
21
|
-
"bins": []
|
22
|
-
}
|
20
|
+
bin_data = {"bins": []}
|
23
21
|
|
24
22
|
# Find the table containing the bin collection data
|
25
|
-
table = soup.find(
|
23
|
+
table = soup.find("table", {"class": "eb-EVDNdR1G-tableContent"})
|
26
24
|
|
27
25
|
if table:
|
28
|
-
rows = table.find_all(
|
29
|
-
|
26
|
+
rows = table.find_all("tr", class_="eb-EVDNdR1G-tableRow")
|
27
|
+
|
30
28
|
for row in rows:
|
31
|
-
columns = row.find_all(
|
29
|
+
columns = row.find_all("td")
|
32
30
|
if len(columns) >= 4:
|
33
31
|
collection_type = columns[1].get_text(strip=True)
|
34
32
|
collection_date = columns[3].get_text(strip=True)
|
35
|
-
|
33
|
+
|
36
34
|
# Validate collection_date format
|
37
35
|
if re.match(r"\d{2}/\d{2}/\d{4}", collection_date):
|
38
36
|
bin_entry = {
|
39
37
|
"type": collection_type,
|
40
|
-
"collectionDate": collection_date
|
38
|
+
"collectionDate": collection_date,
|
41
39
|
}
|
42
40
|
bin_data["bins"].append(bin_entry)
|
43
41
|
|
@@ -1,4 +1,5 @@
|
|
1
1
|
from bs4 import BeautifulSoup
|
2
|
+
|
2
3
|
from uk_bin_collection.uk_bin_collection.common import *
|
3
4
|
from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
|
4
5
|
|
@@ -21,7 +22,7 @@ class CouncilClass(AbstractGetBinDataClass):
|
|
21
22
|
|
22
23
|
# Make Request
|
23
24
|
requests.packages.urllib3.disable_warnings()
|
24
|
-
s = requests.
|
25
|
+
s = requests.Session()
|
25
26
|
page = s.get(url)
|
26
27
|
|
27
28
|
# Make a BS4 object
|
@@ -1,8 +1,10 @@
|
|
1
|
-
from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
|
2
|
-
from uk_bin_collection.uk_bin_collection.common import *
|
3
|
-
from bs4 import BeautifulSoup
|
4
1
|
from datetime import datetime
|
2
|
+
|
5
3
|
import requests
|
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
|
6
8
|
|
7
9
|
|
8
10
|
class CouncilClass(AbstractGetBinDataClass):
|
@@ -19,7 +21,7 @@ class CouncilClass(AbstractGetBinDataClass):
|
|
19
21
|
# start session
|
20
22
|
# note: this ignores the given url
|
21
23
|
base_url = "https://lcc-wrp.whitespacews.com"
|
22
|
-
session = requests.
|
24
|
+
session = requests.Session()
|
23
25
|
response = session.get(base_url + "/#!")
|
24
26
|
links = [
|
25
27
|
a["href"]
|
@@ -2,6 +2,7 @@ from datetime import datetime
|
|
2
2
|
|
3
3
|
import requests
|
4
4
|
from bs4 import BeautifulSoup
|
5
|
+
|
5
6
|
from uk_bin_collection.uk_bin_collection.common import *
|
6
7
|
from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
|
7
8
|
|
@@ -20,7 +21,7 @@ class CouncilClass(AbstractGetBinDataClass):
|
|
20
21
|
|
21
22
|
# Start a new session to walk through the form
|
22
23
|
requests.packages.urllib3.disable_warnings()
|
23
|
-
s = requests.
|
24
|
+
s = requests.Session()
|
24
25
|
|
25
26
|
# There's a cookie that makes the whole thing valid when you search for a postcode,
|
26
27
|
# but postcode and UPRN is a hassle imo, so this makes a request for the session to get a cookie
|
@@ -0,0 +1,146 @@
|
|
1
|
+
import logging
|
2
|
+
import pickle
|
3
|
+
import time
|
4
|
+
|
5
|
+
import requests
|
6
|
+
from bs4 import BeautifulSoup
|
7
|
+
from selenium import webdriver
|
8
|
+
from selenium.webdriver.common.by import By
|
9
|
+
from selenium.webdriver.common.keys import Keys
|
10
|
+
from selenium.webdriver.support import expected_conditions as EC
|
11
|
+
from selenium.webdriver.support.ui import Select
|
12
|
+
from selenium.webdriver.support.wait import WebDriverWait
|
13
|
+
from uk_bin_collection.uk_bin_collection.common import *
|
14
|
+
|
15
|
+
from uk_bin_collection.uk_bin_collection.common import *
|
16
|
+
from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
|
17
|
+
|
18
|
+
# Set up logging
|
19
|
+
logging.basicConfig(
|
20
|
+
level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s"
|
21
|
+
)
|
22
|
+
|
23
|
+
|
24
|
+
class CouncilClass(AbstractGetBinDataClass):
|
25
|
+
|
26
|
+
def parse_data(self, page: str, **kwargs) -> dict:
|
27
|
+
driver = None
|
28
|
+
try:
|
29
|
+
data = {"bins": []}
|
30
|
+
collections = []
|
31
|
+
user_uprn = kwargs.get("uprn")
|
32
|
+
user_postcode = kwargs.get("postcode")
|
33
|
+
web_driver = kwargs.get("web_driver")
|
34
|
+
headless = kwargs.get("headless")
|
35
|
+
check_postcode(user_postcode)
|
36
|
+
url = "https://forms.newforest.gov.uk/ufs/FIND_MY_COLLECTION.eb"
|
37
|
+
|
38
|
+
# Get session cookies using requests
|
39
|
+
|
40
|
+
user_agent = """general.useragent.override", "userAgent=Mozilla/5.0
|
41
|
+
(iPhone; CPU iPhone OS 15_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like
|
42
|
+
Gecko) CriOS/101.0.4951.44 Mobile/15E148 Safari/604.1"""
|
43
|
+
|
44
|
+
# Create Selenium webdriver
|
45
|
+
driver = create_webdriver(web_driver, headless, user_agent, __name__)
|
46
|
+
|
47
|
+
# Navigate to the page first
|
48
|
+
driver.get(url)
|
49
|
+
driver.refresh() # important otherwise it results in too many redirects
|
50
|
+
|
51
|
+
wait = WebDriverWait(driver, 60)
|
52
|
+
|
53
|
+
logging.info("Entering postcode")
|
54
|
+
input_element_postcode = wait.until(
|
55
|
+
EC.presence_of_element_located((By.XPATH, '//input[@id="CTID-1-_-A"]'))
|
56
|
+
)
|
57
|
+
|
58
|
+
input_element_postcode.send_keys(user_postcode)
|
59
|
+
|
60
|
+
logging.info("Searching for postcode")
|
61
|
+
input_element_postcode_btn = wait.until(
|
62
|
+
EC.element_to_be_clickable((By.XPATH, '//input[@type="submit"]'))
|
63
|
+
)
|
64
|
+
|
65
|
+
input_element_postcode_btn.click()
|
66
|
+
|
67
|
+
logging.info("Waiting for address dropdown")
|
68
|
+
input_element_postcode_dropdown = wait.until(
|
69
|
+
EC.presence_of_element_located((By.XPATH, '//select[@id="CTID-6-_-A"]'))
|
70
|
+
)
|
71
|
+
|
72
|
+
logging.info("Selecting address")
|
73
|
+
drop_down_values = Select(input_element_postcode_dropdown)
|
74
|
+
option_element = wait.until(
|
75
|
+
EC.presence_of_element_located(
|
76
|
+
(By.CSS_SELECTOR, f'option[value="{str(user_uprn)}"]')
|
77
|
+
)
|
78
|
+
)
|
79
|
+
|
80
|
+
driver.execute_script("arguments[0].scrollIntoView();", option_element)
|
81
|
+
drop_down_values.select_by_value(str(user_uprn))
|
82
|
+
|
83
|
+
input_element_address_btn = wait.until(
|
84
|
+
EC.element_to_be_clickable((By.XPATH, '//input[@value="Submit"]'))
|
85
|
+
)
|
86
|
+
|
87
|
+
input_element_address_btn.click()
|
88
|
+
|
89
|
+
logging.info("Waiting for bin collection page")
|
90
|
+
h4_element = wait.until(
|
91
|
+
EC.presence_of_element_located(
|
92
|
+
(By.XPATH, "//h1[contains(text(), 'Collections days for')]")
|
93
|
+
)
|
94
|
+
)
|
95
|
+
|
96
|
+
logging.info("Extracting bin collection data")
|
97
|
+
soup = BeautifulSoup(driver.page_source, features="html.parser")
|
98
|
+
bins = []
|
99
|
+
|
100
|
+
# Rubbish and recycling
|
101
|
+
rubbish_recycling = soup.find(
|
102
|
+
"span", class_="CTID-77-_ eb-77-Override-textControl"
|
103
|
+
)
|
104
|
+
if rubbish_recycling:
|
105
|
+
match = re.search(r"collected weekly on (\w+)", rubbish_recycling.text)
|
106
|
+
if match:
|
107
|
+
day_name = match.group(1)
|
108
|
+
next_collection = get_next_day_of_week(day_name)
|
109
|
+
bins.append(
|
110
|
+
{
|
111
|
+
"type": "Rubbish and recycling",
|
112
|
+
"collectionDate": next_collection,
|
113
|
+
}
|
114
|
+
)
|
115
|
+
|
116
|
+
# Glass collection
|
117
|
+
glass_collection = soup.find("span", class_="CTID-78-_ eb-78-textControl")
|
118
|
+
if glass_collection:
|
119
|
+
match = re.search(
|
120
|
+
r"next collection is\s+(\d{2}/\d{2}/\d{4})", glass_collection.text
|
121
|
+
)
|
122
|
+
if match:
|
123
|
+
bins.append(
|
124
|
+
{"type": "Glass collection", "collectionDate": match.group(1)}
|
125
|
+
)
|
126
|
+
|
127
|
+
# Garden waste
|
128
|
+
garden_waste = soup.find("span", class_="CTID-17-_ eb-17-textControl")
|
129
|
+
if garden_waste:
|
130
|
+
match = re.search(
|
131
|
+
r"next collection is\s+(\d{2}/\d{2}/\d{4})", garden_waste.text
|
132
|
+
)
|
133
|
+
if match:
|
134
|
+
bins.append(
|
135
|
+
{"type": "Garden waste", "collectionDate": match.group(1)}
|
136
|
+
)
|
137
|
+
|
138
|
+
return {"bins": bins}
|
139
|
+
|
140
|
+
except Exception as e:
|
141
|
+
logging.error(f"An error occurred: {e}")
|
142
|
+
raise
|
143
|
+
|
144
|
+
finally:
|
145
|
+
if driver:
|
146
|
+
driver.quit()
|
@@ -3,6 +3,7 @@ from datetime import *
|
|
3
3
|
|
4
4
|
import requests
|
5
5
|
from bs4 import BeautifulSoup
|
6
|
+
|
6
7
|
from uk_bin_collection.uk_bin_collection.common import *
|
7
8
|
from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
|
8
9
|
|
@@ -24,7 +25,7 @@ class CouncilClass(AbstractGetBinDataClass):
|
|
24
25
|
check_postcode(user_postcode)
|
25
26
|
|
26
27
|
# Get form data
|
27
|
-
s = requests.
|
28
|
+
s = requests.Session()
|
28
29
|
cookies = {
|
29
30
|
"ntc-cookie-policy": "1",
|
30
31
|
"SSESS6ec6d5d2d471c0357053d5993a839bce": "qBdR7XhmSMd5_PDBIqG0It2R0Fq67igrejRY-WOcskE",
|
@@ -1,4 +1,5 @@
|
|
1
1
|
from bs4 import BeautifulSoup
|
2
|
+
|
2
3
|
from uk_bin_collection.uk_bin_collection.common import *
|
3
4
|
from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
|
4
5
|
|
@@ -21,7 +22,7 @@ class CouncilClass(AbstractGetBinDataClass):
|
|
21
22
|
|
22
23
|
# Make Request
|
23
24
|
requests.packages.urllib3.disable_warnings()
|
24
|
-
s = requests.
|
25
|
+
s = requests.Session()
|
25
26
|
page = s.get(url)
|
26
27
|
|
27
28
|
# Make a BS4 object
|
uk_bin_collection-0.80.0/uk_bin_collection/uk_bin_collection/councils/StaffordBoroughCouncil.py
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
from bs4 import BeautifulSoup
|
2
|
+
from uk_bin_collection.uk_bin_collection.common import *
|
3
|
+
from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
|
4
|
+
|
5
|
+
|
6
|
+
# import the wonderful Beautiful Soup and the URL grabber
|
7
|
+
class CouncilClass(AbstractGetBinDataClass):
|
8
|
+
"""
|
9
|
+
Concrete classes have to implement all abstract operations of the
|
10
|
+
base class. They can also override some operations with a default
|
11
|
+
implementation.
|
12
|
+
"""
|
13
|
+
|
14
|
+
def parse_date(self, date_str):
|
15
|
+
months = {
|
16
|
+
"Jan": "01",
|
17
|
+
"Feb": "02",
|
18
|
+
"Mar": "03",
|
19
|
+
"Apr": "04",
|
20
|
+
"May": "05",
|
21
|
+
"Jun": "06",
|
22
|
+
"Jul": "07",
|
23
|
+
"Aug": "08",
|
24
|
+
"Sep": "09",
|
25
|
+
"Oct": "10",
|
26
|
+
"Nov": "11",
|
27
|
+
"Dec": "12",
|
28
|
+
}
|
29
|
+
day, date, month_abbr, year = date_str.split()
|
30
|
+
month = months[month_abbr]
|
31
|
+
return f"{date}/{month}/{year}"
|
32
|
+
|
33
|
+
def parse_data(self, page: str, **kwargs) -> dict:
|
34
|
+
# Make a BS4 object
|
35
|
+
soup = BeautifulSoup(page.text, features="html.parser")
|
36
|
+
soup.prettify()
|
37
|
+
|
38
|
+
# Initialize the bin data structure
|
39
|
+
bin_data = {"bins": []}
|
40
|
+
|
41
|
+
# Find the table with collection dates
|
42
|
+
table = soup.find("table", class_="my-area")
|
43
|
+
|
44
|
+
# Extract the rows containing the bin collection information
|
45
|
+
rows = table.find_all("tr")
|
46
|
+
|
47
|
+
# Loop through the rows and extract bin data
|
48
|
+
for row in rows:
|
49
|
+
cells = row.find_all("td")
|
50
|
+
if len(cells) == 2:
|
51
|
+
bin_type = cells[0].get_text(strip=True)
|
52
|
+
collection_date = cells[1].get_text(strip=True)
|
53
|
+
|
54
|
+
if "Next refuse" in bin_type:
|
55
|
+
bin_data["bins"].append(
|
56
|
+
{
|
57
|
+
"type": "refuse",
|
58
|
+
"collectionDate": self.parse_date(collection_date),
|
59
|
+
}
|
60
|
+
)
|
61
|
+
elif "Next recycling" in bin_type:
|
62
|
+
bin_data["bins"].append(
|
63
|
+
{
|
64
|
+
"type": "recycling",
|
65
|
+
"collectionDate": self.parse_date(collection_date),
|
66
|
+
}
|
67
|
+
)
|
68
|
+
|
69
|
+
return bin_data
|