uk_bin_collection 0.98.3__tar.gz → 0.98.5__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.98.3 → uk_bin_collection-0.98.5}/PKG-INFO +1 -1
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/pyproject.toml +1 -1
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/tests/input.json +5 -4
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/BarnetCouncil.py +24 -7
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/BradfordMDC.py +1 -1
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/GlasgowCityCouncil.py +15 -16
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/HaltonBoroughCouncil.py +4 -0
- uk_bin_collection-0.98.5/uk_bin_collection/uk_bin_collection/councils/ManchesterCityCouncil.py +90 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/NeathPortTalbotCouncil.py +1 -0
- uk_bin_collection-0.98.5/uk_bin_collection/uk_bin_collection/councils/SwaleBoroughCouncil.py +90 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/UttlesfordDistrictCouncil.py +3 -3
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/ValeofWhiteHorseCouncil.py +2 -5
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/WestBerkshireCouncil.py +45 -24
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/WestSuffolkCouncil.py +0 -1
- uk_bin_collection-0.98.3/uk_bin_collection/uk_bin_collection/councils/ManchesterCityCouncil.py +0 -107
- uk_bin_collection-0.98.3/uk_bin_collection/uk_bin_collection/councils/SwaleBoroughCouncil.py +0 -52
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/LICENSE +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/README.md +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/README.rst +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/tests/council_feature_input_parity.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/tests/features/environment.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/tests/features/validate_council_outputs.feature +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/tests/output.schema +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/tests/step_defs/step_helpers/file_handler.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/tests/step_defs/test_validate_council.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/tests/test_collect_data.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/tests/test_common_functions.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/tests/test_conftest.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/tests/test_get_data.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/collect_data.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/common.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/AdurAndWorthingCouncils.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/ArmaghBanbridgeCraigavonCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/ArunCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/AylesburyValeCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/BCPCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/BarnsleyMBCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/BasildonCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/BasingstokeCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/BathAndNorthEastSomersetCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/BedfordBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/BedfordshireCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/BelfastCityCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/BexleyCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/BirminghamCityCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/BlackburnCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/BoltonCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/BracknellForestCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/BrightonandHoveCityCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/BristolCityCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/BromleyBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/BroxtoweBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/BuckinghamshireCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/BuryCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/CalderdaleCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/CannockChaseDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/CardiffCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/CastlepointDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/CharnwoodBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/ChelmsfordCityCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/CheshireEastCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/CheshireWestAndChesterCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/ChichesterDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/ChorleyCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/ColchesterCityCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/ConwyCountyBorough.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/CornwallCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/CrawleyBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/CroydonCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/DacorumBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/DartfordBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/DerbyshireDalesDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/DoncasterCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/DorsetCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/DoverDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/DurhamCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/EalingCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/EastCambridgeshireCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/EastDevonDC.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/EastLindseyDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/EastRenfrewshireCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/EastRidingCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/EastSuffolkCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/EastleighBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/ElmbridgeBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/EnfieldCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/EnvironmentFirst.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/EppingForestDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/ErewashBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/FalkirkCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/FarehamBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/FenlandDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/ForestOfDeanDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/GatesheadCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/GedlingBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/GloucesterCityCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/GuildfordCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/HaringeyCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/HarrogateBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/HighPeakCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/HighlandCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/HounslowCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/HullCityCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/HuntingdonDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/IslingtonCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/KingstonUponThamesCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/KirkleesCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/KnowsleyMBCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/LancasterCityCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/LeedsCityCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/LichfieldDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/LisburnCastlereaghCityCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/LiverpoolCityCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughEaling.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughHarrow.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughHounslow.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughLambeth.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughRedbridge.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/MaldonDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/MalvernHillsDC.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/MansfieldDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/MertonCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/MidAndEastAntrimBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/MidSussexDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/MiltonKeynesCityCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/MoleValleyDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/NewForestCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/NewarkAndSherwoodDC.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/NewcastleCityCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/NewhamCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/NewportCityCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/NorthAyrshireCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/NorthEastDerbyshireDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/NorthEastLincs.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/NorthKestevenDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/NorthLanarkshireCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/NorthLincolnshireCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/NorthNorfolkDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/NorthNorthamptonshireCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/NorthSomersetCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/NorthTynesideCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/NorthWestLeicestershire.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/NorthYorkshire.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/NorthumberlandCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/NottinghamCityCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/OldhamCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/PortsmouthCityCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/PrestonCityCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/ReadingBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/ReigateAndBansteadBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/RenfrewshireCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/RhonddaCynonTaffCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/RochdaleCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/RochfordCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/RotherhamCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/RugbyBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/RushcliffeBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/RushmoorCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/SalfordCityCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/SevenoaksDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/SheffieldCityCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/ShropshireCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/SolihullCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/SomersetCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/SouthAyrshireCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/SouthCambridgeshireCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/SouthDerbyshireDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/SouthGloucestershireCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/SouthKestevenDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/SouthLanarkshireCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/SouthNorfolkCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/SouthOxfordshireCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/SouthTynesideCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/SouthwarkCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/StAlbansCityAndDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/StHelensBC.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/StaffordBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/StaffordshireMoorlandsDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/StockportBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/StokeOnTrentCityCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/StratfordUponAvonCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/StroudDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/SunderlandCityCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/SwanseaCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/TamesideMBCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/TandridgeDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/TelfordAndWrekinCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/TendringDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/TestValleyBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/ThreeRiversDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/TonbridgeAndMallingBC.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/TorbayCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/TorridgeDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/ValeofGlamorganCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/WakefieldCityCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/WalsallCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/WalthamForest.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/WarwickDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/WaverleyBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/WealdenDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/WelhatCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/WestLindseyDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/WestLothianCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/WestMorlandAndFurness.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/WestNorthamptonshireCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/WiganBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/WiltshireCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/WinchesterCityCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/WindsorAndMaidenheadCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/WirralCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/WokingBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/WokinghamBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/WychavonDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/WyreCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/YorkCouncil.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/councils/council_class_template/councilclasstemplate.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/create_new_council.py +0 -0
- {uk_bin_collection-0.98.3 → uk_bin_collection-0.98.5}/uk_bin_collection/uk_bin_collection/get_bin_data.py +0 -0
@@ -132,7 +132,7 @@
|
|
132
132
|
"BradfordMDC": {
|
133
133
|
"custom_component_show_url_field": false,
|
134
134
|
"skip_get_url": true,
|
135
|
-
"uprn": "
|
135
|
+
"uprn": "100051146921",
|
136
136
|
"url": "https://onlineforms.bradford.gov.uk/ufs/collectiondates.eb",
|
137
137
|
"wiki_name": "Bradford MDC",
|
138
138
|
"wiki_note": "To get the UPRN, you will need to use [FindMyAddress](https://www.findmyaddress.co.uk/search). Post code isn't parsed by this script, but you can pass it in double quotes."
|
@@ -680,7 +680,7 @@
|
|
680
680
|
},
|
681
681
|
"ManchesterCityCouncil": {
|
682
682
|
"skip_get_url": true,
|
683
|
-
"uprn": "
|
683
|
+
"uprn": "77127089",
|
684
684
|
"url": "https://www.manchester.gov.uk/bincollections",
|
685
685
|
"wiki_name": "Manchester City Council"
|
686
686
|
},
|
@@ -691,7 +691,7 @@
|
|
691
691
|
"wiki_name": "Mansfield District Council"
|
692
692
|
},
|
693
693
|
"MertonCouncil": {
|
694
|
-
"url": "https://myneighbourhood.merton.gov.uk/
|
694
|
+
"url": "https://myneighbourhood.merton.gov.uk/wasteservices/WasteServices.aspx?ID=25851371",
|
695
695
|
"wiki_command_url_override": "https://myneighbourhood.merton.gov.uk/Wasteservices/WasteServices.aspx?ID=XXXXXXXX",
|
696
696
|
"wiki_name": "Merton Council",
|
697
697
|
"wiki_note": "Follow the instructions [here](https://myneighbourhood.merton.gov.uk/Wasteservices/WasteServicesSearch.aspx) until you get the \"Your recycling and rubbish collection days\" page then copy the URL and replace the URL in the command (the Address parameter is optional)."
|
@@ -1128,7 +1128,8 @@
|
|
1128
1128
|
"SwaleBoroughCouncil": {
|
1129
1129
|
"postcode": "ME12 2NQ",
|
1130
1130
|
"skip_get_url": true,
|
1131
|
-
"
|
1131
|
+
"house_number": "81",
|
1132
|
+
"web_driver": "http://selenium:4444",
|
1132
1133
|
"url": "https://swale.gov.uk/bins-littering-and-the-environment/bins/collection-days",
|
1133
1134
|
"wiki_name": "Swale Borough Council"
|
1134
1135
|
},
|
@@ -74,13 +74,30 @@ class CouncilClass(AbstractGetBinDataClass):
|
|
74
74
|
|
75
75
|
driver.get(page)
|
76
76
|
|
77
|
+
wait = WebDriverWait(driver, 10)
|
78
|
+
accept_cookies_button = wait.until(
|
79
|
+
EC.element_to_be_clickable(
|
80
|
+
(
|
81
|
+
By.XPATH,
|
82
|
+
"//button[contains(text(), 'Accept additional cookies')]",
|
83
|
+
)
|
84
|
+
)
|
85
|
+
)
|
86
|
+
accept_cookies_button.click()
|
87
|
+
|
77
88
|
# Wait for the element to be clickable
|
78
|
-
|
89
|
+
wait = WebDriverWait(driver, 10)
|
90
|
+
find_your_collection_button = wait.until(
|
79
91
|
EC.element_to_be_clickable(
|
80
|
-
(By.
|
92
|
+
(By.LINK_TEXT, "Find your household collection day")
|
81
93
|
)
|
82
94
|
)
|
83
95
|
|
96
|
+
# Scroll to the element (in case something is blocking it)
|
97
|
+
driver.execute_script(
|
98
|
+
"arguments[0].scrollIntoView();", find_your_collection_button
|
99
|
+
)
|
100
|
+
|
84
101
|
# Click the element
|
85
102
|
find_your_collection_button.click()
|
86
103
|
|
@@ -107,12 +124,12 @@ class CouncilClass(AbstractGetBinDataClass):
|
|
107
124
|
|
108
125
|
postcode_input.send_keys(user_postcode)
|
109
126
|
|
110
|
-
find_address_button = WebDriverWait(driver,
|
111
|
-
EC.
|
112
|
-
(By.CSS_SELECTOR, '[value="Find address"]')
|
113
|
-
)
|
127
|
+
find_address_button = WebDriverWait(driver, 30).until(
|
128
|
+
EC.element_to_be_clickable((By.CSS_SELECTOR, '[value="Find address"]'))
|
114
129
|
)
|
115
|
-
|
130
|
+
driver.execute_script("arguments[0].scrollIntoView();", find_address_button)
|
131
|
+
driver.execute_script("arguments[0].click();", find_address_button)
|
132
|
+
# find_address_button.click()
|
116
133
|
|
117
134
|
time.sleep(15)
|
118
135
|
# Wait for address box to be visible
|
@@ -1,5 +1,6 @@
|
|
1
1
|
import requests
|
2
2
|
from bs4 import BeautifulSoup
|
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
|
|
@@ -92,7 +93,6 @@ class CouncilClass(AbstractGetBinDataClass):
|
|
92
93
|
dict_data = {
|
93
94
|
"type": bin_type,
|
94
95
|
"collectionDate": bin_date,
|
95
|
-
"colour": bin_colour,
|
96
96
|
}
|
97
97
|
data["bins"].append(dict_data)
|
98
98
|
|
@@ -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
|
|
@@ -18,36 +19,34 @@ class CouncilClass(AbstractGetBinDataClass):
|
|
18
19
|
# Declare an empty dict for data, and pair icon source URLs with their respective bin type
|
19
20
|
data = {"bins": []}
|
20
21
|
bin_types = {
|
21
|
-
"../
|
22
|
-
"../
|
23
|
-
"../
|
24
|
-
"../
|
25
|
-
"../
|
26
|
-
"../
|
22
|
+
"../Images/Bins/blueBin.gif": "Mixed recycling",
|
23
|
+
"../Images/Bins/greenBin.gif": "General waste",
|
24
|
+
"../Images/Bins/greyBin.gif": "Food waste",
|
25
|
+
"../Images/Bins/brownBin.gif": "Organic waste",
|
26
|
+
"../Images/Bins/purpleBin.gif": "Glass",
|
27
|
+
"../Images/Bins/ashBin.gif": "Ash bin",
|
27
28
|
}
|
28
29
|
|
29
30
|
# Find the page body with all the calendars
|
30
|
-
body = soup.find("div", {"id": "
|
31
|
-
cal_year = datetime.strptime(soup.select("#Year")[0].text.strip(), "%Y").year
|
31
|
+
body = soup.find("div", {"id": "Application_ctl00"})
|
32
32
|
calendars = body.find_all_next("table", {"title": "Calendar"})
|
33
|
-
|
34
33
|
# For each calendar grid, get the month and all icons within it. We only take icons with alt text, as this
|
35
34
|
# includes the bin type while excluding spacers
|
36
35
|
for item in calendars:
|
37
|
-
|
38
|
-
icons = item.find_all("img", alt=True)
|
39
|
-
|
36
|
+
icons = item.find_all("img")
|
40
37
|
# For each icon, get the day box, so we can parse the correct day number and make a datetime
|
41
38
|
for icon in icons:
|
42
|
-
cal_item = icon.find_parent().find_parent()
|
43
|
-
|
44
|
-
|
39
|
+
cal_item = icon.find_parent().find_parent()
|
40
|
+
bin_date = datetime.strptime(
|
41
|
+
cal_item["title"],
|
42
|
+
"%A, %d %B %Y",
|
43
|
+
)
|
45
44
|
|
46
45
|
# If the collection date is in the future, we want the date. Select the correct type, add the new
|
47
46
|
# datetime, then add to the list
|
48
47
|
if datetime.now() <= bin_date:
|
49
48
|
dict_data = {
|
50
|
-
"type": bin_types.get(icon["src"]
|
49
|
+
"type": bin_types.get(icon["src"]),
|
51
50
|
"collectionDate": bin_date.strftime(date_format),
|
52
51
|
}
|
53
52
|
data["bins"].append(dict_data)
|
@@ -80,6 +80,10 @@ class CouncilClass(AbstractGetBinDataClass):
|
|
80
80
|
)
|
81
81
|
)
|
82
82
|
search_btn.send_keys(Keys.ENTER)
|
83
|
+
WebDriverWait(driver, 10).until(
|
84
|
+
EC.presence_of_element_located((By.ID, "collectionTabs"))
|
85
|
+
)
|
86
|
+
|
83
87
|
soup = BeautifulSoup(driver.page_source, features="html.parser")
|
84
88
|
|
85
89
|
# Find all tab panels within the collectionTabs
|
uk_bin_collection-0.98.5/uk_bin_collection/uk_bin_collection/councils/ManchesterCityCouncil.py
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
from datetime import datetime
|
2
|
+
|
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
|
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
|
+
user_uprn = kwargs.get("uprn")
|
20
|
+
check_uprn(user_uprn)
|
21
|
+
bindata = {"bins": []}
|
22
|
+
|
23
|
+
COLLECTION_MAP = {
|
24
|
+
"ahtm_dates_black_bin": "Black bin",
|
25
|
+
"ahtm_dates_brown_commingled_bin": "Brown bin",
|
26
|
+
"ahtm_dates_blue_pulpable_bin": "Blue bin",
|
27
|
+
"ahtm_dates_green_organic_bin": "Green Bin",
|
28
|
+
}
|
29
|
+
|
30
|
+
API_URL = "https://manchester.form.uk.empro.verintcloudservices.com/api/custom?action=bin_checker-get_bin_col_info&actionedby=_KDF_custom&loadform=true&access=citizen&locale=en"
|
31
|
+
AUTH_URL = "https://manchester.form.uk.empro.verintcloudservices.com/api/citizen?archived=Y&preview=false&locale=en"
|
32
|
+
AUTH_KEY = "Authorization"
|
33
|
+
|
34
|
+
r = requests.get(AUTH_URL)
|
35
|
+
r.raise_for_status()
|
36
|
+
auth_token = r.headers[AUTH_KEY]
|
37
|
+
|
38
|
+
post_data = {
|
39
|
+
"name": "sr_bin_coll_day_checker",
|
40
|
+
"data": {
|
41
|
+
"uprn": user_uprn,
|
42
|
+
"nextCollectionFromDate": (datetime.now() - timedelta(days=1)).strftime(
|
43
|
+
"%Y-%m-%d"
|
44
|
+
),
|
45
|
+
"nextCollectionToDate": (datetime.now() + timedelta(days=30)).strftime(
|
46
|
+
"%Y-%m-%d"
|
47
|
+
),
|
48
|
+
},
|
49
|
+
"email": "",
|
50
|
+
"caseid": "",
|
51
|
+
"xref": "",
|
52
|
+
"xref1": "",
|
53
|
+
"xref2": "",
|
54
|
+
}
|
55
|
+
|
56
|
+
headers = {
|
57
|
+
"referer": "https://manchester.portal.uk.empro.verintcloudservices.com/",
|
58
|
+
"accept": "application/json",
|
59
|
+
"content-type": "application/json",
|
60
|
+
AUTH_KEY: auth_token,
|
61
|
+
}
|
62
|
+
|
63
|
+
r = requests.post(API_URL, data=json.dumps(post_data), headers=headers)
|
64
|
+
r.raise_for_status()
|
65
|
+
|
66
|
+
result = r.json()
|
67
|
+
print(result["data"])
|
68
|
+
|
69
|
+
for key, value in result["data"].items():
|
70
|
+
if key.startswith("ahtm_dates_"):
|
71
|
+
print(key)
|
72
|
+
print(value)
|
73
|
+
|
74
|
+
dates_list = [
|
75
|
+
datetime.strptime(date.strip(), "%d/%m/%Y %H:%M:%S").date()
|
76
|
+
for date in value.split(";")
|
77
|
+
if date.strip()
|
78
|
+
]
|
79
|
+
|
80
|
+
for current_date in dates_list:
|
81
|
+
dict_data = {
|
82
|
+
"type": COLLECTION_MAP.get(key),
|
83
|
+
"collectionDate": current_date.strftime(date_format),
|
84
|
+
}
|
85
|
+
bindata["bins"].append(dict_data)
|
86
|
+
|
87
|
+
bindata["bins"].sort(
|
88
|
+
key=lambda x: datetime.strptime(x.get("collectionDate"), "%d/%m/%Y")
|
89
|
+
)
|
90
|
+
return bindata
|
@@ -0,0 +1,90 @@
|
|
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
|
+
# import the wonderful Beautiful Soup and the URL grabber
|
10
|
+
|
11
|
+
|
12
|
+
class CouncilClass(AbstractGetBinDataClass):
|
13
|
+
"""
|
14
|
+
Concrete classes have to implement all abstract operations of the
|
15
|
+
base class. They can also override some operations with a default
|
16
|
+
implementation.
|
17
|
+
"""
|
18
|
+
|
19
|
+
def parse_data(self, page: str, **kwargs) -> dict:
|
20
|
+
# Get postcode and UPRN from kwargs
|
21
|
+
user_postcode = kwargs.get("postcode")
|
22
|
+
user_paon = kwargs.get("paon")
|
23
|
+
web_driver = kwargs.get("web_driver")
|
24
|
+
headless = kwargs.get("headless")
|
25
|
+
check_postcode(user_postcode)
|
26
|
+
check_paon(user_paon)
|
27
|
+
|
28
|
+
# Build URL to parse
|
29
|
+
council_url = "https://swale.gov.uk/bins-littering-and-the-environment/bins/my-collection-day"
|
30
|
+
|
31
|
+
# Create Selenium webdriver
|
32
|
+
driver = create_webdriver(web_driver, headless, None, __name__)
|
33
|
+
driver.get(council_url)
|
34
|
+
|
35
|
+
# Wait for the postcode field to appear then populate it
|
36
|
+
try:
|
37
|
+
inputElement_postcode = WebDriverWait(driver, 10).until(
|
38
|
+
EC.presence_of_element_located((By.ID, "q462406_q1"))
|
39
|
+
)
|
40
|
+
inputElement_postcode.send_keys(user_postcode)
|
41
|
+
except Exception:
|
42
|
+
print("Page failed to load. Probably due to Cloudflare robot check!")
|
43
|
+
|
44
|
+
# Click search button
|
45
|
+
findAddress = WebDriverWait(driver, 10).until(
|
46
|
+
EC.presence_of_element_located((By.ID, "form_email_462397_submit"))
|
47
|
+
)
|
48
|
+
driver.execute_script("arguments[0].click();", findAddress)
|
49
|
+
|
50
|
+
# Wait for the 'Select address' dropdown to appear and select option matching the house name/number
|
51
|
+
WebDriverWait(driver, 10).until(
|
52
|
+
EC.element_to_be_clickable(
|
53
|
+
(
|
54
|
+
By.XPATH,
|
55
|
+
"//select[@id='SBCYBDAddressList']//option[contains(., '"
|
56
|
+
+ user_paon
|
57
|
+
+ "')]",
|
58
|
+
)
|
59
|
+
)
|
60
|
+
).click()
|
61
|
+
|
62
|
+
# Click search button
|
63
|
+
getBins = WebDriverWait(driver, 10).until(
|
64
|
+
EC.presence_of_element_located((By.ID, "form_email_462397_submit"))
|
65
|
+
)
|
66
|
+
driver.execute_script("arguments[0].click();", getBins)
|
67
|
+
|
68
|
+
BinTable = WebDriverWait(driver, 30).until(
|
69
|
+
EC.presence_of_element_located((By.ID, "SBC-YBD-Main"))
|
70
|
+
)
|
71
|
+
|
72
|
+
soup = BeautifulSoup(driver.page_source, features="html.parser")
|
73
|
+
soup.prettify()
|
74
|
+
|
75
|
+
data = {"bins": []}
|
76
|
+
|
77
|
+
# Get the collection bullet points on the page and parse them
|
78
|
+
nextCollections = soup.find("div", {"id": "nextCollections"})
|
79
|
+
for c in nextCollections:
|
80
|
+
collection = c.find_all("strong")
|
81
|
+
for bin in collection:
|
82
|
+
split = (bin.text).split(" on ")
|
83
|
+
bin_type = split[0]
|
84
|
+
bin_date = datetime.strptime(split[1], "%A %d %b %Y").strftime(
|
85
|
+
"%d/%m/%Y"
|
86
|
+
)
|
87
|
+
dict_data = {"type": bin_type, "collectionDate": bin_date}
|
88
|
+
data["bins"].append(dict_data)
|
89
|
+
|
90
|
+
return data
|
@@ -10,7 +10,6 @@ from selenium.webdriver.common.keys import Keys
|
|
10
10
|
from selenium.webdriver.support import expected_conditions as EC
|
11
11
|
from selenium.webdriver.support.ui import Select
|
12
12
|
from selenium.webdriver.support.wait import WebDriverWait
|
13
|
-
from uk_bin_collection.uk_bin_collection.common import *
|
14
13
|
|
15
14
|
from uk_bin_collection.uk_bin_collection.common import *
|
16
15
|
from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
|
@@ -91,9 +90,10 @@ class CouncilClass(AbstractGetBinDataClass):
|
|
91
90
|
if len(cols) == 2:
|
92
91
|
bin_types = [img["alt"] for img in cols[0].find_all("img")]
|
93
92
|
collection_date_str = cols[1].text
|
94
|
-
|
95
|
-
collection_date_str
|
93
|
+
collection_date_str = remove_ordinal_indicator_from_date_string(
|
94
|
+
collection_date_str
|
96
95
|
)
|
96
|
+
collection_date = datetime.strptime(collection_date_str, "%A %d %B")
|
97
97
|
collection_date = collection_date.replace(
|
98
98
|
year=2024
|
99
99
|
) # Assuming the year is 2024
|
@@ -1,5 +1,6 @@
|
|
1
1
|
import requests
|
2
2
|
from bs4 import BeautifulSoup
|
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
|
|
@@ -89,11 +90,7 @@ class CouncilClass(AbstractGetBinDataClass):
|
|
89
90
|
raise ValueError(f"Error parsing bin data: {ex}")
|
90
91
|
|
91
92
|
# Build data dict for each entry
|
92
|
-
dict_data = {
|
93
|
-
"type": bin_type,
|
94
|
-
"collectionDate": bin_date,
|
95
|
-
"colour": bin_colour,
|
96
|
-
}
|
93
|
+
dict_data = {"type": bin_type, "collectionDate": bin_date}
|
97
94
|
data["bins"].append(dict_data)
|
98
95
|
|
99
96
|
data["bins"].sort(
|
@@ -74,30 +74,51 @@ class CouncilClass(AbstractGetBinDataClass):
|
|
74
74
|
soup = BeautifulSoup(driver.page_source, features="html.parser")
|
75
75
|
soup.prettify()
|
76
76
|
|
77
|
-
|
78
|
-
" "
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
.
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
77
|
+
rubbish_div = soup.find(
|
78
|
+
"div", {"id": "FINDYOURBINDAYS_RUBBISHDATE_OUTERDIV"}
|
79
|
+
)
|
80
|
+
try:
|
81
|
+
rubbish_date = rubbish_div.find_all("div")[2]
|
82
|
+
rubbish_date = datetime.strptime(
|
83
|
+
rubbish_date.text,
|
84
|
+
"%A %d %B",
|
85
|
+
).replace(year=datetime.now().year)
|
86
|
+
except:
|
87
|
+
rubbish_date = rubbish_div.find_all("div")[3]
|
88
|
+
rubbish_date = datetime.strptime(
|
89
|
+
rubbish_date.text,
|
90
|
+
"%A %d %B",
|
91
|
+
).replace(year=datetime.now().year)
|
92
|
+
recycling_div = soup.find(
|
93
|
+
"div", {"id": "FINDYOURBINDAYS_RECYCLINGDATE_OUTERDIV"}
|
94
|
+
)
|
95
|
+
try:
|
96
|
+
recycling_date = recycling_div.find_all("div")[2]
|
97
|
+
recycling_date = datetime.strptime(
|
98
|
+
recycling_date.text,
|
99
|
+
"%A %d %B",
|
100
|
+
).replace(year=datetime.now().year)
|
101
|
+
except:
|
102
|
+
rubbish_date = recycling_div.find_all("div")[3]
|
103
|
+
rubbish_date = datetime.strptime(
|
104
|
+
rubbish_date.text,
|
105
|
+
"%A %d %B",
|
106
|
+
).replace(year=datetime.now().year)
|
107
|
+
food_div = soup.find(
|
108
|
+
"div", {"id": "FINDYOURBINDAYS_RECYCLINGDATE_OUTERDIV"}
|
109
|
+
)
|
110
|
+
try:
|
111
|
+
food_date = food_div.find_all("div")[2]
|
112
|
+
food_date = datetime.strptime(
|
113
|
+
food_date.text,
|
114
|
+
"%A %d %B",
|
115
|
+
).replace(year=datetime.now().year)
|
116
|
+
except:
|
117
|
+
food_date = food_div.find_all("div")[3]
|
118
|
+
food_date = datetime.strptime(
|
119
|
+
food_date.text,
|
120
|
+
"%A %d %B",
|
121
|
+
).replace(year=datetime.now().year)
|
101
122
|
|
102
123
|
if datetime.now().month == 12 and rubbish_date.month == 1:
|
103
124
|
rubbish_date = rubbish_date + relativedelta(years=1)
|
uk_bin_collection-0.98.3/uk_bin_collection/uk_bin_collection/councils/ManchesterCityCouncil.py
DELETED
@@ -1,107 +0,0 @@
|
|
1
|
-
from datetime import datetime
|
2
|
-
|
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
|
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
|
-
user_uprn = kwargs.get("uprn")
|
20
|
-
check_uprn(user_uprn)
|
21
|
-
|
22
|
-
# Start a new session to walk through the form
|
23
|
-
requests.packages.urllib3.disable_warnings()
|
24
|
-
s = requests.Session()
|
25
|
-
|
26
|
-
# There's a cookie that makes the whole thing valid when you search for a postcode,
|
27
|
-
# but postcode and UPRN is a hassle imo, so this makes a request for the session to get a cookie
|
28
|
-
# using a Manchester City Council postcode I hardcoded in the data payload
|
29
|
-
postcode_request_header = {
|
30
|
-
"authority": "www.manchester.gov.uk",
|
31
|
-
"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,"
|
32
|
-
"image/webp,image/apng,*/*;q=0.8",
|
33
|
-
"accept-language": "en-GB,en;q=0.6",
|
34
|
-
"cache-control": "max-age=0",
|
35
|
-
# Requests sorts cookies= alphabetically
|
36
|
-
"origin": "https://www.manchester.gov.uk",
|
37
|
-
"referer": "https://www.manchester.gov.uk/bincollections",
|
38
|
-
"sec-fetch-dest": "document",
|
39
|
-
"sec-fetch-mode": "navigate",
|
40
|
-
"sec-fetch-site": "same-origin",
|
41
|
-
"sec-fetch-user": "?1",
|
42
|
-
"sec-gpc": "1",
|
43
|
-
"upgrade-insecure-requests": "1",
|
44
|
-
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, "
|
45
|
-
"like Gecko) Chrome/104.0.5112.102 Safari/537.36",
|
46
|
-
}
|
47
|
-
postcode_request_data = {
|
48
|
-
"mcc_bin_dates_search_term": "M2 5DB",
|
49
|
-
"mcc_bin_dates_submit": "Go",
|
50
|
-
}
|
51
|
-
response = s.post(
|
52
|
-
"https://www.manchester.gov.uk/bincollections",
|
53
|
-
headers=postcode_request_header,
|
54
|
-
data=postcode_request_data,
|
55
|
-
)
|
56
|
-
|
57
|
-
# Make a POST with the same cookie-fied session using the user's UPRN data
|
58
|
-
uprn_request_headers = {
|
59
|
-
"authority": "www.manchester.gov.uk",
|
60
|
-
"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8",
|
61
|
-
"accept-language": "en-GB,en;q=0.6",
|
62
|
-
"cache-control": "max-age=0",
|
63
|
-
# Requests sorts cookies= alphabetically
|
64
|
-
# 'cookie': 'TestCookie=Test; CookieConsent={stamp:%27D8rypjMDBJhpfMWybSMdGXP1hCZWGJYtGETiMTu1UuXTdRIKl8SU5g==%27%2Cnecessary:true%2Cpreferences:true%2Cstatistics:true%2Cmarketing:true%2Cver:6%2Cutc:1661783732090%2Cregion:%27gb%27}; PHPSESSID=kElJxYAt%2Cf-4ZWoskt0s5tn32BUQRXDYUVp3G-NsqOAOaeIcKlm2T4r7ATSgqfz6',
|
65
|
-
"origin": "https://www.manchester.gov.uk",
|
66
|
-
"referer": "https://www.manchester.gov.uk/bincollections",
|
67
|
-
"sec-fetch-dest": "document",
|
68
|
-
"sec-fetch-mode": "navigate",
|
69
|
-
"sec-fetch-site": "same-origin",
|
70
|
-
"sec-fetch-user": "?1",
|
71
|
-
"sec-gpc": "1",
|
72
|
-
"upgrade-insecure-requests": "1",
|
73
|
-
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.102 Safari/537.36",
|
74
|
-
}
|
75
|
-
uprn_request_data = {
|
76
|
-
"mcc_bin_dates_uprn": user_uprn,
|
77
|
-
"mcc_bin_dates_submit": "Go",
|
78
|
-
}
|
79
|
-
response = s.post(
|
80
|
-
"https://www.manchester.gov.uk/bincollections",
|
81
|
-
headers=uprn_request_headers,
|
82
|
-
data=uprn_request_data,
|
83
|
-
)
|
84
|
-
|
85
|
-
# Make that BS4 object and use it to prettify the response
|
86
|
-
soup = BeautifulSoup(response.content, features="html.parser")
|
87
|
-
soup.prettify()
|
88
|
-
|
89
|
-
# Get the collection items on the page and strip the bits of text that we don't care for
|
90
|
-
collections = []
|
91
|
-
for bin in soup.find_all("div", {"class": "collection"}):
|
92
|
-
bin_type = bin.find_next("h3").text.replace(" DUE TODAY", "").strip()
|
93
|
-
next_collection = bin.find_next("p").text.replace("Next collection ", "")
|
94
|
-
next_collection = datetime.strptime(next_collection, "%A %d %b %Y")
|
95
|
-
collections.append((bin_type, next_collection))
|
96
|
-
|
97
|
-
# Sort the collections by date order rather than bin type, then return as a dictionary (with str date)
|
98
|
-
ordered_data = sorted(collections, key=lambda x: x[1])
|
99
|
-
data = {"bins": []}
|
100
|
-
for item in ordered_data:
|
101
|
-
dict_data = {
|
102
|
-
"type": item[0],
|
103
|
-
"collectionDate": item[1].strftime(date_format),
|
104
|
-
}
|
105
|
-
data["bins"].append(dict_data)
|
106
|
-
|
107
|
-
return data
|