uk_bin_collection 0.127.2__tar.gz → 0.127.4__tar.gz

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of uk_bin_collection might be problematic. Click here for more details.

Files changed (306) hide show
  1. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/PKG-INFO +1 -1
  2. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/pyproject.toml +1 -1
  3. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/tests/input.json +17 -11
  4. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/CarmarthenshireCountyCouncil.py +3 -3
  5. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/GlasgowCityCouncil.py +18 -7
  6. uk_bin_collection-0.127.4/uk_bin_collection/uk_bin_collection/councils/LondonBoroughOfRichmondUponThames.py +98 -0
  7. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/MertonCouncil.py +2 -2
  8. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/NewForestCouncil.py +2 -2
  9. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/PowysCouncil.py +10 -7
  10. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/SouthOxfordshireCouncil.py +20 -11
  11. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/StaffordshireMoorlandsDistrictCouncil.py +6 -6
  12. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/StroudDistrictCouncil.py +8 -3
  13. uk_bin_collection-0.127.4/uk_bin_collection/uk_bin_collection/councils/SurreyHeathBoroughCouncil.py +116 -0
  14. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/ValeofGlamorganCouncil.py +9 -6
  15. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/ValeofWhiteHorseCouncil.py +18 -7
  16. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/WestOxfordshireDistrictCouncil.py +3 -3
  17. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/LICENSE +0 -0
  18. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/README.md +0 -0
  19. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/README.rst +0 -0
  20. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/tests/council_feature_input_parity.py +0 -0
  21. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/tests/features/environment.py +0 -0
  22. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/tests/features/validate_council_outputs.feature +0 -0
  23. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/tests/output.schema +0 -0
  24. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/tests/step_defs/step_helpers/file_handler.py +0 -0
  25. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/tests/step_defs/test_validate_council.py +0 -0
  26. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/tests/test_collect_data.py +0 -0
  27. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/tests/test_common_functions.py +0 -0
  28. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/tests/test_conftest.py +0 -0
  29. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/tests/test_get_data.py +0 -0
  30. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/collect_data.py +0 -0
  31. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/common.py +0 -0
  32. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/AberdeenCityCouncil.py +0 -0
  33. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/AberdeenshireCouncil.py +0 -0
  34. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/AdurAndWorthingCouncils.py +0 -0
  35. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/AntrimAndNewtonabbeyCouncil.py +0 -0
  36. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/ArdsAndNorthDownCouncil.py +0 -0
  37. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/ArgyllandButeCouncil.py +0 -0
  38. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/ArmaghBanbridgeCraigavonCouncil.py +0 -0
  39. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/ArunCouncil.py +0 -0
  40. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/AshfieldDistrictCouncil.py +0 -0
  41. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/AshfordBoroughCouncil.py +0 -0
  42. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/AylesburyValeCouncil.py +0 -0
  43. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/BCPCouncil.py +0 -0
  44. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/BaberghDistrictCouncil.py +0 -0
  45. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/BarnetCouncil.py +0 -0
  46. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/BarnsleyMBCouncil.py +0 -0
  47. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/BasildonCouncil.py +0 -0
  48. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/BasingstokeCouncil.py +0 -0
  49. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/BathAndNorthEastSomersetCouncil.py +0 -0
  50. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/BedfordBoroughCouncil.py +0 -0
  51. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/BedfordshireCouncil.py +0 -0
  52. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/BelfastCityCouncil.py +0 -0
  53. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/BexleyCouncil.py +0 -0
  54. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/BirminghamCityCouncil.py +0 -0
  55. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/BlabyDistrictCouncil.py +0 -0
  56. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/BlackburnCouncil.py +0 -0
  57. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/BlaenauGwentCountyBoroughCouncil.py +0 -0
  58. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/BoltonCouncil.py +0 -0
  59. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/BracknellForestCouncil.py +0 -0
  60. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/BradfordMDC.py +0 -0
  61. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/BraintreeDistrictCouncil.py +0 -0
  62. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/BrecklandCouncil.py +0 -0
  63. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/BrentCouncil.py +0 -0
  64. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/BrightonandHoveCityCouncil.py +0 -0
  65. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/BristolCityCouncil.py +0 -0
  66. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/BromleyBoroughCouncil.py +0 -0
  67. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/BromsgroveDistrictCouncil.py +0 -0
  68. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/BroxbourneCouncil.py +0 -0
  69. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/BroxtoweBoroughCouncil.py +0 -0
  70. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/BuckinghamshireCouncil.py +0 -0
  71. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/BurnleyBoroughCouncil.py +0 -0
  72. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/BuryCouncil.py +0 -0
  73. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/CalderdaleCouncil.py +0 -0
  74. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/CannockChaseDistrictCouncil.py +0 -0
  75. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/CanterburyCityCouncil.py +0 -0
  76. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/CardiffCouncil.py +0 -0
  77. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/CastlepointDistrictCouncil.py +0 -0
  78. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/CharnwoodBoroughCouncil.py +0 -0
  79. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/ChelmsfordCityCouncil.py +0 -0
  80. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/CheltenhamBoroughCouncil.py +0 -0
  81. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/CheshireEastCouncil.py +0 -0
  82. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/CheshireWestAndChesterCouncil.py +0 -0
  83. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/ChesterfieldBoroughCouncil.py +0 -0
  84. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/ChichesterDistrictCouncil.py +0 -0
  85. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/ChorleyCouncil.py +0 -0
  86. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/ColchesterCityCouncil.py +0 -0
  87. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/ConwyCountyBorough.py +0 -0
  88. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/CopelandBoroughCouncil.py +0 -0
  89. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/CornwallCouncil.py +0 -0
  90. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/CotswoldDistrictCouncil.py +0 -0
  91. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/CoventryCityCouncil.py +0 -0
  92. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/CrawleyBoroughCouncil.py +0 -0
  93. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/CroydonCouncil.py +0 -0
  94. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/CumberlandAllerdaleCouncil.py +0 -0
  95. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/CumberlandCouncil.py +0 -0
  96. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/DacorumBoroughCouncil.py +0 -0
  97. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/DartfordBoroughCouncil.py +0 -0
  98. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/DenbighshireCouncil.py +0 -0
  99. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/DerbyCityCouncil.py +0 -0
  100. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/DerbyshireDalesDistrictCouncil.py +0 -0
  101. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/DoncasterCouncil.py +0 -0
  102. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/DorsetCouncil.py +0 -0
  103. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/DoverDistrictCouncil.py +0 -0
  104. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/DudleyCouncil.py +0 -0
  105. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/DundeeCityCouncil.py +0 -0
  106. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/DurhamCouncil.py +0 -0
  107. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/EalingCouncil.py +0 -0
  108. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/EastAyrshireCouncil.py +0 -0
  109. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/EastCambridgeshireCouncil.py +0 -0
  110. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/EastDevonDC.py +0 -0
  111. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/EastHertsCouncil.py +0 -0
  112. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/EastLindseyDistrictCouncil.py +0 -0
  113. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/EastRenfrewshireCouncil.py +0 -0
  114. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/EastRidingCouncil.py +0 -0
  115. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/EastSuffolkCouncil.py +0 -0
  116. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/EastleighBoroughCouncil.py +0 -0
  117. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/EdinburghCityCouncil.py +0 -0
  118. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/ElmbridgeBoroughCouncil.py +0 -0
  119. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/EnfieldCouncil.py +0 -0
  120. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/EnvironmentFirst.py +0 -0
  121. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/EppingForestDistrictCouncil.py +0 -0
  122. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/ErewashBoroughCouncil.py +0 -0
  123. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/ExeterCityCouncil.py +0 -0
  124. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/FalkirkCouncil.py +0 -0
  125. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/FarehamBoroughCouncil.py +0 -0
  126. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/FenlandDistrictCouncil.py +0 -0
  127. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/FifeCouncil.py +0 -0
  128. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/FlintshireCountyCouncil.py +0 -0
  129. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/FolkstoneandHytheDistrictCouncil.py +0 -0
  130. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/ForestOfDeanDistrictCouncil.py +0 -0
  131. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/GatesheadCouncil.py +0 -0
  132. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/GedlingBoroughCouncil.py +0 -0
  133. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/GloucesterCityCouncil.py +0 -0
  134. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/GraveshamBoroughCouncil.py +0 -0
  135. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/GuildfordCouncil.py +0 -0
  136. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/GwyneddCouncil.py +0 -0
  137. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/HackneyCouncil.py +0 -0
  138. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/HaltonBoroughCouncil.py +0 -0
  139. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/HarboroughDistrictCouncil.py +0 -0
  140. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/HaringeyCouncil.py +0 -0
  141. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/HarrogateBoroughCouncil.py +0 -0
  142. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/HartDistrictCouncil.py +0 -0
  143. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/HartlepoolBoroughCouncil.py +0 -0
  144. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/HertsmereBoroughCouncil.py +0 -0
  145. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/HighPeakCouncil.py +0 -0
  146. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/HighlandCouncil.py +0 -0
  147. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/HinckleyandBosworthBoroughCouncil.py +0 -0
  148. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/HounslowCouncil.py +0 -0
  149. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/HullCityCouncil.py +0 -0
  150. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/HuntingdonDistrictCouncil.py +0 -0
  151. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/IslingtonCouncil.py +0 -0
  152. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/KingsLynnandWestNorfolkBC.py +0 -0
  153. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/KingstonUponThamesCouncil.py +0 -0
  154. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/KirkleesCouncil.py +0 -0
  155. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/KnowsleyMBCouncil.py +0 -0
  156. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/LancasterCityCouncil.py +0 -0
  157. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/LeedsCityCouncil.py +0 -0
  158. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/LichfieldDistrictCouncil.py +0 -0
  159. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/LincolnCouncil.py +0 -0
  160. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/LisburnCastlereaghCityCouncil.py +0 -0
  161. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/LiverpoolCityCouncil.py +0 -0
  162. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughEaling.py +0 -0
  163. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughHarrow.py +0 -0
  164. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughHavering.py +0 -0
  165. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughHounslow.py +0 -0
  166. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughLambeth.py +0 -0
  167. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughLewisham.py +0 -0
  168. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughRedbridge.py +0 -0
  169. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughSutton.py +0 -0
  170. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/LutonBoroughCouncil.py +0 -0
  171. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/MaldonDistrictCouncil.py +0 -0
  172. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/MalvernHillsDC.py +0 -0
  173. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/ManchesterCityCouncil.py +0 -0
  174. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/MansfieldDistrictCouncil.py +0 -0
  175. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/MidAndEastAntrimBoroughCouncil.py +0 -0
  176. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/MidDevonCouncil.py +0 -0
  177. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/MidSuffolkDistrictCouncil.py +0 -0
  178. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/MidSussexDistrictCouncil.py +0 -0
  179. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/MidlothianCouncil.py +0 -0
  180. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/MiltonKeynesCityCouncil.py +0 -0
  181. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/MoleValleyDistrictCouncil.py +0 -0
  182. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/MonmouthshireCountyCouncil.py +0 -0
  183. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/MorayCouncil.py +0 -0
  184. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/NeathPortTalbotCouncil.py +0 -0
  185. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/NewarkAndSherwoodDC.py +0 -0
  186. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/NewcastleCityCouncil.py +0 -0
  187. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/NewcastleUnderLymeCouncil.py +0 -0
  188. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/NewhamCouncil.py +0 -0
  189. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/NewportCityCouncil.py +0 -0
  190. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/NorthAyrshireCouncil.py +0 -0
  191. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/NorthEastDerbyshireDistrictCouncil.py +0 -0
  192. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/NorthEastLincs.py +0 -0
  193. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/NorthHertfordshireDistrictCouncil.py +0 -0
  194. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/NorthKestevenDistrictCouncil.py +0 -0
  195. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/NorthLanarkshireCouncil.py +0 -0
  196. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/NorthLincolnshireCouncil.py +0 -0
  197. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/NorthNorfolkDistrictCouncil.py +0 -0
  198. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/NorthNorthamptonshireCouncil.py +0 -0
  199. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/NorthSomersetCouncil.py +0 -0
  200. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/NorthTynesideCouncil.py +0 -0
  201. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/NorthWestLeicestershire.py +0 -0
  202. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/NorthYorkshire.py +0 -0
  203. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/NorthumberlandCouncil.py +0 -0
  204. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/NorwichCityCouncil.py +0 -0
  205. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/NottinghamCityCouncil.py +0 -0
  206. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/NuneatonBedworthBoroughCouncil.py +0 -0
  207. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/OadbyAndWigstonBoroughCouncil.py +0 -0
  208. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/OldhamCouncil.py +0 -0
  209. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/OxfordCityCouncil.py +0 -0
  210. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/PerthAndKinrossCouncil.py +0 -0
  211. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/PlymouthCouncil.py +0 -0
  212. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/PortsmouthCityCouncil.py +0 -0
  213. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/PrestonCityCouncil.py +0 -0
  214. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/ReadingBoroughCouncil.py +0 -0
  215. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/RedditchBoroughCouncil.py +0 -0
  216. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/ReigateAndBansteadBoroughCouncil.py +0 -0
  217. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/RenfrewshireCouncil.py +0 -0
  218. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/RhonddaCynonTaffCouncil.py +0 -0
  219. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/RochdaleCouncil.py +0 -0
  220. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/RochfordCouncil.py +0 -0
  221. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/RotherDistrictCouncil.py +0 -0
  222. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/RotherhamCouncil.py +0 -0
  223. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/RoyalBoroughofGreenwich.py +0 -0
  224. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/RugbyBoroughCouncil.py +0 -0
  225. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/RushcliffeBoroughCouncil.py +0 -0
  226. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/RushmoorCouncil.py +0 -0
  227. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/SalfordCityCouncil.py +0 -0
  228. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/SandwellBoroughCouncil.py +0 -0
  229. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/SeftonCouncil.py +0 -0
  230. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/SevenoaksDistrictCouncil.py +0 -0
  231. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/SheffieldCityCouncil.py +0 -0
  232. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/ShropshireCouncil.py +0 -0
  233. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/SolihullCouncil.py +0 -0
  234. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/SomersetCouncil.py +0 -0
  235. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/SouthAyrshireCouncil.py +0 -0
  236. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/SouthCambridgeshireCouncil.py +0 -0
  237. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/SouthDerbyshireDistrictCouncil.py +0 -0
  238. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/SouthGloucestershireCouncil.py +0 -0
  239. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/SouthHamsDistrictCouncil.py +0 -0
  240. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/SouthKestevenDistrictCouncil.py +0 -0
  241. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/SouthLanarkshireCouncil.py +0 -0
  242. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/SouthNorfolkCouncil.py +0 -0
  243. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/SouthRibbleCouncil.py +0 -0
  244. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/SouthStaffordshireDistrictCouncil.py +0 -0
  245. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/SouthTynesideCouncil.py +0 -0
  246. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/SouthwarkCouncil.py +0 -0
  247. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/StAlbansCityAndDistrictCouncil.py +0 -0
  248. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/StHelensBC.py +0 -0
  249. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/StaffordBoroughCouncil.py +0 -0
  250. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/StevenageBoroughCouncil.py +0 -0
  251. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/StockportBoroughCouncil.py +0 -0
  252. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/StocktonOnTeesCouncil.py +0 -0
  253. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/StokeOnTrentCityCouncil.py +0 -0
  254. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/StratfordUponAvonCouncil.py +0 -0
  255. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/SunderlandCityCouncil.py +0 -0
  256. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/SwaleBoroughCouncil.py +0 -0
  257. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/SwanseaCouncil.py +0 -0
  258. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/SwindonBoroughCouncil.py +0 -0
  259. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/TamesideMBCouncil.py +0 -0
  260. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/TandridgeDistrictCouncil.py +0 -0
  261. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/TeignbridgeCouncil.py +0 -0
  262. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/TelfordAndWrekinCouncil.py +0 -0
  263. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/TendringDistrictCouncil.py +0 -0
  264. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/TestValleyBoroughCouncil.py +0 -0
  265. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/ThanetDistrictCouncil.py +0 -0
  266. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/ThreeRiversDistrictCouncil.py +0 -0
  267. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/ThurrockCouncil.py +0 -0
  268. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/TonbridgeAndMallingBC.py +0 -0
  269. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/TorbayCouncil.py +0 -0
  270. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/TorridgeDistrictCouncil.py +0 -0
  271. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/TunbridgeWellsCouncil.py +0 -0
  272. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/UttlesfordDistrictCouncil.py +0 -0
  273. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/WakefieldCityCouncil.py +0 -0
  274. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/WalsallCouncil.py +0 -0
  275. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/WalthamForest.py +0 -0
  276. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/WandsworthCouncil.py +0 -0
  277. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/WarringtonBoroughCouncil.py +0 -0
  278. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/WarwickDistrictCouncil.py +0 -0
  279. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/WatfordBoroughCouncil.py +0 -0
  280. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/WaverleyBoroughCouncil.py +0 -0
  281. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/WealdenDistrictCouncil.py +0 -0
  282. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/WelhatCouncil.py +0 -0
  283. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/WestBerkshireCouncil.py +0 -0
  284. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/WestDunbartonshireCouncil.py +0 -0
  285. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/WestLancashireBoroughCouncil.py +0 -0
  286. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/WestLindseyDistrictCouncil.py +0 -0
  287. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/WestLothianCouncil.py +0 -0
  288. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/WestMorlandAndFurness.py +0 -0
  289. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/WestNorthamptonshireCouncil.py +0 -0
  290. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/WestSuffolkCouncil.py +0 -0
  291. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/WiganBoroughCouncil.py +0 -0
  292. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/WiltshireCouncil.py +0 -0
  293. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/WinchesterCityCouncil.py +0 -0
  294. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/WindsorAndMaidenheadCouncil.py +0 -0
  295. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/WirralCouncil.py +0 -0
  296. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/WokingBoroughCouncil.py +0 -0
  297. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/WokinghamBoroughCouncil.py +0 -0
  298. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/WolverhamptonCityCouncil.py +0 -0
  299. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/WorcesterCityCouncil.py +0 -0
  300. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/WychavonDistrictCouncil.py +0 -0
  301. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/WyreCouncil.py +0 -0
  302. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/WyreForestDistrictCouncil.py +0 -0
  303. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/YorkCouncil.py +0 -0
  304. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/councils/council_class_template/councilclasstemplate.py +0 -0
  305. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/create_new_council.py +0 -0
  306. {uk_bin_collection-0.127.2 → uk_bin_collection-0.127.4}/uk_bin_collection/uk_bin_collection/get_bin_data.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: uk_bin_collection
3
- Version: 0.127.2
3
+ Version: 0.127.4
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.127.2"
3
+ version = "0.127.4"
4
4
  description = "Python Lib to collect UK Bin Data"
5
5
  readme = "README.md"
6
6
  authors = ["Robert Bradley <robbrad182@gmail.com>"]
@@ -1030,6 +1030,13 @@
1030
1030
  "wiki_name": "London Borough Ealing",
1031
1031
  "wiki_note": "Pass the UPRN. You can find it using [FindMyAddress](https://www.findmyaddress.co.uk/search)."
1032
1032
  },
1033
+ "LondonBoroughOfRichmondUponThames": {
1034
+ "house_number": "March Road",
1035
+ "skip_get_url": true,
1036
+ "url": "https://www.richmond.gov.uk/services/waste_and_recycling/collection_days/",
1037
+ "wiki_name": "London Borough Of Richmond Upon Thames",
1038
+ "wiki_note": "Pass the name of the street ONLY in the house number parameter, unfortunately post code's are not allowed. "
1039
+ },
1033
1040
  "LondonBoroughHarrow": {
1034
1041
  "url": "https://www.harrow.gov.uk",
1035
1042
  "wiki_command_url_override": "https://www.harrow.gov.uk",
@@ -1208,8 +1215,8 @@
1208
1215
  "wiki_note": "Pass the postcode and UPRN. This parser requires a Selenium webdriver."
1209
1216
  },
1210
1217
  "NewarkAndSherwoodDC": {
1211
- "url": "http://app.newark-sherwooddc.gov.uk/bincollection/calendar?pid=200004258529&nc=1",
1212
- "wiki_command_url_override": "http://app.newark-sherwooddc.gov.uk/bincollection/calendar?pid=XXXXXXXX&nc=1",
1218
+ "url": "http://app.newark-sherwooddc.gov.uk/bincollection/calendar?pid=200004258529",
1219
+ "wiki_command_url_override": "http://app.newark-sherwooddc.gov.uk/bincollection/calendar?pid=XXXXXXXX",
1213
1220
  "wiki_name": "Newark and Sherwood District Council",
1214
1221
  "wiki_note": "Replace XXXXXXXX with your UPRN."
1215
1222
  },
@@ -1409,15 +1416,6 @@
1409
1416
  "wiki_name": "Portsmouth City Council",
1410
1417
  "wiki_note": "Pass the postcode and UPRN. This parser requires a Selenium webdriver."
1411
1418
  },
1412
- "PowysCouncil": {
1413
- "house_number": "LANE COTTAGE",
1414
- "postcode": "HR3 5JS",
1415
- "skip_get_url": true,
1416
- "url": "https://www.powys.gov.uk",
1417
- "web_driver": "http://selenium:4444",
1418
- "wiki_name": "Powys Council",
1419
- "wiki_note": "Pass the house name/number and postcode in their respective parameters. This parser requires a Selenium webdriver."
1420
- },
1421
1419
  "PowysCouncil": {
1422
1420
  "house_number": "LANE COTTAGE",
1423
1421
  "postcode": "HR3 5JS",
@@ -1768,6 +1766,14 @@
1768
1766
  "wiki_name": "Sunderland City Council",
1769
1767
  "wiki_note": "Provide your house number (without quotes) and postcode (wrapped in double quotes with a space)."
1770
1768
  },
1769
+ "SurreyHeathBoroughCouncil": {
1770
+ "house_number": "36",
1771
+ "postcode": "GU20 6PN",
1772
+ "skip_get_url": true,
1773
+ "url": "https://asjwsw-wrpsurreyheathmunicipal-live.whitespacews.com/",
1774
+ "wiki_name": "Surrey Heath Borough Council / Joint Waste Solutions",
1775
+ "wiki_note": "Provide your house number in the `house_number` parameter and postcode in the `postcode` parameter."
1776
+ },
1771
1777
  "SwaleBoroughCouncil": {
1772
1778
  "postcode": "ME12 2NQ",
1773
1779
  "skip_get_url": true,
@@ -34,10 +34,10 @@ class CouncilClass(AbstractGetBinDataClass):
34
34
 
35
35
  # Find the next collection date
36
36
  date_tag = container.find(class_="font11 text-center")
37
- if date_tag.text.strip() == "":
38
- continue
39
- else:
37
+ if date_tag:
40
38
  collection_date = date_tag.text.strip()
39
+ else:
40
+ continue
41
41
 
42
42
  dict_data = {
43
43
  "type": bin_type,
@@ -1,3 +1,5 @@
1
+ import datetime
2
+
1
3
  from bs4 import BeautifulSoup
2
4
 
3
5
  from uk_bin_collection.uk_bin_collection.common import *
@@ -32,15 +34,24 @@ class CouncilClass(AbstractGetBinDataClass):
32
34
  for p in ps:
33
35
  collection = p.text.strip().replace("Your next ", "").split(".")[0]
34
36
  bin_type = collection.split(" day is")[0]
35
- collection_date = datetime.strptime(
36
- remove_ordinal_indicator_from_date_string(collection).split("day is ")[
37
- 1
38
- ],
39
- "%A %d %B %Y",
40
- )
37
+ collection_date = remove_ordinal_indicator_from_date_string(
38
+ collection
39
+ ).split("day is ")[1]
40
+ if collection_date == "Today":
41
+ collection_date = datetime.today().strftime(date_format)
42
+ elif collection_date == "Tomorrow":
43
+ collection_date = (datetime.today() + timedelta(days=1)).strftime(
44
+ date_format
45
+ )
46
+ print(collection_date)
47
+ else:
48
+ collection_date = datetime.strptime(
49
+ collection_date,
50
+ "%A %d %B %Y",
51
+ ).strftime(date_format)
41
52
  dict_data = {
42
53
  "type": bin_type,
43
- "collectionDate": collection_date.strftime(date_format),
54
+ "collectionDate": collection_date,
44
55
  }
45
56
  data["bins"].append(dict_data)
46
57
 
@@ -0,0 +1,98 @@
1
+ from selenium.webdriver.common.by import By
2
+ from selenium.webdriver.support import expected_conditions as EC
3
+ from datetime import datetime
4
+ from selenium.webdriver.support.wait import WebDriverWait
5
+ from selenium.webdriver.common.keys import Keys
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
+ def parse_data(self, page: str, **kwargs) -> dict:
13
+ print(f"Arguments are f{kwargs}")
14
+ driver = None
15
+ try:
16
+ page = kwargs["url"]
17
+ street_name = kwargs.get("paon")
18
+ web_driver = kwargs.get("web_driver")
19
+ headless = kwargs.get("headless")
20
+
21
+ driver = create_webdriver(web_driver, headless, None, __name__)
22
+ driver.get(page)
23
+
24
+ wait = WebDriverWait(driver, 60)
25
+
26
+ self.dismiss_cookie_banner(wait)
27
+ self.input_street_name(street_name, wait)
28
+ self.submit(wait)
29
+ bin_types, collection_days = self.get_bins(driver)
30
+ bindata = self.get_collection_days(bin_types, collection_days)
31
+
32
+ print(bindata)
33
+
34
+ except Exception as e:
35
+ # Here you can log the exception if needed
36
+ print(f"An error occurred: {e}")
37
+ # Optionally, re-raise the exception if you want it to propagate
38
+ raise
39
+ finally:
40
+ # This block ensures that the driver is closed regardless of an exception
41
+ if driver:
42
+ driver.quit()
43
+ return bindata
44
+
45
+ def get_collection_days(self, bin_types, collection_days):
46
+ bindata = {"bins": []}
47
+ WEEKLY_COLLECTION = 0
48
+ GARDEN_COLLECTION = 1
49
+
50
+ for index, bin_type in enumerate(bin_types):
51
+ # currently only handled weekly and garden collection, special collections like Christmas Day need to be added
52
+ if index == WEEKLY_COLLECTION:
53
+ next_collection_date = get_next_day_of_week(collection_days[index].text.strip(), date_format)
54
+ elif index == GARDEN_COLLECTION:
55
+ split_date_part = collection_days[index].text.split("More dates")[0]
56
+ next_collection_date = datetime.strptime(split_date_part.strip(), "%d %B %Y").strftime(date_format)
57
+ else:
58
+ next_collection_date = datetime.strptime(collection_days[index].text.strip(), "%d %B %Y").strftime(date_format)
59
+
60
+ dict_data = {
61
+ "type": bin_type.text.strip(),
62
+ "collectionDate": next_collection_date,
63
+ }
64
+ bindata["bins"].append(dict_data)
65
+ return bindata
66
+
67
+ def get_bins(self, driver):
68
+ table = driver.find_element(By.XPATH, ".//div[@id='maincontent']//table")
69
+ table_rows = table.find_elements(by=By.TAG_NAME, value="tr")
70
+ headerRow = table_rows[0]
71
+ table_info_row = table_rows[1]
72
+ bin_types = headerRow.find_elements(by=By.TAG_NAME, value="th")[2:]
73
+ collection_days = table_info_row.find_elements(by=By.TAG_NAME, value="td")[2:]
74
+ return bin_types, collection_days
75
+
76
+ def submit(self, wait):
77
+ main_content_submit_button = wait.until(
78
+ EC.element_to_be_clickable(
79
+ (By.XPATH, ".//div[@id='maincontent']//input[@type='submit']")
80
+ )
81
+ )
82
+ main_content_submit_button.send_keys(Keys.ENTER)
83
+
84
+ def input_street_name(self, street_name, wait):
85
+ input_element_postcodesearch = wait.until(
86
+ EC.visibility_of_element_located(
87
+ (By.ID, "Street")
88
+ )
89
+ )
90
+ input_element_postcodesearch.send_keys(street_name)
91
+
92
+ def dismiss_cookie_banner(self, wait):
93
+ cookie_banner = wait.until(
94
+ EC.visibility_of_element_located(
95
+ (By.ID, "ccc-dismiss-button")
96
+ )
97
+ )
98
+ cookie_banner.send_keys(Keys.ENTER)
@@ -47,10 +47,10 @@ class CouncilClass(AbstractGetBinDataClass):
47
47
  bin_type = cells[0].get_text().strip()
48
48
  # Date is on the second cell, second paragraph, wrapped in p
49
49
  collectionDate = None
50
- for date_format in possible_formats:
50
+ for format in possible_formats:
51
51
  try:
52
52
  collectionDate = datetime.strptime(
53
- cells[1].select("p > b")[2].get_text(strip=True), date_format
53
+ cells[1].select("p > b")[2].get_text(strip=True), format
54
54
  )
55
55
  break # Exit the loop if parsing is successful
56
56
  except ValueError:
@@ -125,10 +125,10 @@ class CouncilClass(AbstractGetBinDataClass):
125
125
  )
126
126
 
127
127
  # Garden waste
128
- garden_waste = soup.find("span", class_="CTID-17-_ eb-17-textControl")
128
+ garden_waste = soup.find("div", class_="eb-2HIpCnWC-Override-EditorInput")
129
129
  if garden_waste:
130
130
  match = re.search(
131
- r"next collection is\s+(\d{2}/\d{2}/\d{4})", garden_waste.text
131
+ r"(\d{2}/\d{2}/\d{4})", garden_waste.text
132
132
  )
133
133
  if match:
134
134
  bins.append(
@@ -127,12 +127,15 @@ class CouncilClass(AbstractGetBinDataClass):
127
127
  li.text for li in garden_waste_section.find_next("ul").find_all("li")
128
128
  ]
129
129
  for date in garden_waste_dates:
130
- dict_data = {
131
- "type": "Garden Waste",
132
- "collectionDate": datetime.strptime(
133
- remove_ordinal_indicator_from_date_string(date), "%d %B %Y"
134
- ).strftime(date_format),
135
- }
136
- data["bins"].append(dict_data)
130
+ try:
131
+ dict_data = {
132
+ "type": "Garden Waste",
133
+ "collectionDate": datetime.strptime(
134
+ remove_ordinal_indicator_from_date_string(date), "%d %B %Y"
135
+ ).strftime(date_format),
136
+ }
137
+ data["bins"].append(dict_data)
138
+ except:
139
+ continue
137
140
 
138
141
  return data
@@ -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
 
@@ -54,6 +55,9 @@ class CouncilClass(AbstractGetBinDataClass):
54
55
 
55
56
  data = {"bins": []}
56
57
 
58
+ current_year = datetime.now().year
59
+ next_year = current_year + 1
60
+
57
61
  # Page has slider info side by side, which are two instances of this class
58
62
  for bin in soup.find_all("div", {"class": "binextra"}):
59
63
  bin_info = list(bin.stripped_strings)
@@ -62,27 +66,32 @@ class CouncilClass(AbstractGetBinDataClass):
62
66
  if contains_date(bin_info[0]):
63
67
  bin_date = get_next_occurrence_from_day_month(
64
68
  datetime.strptime(
65
- bin_info[0] + " " + datetime.today().strftime("%Y"),
66
- "%A %d %B - %Y",
69
+ bin_info[0],
70
+ "%A %d %B -",
67
71
  )
68
- ).strftime(date_format)
69
- bin_type = str.capitalize(' '.join(bin_info[1:]))
72
+ )
73
+ bin_type = str.capitalize(" ".join(bin_info[1:]))
70
74
  # On exceptional collection schedule (e.g. around English Bank Holidays), date will be contained in the second stripped string
71
75
  else:
72
76
  bin_date = get_next_occurrence_from_day_month(
73
77
  datetime.strptime(
74
- bin_info[1] + " " + datetime.today().strftime("%Y"),
75
- "%A %d %B - %Y",
78
+ bin_info[1],
79
+ "%A %d %B -",
76
80
  )
77
- ).strftime(date_format)
78
- str.capitalize(' '.join(bin_info[2:]))
79
- except Exception as ex:
80
- raise ValueError(f"Error parsing bin data: {ex}")
81
+ )
82
+ str.capitalize(" ".join(bin_info[2:]))
83
+ except:
84
+ continue
85
+
86
+ if (datetime.now().month == 12) and (bin_date.month == 1):
87
+ bin_date = bin_date.replace(year=next_year)
88
+ else:
89
+ bin_date = bin_date.replace(year=current_year)
81
90
 
82
91
  # Build data dict for each entry
83
92
  dict_data = {
84
93
  "type": bin_type,
85
- "collectionDate": bin_date,
94
+ "collectionDate": bin_date.strftime(date_format),
86
95
  }
87
96
  data["bins"].append(dict_data)
88
97
 
@@ -30,12 +30,12 @@ class CouncilClass(AbstractGetBinDataClass):
30
30
  driver.get("https://www.staffsmoorlands.gov.uk/findyourbinday")
31
31
 
32
32
  # Close cookies banner
33
- cookieAccept = WebDriverWait(driver, 10).until(
34
- EC.presence_of_element_located(
35
- (By.CSS_SELECTOR, ".cookiemessage__link--close")
36
- )
37
- )
38
- cookieAccept.click()
33
+ # cookieAccept = WebDriverWait(driver, 10).until(
34
+ # EC.presence_of_element_located(
35
+ # (By.CSS_SELECTOR, ".cookiemessage__link--close")
36
+ # )
37
+ # )
38
+ # cookieAccept.click()
39
39
 
40
40
  # Wait for the postcode field to appear then populate it
41
41
  inputElement_postcode = WebDriverWait(driver, 30).until(
@@ -1,8 +1,10 @@
1
+ from datetime import datetime, timedelta
2
+ from typing import Any, Dict
3
+
1
4
  from bs4 import BeautifulSoup
5
+
2
6
  from uk_bin_collection.uk_bin_collection.common import *
3
7
  from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
4
- from datetime import datetime, timedelta
5
- from typing import Dict, Any
6
8
 
7
9
 
8
10
  class CouncilClass(AbstractGetBinDataClass):
@@ -78,7 +80,10 @@ class CouncilClass(AbstractGetBinDataClass):
78
80
  formatted_date = self.get_next_weekday(day_name)
79
81
  else:
80
82
  # Convert date format from "Tuesday 28 May 2024" to "28/05/2024"
81
- date_obj = datetime.strptime(value, "%A %d %B %Y")
83
+ try:
84
+ date_obj = datetime.strptime(value, "%A %d %B %Y")
85
+ except:
86
+ continue
82
87
  formatted_date = date_obj.strftime("%d/%m/%Y")
83
88
 
84
89
  bin_entry = {
@@ -0,0 +1,116 @@
1
+ import urllib
2
+
3
+ from bs4 import BeautifulSoup
4
+
5
+ from uk_bin_collection.uk_bin_collection.common import *
6
+ from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
7
+
8
+
9
+ class CouncilClass(AbstractGetBinDataClass):
10
+ """
11
+ Concrete classes have to implement all abstract operations of the
12
+ base class. They can also override some operations with a default
13
+ implementation.
14
+ """
15
+
16
+ def parse_data(self, page: str, **kwargs) -> dict:
17
+ requests.packages.urllib3.disable_warnings()
18
+ root_url = "https://asjwsw-wrpsurreyheathmunicipal-live.whitespacews.com/"
19
+ # Get the house number and postcode from the commandline
20
+ user_paon = kwargs.get("paon")
21
+ user_postcode = kwargs.get("postcode")
22
+ check_postcode(user_postcode)
23
+
24
+ # Start a new session for the form, and get the chosen URL from the commandline
25
+ session = requests.Session()
26
+ req = session.get(root_url)
27
+
28
+ # Parse the requested URL to get a link to the "View My Collections" portal with a unique service ID
29
+ start = BeautifulSoup(req.text, features="html.parser")
30
+ start.prettify()
31
+ base_link = start.select(
32
+ "#menu-content > div > div:nth-child(1) > p.govuk-body.govuk-\\!-margin-bottom-0.colorblue.lineheight15 > a"
33
+ )[0].attrs.get("href")
34
+
35
+ # We need to reorder the query parts from the unique URL, so split them up to make it easier
36
+ query_parts = urllib.parse.urlparse(base_link).query.split("&")
37
+ parts = base_link.split("?")
38
+ addr_link = (
39
+ parts[0] + "/mop.php?" + query_parts[1] + "&" + query_parts[0] + "&seq=2"
40
+ )
41
+
42
+ # Bring in some headers to emulate a browser, and put the UPRN and postcode into the form data.
43
+ # This is sent in a POST request, emulating browser behaviour.
44
+ headers = {
45
+ "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
46
+ "Accept-Language": "en-GB,en;q=0.9",
47
+ "Cache-Control": "no-cache",
48
+ "Connection": "keep-alive",
49
+ "Content-Type": "application/x-www-form-urlencoded",
50
+ "Origin": "https://asjwsw-wrpsurreyheathmunicipal-live.whitespacews.com",
51
+ "Pragma": "no-cache",
52
+ "Referer": "https://asjwsw-wrpsurreyheathmunicipal-live.whitespacews.com/",
53
+ "Sec-Fetch-Dest": "document",
54
+ "Sec-Fetch-Mode": "navigate",
55
+ "Sec-Fetch-Site": "same-origin",
56
+ "Sec-Fetch-User": "?1",
57
+ "Upgrade-Insecure-Requests": "1",
58
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 OPR/98.0.0.0",
59
+ "sec-ch-ua": '"Chromium";v="112", "Not_A Brand";v="24", "Opera GX";v="98"',
60
+ "sec-ch-ua-mobile": "?0",
61
+ "sec-ch-ua-platform": '"Windows"',
62
+ }
63
+ data = {
64
+ "address_name_number": user_paon,
65
+ "address_street": "",
66
+ "street_town": "",
67
+ "address_postcode": user_postcode,
68
+ }
69
+ addr_page = session.post(addr_link, headers=headers, data=data)
70
+ addr = BeautifulSoup(addr_page.text, features="html.parser")
71
+ addr.prettify()
72
+
73
+ # This page should only have one address, but regardless, select the first one and make a request to load the
74
+ # calendar page.
75
+ cal_link = root_url + addr.select("#property_list > ul > li > a")[0].attrs.get(
76
+ "href"
77
+ )
78
+ cal_page = session.get(cal_link)
79
+
80
+ # Parse the calendar page
81
+ soup = BeautifulSoup(cal_page.text, features="html.parser")
82
+ soup.prettify()
83
+ data = {"bins": []}
84
+
85
+ # For whatever reason, each row contains all the information for that row, and each one after it. This code
86
+ # essentially gets all items from each row, but ignores the whitespace that you get when splitting using \n.
87
+ # This produces a big list of dates then bin types, so we split them up into a list of lists - each pair is
88
+ # a date and the bin type.
89
+ items = [
90
+ i
91
+ for i in soup.find(
92
+ "u1",
93
+ {
94
+ "class": "displayinlineblock justifycontentleft alignitemscenter margin0 padding0"
95
+ },
96
+ ).text.split("\n")
97
+ if i != ""
98
+ ]
99
+ pairs = [items[i : i + 2] for i in range(0, len(items), 2)]
100
+
101
+ # Loop through the paired bin dates and types
102
+ for pair in pairs:
103
+ # This isn't necessary, but better safe than sorry
104
+ collection_date = datetime.strptime(pair[0], date_format).strftime(
105
+ date_format
106
+ )
107
+ # Change the formatting of the purple bins to replace the hyphens with slashes
108
+ if pair[1] == "Batteries-small electricals-textiles":
109
+ bin_type = pair[1].replace("-", "/").strip()
110
+ else:
111
+ bin_type = pair[1]
112
+
113
+ # Add the data into the dictionary
114
+ data["bins"].append({"type": bin_type, "collectionDate": collection_date})
115
+
116
+ return data
@@ -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
 
@@ -31,12 +32,12 @@ class CouncilClass(AbstractGetBinDataClass):
31
32
  params = {
32
33
  "RequestType": "LocalInfo",
33
34
  "ms": "ValeOfGlamorgan/AllMaps",
34
- "group": "Community and Living|Refuse HIDE2",
35
- "type": "json",
35
+ "group": "Waste|new_refuse",
36
+ "type": "jsonp",
36
37
  "callback": "AddressInfoCallback",
37
38
  "uid": user_uprn,
38
- "import": "jQuery35108514154283927682_1673022974838",
39
- "_": "1673022974840",
39
+ "import": "jQuery35107288886041176057_1736292844067",
40
+ "_": "1736292844068",
40
41
  }
41
42
 
42
43
  # Get a response from the council
@@ -46,13 +47,15 @@ class CouncilClass(AbstractGetBinDataClass):
46
47
  headers=headers,
47
48
  ).text
48
49
 
50
+ response = response.replace("AddressInfoCallback(", "").rstrip(");")
51
+
49
52
  # Load the JSON and seek out the bin week text, then add it to the calendar URL. Also take the weekly
50
53
  # collection type and generate dates for it. Then make a GET request for the calendar
51
54
  bin_week = str(
52
- json.loads(response)["Results"]["Refuse_HIDE2"]["Your_Refuse_round_is"]
55
+ json.loads(response)["Results"]["waste"]["roundday_residual"]
53
56
  ).replace(" ", "-")
54
57
  weekly_collection = str(
55
- json.loads(response)["Results"]["Refuse_HIDE2"]["Recycling__type"]
58
+ json.loads(response)["Results"]["waste"]["recycling_code"]
56
59
  ).capitalize()
57
60
  weekly_dates = get_weekday_dates_in_period(
58
61
  datetime.now(), days_of_week.get(bin_week.split("-")[0].strip()), amount=48
@@ -53,6 +53,9 @@ class CouncilClass(AbstractGetBinDataClass):
53
53
 
54
54
  data = {"bins": []}
55
55
 
56
+ current_year = datetime.now().year
57
+ next_year = current_year + 1
58
+
56
59
  # Page has slider info side by side, which are two instances of this class
57
60
  for bin in soup.find_all("div", {"class": "bintxt"}):
58
61
  try:
@@ -74,23 +77,31 @@ class CouncilClass(AbstractGetBinDataClass):
74
77
  if contains_date(bin_date_info[0]):
75
78
  bin_date = get_next_occurrence_from_day_month(
76
79
  datetime.strptime(
77
- bin_date_info[0] + " " + datetime.today().strftime("%Y"),
78
- "%A %d %B - %Y",
80
+ bin_date_info[0],
81
+ "%A %d %B -",
79
82
  )
80
- ).strftime(date_format)
83
+ )
81
84
  # On exceptional collection schedule (e.g. around English Bank Holidays), date will be contained in the second stripped string
82
85
  else:
83
86
  bin_date = get_next_occurrence_from_day_month(
84
87
  datetime.strptime(
85
- bin_date_info[1] + " " + datetime.today().strftime("%Y"),
86
- "%A %d %B - %Y",
88
+ bin_date_info[1],
89
+ "%A %d %B -",
87
90
  )
88
- ).strftime(date_format)
91
+ )
89
92
  except Exception as ex:
90
93
  raise ValueError(f"Error parsing bin data: {ex}")
91
94
 
95
+ if (datetime.now().month == 12) and (bin_date.month == 1):
96
+ bin_date = bin_date.replace(year=next_year)
97
+ else:
98
+ bin_date = bin_date.replace(year=current_year)
99
+
92
100
  # Build data dict for each entry
93
- dict_data = {"type": bin_type, "collectionDate": bin_date}
101
+ dict_data = {
102
+ "type": bin_type,
103
+ "collectionDate": bin_date.strftime(date_format),
104
+ }
94
105
  data["bins"].append(dict_data)
95
106
 
96
107
  data["bins"].sort(
@@ -42,14 +42,14 @@ class CouncilClass(AbstractGetBinDataClass):
42
42
  wait = WebDriverWait(driver, 60)
43
43
  address_entry_field = wait.until(
44
44
  EC.presence_of_element_located(
45
- (By.XPATH, '//*[@id="combobox-input-19"]')
45
+ (By.XPATH, '//*[@id="combobox-input-20"]')
46
46
  )
47
47
  )
48
48
 
49
49
  address_entry_field.send_keys(str(full_address))
50
50
 
51
51
  address_entry_field = wait.until(
52
- EC.element_to_be_clickable((By.XPATH, '//*[@id="combobox-input-19"]'))
52
+ EC.element_to_be_clickable((By.XPATH, '//*[@id="combobox-input-20"]'))
53
53
  )
54
54
  address_entry_field.click()
55
55
  address_entry_field.send_keys(Keys.BACKSPACE)
@@ -57,7 +57,7 @@ class CouncilClass(AbstractGetBinDataClass):
57
57
 
58
58
  first_found_address = wait.until(
59
59
  EC.element_to_be_clickable(
60
- (By.XPATH, '//*[@id="dropdown-element-19"]/ul')
60
+ (By.XPATH, '//*[@id="dropdown-element-20"]/ul')
61
61
  )
62
62
  )
63
63