uk_bin_collection 0.117.0__tar.gz → 0.118.0__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (272) hide show
  1. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/PKG-INFO +1 -1
  2. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/pyproject.toml +1 -1
  3. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/tests/input.json +41 -2
  4. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/BaberghDistrictCouncil.py +62 -0
  5. uk_bin_collection-0.118.0/uk_bin_collection/uk_bin_collection/councils/CopelandBoroughCouncil.py +93 -0
  6. uk_bin_collection-0.118.0/uk_bin_collection/uk_bin_collection/councils/CrawleyBoroughCouncil.py +112 -0
  7. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/MidSuffolkDistrictCouncil.py +62 -0
  8. uk_bin_collection-0.118.0/uk_bin_collection/uk_bin_collection/councils/RotherDistrictCouncil.py +84 -0
  9. uk_bin_collection-0.118.0/uk_bin_collection/uk_bin_collection/councils/SouthHamsDistrictCouncil.py +90 -0
  10. uk_bin_collection-0.118.0/uk_bin_collection/uk_bin_collection/councils/StevenageBoroughCouncil.py +101 -0
  11. uk_bin_collection-0.118.0/uk_bin_collection/uk_bin_collection/councils/ThanetDistrictCouncil.py +51 -0
  12. uk_bin_collection-0.118.0/uk_bin_collection/uk_bin_collection/councils/WolverhamptonCityCouncil.py +57 -0
  13. uk_bin_collection-0.117.0/uk_bin_collection/uk_bin_collection/councils/CrawleyBoroughCouncil.py +0 -61
  14. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/LICENSE +0 -0
  15. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/README.md +0 -0
  16. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/README.rst +0 -0
  17. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/tests/council_feature_input_parity.py +0 -0
  18. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/tests/features/environment.py +0 -0
  19. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/tests/features/validate_council_outputs.feature +0 -0
  20. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/tests/output.schema +0 -0
  21. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/tests/step_defs/step_helpers/file_handler.py +0 -0
  22. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/tests/step_defs/test_validate_council.py +0 -0
  23. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/tests/test_collect_data.py +0 -0
  24. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/tests/test_common_functions.py +0 -0
  25. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/tests/test_conftest.py +0 -0
  26. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/tests/test_get_data.py +0 -0
  27. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/collect_data.py +0 -0
  28. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/common.py +0 -0
  29. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/AberdeenshireCouncil.py +0 -0
  30. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/AdurAndWorthingCouncils.py +0 -0
  31. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/AntrimAndNewtonabbeyCouncil.py +0 -0
  32. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/ArdsAndNorthDownCouncil.py +0 -0
  33. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/ArgyllandButeCouncil.py +0 -0
  34. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/ArmaghBanbridgeCraigavonCouncil.py +0 -0
  35. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/ArunCouncil.py +0 -0
  36. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/AshfieldDistrictCouncil.py +0 -0
  37. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/AshfordBoroughCouncil.py +0 -0
  38. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/AylesburyValeCouncil.py +0 -0
  39. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/BCPCouncil.py +0 -0
  40. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/BarnetCouncil.py +0 -0
  41. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/BarnsleyMBCouncil.py +0 -0
  42. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/BasildonCouncil.py +0 -0
  43. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/BasingstokeCouncil.py +0 -0
  44. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/BathAndNorthEastSomersetCouncil.py +0 -0
  45. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/BedfordBoroughCouncil.py +0 -0
  46. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/BedfordshireCouncil.py +0 -0
  47. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/BelfastCityCouncil.py +0 -0
  48. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/BexleyCouncil.py +0 -0
  49. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/BirminghamCityCouncil.py +0 -0
  50. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/BlabyDistrictCouncil.py +0 -0
  51. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/BlackburnCouncil.py +0 -0
  52. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/BoltonCouncil.py +0 -0
  53. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/BracknellForestCouncil.py +0 -0
  54. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/BradfordMDC.py +0 -0
  55. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/BrecklandCouncil.py +0 -0
  56. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/BrightonandHoveCityCouncil.py +0 -0
  57. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/BristolCityCouncil.py +0 -0
  58. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/BromleyBoroughCouncil.py +0 -0
  59. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/BromsgroveDistrictCouncil.py +0 -0
  60. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/BroxbourneCouncil.py +0 -0
  61. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/BroxtoweBoroughCouncil.py +0 -0
  62. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/BuckinghamshireCouncil.py +0 -0
  63. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/BuryCouncil.py +0 -0
  64. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/CalderdaleCouncil.py +0 -0
  65. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/CannockChaseDistrictCouncil.py +0 -0
  66. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/CanterburyCityCouncil.py +0 -0
  67. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/CardiffCouncil.py +0 -0
  68. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/CarmarthenshireCountyCouncil.py +0 -0
  69. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/CastlepointDistrictCouncil.py +0 -0
  70. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/CharnwoodBoroughCouncil.py +0 -0
  71. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/ChelmsfordCityCouncil.py +0 -0
  72. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/CheshireEastCouncil.py +0 -0
  73. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/CheshireWestAndChesterCouncil.py +0 -0
  74. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/ChesterfieldBoroughCouncil.py +0 -0
  75. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/ChichesterDistrictCouncil.py +0 -0
  76. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/ChorleyCouncil.py +0 -0
  77. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/ColchesterCityCouncil.py +0 -0
  78. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/ConwyCountyBorough.py +0 -0
  79. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/CornwallCouncil.py +0 -0
  80. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/CotswoldDistrictCouncil.py +0 -0
  81. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/CoventryCityCouncil.py +0 -0
  82. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/CroydonCouncil.py +0 -0
  83. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/DacorumBoroughCouncil.py +0 -0
  84. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/DartfordBoroughCouncil.py +0 -0
  85. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/DerbyCityCouncil.py +0 -0
  86. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/DerbyshireDalesDistrictCouncil.py +0 -0
  87. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/DoncasterCouncil.py +0 -0
  88. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/DorsetCouncil.py +0 -0
  89. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/DoverDistrictCouncil.py +0 -0
  90. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/DudleyCouncil.py +0 -0
  91. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/DurhamCouncil.py +0 -0
  92. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/EalingCouncil.py +0 -0
  93. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/EastAyrshireCouncil.py +0 -0
  94. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/EastCambridgeshireCouncil.py +0 -0
  95. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/EastDevonDC.py +0 -0
  96. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/EastHertsCouncil.py +0 -0
  97. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/EastLindseyDistrictCouncil.py +0 -0
  98. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/EastRenfrewshireCouncil.py +0 -0
  99. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/EastRidingCouncil.py +0 -0
  100. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/EastSuffolkCouncil.py +0 -0
  101. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/EastleighBoroughCouncil.py +0 -0
  102. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/ElmbridgeBoroughCouncil.py +0 -0
  103. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/EnfieldCouncil.py +0 -0
  104. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/EnvironmentFirst.py +0 -0
  105. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/EppingForestDistrictCouncil.py +0 -0
  106. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/ErewashBoroughCouncil.py +0 -0
  107. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/FalkirkCouncil.py +0 -0
  108. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/FarehamBoroughCouncil.py +0 -0
  109. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/FenlandDistrictCouncil.py +0 -0
  110. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/FifeCouncil.py +0 -0
  111. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/FlintshireCountyCouncil.py +0 -0
  112. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/ForestOfDeanDistrictCouncil.py +0 -0
  113. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/GatesheadCouncil.py +0 -0
  114. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/GedlingBoroughCouncil.py +0 -0
  115. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/GlasgowCityCouncil.py +0 -0
  116. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/GloucesterCityCouncil.py +0 -0
  117. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/GraveshamBoroughCouncil.py +0 -0
  118. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/GuildfordCouncil.py +0 -0
  119. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/HaltonBoroughCouncil.py +0 -0
  120. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/HarboroughDistrictCouncil.py +0 -0
  121. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/HaringeyCouncil.py +0 -0
  122. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/HarrogateBoroughCouncil.py +0 -0
  123. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/HertsmereBoroughCouncil.py +0 -0
  124. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/HighPeakCouncil.py +0 -0
  125. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/HighlandCouncil.py +0 -0
  126. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/HounslowCouncil.py +0 -0
  127. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/HullCityCouncil.py +0 -0
  128. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/HuntingdonDistrictCouncil.py +0 -0
  129. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/IslingtonCouncil.py +0 -0
  130. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/KingstonUponThamesCouncil.py +0 -0
  131. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/KirkleesCouncil.py +0 -0
  132. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/KnowsleyMBCouncil.py +0 -0
  133. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/LancasterCityCouncil.py +0 -0
  134. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/LeedsCityCouncil.py +0 -0
  135. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/LichfieldDistrictCouncil.py +0 -0
  136. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/LincolnCouncil.py +0 -0
  137. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/LisburnCastlereaghCityCouncil.py +0 -0
  138. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/LiverpoolCityCouncil.py +0 -0
  139. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughEaling.py +0 -0
  140. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughHarrow.py +0 -0
  141. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughHounslow.py +0 -0
  142. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughLambeth.py +0 -0
  143. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughRedbridge.py +0 -0
  144. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughSutton.py +0 -0
  145. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/LutonBoroughCouncil.py +0 -0
  146. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/MaldonDistrictCouncil.py +0 -0
  147. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/MalvernHillsDC.py +0 -0
  148. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/ManchesterCityCouncil.py +0 -0
  149. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/MansfieldDistrictCouncil.py +0 -0
  150. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/MertonCouncil.py +0 -0
  151. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/MidAndEastAntrimBoroughCouncil.py +0 -0
  152. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/MidDevonCouncil.py +0 -0
  153. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/MidSussexDistrictCouncil.py +0 -0
  154. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/MidlothianCouncil.py +0 -0
  155. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/MiltonKeynesCityCouncil.py +0 -0
  156. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/MoleValleyDistrictCouncil.py +0 -0
  157. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/NeathPortTalbotCouncil.py +0 -0
  158. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/NewForestCouncil.py +0 -0
  159. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/NewarkAndSherwoodDC.py +0 -0
  160. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/NewcastleCityCouncil.py +0 -0
  161. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/NewhamCouncil.py +0 -0
  162. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/NewportCityCouncil.py +0 -0
  163. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/NorthAyrshireCouncil.py +0 -0
  164. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/NorthEastDerbyshireDistrictCouncil.py +0 -0
  165. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/NorthEastLincs.py +0 -0
  166. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/NorthKestevenDistrictCouncil.py +0 -0
  167. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/NorthLanarkshireCouncil.py +0 -0
  168. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/NorthLincolnshireCouncil.py +0 -0
  169. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/NorthNorfolkDistrictCouncil.py +0 -0
  170. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/NorthNorthamptonshireCouncil.py +0 -0
  171. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/NorthSomersetCouncil.py +0 -0
  172. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/NorthTynesideCouncil.py +0 -0
  173. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/NorthWestLeicestershire.py +0 -0
  174. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/NorthYorkshire.py +0 -0
  175. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/NorthumberlandCouncil.py +0 -0
  176. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/NorwichCityCouncil.py +0 -0
  177. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/NottinghamCityCouncil.py +0 -0
  178. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/NuneatonBedworthBoroughCouncil.py +0 -0
  179. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/OldhamCouncil.py +0 -0
  180. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/OxfordCityCouncil.py +0 -0
  181. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/PerthAndKinrossCouncil.py +0 -0
  182. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/PlymouthCouncil.py +0 -0
  183. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/PortsmouthCityCouncil.py +0 -0
  184. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/PowysCouncil.py +0 -0
  185. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/PrestonCityCouncil.py +0 -0
  186. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/ReadingBoroughCouncil.py +0 -0
  187. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/ReigateAndBansteadBoroughCouncil.py +0 -0
  188. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/RenfrewshireCouncil.py +0 -0
  189. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/RhonddaCynonTaffCouncil.py +0 -0
  190. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/RochdaleCouncil.py +0 -0
  191. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/RochfordCouncil.py +0 -0
  192. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/RotherhamCouncil.py +0 -0
  193. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/RugbyBoroughCouncil.py +0 -0
  194. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/RushcliffeBoroughCouncil.py +0 -0
  195. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/RushmoorCouncil.py +0 -0
  196. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/SalfordCityCouncil.py +0 -0
  197. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/SeftonCouncil.py +0 -0
  198. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/SevenoaksDistrictCouncil.py +0 -0
  199. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/SheffieldCityCouncil.py +0 -0
  200. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/ShropshireCouncil.py +0 -0
  201. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/SolihullCouncil.py +0 -0
  202. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/SomersetCouncil.py +0 -0
  203. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/SouthAyrshireCouncil.py +0 -0
  204. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/SouthCambridgeshireCouncil.py +0 -0
  205. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/SouthDerbyshireDistrictCouncil.py +0 -0
  206. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/SouthGloucestershireCouncil.py +0 -0
  207. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/SouthKestevenDistrictCouncil.py +0 -0
  208. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/SouthLanarkshireCouncil.py +0 -0
  209. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/SouthNorfolkCouncil.py +0 -0
  210. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/SouthOxfordshireCouncil.py +0 -0
  211. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/SouthRibbleCouncil.py +0 -0
  212. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/SouthStaffordshireDistrictCouncil.py +0 -0
  213. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/SouthTynesideCouncil.py +0 -0
  214. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/SouthwarkCouncil.py +0 -0
  215. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/StAlbansCityAndDistrictCouncil.py +0 -0
  216. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/StHelensBC.py +0 -0
  217. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/StaffordBoroughCouncil.py +0 -0
  218. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/StaffordshireMoorlandsDistrictCouncil.py +0 -0
  219. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/StockportBoroughCouncil.py +0 -0
  220. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/StocktonOnTeesCouncil.py +0 -0
  221. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/StokeOnTrentCityCouncil.py +0 -0
  222. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/StratfordUponAvonCouncil.py +0 -0
  223. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/StroudDistrictCouncil.py +0 -0
  224. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/SunderlandCityCouncil.py +0 -0
  225. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/SwaleBoroughCouncil.py +0 -0
  226. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/SwanseaCouncil.py +0 -0
  227. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/SwindonBoroughCouncil.py +0 -0
  228. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/TamesideMBCouncil.py +0 -0
  229. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/TandridgeDistrictCouncil.py +0 -0
  230. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/TeignbridgeCouncil.py +0 -0
  231. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/TelfordAndWrekinCouncil.py +0 -0
  232. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/TendringDistrictCouncil.py +0 -0
  233. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/TestValleyBoroughCouncil.py +0 -0
  234. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/ThreeRiversDistrictCouncil.py +0 -0
  235. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/TonbridgeAndMallingBC.py +0 -0
  236. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/TorbayCouncil.py +0 -0
  237. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/TorridgeDistrictCouncil.py +0 -0
  238. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/TunbridgeWellsCouncil.py +0 -0
  239. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/UttlesfordDistrictCouncil.py +0 -0
  240. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/ValeofGlamorganCouncil.py +0 -0
  241. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/ValeofWhiteHorseCouncil.py +0 -0
  242. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/WakefieldCityCouncil.py +0 -0
  243. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/WalsallCouncil.py +0 -0
  244. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/WalthamForest.py +0 -0
  245. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/WarringtonBoroughCouncil.py +0 -0
  246. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/WarwickDistrictCouncil.py +0 -0
  247. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/WatfordBoroughCouncil.py +0 -0
  248. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/WaverleyBoroughCouncil.py +0 -0
  249. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/WealdenDistrictCouncil.py +0 -0
  250. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/WelhatCouncil.py +0 -0
  251. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/WestBerkshireCouncil.py +0 -0
  252. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/WestLancashireBoroughCouncil.py +0 -0
  253. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/WestLindseyDistrictCouncil.py +0 -0
  254. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/WestLothianCouncil.py +0 -0
  255. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/WestMorlandAndFurness.py +0 -0
  256. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/WestNorthamptonshireCouncil.py +0 -0
  257. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/WestOxfordshireDistrictCouncil.py +0 -0
  258. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/WestSuffolkCouncil.py +0 -0
  259. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/WiganBoroughCouncil.py +0 -0
  260. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/WiltshireCouncil.py +0 -0
  261. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/WinchesterCityCouncil.py +0 -0
  262. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/WindsorAndMaidenheadCouncil.py +0 -0
  263. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/WirralCouncil.py +0 -0
  264. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/WokingBoroughCouncil.py +0 -0
  265. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/WokinghamBoroughCouncil.py +0 -0
  266. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/WorcesterCityCouncil.py +0 -0
  267. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/WychavonDistrictCouncil.py +0 -0
  268. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/WyreCouncil.py +0 -0
  269. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/YorkCouncil.py +0 -0
  270. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/councils/council_class_template/councilclasstemplate.py +0 -0
  271. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/uk_bin_collection/uk_bin_collection/create_new_council.py +0 -0
  272. {uk_bin_collection-0.117.0 → uk_bin_collection-0.118.0}/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.117.0
3
+ Version: 0.118.0
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.117.0"
3
+ version = "0.118.0"
4
4
  description = "Python Lib to collect UK Bin Data"
5
5
  readme = "README.md"
6
6
  authors = ["Robert Bradley <robbrad182@gmail.com>"]
@@ -81,9 +81,10 @@
81
81
  "BaberghDistrictCouncil": {
82
82
  "skip_get_url": true,
83
83
  "house_number": "Monday",
84
+ "postcode": "Week 1",
84
85
  "url": "https://www.babergh.gov.uk",
85
86
  "wiki_name": "Babergh District Council",
86
- "wiki_note": "Use the House Number field to pass the DAY of the week for your collections. Monday/Tuesday/Wednesday/Thursday/Friday"
87
+ "wiki_note": "Use the House Number field to pass the DAY of the week for your collections. Monday/Tuesday/Wednesday/Thursday/Friday. [OPTIONAL] Use the 'postcode' field to pass the WEEK for your garden collection. [Week 1/Week 2]"
87
88
  },
88
89
  "BCPCouncil": {
89
90
  "skip_get_url": true,
@@ -397,6 +398,12 @@
397
398
  "wiki_name": "Conwy County Borough Council",
398
399
  "wiki_note": "Conwy County Borough Council uses a straight UPRN in the URL, e.g., `&uprn=XXXXXXXXXXXXX`."
399
400
  },
401
+ "CopelandBoroughCouncil": {
402
+ "uprn": "100110734613",
403
+ "url": "https://www.copeland.gov.uk",
404
+ "wiki_name": "Copeland Borough Council",
405
+ "wiki_note": "Use [FindMyAddress](https://www.findmyaddress.co.uk/search) to find your UPRN."
406
+ },
400
407
  "CornwallCouncil": {
401
408
  "skip_get_url": true,
402
409
  "uprn": "100040128734",
@@ -1005,9 +1012,10 @@
1005
1012
  "MidSuffolkDistrictCouncil": {
1006
1013
  "skip_get_url": true,
1007
1014
  "house_number": "Monday",
1015
+ "postcode": "Week 2",
1008
1016
  "url": "https://www.midsuffolk.gov.uk",
1009
1017
  "wiki_name": "Mid Suffolk District Council",
1010
- "wiki_note": "Use the House Number field to pass the DAY of the week for your collections. Monday/Tuesday/Wednesday/Thursday/Friday"
1018
+ "wiki_note": "Use the House Number field to pass the DAY of the week for your collections. Monday/Tuesday/Wednesday/Thursday/Friday. [OPTIONAL] Use the 'postcode' field to pass the WEEK for your garden collection. [Week 1/Week 2]"
1011
1019
  },
1012
1020
  "MidSussexDistrictCouncil": {
1013
1021
  "house_number": "OAKLANDS, OAKLANDS ROAD RH16 1SS",
@@ -1303,6 +1311,12 @@
1303
1311
  "wiki_name": "Rochford Council",
1304
1312
  "wiki_note": "No extra parameters are required. Dates presented should be read as 'week commencing'."
1305
1313
  },
1314
+ "RotherDistrictCouncil": {
1315
+ "uprn": "100061937338",
1316
+ "url": "https://www.rother.gov.uk",
1317
+ "wiki_name": "Rother District Council",
1318
+ "wiki_note": "Use [FindMyAddress](https://www.findmyaddress.co.uk/search) to find your UPRN."
1319
+ },
1306
1320
  "RotherhamCouncil": {
1307
1321
  "url": "https://www.rotherham.gov.uk/bin-collections?address=100050866000&submit=Submit",
1308
1322
  "uprn": "100050866000",
@@ -1412,6 +1426,12 @@
1412
1426
  "wiki_name": "South Gloucestershire Council",
1413
1427
  "wiki_note": "Provide your UPRN. You can find it using [FindMyAddress](https://www.findmyaddress.co.uk/search)."
1414
1428
  },
1429
+ "SouthHamsDistrictCouncil": {
1430
+ "uprn": "10004742851",
1431
+ "url": "https://www.southhams.gov.uk",
1432
+ "wiki_name": "South Hams District Council",
1433
+ "wiki_note": "Use [FindMyAddress](https://www.findmyaddress.co.uk/search) to find your UPRN."
1434
+ },
1415
1435
  "SouthKestevenDistrictCouncil": {
1416
1436
  "house_number": "2 Althorpe Close, Market Deeping, PE6 8BL",
1417
1437
  "postcode": "PE68BL",
@@ -1476,6 +1496,12 @@
1476
1496
  "wiki_name": "St Albans City and District Council",
1477
1497
  "wiki_note": "Provide your UPRN. You can find it using [FindMyAddress](https://www.findmyaddress.co.uk/search)."
1478
1498
  },
1499
+ "StevenageBoroughCouncil": {
1500
+ "uprn": "100080878852",
1501
+ "url": "https://www.stevenage.gov.uk",
1502
+ "wiki_name": "Stevenage Borough Council",
1503
+ "wiki_note": "Use [FindMyAddress](https://www.findmyaddress.co.uk/search) to find your UPRN."
1504
+ },
1479
1505
  "StHelensBC": {
1480
1506
  "house_number": "15",
1481
1507
  "postcode": "L34 2GA",
@@ -1630,6 +1656,12 @@
1630
1656
  "wiki_name": "Test Valley Borough Council",
1631
1657
  "wiki_note": "Provide your UPRN and postcode. Use [FindMyAddress](https://www.findmyaddress.co.uk/search) to find your UPRN."
1632
1658
  },
1659
+ "ThanetDistrictCouncil": {
1660
+ "uprn": "100061111858",
1661
+ "url": "https://www.thanet.gov.uk",
1662
+ "wiki_name": "Thanet District Council",
1663
+ "wiki_note": "Use [FindMyAddress](https://www.findmyaddress.co.uk/search) to find your UPRN."
1664
+ },
1633
1665
  "ThreeRiversDistrictCouncil": {
1634
1666
  "postcode": "WD3 7AZ",
1635
1667
  "skip_get_url": true,
@@ -1897,6 +1929,13 @@
1897
1929
  "wiki_name": "Worcester City Council",
1898
1930
  "wiki_note": "Provide your UPRN. You can find it using [FindMyAddress](https://www.findmyaddress.co.uk/search)."
1899
1931
  },
1932
+ "WolverhamptonCityCouncil": {
1933
+ "uprn": "100071205205",
1934
+ "postcode": "WV3 9NZ",
1935
+ "url": "https://www.wolverhampton.gov.uk",
1936
+ "wiki_name": "Wolverhampton City Council",
1937
+ "wiki_note": "Use [FindMyAddress](https://www.findmyaddress.co.uk/search) to find your UPRN."
1938
+ },
1900
1939
  "WorcesterCityCouncil": {
1901
1940
  "url": "https://www.Worcester.gov.uk",
1902
1941
  "wiki_command_url_override": "https://www.Worcester.gov.uk",
@@ -23,6 +23,7 @@ class CouncilClass(AbstractGetBinDataClass):
23
23
  def parse_data(self, page: str, **kwargs) -> dict:
24
24
 
25
25
  collection_day = kwargs.get("paon")
26
+ garden_collection_week = kwargs.get("postcode")
26
27
  bindata = {"bins": []}
27
28
 
28
29
  days_of_week = [
@@ -35,10 +36,14 @@ class CouncilClass(AbstractGetBinDataClass):
35
36
  "Sunday",
36
37
  ]
37
38
 
39
+ garden_week = ["Week 1", "Week 2"]
40
+
38
41
  refusestartDate = datetime(2024, 11, 4)
39
42
  recyclingstartDate = datetime(2024, 11, 11)
40
43
 
41
44
  offset_days = days_of_week.index(collection_day)
45
+ if garden_collection_week:
46
+ garden_collection = garden_week.index(garden_collection_week)
42
47
 
43
48
  refuse_dates = get_dates_every_x_days(refusestartDate, 14, 28)
44
49
  recycling_dates = get_dates_every_x_days(recyclingstartDate, 14, 28)
@@ -125,6 +130,63 @@ class CouncilClass(AbstractGetBinDataClass):
125
130
  }
126
131
  bindata["bins"].append(dict_data)
127
132
 
133
+ if garden_collection_week:
134
+ if garden_collection == 0:
135
+ gardenstartDate = datetime(2024, 11, 11)
136
+ elif garden_collection == 1:
137
+ gardenstartDate = datetime(2024, 11, 4)
138
+
139
+ garden_dates = get_dates_every_x_days(gardenstartDate, 14, 28)
140
+
141
+ garden_bank_holidays = [
142
+ ("23/12/2024", 1),
143
+ ("24/12/2024", 1),
144
+ ("25/12/2024", 1),
145
+ ("26/12/2024", 1),
146
+ ("27/12/2024", 1),
147
+ ("30/12/2024", 1),
148
+ ("31/12/2024", 1),
149
+ ("01/01/2025", 1),
150
+ ("02/01/2025", 1),
151
+ ("03/01/2025", 1),
152
+ ]
153
+
154
+ for gardenDate in garden_dates:
155
+
156
+ collection_date = (
157
+ datetime.strptime(gardenDate, "%d/%m/%Y")
158
+ + timedelta(days=offset_days)
159
+ ).strftime("%d/%m/%Y")
160
+
161
+ garden_holiday = next(
162
+ (
163
+ value
164
+ for date, value in garden_bank_holidays
165
+ if date == collection_date
166
+ ),
167
+ 0,
168
+ )
169
+
170
+ if garden_holiday > 0:
171
+ continue
172
+
173
+ holiday_offset = next(
174
+ (value for date, value in bank_holidays if date == collection_date),
175
+ 0,
176
+ )
177
+
178
+ if holiday_offset > 0:
179
+ collection_date = (
180
+ datetime.strptime(collection_date, "%d/%m/%Y")
181
+ + timedelta(days=holiday_offset)
182
+ ).strftime("%d/%m/%Y")
183
+
184
+ dict_data = {
185
+ "type": "Garden Bin",
186
+ "collectionDate": collection_date,
187
+ }
188
+ bindata["bins"].append(dict_data)
189
+
128
190
  bindata["bins"].sort(
129
191
  key=lambda x: datetime.strptime(x.get("collectionDate"), "%d/%m/%Y")
130
192
  )
@@ -0,0 +1,93 @@
1
+ from xml.etree import ElementTree
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
+ baseclass. They can also override some
13
+ operations with a default implementation.
14
+ """
15
+
16
+ def parse_data(self, page: str, **kwargs) -> dict:
17
+ uprn = kwargs.get("uprn")
18
+ check_uprn(uprn)
19
+ council = "CPL"
20
+
21
+ # Make SOAP request
22
+ headers = {
23
+ "Content-Type": "text/xml; charset=UTF-8",
24
+ "Referer": "https://collections-copeland.azurewebsites.net/calendar.html",
25
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36",
26
+ }
27
+ requests.packages.urllib3.disable_warnings()
28
+ post_data = (
29
+ '<?xml version="1.0" encoding="utf-8"?>'
30
+ '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">'
31
+ '<soap:Body><getRoundCalendarForUPRN xmlns="http://webaspx-collections.azurewebsites.net/">'
32
+ "<council>" + council + "</council><UPRN>" + uprn + "</UPRN>"
33
+ "<from>Chtml</from></getRoundCalendarForUPRN></soap:Body></soap:Envelope>"
34
+ )
35
+ response = requests.post(
36
+ "https://collections-copeland.azurewebsites.net/WSCollExternal.asmx",
37
+ headers=headers,
38
+ data=post_data,
39
+ )
40
+
41
+ if response.status_code != 200:
42
+ raise ValueError("No bin data found for provided UPRN.")
43
+
44
+ # Get HTML from SOAP response
45
+ xmltree = ElementTree.fromstring(response.text)
46
+ html = xmltree.find(
47
+ ".//{http://webaspx-collections.azurewebsites.net/}getRoundCalendarForUPRNResult"
48
+ ).text
49
+ # Parse with BS4
50
+ soup = BeautifulSoup(html, features="html.parser")
51
+ soup.prettify()
52
+
53
+ data = {"bins": []}
54
+ for bin_type in ["Refuse", "Recycling", "Garden"]:
55
+ bin_el = soup.find("b", string=bin_type)
56
+ if bin_el:
57
+ bin_info = bin_el.next_sibling.split(": ")[1]
58
+ collection_date = ""
59
+ results = re.search("([A-Za-z]+ \\d\\d? [A-Za-z]+) then", bin_info)
60
+ if results:
61
+ if results[1] == "Today":
62
+ date = datetime.now()
63
+ elif results[1] == "Tomorrow":
64
+ date = datetime.now() + timedelta(days=1)
65
+ else:
66
+ date = get_next_occurrence_from_day_month(
67
+ datetime.strptime(
68
+ results[1] + " " + datetime.now().strftime("%Y"),
69
+ "%a %d %b %Y",
70
+ )
71
+ )
72
+ if date:
73
+ collection_date = date.strftime(date_format)
74
+ else:
75
+ results2 = re.search("([A-Za-z]+) then", bin_info)
76
+ if results2:
77
+ if results2[1] == "Today":
78
+ collection_date = datetime.now().strftime(date_format)
79
+ elif results2[1] == "Tomorrow":
80
+ collection_date = (
81
+ datetime.now() + timedelta(days=1)
82
+ ).strftime(date_format)
83
+ else:
84
+ collection_date = results2[1]
85
+
86
+ if collection_date != "":
87
+ dict_data = {
88
+ "type": bin_type,
89
+ "collectionDate": collection_date,
90
+ }
91
+ data["bins"].append(dict_data)
92
+
93
+ return data
@@ -0,0 +1,112 @@
1
+ import time
2
+
3
+ import requests
4
+ from dateutil.relativedelta import relativedelta
5
+
6
+ from uk_bin_collection.uk_bin_collection.common import *
7
+ from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
8
+
9
+
10
+ # import the wonderful Beautiful Soup and the URL grabber
11
+ class CouncilClass(AbstractGetBinDataClass):
12
+ """
13
+ Concrete classes have to implement all abstract operations of the
14
+ base class. They can also override some operations with a default
15
+ implementation.
16
+ """
17
+
18
+ def parse_data(self, page: str, **kwargs) -> dict:
19
+ # Make a BS4 object
20
+ uprn = kwargs.get("uprn")
21
+ usrn = kwargs.get("paon")
22
+ check_uprn(uprn)
23
+ check_usrn(usrn)
24
+ bindata = {"bins": []}
25
+
26
+ SESSION_URL = "https://crawleybc-self.achieveservice.com/authapi/isauthenticated?uri=https%253A%252F%252Fcrawleybc-self.achieveservice.com%252Fen%252FAchieveForms%252F%253Fform_uri%253Dsandbox-publish%253A%252F%252FAF-Process-fb73f73e-e8f5-4441-9f83-8b5d04d889d6%252FAF-Stage-ec9ada91-d2d9-43bc-9730-597d15fc8108%252Fdefinition.json%2526redirectlink%253D%252Fen%2526cancelRedirectLink%253D%252Fen%2526noLoginPrompt%253D1%2526accept%253Dyes&hostname=crawleybc-self.achieveservice.com&withCredentials=true"
27
+
28
+ API_URL = "https://crawleybc-self.achieveservice.com/apibroker/"
29
+
30
+ currentdate = datetime.now().strftime("%d/%m/%Y")
31
+
32
+ data = {
33
+ "formValues": {
34
+ "Address": {
35
+ "address": {
36
+ "value": {
37
+ "Address": {
38
+ "usrn": {
39
+ "value": usrn,
40
+ },
41
+ "uprn": {
42
+ "value": uprn,
43
+ },
44
+ }
45
+ },
46
+ },
47
+ "dayConverted": {
48
+ "value": currentdate,
49
+ },
50
+ "getCollection": {
51
+ "value": "true",
52
+ },
53
+ "getWorksheets": {
54
+ "value": "false",
55
+ },
56
+ },
57
+ },
58
+ }
59
+
60
+ headers = {
61
+ "Content-Type": "application/json",
62
+ "Accept": "application/json",
63
+ "User-Agent": "Mozilla/5.0",
64
+ "X-Requested-With": "XMLHttpRequest",
65
+ "Referer": "https://crawleybc-self.achieveservice.com/fillform/?iframe_id=fillform-frame-1&db_id=",
66
+ }
67
+ s = requests.session()
68
+ r = s.get(SESSION_URL)
69
+ r.raise_for_status()
70
+ session_data = r.json()
71
+ sid = session_data["auth-session"]
72
+ params = {
73
+ "api": "RunLookup",
74
+ "id": "5b4f0ec5f13f4",
75
+ "repeat_against": "",
76
+ "noRetry": "true",
77
+ "getOnlyTokens": "undefined",
78
+ "log_id": "",
79
+ "app_name": "AF-Renderer::Self",
80
+ # unix_timestamp
81
+ "_": str(int(time.time() * 1000)),
82
+ "sid": sid,
83
+ }
84
+
85
+ r = s.post(API_URL, json=data, headers=headers, params=params)
86
+ r.raise_for_status()
87
+
88
+ data = r.json()
89
+ rows_data = data["integration"]["transformed"]["rows_data"]["0"]
90
+ if not isinstance(rows_data, dict):
91
+ raise ValueError("Invalid data returned from API")
92
+
93
+ # Extract each service's relevant details for the bin schedule
94
+ for key, value in rows_data.items():
95
+ if key.endswith("DateNext"):
96
+ BinType = key.replace("DateNext", "Service")
97
+ for key2, value2 in rows_data.items():
98
+ if key2 == BinType:
99
+ BinType = value2
100
+ next_collection = datetime.strptime(value, "%A %d %B").replace(
101
+ year=datetime.now().year
102
+ )
103
+ if datetime.now().month == 12 and next_collection.month == 1:
104
+ next_collection = next_collection + relativedelta(years=1)
105
+
106
+ dict_data = {
107
+ "type": BinType,
108
+ "collectionDate": next_collection.strftime(date_format),
109
+ }
110
+ bindata["bins"].append(dict_data)
111
+
112
+ return bindata
@@ -23,6 +23,7 @@ class CouncilClass(AbstractGetBinDataClass):
23
23
  def parse_data(self, page: str, **kwargs) -> dict:
24
24
 
25
25
  collection_day = kwargs.get("paon")
26
+ garden_collection_week = kwargs.get("postcode")
26
27
  bindata = {"bins": []}
27
28
 
28
29
  days_of_week = [
@@ -35,10 +36,14 @@ class CouncilClass(AbstractGetBinDataClass):
35
36
  "Sunday",
36
37
  ]
37
38
 
39
+ garden_week = ["Week 1", "Week 2"]
40
+
38
41
  refusestartDate = datetime(2024, 11, 11)
39
42
  recyclingstartDate = datetime(2024, 11, 4)
40
43
 
41
44
  offset_days = days_of_week.index(collection_day)
45
+ if garden_collection_week:
46
+ garden_collection = garden_week.index(garden_collection_week)
42
47
 
43
48
  refuse_dates = get_dates_every_x_days(refusestartDate, 14, 28)
44
49
  recycling_dates = get_dates_every_x_days(recyclingstartDate, 14, 28)
@@ -125,6 +130,63 @@ class CouncilClass(AbstractGetBinDataClass):
125
130
  }
126
131
  bindata["bins"].append(dict_data)
127
132
 
133
+ if garden_collection_week:
134
+ if garden_collection == 0:
135
+ gardenstartDate = datetime(2024, 11, 11)
136
+ elif garden_collection == 1:
137
+ gardenstartDate = datetime(2024, 11, 4)
138
+
139
+ garden_dates = get_dates_every_x_days(gardenstartDate, 14, 28)
140
+
141
+ garden_bank_holidays = [
142
+ ("23/12/2024", 1),
143
+ ("24/12/2024", 1),
144
+ ("25/12/2024", 1),
145
+ ("26/12/2024", 1),
146
+ ("27/12/2024", 1),
147
+ ("30/12/2024", 1),
148
+ ("31/12/2024", 1),
149
+ ("01/01/2025", 1),
150
+ ("02/01/2025", 1),
151
+ ("03/01/2025", 1),
152
+ ]
153
+
154
+ for gardenDate in garden_dates:
155
+
156
+ collection_date = (
157
+ datetime.strptime(gardenDate, "%d/%m/%Y")
158
+ + timedelta(days=offset_days)
159
+ ).strftime("%d/%m/%Y")
160
+
161
+ garden_holiday = next(
162
+ (
163
+ value
164
+ for date, value in garden_bank_holidays
165
+ if date == collection_date
166
+ ),
167
+ 0,
168
+ )
169
+
170
+ if garden_holiday > 0:
171
+ continue
172
+
173
+ holiday_offset = next(
174
+ (value for date, value in bank_holidays if date == collection_date),
175
+ 0,
176
+ )
177
+
178
+ if holiday_offset > 0:
179
+ collection_date = (
180
+ datetime.strptime(collection_date, "%d/%m/%Y")
181
+ + timedelta(days=holiday_offset)
182
+ ).strftime("%d/%m/%Y")
183
+
184
+ dict_data = {
185
+ "type": "Garden Bin",
186
+ "collectionDate": collection_date,
187
+ }
188
+ bindata["bins"].append(dict_data)
189
+
128
190
  bindata["bins"].sort(
129
191
  key=lambda x: datetime.strptime(x.get("collectionDate"), "%d/%m/%Y")
130
192
  )
@@ -0,0 +1,84 @@
1
+ from datetime import datetime
2
+
3
+ import requests
4
+ from bs4 import BeautifulSoup
5
+ from dateutil.relativedelta import relativedelta
6
+
7
+ from uk_bin_collection.uk_bin_collection.common import *
8
+ from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
9
+
10
+
11
+ class CouncilClass(AbstractGetBinDataClass):
12
+ """
13
+ Concrete classes have to implement all abstract operations of the
14
+ base class. They can also override some operations with a default
15
+ implementation.
16
+ """
17
+
18
+ def parse_data(self, page: str, **kwargs) -> dict:
19
+ # Get and check UPRN
20
+ user_uprn = kwargs.get("uprn")
21
+ check_uprn(user_uprn)
22
+ bindata = {"bins": []}
23
+
24
+ uri = "https://www.rother.gov.uk/wp-admin/admin-ajax.php"
25
+ params = {
26
+ "action": "get_address_data",
27
+ "uprn": user_uprn,
28
+ "context": "full-page",
29
+ }
30
+
31
+ headers = {
32
+ "Content-Type": "application/x-www-form-urlencoded",
33
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36",
34
+ }
35
+
36
+ # Send a POST request with form data and headers
37
+ r = requests.post(uri, data=params, headers=headers, verify=False)
38
+
39
+ result = r.json()
40
+
41
+ if result["success"]:
42
+ # Parse the HTML with BeautifulSoup
43
+ soup = BeautifulSoup(result["data"], "html.parser")
44
+ soup.prettify()
45
+
46
+ # print(soup)
47
+
48
+ # Find the div elements with class "bindays-item"
49
+ bin_days = soup.find_all("div", class_="bindays-item")
50
+
51
+ # Loop through each bin item and extract type and date
52
+ for bin_day in bin_days:
53
+ # Extract bin type from the <h3> tag
54
+ bin_type = bin_day.find("h3").get_text(strip=True).replace(":", "")
55
+
56
+ # Extract date (or check if it's a subscription link for Garden Waste)
57
+ date_span = bin_day.find("span", class_="find-my-nearest-bindays-date")
58
+ if date_span:
59
+ if date_span.find("a"):
60
+ # If there is a link, this is the Garden bin signup link
61
+ continue
62
+ else:
63
+ # Otherwise, get the date text directly
64
+ date = date_span.get_text(strip=True)
65
+ else:
66
+ date = None
67
+
68
+ date = datetime.strptime(
69
+ remove_ordinal_indicator_from_date_string(date),
70
+ "%A %d %B",
71
+ ).replace(year=datetime.now().year)
72
+ if datetime.now().month == 12 and date.month == 1:
73
+ date = date + relativedelta(years=1)
74
+
75
+ dict_data = {
76
+ "type": bin_type,
77
+ "collectionDate": date.strftime(date_format),
78
+ }
79
+ bindata["bins"].append(dict_data)
80
+
81
+ bindata["bins"].sort(
82
+ key=lambda x: datetime.strptime(x.get("collectionDate"), "%d/%m/%Y")
83
+ )
84
+ return bindata
@@ -0,0 +1,90 @@
1
+ from datetime import datetime
2
+
3
+ import requests
4
+ from bs4 import BeautifulSoup
5
+ from dateutil.relativedelta import relativedelta
6
+
7
+ from uk_bin_collection.uk_bin_collection.common import *
8
+ from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
9
+
10
+
11
+ class CouncilClass(AbstractGetBinDataClass):
12
+ """
13
+ Concrete classes have to implement all abstract operations of the
14
+ base class. They can also override some operations with a default
15
+ implementation.
16
+ """
17
+
18
+ def parse_data(self, page: str, **kwargs) -> dict:
19
+ # Get and check UPRN
20
+ user_uprn = kwargs.get("uprn")
21
+ check_uprn(user_uprn)
22
+ bindata = {"bins": []}
23
+
24
+ uri = "https://waste.southhams.gov.uk/mycollections"
25
+
26
+ s = requests.session()
27
+ r = s.get(uri)
28
+ for cookie in r.cookies:
29
+ if cookie.name == "fcc_session_cookie":
30
+ fcc_session_token = cookie.value
31
+
32
+ uri = "https://waste.southhams.gov.uk/mycollections/getcollectiondetails"
33
+
34
+ params = {
35
+ "fcc_session_token": fcc_session_token,
36
+ "uprn": user_uprn,
37
+ }
38
+
39
+ headers = {
40
+ "Content-Type": "application/x-www-form-urlencoded",
41
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36",
42
+ "Referer": "https://waste.southhams.gov.uk/mycollections",
43
+ "X-Requested-With": "XMLHttpRequest",
44
+ }
45
+
46
+ # Send a POST request with form data and headers
47
+ r = s.post(uri, data=params, headers=headers)
48
+
49
+ result = r.json()
50
+
51
+ for collection in result["binCollections"]["tile"]:
52
+
53
+ # Parse the HTML with BeautifulSoup
54
+ soup = BeautifulSoup(collection[0], "html.parser")
55
+ soup.prettify()
56
+
57
+ # Find all collectionDiv elements
58
+ collections = soup.find_all("div", class_="collectionDiv")
59
+
60
+ # Process each collectionDiv
61
+ for collection in collections:
62
+ # Extract the service name
63
+ service_name = collection.find("h3").text.strip()
64
+
65
+ # Extract collection frequency and day
66
+ details = collection.find("div", class_="detWrap").text.strip()
67
+
68
+ # Extract the next collection date
69
+ next_collection = details.split("Your next scheduled collection is ")[
70
+ 1
71
+ ].split(".")[0]
72
+
73
+ if next_collection.startswith("today"):
74
+ next_collection = next_collection.split("today, ")[1]
75
+ elif next_collection.startswith("tomorrow"):
76
+ next_collection = next_collection.split("tomorrow, ")[1]
77
+
78
+ dict_data = {
79
+ "type": service_name,
80
+ "collectionDate": datetime.strptime(
81
+ next_collection, "%A, %d %B %Y"
82
+ ).strftime(date_format),
83
+ }
84
+ bindata["bins"].append(dict_data)
85
+
86
+ bindata["bins"].sort(
87
+ key=lambda x: datetime.strptime(x.get("collectionDate"), "%d/%m/%Y")
88
+ )
89
+
90
+ return bindata