uk_bin_collection 0.152.7__tar.gz → 0.152.9__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.
Files changed (362) hide show
  1. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/PKG-INFO +1 -1
  2. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/pyproject.toml +1 -1
  3. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/tests/input.json +11 -15
  4. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/AngusCouncil.py +69 -46
  5. uk_bin_collection-0.152.9/uk_bin_collection/uk_bin_collection/councils/BCPCouncil.py +133 -0
  6. uk_bin_collection-0.152.9/uk_bin_collection/uk_bin_collection/councils/BarnetCouncil.py +263 -0
  7. uk_bin_collection-0.152.9/uk_bin_collection/uk_bin_collection/councils/BasildonCouncil.py +110 -0
  8. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/BedfordshireCouncil.py +2 -0
  9. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/BlabyDistrictCouncil.py +5 -1
  10. uk_bin_collection-0.152.9/uk_bin_collection/uk_bin_collection/councils/BlaenauGwentCountyBoroughCouncil.py +138 -0
  11. uk_bin_collection-0.152.9/uk_bin_collection/uk_bin_collection/councils/BroxbourneCouncil.py +104 -0
  12. uk_bin_collection-0.152.9/uk_bin_collection/uk_bin_collection/councils/BuckinghamshireCouncil.py +126 -0
  13. uk_bin_collection-0.152.9/uk_bin_collection/uk_bin_collection/councils/ChelmsfordCityCouncil.py +95 -0
  14. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/CherwellDistrictCouncil.py +39 -18
  15. uk_bin_collection-0.152.9/uk_bin_collection/uk_bin_collection/councils/ChorleyCouncil.py +148 -0
  16. uk_bin_collection-0.152.9/uk_bin_collection/uk_bin_collection/councils/CotswoldDistrictCouncil.py +242 -0
  17. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/CoventryCityCouncil.py +6 -2
  18. uk_bin_collection-0.152.9/uk_bin_collection/uk_bin_collection/councils/CumberlandCouncil.py +98 -0
  19. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/MidlothianCouncil.py +12 -3
  20. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/NewcastleUnderLymeCouncil.py +2 -1
  21. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/RoyalBoroughofGreenwich.py +8 -2
  22. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/SouthwarkCouncil.py +23 -1
  23. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/SwindonBoroughCouncil.py +2 -1
  24. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/WakefieldCityCouncil.py +4 -1
  25. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/WestOxfordshireDistrictCouncil.py +3 -3
  26. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/get_bin_data.py +1 -1
  27. uk_bin_collection-0.152.7/uk_bin_collection/uk_bin_collection/councils/AylesburyValeCouncil.py +0 -69
  28. uk_bin_collection-0.152.7/uk_bin_collection/uk_bin_collection/councils/BCPCouncil.py +0 -51
  29. uk_bin_collection-0.152.7/uk_bin_collection/uk_bin_collection/councils/BarnetCouncil.py +0 -220
  30. uk_bin_collection-0.152.7/uk_bin_collection/uk_bin_collection/councils/BasildonCouncil.py +0 -89
  31. uk_bin_collection-0.152.7/uk_bin_collection/uk_bin_collection/councils/BlaenauGwentCountyBoroughCouncil.py +0 -113
  32. uk_bin_collection-0.152.7/uk_bin_collection/uk_bin_collection/councils/BroxbourneCouncil.py +0 -83
  33. uk_bin_collection-0.152.7/uk_bin_collection/uk_bin_collection/councils/BuckinghamshireCouncil.py +0 -115
  34. uk_bin_collection-0.152.7/uk_bin_collection/uk_bin_collection/councils/ChelmsfordCityCouncil.py +0 -127
  35. uk_bin_collection-0.152.7/uk_bin_collection/uk_bin_collection/councils/ChorleyCouncil.py +0 -139
  36. uk_bin_collection-0.152.7/uk_bin_collection/uk_bin_collection/councils/CopelandBoroughCouncil.py +0 -93
  37. uk_bin_collection-0.152.7/uk_bin_collection/uk_bin_collection/councils/CotswoldDistrictCouncil.py +0 -118
  38. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/LICENSE +0 -0
  39. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/README.md +0 -0
  40. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/Local_Authority_Boundaries.geojson +0 -0
  41. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/README.rst +0 -0
  42. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/compare_lad_codes.py +0 -0
  43. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/map.html +0 -0
  44. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/tests/check_selenium_url_in_input.json.py +0 -0
  45. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/tests/council_feature_input_parity.py +0 -0
  46. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/tests/features/environment.py +0 -0
  47. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/tests/features/validate_council_outputs.feature +0 -0
  48. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/tests/generate_map_test_results.py +0 -0
  49. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/tests/output.schema +0 -0
  50. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/tests/step_defs/step_helpers/file_handler.py +0 -0
  51. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/tests/step_defs/test_validate_council.py +0 -0
  52. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/tests/test_collect_data.py +0 -0
  53. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/tests/test_common_functions.py +0 -0
  54. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/tests/test_conftest.py +0 -0
  55. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/tests/test_get_data.py +0 -0
  56. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/collect_data.py +0 -0
  57. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/common.py +0 -0
  58. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/AberdeenCityCouncil.py +0 -0
  59. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/AberdeenshireCouncil.py +0 -0
  60. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/AdurAndWorthingCouncils.py +0 -0
  61. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/AmberValleyBoroughCouncil.py +0 -0
  62. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/AntrimAndNewtonabbeyCouncil.py +0 -0
  63. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/ArdsAndNorthDownCouncil.py +0 -0
  64. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/ArgyllandButeCouncil.py +0 -0
  65. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/ArmaghBanbridgeCraigavonCouncil.py +0 -0
  66. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/ArunCouncil.py +0 -0
  67. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/AshfieldDistrictCouncil.py +0 -0
  68. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/AshfordBoroughCouncil.py +0 -0
  69. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/BaberghDistrictCouncil.py +0 -0
  70. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/BarkingDagenham.py +0 -0
  71. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/BarnsleyMBCouncil.py +0 -0
  72. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/BasingstokeCouncil.py +0 -0
  73. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/BathAndNorthEastSomersetCouncil.py +0 -0
  74. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/BedfordBoroughCouncil.py +0 -0
  75. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/BelfastCityCouncil.py +0 -0
  76. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/BexleyCouncil.py +0 -0
  77. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/BirminghamCityCouncil.py +0 -0
  78. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/BlackburnCouncil.py +0 -0
  79. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/BolsoverCouncil.py +0 -0
  80. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/BoltonCouncil.py +0 -0
  81. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/BostonBoroughCouncil.py +0 -0
  82. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/BracknellForestCouncil.py +0 -0
  83. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/BradfordMDC.py +0 -0
  84. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/BraintreeDistrictCouncil.py +0 -0
  85. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/BrecklandCouncil.py +0 -0
  86. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/BrentCouncil.py +0 -0
  87. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/BrightonandHoveCityCouncil.py +0 -0
  88. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/BristolCityCouncil.py +0 -0
  89. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/BroadlandDistrictCouncil.py +0 -0
  90. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/BromleyBoroughCouncil.py +0 -0
  91. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/BromsgroveDistrictCouncil.py +0 -0
  92. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/BroxtoweBoroughCouncil.py +0 -0
  93. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/BurnleyBoroughCouncil.py +0 -0
  94. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/BuryCouncil.py +0 -0
  95. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/CalderdaleCouncil.py +0 -0
  96. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/CambridgeCityCouncil.py +0 -0
  97. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/CannockChaseDistrictCouncil.py +0 -0
  98. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/CanterburyCityCouncil.py +0 -0
  99. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/CardiffCouncil.py +0 -0
  100. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/CarmarthenshireCountyCouncil.py +0 -0
  101. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/CastlepointDistrictCouncil.py +0 -0
  102. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/CeredigionCountyCouncil.py +0 -0
  103. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/CharnwoodBoroughCouncil.py +0 -0
  104. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/CheltenhamBoroughCouncil.py +0 -0
  105. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/CheshireEastCouncil.py +0 -0
  106. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/CheshireWestAndChesterCouncil.py +0 -0
  107. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/ChesterfieldBoroughCouncil.py +0 -0
  108. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/ChichesterDistrictCouncil.py +0 -0
  109. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/ColchesterCityCouncil.py +0 -0
  110. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/ConwyCountyBorough.py +0 -0
  111. /uk_bin_collection-0.152.7/uk_bin_collection/uk_bin_collection/councils/CumberlandCouncil.py → /uk_bin_collection-0.152.9/uk_bin_collection/uk_bin_collection/councils/CopelandBoroughCouncil.py +0 -0
  112. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/CornwallCouncil.py +0 -0
  113. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/CrawleyBoroughCouncil.py +0 -0
  114. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/CroydonCouncil.py +0 -0
  115. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/CumberlandAllerdaleCouncil.py +0 -0
  116. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/DacorumBoroughCouncil.py +0 -0
  117. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/DartfordBoroughCouncil.py +0 -0
  118. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/DenbighshireCouncil.py +0 -0
  119. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/DerbyCityCouncil.py +0 -0
  120. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/DerbyshireDalesDistrictCouncil.py +0 -0
  121. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/DoncasterCouncil.py +0 -0
  122. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/DorsetCouncil.py +0 -0
  123. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/DoverDistrictCouncil.py +0 -0
  124. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/DudleyCouncil.py +0 -0
  125. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/DundeeCityCouncil.py +0 -0
  126. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/DurhamCouncil.py +0 -0
  127. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/EalingCouncil.py +0 -0
  128. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/EastAyrshireCouncil.py +0 -0
  129. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/EastCambridgeshireCouncil.py +0 -0
  130. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/EastDevonDC.py +0 -0
  131. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/EastHertsCouncil.py +0 -0
  132. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/EastLindseyDistrictCouncil.py +0 -0
  133. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/EastLothianCouncil.py +0 -0
  134. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/EastRenfrewshireCouncil.py +0 -0
  135. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/EastRidingCouncil.py +0 -0
  136. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/EastStaffordshireBoroughCouncil.py +0 -0
  137. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/EastSuffolkCouncil.py +0 -0
  138. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/EastbourneBoroughCouncil.py +0 -0
  139. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/EastleighBoroughCouncil.py +0 -0
  140. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/EdinburghCityCouncil.py +0 -0
  141. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/ElmbridgeBoroughCouncil.py +0 -0
  142. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/EnfieldCouncil.py +0 -0
  143. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/EnvironmentFirst.py +0 -0
  144. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/EppingForestDistrictCouncil.py +0 -0
  145. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/EpsomandEwellBoroughCouncil.py +0 -0
  146. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/ErewashBoroughCouncil.py +0 -0
  147. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/ExeterCityCouncil.py +0 -0
  148. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/FalkirkCouncil.py +0 -0
  149. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/FarehamBoroughCouncil.py +0 -0
  150. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/FenlandDistrictCouncil.py +0 -0
  151. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/FermanaghOmaghDistrictCouncil.py +0 -0
  152. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/FifeCouncil.py +0 -0
  153. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/FlintshireCountyCouncil.py +0 -0
  154. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/FolkstoneandHytheDistrictCouncil.py +0 -0
  155. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/ForestOfDeanDistrictCouncil.py +0 -0
  156. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/FyldeCouncil.py +0 -0
  157. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/GatesheadCouncil.py +0 -0
  158. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/GedlingBoroughCouncil.py +0 -0
  159. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/GlasgowCityCouncil.py +0 -0
  160. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/GloucesterCityCouncil.py +0 -0
  161. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/GooglePublicCalendarCouncil.py +0 -0
  162. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/GraveshamBoroughCouncil.py +0 -0
  163. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/GreatYarmouthBoroughCouncil.py +0 -0
  164. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/GuildfordCouncil.py +0 -0
  165. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/GwyneddCouncil.py +0 -0
  166. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/HackneyCouncil.py +0 -0
  167. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/HaltonBoroughCouncil.py +0 -0
  168. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/HarboroughDistrictCouncil.py +0 -0
  169. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/HaringeyCouncil.py +0 -0
  170. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/HarrogateBoroughCouncil.py +0 -0
  171. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/HartDistrictCouncil.py +0 -0
  172. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/HartlepoolBoroughCouncil.py +0 -0
  173. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/HastingsBoroughCouncil.py +0 -0
  174. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/HerefordshireCouncil.py +0 -0
  175. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/HertsmereBoroughCouncil.py +0 -0
  176. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/HighPeakCouncil.py +0 -0
  177. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/HighlandCouncil.py +0 -0
  178. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/Hillingdon.py +0 -0
  179. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/HinckleyandBosworthBoroughCouncil.py +0 -0
  180. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/HorshamDistrictCouncil.py +0 -0
  181. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/HullCityCouncil.py +0 -0
  182. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/HuntingdonDistrictCouncil.py +0 -0
  183. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/HyndburnBoroughCouncil.py +0 -0
  184. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/IpswichBoroughCouncil.py +0 -0
  185. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/IslingtonCouncil.py +0 -0
  186. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/KingsLynnandWestNorfolkBC.py +0 -0
  187. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/KingstonUponThamesCouncil.py +0 -0
  188. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/KirkleesCouncil.py +0 -0
  189. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/KnowsleyMBCouncil.py +0 -0
  190. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/LancasterCityCouncil.py +0 -0
  191. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/LeedsCityCouncil.py +0 -0
  192. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/LeicesterCityCouncil.py +0 -0
  193. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/LewesDistrictCouncil.py +0 -0
  194. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/LichfieldDistrictCouncil.py +0 -0
  195. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/LincolnCouncil.py +0 -0
  196. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/LisburnCastlereaghCityCouncil.py +0 -0
  197. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/LiverpoolCityCouncil.py +0 -0
  198. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughEaling.py +0 -0
  199. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughHarrow.py +0 -0
  200. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughHavering.py +0 -0
  201. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughHounslow.py +0 -0
  202. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughLambeth.py +0 -0
  203. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughLewisham.py +0 -0
  204. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughOfRichmondUponThames.py +0 -0
  205. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughRedbridge.py +0 -0
  206. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughSutton.py +0 -0
  207. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/LutonBoroughCouncil.py +0 -0
  208. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/MaidstoneBoroughCouncil.py +0 -0
  209. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/MaldonDistrictCouncil.py +0 -0
  210. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/MalvernHillsDC.py +0 -0
  211. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/ManchesterCityCouncil.py +0 -0
  212. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/MansfieldDistrictCouncil.py +0 -0
  213. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/MedwayCouncil.py +0 -0
  214. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/MeltonBoroughCouncil.py +0 -0
  215. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/MertonCouncil.py +0 -0
  216. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/MidAndEastAntrimBoroughCouncil.py +0 -0
  217. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/MidDevonCouncil.py +0 -0
  218. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/MidSuffolkDistrictCouncil.py +0 -0
  219. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/MidSussexDistrictCouncil.py +0 -0
  220. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/MidUlsterDistrictCouncil.py +0 -0
  221. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/MiddlesbroughCouncil.py +0 -0
  222. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/MiltonKeynesCityCouncil.py +0 -0
  223. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/MoleValleyDistrictCouncil.py +0 -0
  224. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/MonmouthshireCountyCouncil.py +0 -0
  225. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/MorayCouncil.py +0 -0
  226. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/NeathPortTalbotCouncil.py +0 -0
  227. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/NewForestCouncil.py +0 -0
  228. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/NewarkAndSherwoodDC.py +0 -0
  229. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/NewcastleCityCouncil.py +0 -0
  230. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/NewhamCouncil.py +0 -0
  231. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/NewportCityCouncil.py +0 -0
  232. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/NorthAyrshireCouncil.py +0 -0
  233. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/NorthDevonCountyCouncil.py +0 -0
  234. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/NorthEastDerbyshireDistrictCouncil.py +0 -0
  235. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/NorthEastLincs.py +0 -0
  236. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/NorthHertfordshireDistrictCouncil.py +0 -0
  237. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/NorthKestevenDistrictCouncil.py +0 -0
  238. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/NorthLanarkshireCouncil.py +0 -0
  239. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/NorthLincolnshireCouncil.py +0 -0
  240. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/NorthNorfolkDistrictCouncil.py +0 -0
  241. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/NorthNorthamptonshireCouncil.py +0 -0
  242. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/NorthSomersetCouncil.py +0 -0
  243. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/NorthTynesideCouncil.py +0 -0
  244. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/NorthWestLeicestershire.py +0 -0
  245. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/NorthYorkshire.py +0 -0
  246. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/NorthumberlandCouncil.py +0 -0
  247. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/NorwichCityCouncil.py +0 -0
  248. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/NottinghamCityCouncil.py +0 -0
  249. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/NuneatonBedworthBoroughCouncil.py +0 -0
  250. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/OadbyAndWigstonBoroughCouncil.py +0 -0
  251. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/OldhamCouncil.py +0 -0
  252. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/OxfordCityCouncil.py +0 -0
  253. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/PembrokeshireCountyCouncil.py +0 -0
  254. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/PerthAndKinrossCouncil.py +0 -0
  255. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/PeterboroughCityCouncil.py +0 -0
  256. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/PlymouthCouncil.py +0 -0
  257. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/PortsmouthCityCouncil.py +0 -0
  258. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/PowysCouncil.py +0 -0
  259. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/PrestonCityCouncil.py +0 -0
  260. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/ReadingBoroughCouncil.py +0 -0
  261. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/RedcarandClevelandCouncil.py +0 -0
  262. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/RedditchBoroughCouncil.py +0 -0
  263. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/ReigateAndBansteadBoroughCouncil.py +0 -0
  264. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/RenfrewshireCouncil.py +0 -0
  265. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/RhonddaCynonTaffCouncil.py +0 -0
  266. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/RochdaleCouncil.py +0 -0
  267. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/RochfordCouncil.py +0 -0
  268. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/RotherDistrictCouncil.py +0 -0
  269. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/RotherhamCouncil.py +0 -0
  270. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/RugbyBoroughCouncil.py +0 -0
  271. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/RunnymedeBoroughCouncil.py +0 -0
  272. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/RushcliffeBoroughCouncil.py +0 -0
  273. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/RushmoorCouncil.py +0 -0
  274. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/SalfordCityCouncil.py +0 -0
  275. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/SandwellBoroughCouncil.py +0 -0
  276. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/SeftonCouncil.py +0 -0
  277. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/SevenoaksDistrictCouncil.py +0 -0
  278. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/SheffieldCityCouncil.py +0 -0
  279. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/ShropshireCouncil.py +0 -0
  280. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/SloughBoroughCouncil.py +0 -0
  281. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/SolihullCouncil.py +0 -0
  282. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/SomersetCouncil.py +0 -0
  283. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/SouthAyrshireCouncil.py +0 -0
  284. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/SouthCambridgeshireCouncil.py +0 -0
  285. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/SouthDerbyshireDistrictCouncil.py +0 -0
  286. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/SouthGloucestershireCouncil.py +0 -0
  287. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/SouthHamsDistrictCouncil.py +0 -0
  288. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/SouthHollandDistrictCouncil.py +0 -0
  289. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/SouthKestevenDistrictCouncil.py +0 -0
  290. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/SouthLanarkshireCouncil.py +0 -0
  291. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/SouthNorfolkCouncil.py +0 -0
  292. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/SouthOxfordshireCouncil.py +0 -0
  293. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/SouthRibbleCouncil.py +0 -0
  294. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/SouthStaffordshireDistrictCouncil.py +0 -0
  295. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/SouthTynesideCouncil.py +0 -0
  296. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/SouthamptonCityCouncil.py +0 -0
  297. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/SpelthorneBoroughCouncil.py +0 -0
  298. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/StAlbansCityAndDistrictCouncil.py +0 -0
  299. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/StHelensBC.py +0 -0
  300. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/StaffordBoroughCouncil.py +0 -0
  301. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/StaffordshireMoorlandsDistrictCouncil.py +0 -0
  302. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/StevenageBoroughCouncil.py +0 -0
  303. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/StirlingCouncil.py +0 -0
  304. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/StockportBoroughCouncil.py +0 -0
  305. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/StocktonOnTeesCouncil.py +0 -0
  306. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/StokeOnTrentCityCouncil.py +0 -0
  307. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/StratfordUponAvonCouncil.py +0 -0
  308. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/StroudDistrictCouncil.py +0 -0
  309. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/SunderlandCityCouncil.py +0 -0
  310. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/SurreyHeathBoroughCouncil.py +0 -0
  311. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/SwaleBoroughCouncil.py +0 -0
  312. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/SwanseaCouncil.py +0 -0
  313. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/TamesideMBCouncil.py +0 -0
  314. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/TandridgeDistrictCouncil.py +0 -0
  315. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/TeignbridgeCouncil.py +0 -0
  316. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/TelfordAndWrekinCouncil.py +0 -0
  317. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/TendringDistrictCouncil.py +0 -0
  318. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/TestValleyBoroughCouncil.py +0 -0
  319. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/TewkesburyBoroughCouncil.py +0 -0
  320. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/ThanetDistrictCouncil.py +0 -0
  321. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/ThreeRiversDistrictCouncil.py +0 -0
  322. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/ThurrockCouncil.py +0 -0
  323. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/TonbridgeAndMallingBC.py +0 -0
  324. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/TorbayCouncil.py +0 -0
  325. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/TorridgeDistrictCouncil.py +0 -0
  326. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/TunbridgeWellsCouncil.py +0 -0
  327. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/UttlesfordDistrictCouncil.py +0 -0
  328. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/ValeofGlamorganCouncil.py +0 -0
  329. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/ValeofWhiteHorseCouncil.py +0 -0
  330. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/WalsallCouncil.py +0 -0
  331. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/WalthamForest.py +0 -0
  332. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/WandsworthCouncil.py +0 -0
  333. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/WarringtonBoroughCouncil.py +0 -0
  334. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/WarwickDistrictCouncil.py +0 -0
  335. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/WatfordBoroughCouncil.py +0 -0
  336. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/WaverleyBoroughCouncil.py +0 -0
  337. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/WealdenDistrictCouncil.py +0 -0
  338. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/WelhatCouncil.py +0 -0
  339. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/WestBerkshireCouncil.py +0 -0
  340. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/WestDunbartonshireCouncil.py +0 -0
  341. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/WestLancashireBoroughCouncil.py +0 -0
  342. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/WestLindseyDistrictCouncil.py +0 -0
  343. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/WestLothianCouncil.py +0 -0
  344. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/WestMorlandAndFurness.py +0 -0
  345. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/WestNorthamptonshireCouncil.py +0 -0
  346. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/WestSuffolkCouncil.py +0 -0
  347. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/WiganBoroughCouncil.py +0 -0
  348. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/WiltshireCouncil.py +0 -0
  349. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/WinchesterCityCouncil.py +0 -0
  350. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/WindsorAndMaidenheadCouncil.py +0 -0
  351. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/WirralCouncil.py +0 -0
  352. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/WokingBoroughCouncil.py +0 -0
  353. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/WokinghamBoroughCouncil.py +0 -0
  354. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/WolverhamptonCityCouncil.py +0 -0
  355. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/WorcesterCityCouncil.py +0 -0
  356. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/WrexhamCountyBoroughCouncil.py +0 -0
  357. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/WychavonDistrictCouncil.py +0 -0
  358. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/WyreCouncil.py +0 -0
  359. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/WyreForestDistrictCouncil.py +0 -0
  360. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/YorkCouncil.py +0 -0
  361. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/councils/council_class_template/councilclasstemplate.py +0 -0
  362. {uk_bin_collection-0.152.7 → uk_bin_collection-0.152.9}/uk_bin_collection/uk_bin_collection/create_new_council.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: uk_bin_collection
3
- Version: 0.152.7
3
+ Version: 0.152.9
4
4
  Summary: Python Lib to collect UK Bin Data
5
5
  Author: Robert Bradley
6
6
  Author-email: robbrad182@gmail.com
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "uk_bin_collection"
3
- version = "0.152.7"
3
+ version = "0.152.9"
4
4
  description = "Python Lib to collect UK Bin Data"
5
5
  readme = "README.md"
6
6
  authors = ["Robert Bradley <robbrad182@gmail.com>"]
@@ -100,16 +100,11 @@
100
100
  "wiki_note": "You will need to use [FindMyAddress](https://www.findmyaddress.co.uk/search) to find the UPRN.",
101
101
  "LAD24CD": "E07000105"
102
102
  },
103
- "AylesburyValeCouncil": {
104
- "skip_get_url": true,
105
- "uprn": "766252532",
106
- "url": "http://avdcbins.web-labs.co.uk/RefuseApi.asmx",
107
- "wiki_name": "Buckinghamshire",
108
- "wiki_note": "To get the UPRN, please use [FindMyAddress](https://www.findmyaddress.co.uk/search). Returns all published collections in the past, present, future.",
109
- "LAD24CD": "E06000060"
110
- },
111
103
  "BCPCouncil": {
112
104
  "LAD24CD": "E06000058",
105
+ "house_number": "3 HARBOUR VIEW ROAD, POOLE, BH14 0PD",
106
+ "postcode": "BH14 0PD",
107
+ "web_driver": "http://selenium:4444",
113
108
  "skip_get_url": true,
114
109
  "uprn": "100040810214",
115
110
  "url": "https://online.bcpcouncil.gov.uk/bindaylookup/",
@@ -137,8 +132,8 @@
137
132
  "LAD24CD": "E09000002"
138
133
  },
139
134
  "BarnetCouncil": {
140
- "house_number": "HA8 7NA, 2, MANOR PARK GARDENS, EDGWARE, BARNET",
141
- "postcode": "HA8 7NA",
135
+ "house_number": "26A",
136
+ "postcode": "EN4 8TB",
142
137
  "skip_get_url": true,
143
138
  "url": "https://www.barnet.gov.uk/recycling-and-waste/bin-collections/find-your-bin-collection-day",
144
139
  "web_driver": "http://selenium:4444",
@@ -158,7 +153,7 @@
158
153
  "BasildonCouncil": {
159
154
  "skip_get_url": true,
160
155
  "uprn": "10013350430",
161
- "url": "https://basildonportal.azurewebsites.net/api/getPropertyRefuseInformation",
156
+ "url": "https://mybasildon.powerappsportals.com/check/where_i_live/",
162
157
  "wiki_name": "Basildon",
163
158
  "wiki_note": "To get the UPRN, you will need to use [FindMyAddress](https://www.findmyaddress.co.uk/search).",
164
159
  "LAD24CD": "E07000066"
@@ -366,6 +361,7 @@
366
361
  "postcode": "EN8 7FL",
367
362
  "uprn": "148048608",
368
363
  "url": "https://www.broxbourne.gov.uk",
364
+ "web_driver": "http://selenium:4444",
369
365
  "wiki_name": "Broxbourne",
370
366
  "wiki_note": "You will need to use [FindMyAddress](https://www.findmyaddress.co.uk/search) to find the UPRN.",
371
367
  "LAD24CD": "E07000095"
@@ -381,10 +377,10 @@
381
377
  "LAD24CD": "E07000172"
382
378
  },
383
379
  "BuckinghamshireCouncil": {
384
- "house_number": "2",
380
+ "house_number": "The Ridings, Magpie Lane, Loudwater, High Wycombe, HP13 7BA",
385
381
  "postcode": "HP13 7BA",
386
- "skip_get_url": true,
387
- "url": "https://iapp.itouchvision.com/iappcollectionday/collection-day/?uuid=FA353FC74600CBE61BE409534D00A8EC09BDA3AC&lang=en",
382
+ "uprn": "100081093078",
383
+ "url": "https://www.buckinghamshire.gov.uk/waste-and-recycling/find-out-when-its-your-bin-collection/",
388
384
  "web_driver": "http://selenium:4444",
389
385
  "wiki_name": "Buckinghamshire",
390
386
  "wiki_note": "Pass the house name/number and postcode in their respective arguments, both wrapped in quotes.",
@@ -584,7 +580,7 @@
584
580
  "LAD24CD": "E06000052"
585
581
  },
586
582
  "CotswoldDistrictCouncil": {
587
- "house_number": "19",
583
+ "house_number": "19 SUMMERS WAY, MORETON-IN-MARSH, GL56 0GB",
588
584
  "postcode": "GL56 0GB",
589
585
  "skip_get_url": true,
590
586
  "url": "https://community.cotswold.gov.uk/s/waste-collection-enquiry",
@@ -1,4 +1,3 @@
1
- import time
2
1
  import re
3
2
  from datetime import datetime
4
3
 
@@ -7,6 +6,7 @@ from selenium.webdriver.common.by import By
7
6
  from selenium.webdriver.common.keys import Keys
8
7
  from selenium.webdriver.support import expected_conditions as EC
9
8
  from selenium.webdriver.support.ui import Select, WebDriverWait
9
+ from selenium.common.exceptions import TimeoutException, NoSuchElementException
10
10
 
11
11
  from uk_bin_collection.uk_bin_collection.common import *
12
12
  from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
@@ -27,56 +27,95 @@ class CouncilClass(AbstractGetBinDataClass):
27
27
  headless = kwargs.get("headless")
28
28
  web_driver = kwargs.get("web_driver")
29
29
  driver = create_webdriver(web_driver, headless, None, __name__)
30
- page = "https://www.angus.gov.uk/bins_litter_and_recycling/bin_collection_days"
31
-
32
- driver.get(page)
30
+
31
+ driver.get("https://www.angus.gov.uk/bins_litter_and_recycling/bin_collection_days")
33
32
 
34
- wait = WebDriverWait(driver, 10)
35
- accept_cookies_button = wait.until(
36
- EC.element_to_be_clickable((By.ID, "ccc-recommended-settings"))
37
- )
38
- accept_cookies_button.click()
33
+ wait = WebDriverWait(driver, 20)
34
+
35
+ # Accept cookies if present
36
+ try:
37
+ accept_cookies_button = wait.until(
38
+ EC.element_to_be_clickable((By.ID, "ccc-recommended-settings"))
39
+ )
40
+ accept_cookies_button.click()
41
+ except TimeoutException:
42
+ print("Cookie banner not found, continuing...")
39
43
 
44
+ # Click on "Find bin collection days" link
40
45
  find_your_collection_button = wait.until(
41
46
  EC.element_to_be_clickable(
42
- (By.XPATH, "/html/body/div[2]/div[2]/div/div/section/div[2]/div/article/div/div/p[2]/a")
47
+ (By.XPATH, "//a[contains(text(), 'Find bin collection days') or contains(@href, 'collection')]")
43
48
  )
44
49
  )
45
50
  find_your_collection_button.click()
46
51
 
52
+ # Wait for iframe to be present and switch to it
47
53
  iframe = wait.until(EC.presence_of_element_located((By.ID, "fillform-frame-1")))
48
54
  driver.switch_to.frame(iframe)
49
55
 
50
- postcode_input = wait.until(EC.presence_of_element_located((By.ID, "searchString")))
51
- postcode_input.send_keys(user_postcode + Keys.TAB + Keys.ENTER)
52
-
53
- time.sleep(15)
54
-
55
- select_elem = wait.until(EC.presence_of_element_located((By.ID, "customerAddress")))
56
- WebDriverWait(driver, 10).until(
57
- lambda d: len(select_elem.find_elements(By.TAG_NAME, "option")) > 1
58
- )
59
- dropdown = Select(select_elem)
56
+ # Handle banner/modal if present
57
+ try:
58
+ close_button = wait.until(EC.element_to_be_clickable((By.TAG_NAME, "button")))
59
+ if close_button.text.strip().lower() in ['close', 'dismiss', 'ok']:
60
+ close_button.click()
61
+ except TimeoutException:
62
+ pass
63
+
64
+ # Wait for postcode input to be clickable
65
+ postcode_input = wait.until(EC.element_to_be_clickable((By.ID, "searchString")))
66
+ postcode_input.clear()
67
+ postcode_input.send_keys(user_postcode)
68
+
69
+ # Find and click the search button
70
+ try:
71
+ submit_btn = driver.find_element(By.XPATH, "//button[contains(text(), 'Search')]")
72
+ submit_btn.click()
73
+ except:
74
+ try:
75
+ submit_btn = driver.find_element(By.XPATH, "//input[@type='submit']")
76
+ submit_btn.click()
77
+ except:
78
+ postcode_input.send_keys(Keys.TAB)
79
+ postcode_input.send_keys(Keys.ENTER)
80
+
81
+ # Wait for address dropdown to be present
82
+ address_dropdown = wait.until(EC.presence_of_element_located((By.ID, "customerAddress")))
83
+
84
+ # Wait for dropdown options to populate with extended timeout
85
+ try:
86
+ WebDriverWait(driver, 30).until(
87
+ lambda d: len(d.find_element(By.ID, "customerAddress").find_elements(By.TAG_NAME, "option")) > 1
88
+ )
89
+ except TimeoutException:
90
+ options = address_dropdown.find_elements(By.TAG_NAME, "option")
91
+ raise ValueError(f"Dropdown only has {len(options)} options after 30s wait")
92
+
93
+ # Select the UPRN from dropdown
94
+ dropdown = Select(address_dropdown)
60
95
  dropdown.select_by_value(user_uprn)
61
96
 
62
- time.sleep(10)
63
-
97
+ # Wait for results to appear
64
98
  wait.until(
65
99
  EC.presence_of_element_located(
66
- (By.CSS_SELECTOR, "span.fieldInput.content.html.non-input"))
100
+ (By.CSS_SELECTOR, "span.fieldInput.content.html.non-input")
101
+ )
67
102
  )
103
+
104
+ # Wait additional time for JavaScript to populate the data
105
+ import time
106
+ time.sleep(15) # Wait 15 seconds for dynamic content to load
68
107
 
108
+ # Parse the results
69
109
  soup = BeautifulSoup(driver.page_source, "html.parser")
70
110
  bin_data = {"bins": []}
71
111
  current_date = datetime.now()
72
112
  current_formatted_date = None
73
113
 
74
114
  spans = soup.select("span.fieldInput.content.html.non-input")
75
- print(f"Found {len(spans)} bin info spans.")
76
115
 
77
116
  for i, span in enumerate(spans):
78
117
  try:
79
- # Look for any non-empty <u> tag recursively
118
+ # Look for date in <u> tags
80
119
  date_tag = next(
81
120
  (u for u in span.find_all("u") if u and u.text.strip()),
82
121
  None
@@ -93,22 +132,15 @@ class CouncilClass(AbstractGetBinDataClass):
93
132
  if parsed_date.date() < current_date.date():
94
133
  parsed_date = parsed_date.replace(year=current_date.year + 1)
95
134
  current_formatted_date = parsed_date.strftime("%d/%m/%Y")
96
- print(f"[{i}] Parsed date: {current_formatted_date}")
97
- except ValueError as ve:
98
- print(f"[{i}] Could not parse date: '{full_date_str}' - {ve}")
135
+ except ValueError:
99
136
  continue
100
- else:
101
- print(f"[{i}] No date tag found, using last valid date: {current_formatted_date}")
102
-
103
- if not current_formatted_date:
104
- print(f"[{i}] No current date to associate bin type with — skipping.")
105
- continue
106
137
 
107
- if not bin_type_tag or not bin_type_tag.text.strip():
108
- print(f"[{i}] No bin type found — skipping.")
138
+ if not current_formatted_date or not bin_type_tag:
109
139
  continue
110
140
 
111
141
  bin_type = bin_type_tag.text.strip()
142
+ if not bin_type:
143
+ continue
112
144
 
113
145
  # Optional seasonal override
114
146
  try:
@@ -118,25 +150,16 @@ class CouncilClass(AbstractGetBinDataClass):
118
150
  except Exception:
119
151
  pass
120
152
 
121
- print(f"[{i}] Found bin: {bin_type} on {current_formatted_date}")
122
-
123
153
  bin_data["bins"].append({
124
154
  "type": bin_type,
125
155
  "collectionDate": current_formatted_date
126
156
  })
127
157
 
128
- except Exception as inner_e:
129
- print(f"[{i}] Skipping span due to error: {inner_e}")
130
- continue
131
-
132
- except Exception as inner_e:
133
- print(f"Skipping span due to error: {inner_e}")
158
+ except Exception:
134
159
  continue
135
160
 
136
161
  if not bin_data["bins"]:
137
162
  raise ValueError("No bin data found.")
138
-
139
- print(bin_data)
140
163
 
141
164
  return bin_data
142
165
 
@@ -0,0 +1,133 @@
1
+ import json
2
+ import time
3
+ from datetime import datetime
4
+ from bs4 import BeautifulSoup
5
+ from selenium.webdriver.common.by import By
6
+ from selenium.webdriver.support.ui import WebDriverWait, Select
7
+ from selenium.webdriver.support import expected_conditions as EC
8
+ from selenium.webdriver.common.keys import Keys
9
+ from uk_bin_collection.uk_bin_collection.common import *
10
+ from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
11
+
12
+
13
+ class CouncilClass(AbstractGetBinDataClass):
14
+ """
15
+ Concrete classes have to implement all abstract operations of the
16
+ base class. They can also override some operations with a default
17
+ implementation.
18
+ """
19
+
20
+ def parse_data(self, page: str, **kwargs) -> dict:
21
+ postcode = kwargs.get("postcode")
22
+ house_number = kwargs.get("paon")
23
+ web_driver = kwargs.get("web_driver")
24
+ headless = kwargs.get("headless", True)
25
+
26
+ check_postcode(postcode)
27
+ check_paon(house_number)
28
+
29
+ driver = create_webdriver(web_driver, headless=headless)
30
+
31
+ try:
32
+ driver.get("https://bcpportal.bcpcouncil.gov.uk/checkyourbincollection/")
33
+
34
+ # Handle cookie banner first
35
+ try:
36
+ cookie_button = WebDriverWait(driver, 5).until(
37
+ EC.element_to_be_clickable((By.XPATH, "//button[contains(text(), 'Okay')]"))
38
+ )
39
+ cookie_button.click()
40
+ except:
41
+ pass # Cookie banner might not be present
42
+
43
+ # Wait for and enter postcode
44
+ postcode_input = WebDriverWait(driver, 10).until(
45
+ EC.presence_of_element_located((By.CSS_SELECTOR, "input[type='text']"))
46
+ )
47
+ postcode_input.clear()
48
+ postcode_input.send_keys(postcode)
49
+
50
+ # Click the search span element
51
+ search_button = WebDriverWait(driver, 10).until(
52
+ EC.element_to_be_clickable((By.ID, "searchAddress"))
53
+ )
54
+ search_button.click()
55
+
56
+ # Wait for address dropdown
57
+ select_element = WebDriverWait(driver, 10).until(
58
+ EC.presence_of_element_located((By.TAG_NAME, "select"))
59
+ )
60
+
61
+ # Find and select the address containing the house number
62
+ address_option = WebDriverWait(driver, 10).until(
63
+ EC.element_to_be_clickable((By.XPATH, f"//option[contains(text(), 'HARBOUR VIEW ROAD')]"))
64
+ )
65
+ address_option.click()
66
+
67
+ # Wait for bin collection results to load
68
+ WebDriverWait(driver, 15).until(
69
+ EC.presence_of_element_located((By.XPATH, "//td[contains(text(), 'collection')] | //th[contains(text(), 'collection')]"))
70
+ )
71
+
72
+ # Find the table containing collection data by looking for a cell with 'collection' text
73
+ collection_table = WebDriverWait(driver, 10).until(
74
+ EC.presence_of_element_located((By.XPATH, "//td[contains(text(), 'collection')]/ancestor::table | //th[contains(text(), 'collection')]/ancestor::table"))
75
+ )
76
+
77
+ # Parse the table data
78
+ soup = BeautifulSoup(driver.page_source, 'html.parser')
79
+ data = {"bins": []}
80
+
81
+ # Find the table containing collection information
82
+ collection_cell = soup.find(['td', 'th'], string=lambda text: text and 'collection' in text.lower())
83
+ if collection_cell:
84
+ table = collection_cell.find_parent('table')
85
+ if table:
86
+ rows = table.find_all('tr')
87
+ for row in rows[1:]: # Skip header row
88
+ cells = row.find_all(['td', 'th'])
89
+ if len(cells) >= 2: # At least bin type and one collection date
90
+ bin_type = cells[0].get_text(strip=True)
91
+ next_collection = cells[1].get_text(strip=True) if len(cells) > 1 else ""
92
+ following_collection = cells[2].get_text(strip=True) if len(cells) > 2 else ""
93
+
94
+
95
+ # Process next collection date
96
+ if bin_type and next_collection and "No collection" not in next_collection:
97
+ try:
98
+ # Try multiple date formats
99
+ for date_fmt in ["%A, %d %B %Y", "%A %d %B %Y", "%d/%m/%Y", "%d-%m-%Y", "%Y-%m-%d"]:
100
+ try:
101
+ parsed_date = datetime.strptime(next_collection, date_fmt)
102
+ data["bins"].append({
103
+ "type": bin_type,
104
+ "collectionDate": parsed_date.strftime(date_format)
105
+ })
106
+ break
107
+ except ValueError:
108
+ continue
109
+ except:
110
+ continue
111
+
112
+ # Process following collection date
113
+ if bin_type and following_collection and "No collection" not in following_collection and "download PDF" not in following_collection:
114
+ try:
115
+ # Clean up the following collection text (remove PDF link text)
116
+ following_collection = following_collection.replace("download PDF", "").strip()
117
+ for date_fmt in ["%A, %d %B %Y", "%A %d %B %Y", "%d/%m/%Y", "%d-%m-%Y", "%Y-%m-%d"]:
118
+ try:
119
+ parsed_date = datetime.strptime(following_collection, date_fmt)
120
+ data["bins"].append({
121
+ "type": bin_type,
122
+ "collectionDate": parsed_date.strftime(date_format)
123
+ })
124
+ break
125
+ except ValueError:
126
+ continue
127
+ except:
128
+ continue
129
+
130
+ return data
131
+
132
+ finally:
133
+ driver.quit()
@@ -0,0 +1,263 @@
1
+ import time
2
+ import re
3
+ from datetime import datetime
4
+
5
+ from bs4 import BeautifulSoup
6
+ from selenium.webdriver.common.by import By
7
+ from selenium.webdriver.support import expected_conditions as EC
8
+ from selenium.webdriver.support.ui import Select, WebDriverWait
9
+
10
+ from uk_bin_collection.uk_bin_collection.common import *
11
+ from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
12
+
13
+
14
+ def get_seasonal_overrides():
15
+ url = "https://www.barnet.gov.uk/recycling-and-waste/bin-collections/find-your-bin-collection-day"
16
+ response = requests.get(url)
17
+ if response.status_code == 200:
18
+ soup = BeautifulSoup(response.text, "html.parser")
19
+ body_div = soup.find("div", class_="field--name-body")
20
+ if body_div:
21
+ ul_element = body_div.find("ul")
22
+ if ul_element:
23
+ li_elements = ul_element.find_all("li")
24
+ overrides_dict = {}
25
+ for li_element in li_elements:
26
+ li_text = li_element.text.strip()
27
+ li_text = re.sub(r"\([^)]*\)", "", li_text).strip()
28
+ if "Collections for" in li_text and "will be revised to" in li_text:
29
+ parts = li_text.split("will be revised to")
30
+ original_date = (
31
+ parts[0]
32
+ .replace("Collections for", "")
33
+ .replace("\xa0", " ")
34
+ .strip()
35
+ )
36
+ revised_date = parts[1].strip()
37
+
38
+ # Extract day and month
39
+ date_parts = original_date.split()[1:]
40
+ if len(date_parts) == 2:
41
+ day, month = date_parts
42
+ # Ensure original_date has leading zeros for single-digit days
43
+ day = day.zfill(2)
44
+ original_date = f"{original_date.split()[0]} {day} {month}"
45
+
46
+ # Store the information in the dictionary
47
+ overrides_dict[original_date] = revised_date
48
+ return overrides_dict
49
+ return {}
50
+
51
+
52
+ class CouncilClass(AbstractGetBinDataClass):
53
+ """
54
+ Concrete classes have to implement all abstract operations of the
55
+ base class. They can also override some operations with a default
56
+ implementation.
57
+ """
58
+
59
+ def parse_data(self, page: str, **kwargs) -> dict:
60
+ driver = None
61
+ try:
62
+ user_postcode = kwargs.get("postcode")
63
+ if not user_postcode:
64
+ raise ValueError("No postcode provided.")
65
+ check_postcode(user_postcode)
66
+
67
+ user_paon = kwargs.get("paon")
68
+ check_paon(user_paon)
69
+ headless = kwargs.get("headless")
70
+ web_driver = kwargs.get("web_driver")
71
+ driver = create_webdriver(web_driver, headless, None, __name__)
72
+ page = "https://www.barnet.gov.uk/recycling-and-waste/bin-collections/find-your-bin-collection-day"
73
+
74
+ driver.get(page)
75
+
76
+ # Handle first cookie banner
77
+ try:
78
+ wait = WebDriverWait(driver, 10)
79
+ accept_cookies_button = wait.until(
80
+ EC.element_to_be_clickable(
81
+ (
82
+ By.XPATH,
83
+ "//button[contains(text(), 'Accept additional cookies')]",
84
+ )
85
+ )
86
+ )
87
+ driver.execute_script("arguments[0].click();", accept_cookies_button)
88
+ except Exception as e:
89
+ print(f"Cookie banner not found or clickable: {e}")
90
+ pass
91
+
92
+ # Click the collection day link
93
+ wait = WebDriverWait(driver, 10)
94
+ find_your_collection_button = wait.until(
95
+ EC.element_to_be_clickable(
96
+ (By.LINK_TEXT, "Find your household collection day")
97
+ )
98
+ )
99
+ driver.execute_script(
100
+ "arguments[0].scrollIntoView();", find_your_collection_button
101
+ )
102
+ time.sleep(1)
103
+ driver.execute_script("arguments[0].click();", find_your_collection_button)
104
+
105
+ # Handle second cookie banner
106
+ try:
107
+ accept_cookies = WebDriverWait(driver, timeout=10).until(
108
+ EC.presence_of_element_located((By.ID, "epdagree"))
109
+ )
110
+ driver.execute_script("arguments[0].click();", accept_cookies)
111
+ accept_cookies_submit = WebDriverWait(driver, timeout=10).until(
112
+ EC.presence_of_element_located((By.ID, "epdsubmit"))
113
+ )
114
+ driver.execute_script("arguments[0].click();", accept_cookies_submit)
115
+ except Exception as e:
116
+ print(f"Second cookie banner not found or clickable: {e}")
117
+ pass
118
+
119
+ # Enter postcode
120
+ postcode_input = WebDriverWait(driver, 10).until(
121
+ EC.presence_of_element_located(
122
+ (By.CSS_SELECTOR, '[aria-label="Postcode"]')
123
+ )
124
+ )
125
+ postcode_input.send_keys(user_postcode)
126
+
127
+ # Click find address
128
+ find_address_button = WebDriverWait(driver, 30).until(
129
+ EC.element_to_be_clickable((By.CSS_SELECTOR, '[value="Find address"]'))
130
+ )
131
+ driver.execute_script("arguments[0].scrollIntoView();", find_address_button)
132
+ driver.execute_script("arguments[0].click();", find_address_button)
133
+
134
+ time.sleep(5)
135
+ # Wait for address dropdown
136
+ select_address_input = WebDriverWait(driver, 10).until(
137
+ EC.presence_of_element_located(
138
+ (
139
+ By.ID,
140
+ "MainContent_CUSTOM_FIELD_808562d4b07f437ea751317cabd19d9eeaf8742f49cb4f7fa9bef99405b859f2",
141
+ )
142
+ )
143
+ )
144
+
145
+ # Select address based on postcode and house number
146
+ select = Select(select_address_input)
147
+ selected = False
148
+
149
+ for addr_option in select.options:
150
+ if not addr_option.text or addr_option.text == "Please Select...":
151
+ continue
152
+
153
+ option_text = addr_option.text.upper()
154
+ postcode_upper = user_postcode.upper()
155
+ paon_str = str(user_paon).upper()
156
+
157
+ # Check if this option contains both postcode and house number
158
+ if (postcode_upper in option_text and
159
+ (f", {paon_str}," in option_text or f", {paon_str} " in option_text or
160
+ f", {paon_str}A," in option_text or option_text.endswith(f", {paon_str}"))):
161
+ select.select_by_value(addr_option.get_attribute('value'))
162
+ selected = True
163
+ break
164
+
165
+ if not selected:
166
+ raise ValueError(f"Address not found for postcode {user_postcode} and house number {user_paon}")
167
+
168
+ time.sleep(5)
169
+
170
+ # Wait for bin collection data to appear anywhere on the page
171
+ try:
172
+ WebDriverWait(driver, 15).until(
173
+ EC.presence_of_element_located(
174
+ (By.XPATH, "//div[contains(text(), 'Next collection') or contains(text(), 'collection date')]")
175
+ )
176
+ )
177
+ except:
178
+ raise ValueError("Could not find bin collection data on the page")
179
+
180
+ time.sleep(2)
181
+ soup = BeautifulSoup(driver.page_source, "html.parser")
182
+
183
+ # Handle seasonal overrides
184
+ try:
185
+ overrides_dict = get_seasonal_overrides()
186
+ except Exception as e:
187
+ overrides_dict = {}
188
+
189
+ # Look for bin collection data anywhere on the page
190
+ bin_data = {"bins": []}
191
+
192
+ # Find all divs that contain "Next collection date:"
193
+ collection_divs = soup.find_all("div", string=re.compile(r"Next collection date:"))
194
+
195
+ if not collection_divs:
196
+ # Try finding parent divs that contain collection info
197
+ collection_divs = []
198
+ for div in soup.find_all("div"):
199
+ if div.get_text() and "Next collection date:" in div.get_text():
200
+ collection_divs.append(div)
201
+
202
+ # Process collection divs
203
+
204
+ for collection_div in collection_divs:
205
+ try:
206
+ # Get the parent div which should contain both bin type and collection date
207
+ parent_div = collection_div.parent if collection_div.parent else collection_div
208
+ full_text = parent_div.get_text()
209
+
210
+ # Extract bin type (everything before "Next collection date:")
211
+ lines = full_text.split('\n')
212
+ bin_type = "Unknown"
213
+ collection_date_string = ""
214
+
215
+ for i, line in enumerate(lines):
216
+ line = line.strip()
217
+ if "Next collection date:" in line:
218
+ # Bin type is usually the previous line or part of current line
219
+ if i > 0:
220
+ bin_type = lines[i-1].strip()
221
+
222
+ # Extract date from current line
223
+ date_match = re.search(r"Next collection date:\s+(.*)", line)
224
+ if date_match:
225
+ collection_date_string = date_match.group(1).strip().replace(",", "")
226
+ break
227
+
228
+ if collection_date_string:
229
+ if collection_date_string in overrides_dict:
230
+ collection_date_string = overrides_dict[collection_date_string]
231
+
232
+ current_date = datetime.now()
233
+ parsed_date = datetime.strptime(
234
+ collection_date_string + f" {current_date.year}", "%A %d %B %Y"
235
+ )
236
+
237
+ # Check if the parsed date is in the past
238
+ if parsed_date.date() < current_date.date():
239
+ parsed_date = parsed_date.replace(year=current_date.year + 1)
240
+
241
+ formatted_date = parsed_date.strftime("%d/%m/%Y")
242
+ contains_date(formatted_date)
243
+
244
+ bin_info = {"type": bin_type, "collectionDate": formatted_date}
245
+ bin_data["bins"].append(bin_info)
246
+
247
+ except Exception as e:
248
+ pass # Skip problematic divs
249
+ continue
250
+
251
+ if not bin_data["bins"]:
252
+ # Some addresses may not have bin collection data available
253
+ print("No bin collection data found for this address")
254
+ bin_data = {"bins": []}
255
+
256
+ except Exception as e:
257
+ print(f"An error occurred: {e}")
258
+ raise
259
+ finally:
260
+ if driver:
261
+ driver.quit()
262
+
263
+ return bin_data