codeforlife-portal 6.44.10__tar.gz → 6.45.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of codeforlife-portal might be problematic. Click here for more details.

Files changed (568) hide show
  1. {codeforlife-portal-6.44.10/codeforlife_portal.egg-info → codeforlife-portal-6.45.0}/PKG-INFO +1 -1
  2. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0/codeforlife_portal.egg-info}/PKG-INFO +1 -1
  3. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/codeforlife_portal.egg-info/requires.txt +1 -1
  4. codeforlife-portal-6.45.0/portal/__init__.py +1 -0
  5. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/forms/play.py +10 -6
  6. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/test_independent_student.py +7 -3
  7. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/test_views.py +188 -45
  8. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/views/teacher/teach.py +3 -2
  9. codeforlife-portal-6.44.10/portal/__init__.py +0 -1
  10. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/LICENSE.md +0 -0
  11. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/MANIFEST.in +0 -0
  12. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/README.md +0 -0
  13. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/codeforlife_portal.egg-info/SOURCES.txt +0 -0
  14. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/codeforlife_portal.egg-info/dependency_links.txt +0 -0
  15. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/codeforlife_portal.egg-info/not-zip-safe +0 -0
  16. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/codeforlife_portal.egg-info/top_level.txt +0 -0
  17. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/deploy/__init__.py +0 -0
  18. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/deploy/captcha.py +0 -0
  19. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/deploy/middleware/__init__.py +0 -0
  20. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/deploy/middleware/admin_access.py +0 -0
  21. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/deploy/middleware/basicauth.py +0 -0
  22. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/deploy/middleware/exceptionlogging.py +0 -0
  23. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/deploy/middleware/screentime_warning.py +0 -0
  24. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/deploy/middleware/security.py +0 -0
  25. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/deploy/middleware/session_timeout.py +0 -0
  26. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/deploy/static/apple-touch-icon-120x120.png +0 -0
  27. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/deploy/static/apple-touch-icon-152x152.png +0 -0
  28. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/deploy/static/apple-touch-icon-180x180.png +0 -0
  29. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/deploy/static/apple-touch-icon-76x76.png +0 -0
  30. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/deploy/static/apple-touch-icon.png +0 -0
  31. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/deploy/static/robots.txt +0 -0
  32. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/deploy/templates/deploy/csrf_failure.html +0 -0
  33. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/deploy/views.py +0 -0
  34. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/admin.py +0 -0
  35. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/app_settings.py +0 -0
  36. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/backends.py +0 -0
  37. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/beta.py +0 -0
  38. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/context_processors.py +0 -0
  39. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/forms/__init__.py +0 -0
  40. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/forms/add_game.py +0 -0
  41. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/forms/admin.py +0 -0
  42. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/forms/dotmailer.py +0 -0
  43. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/forms/error_messages.py +0 -0
  44. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/forms/invite_teacher.py +0 -0
  45. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/forms/organisation.py +0 -0
  46. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/forms/registration.py +0 -0
  47. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/forms/teach.py +0 -0
  48. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/handlers.py +0 -0
  49. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/helpers/__init__.py +0 -0
  50. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/helpers/captcha.py +0 -0
  51. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/helpers/decorators.py +0 -0
  52. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/helpers/password.py +0 -0
  53. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/helpers/ratelimit.py +0 -0
  54. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/helpers/regexes.py +0 -0
  55. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/helpers/request_handlers.py +0 -0
  56. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/migrations/0001_squashed_0041_new_news.py +0 -0
  57. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/migrations/0042_school_country.py +0 -0
  58. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/migrations/0043_auto_20150430_0952.py +0 -0
  59. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/migrations/0044_auto_20150430_0959.py +0 -0
  60. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/migrations/0045_auto_20150430_1446.py +0 -0
  61. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/migrations/0046_auto_20150723_1101.py +0 -0
  62. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/migrations/0047_remove_userprofile_avatar.py +0 -0
  63. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/migrations/0048_plural_management_frontnews.py +0 -0
  64. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/migrations/0049_refactor_emailverifications.py +0 -0
  65. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/migrations/0050_refactor_emailverifications_2.py +0 -0
  66. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/migrations/0051_add_missing_ev_records.py +0 -0
  67. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/migrations/0052_refactor_emailverifications_3.py +0 -0
  68. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/migrations/0053_refactor_teacher_student_1.py +0 -0
  69. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/migrations/0054_pending_join_request_can_be_blank.py +0 -0
  70. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/migrations/0055_add_preview_user.py +0 -0
  71. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/migrations/0056_remove_preview_user.py +0 -0
  72. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/migrations/0057_delete_frontpagenews.py +0 -0
  73. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/migrations/0058_move_to_common_models.py +0 -0
  74. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/migrations/0059_move_email_verifications_to_common.py +0 -0
  75. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/migrations/0060_delete_guardian.py +0 -0
  76. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/migrations/0061_make_portaladmin_teacher.py +0 -0
  77. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/migrations/0062_verify_portaladmin.py +0 -0
  78. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/migrations/__init__.py +0 -0
  79. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/mixins/__init__.py +0 -0
  80. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/mixins/cron_mixin.py +0 -0
  81. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/models.py +0 -0
  82. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/permissions/__init__.py +0 -0
  83. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/permissions/is_cron_request_from_google.py +0 -0
  84. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/pipeline_compilers/__init__.py +0 -0
  85. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/pipeline_compilers/libsass_compiler.py +0 -0
  86. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/fonts/bootstrap/glyphicons-halflings-regular.eot +0 -0
  87. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/fonts/bootstrap/glyphicons-halflings-regular.svg +0 -0
  88. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/fonts/bootstrap/glyphicons-halflings-regular.ttf +0 -0
  89. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/fonts/bootstrap/glyphicons-halflings-regular.woff +0 -0
  90. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/fonts/bootstrap/glyphicons-halflings-regular.woff2 +0 -0
  91. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/10_years_anniversary.png +0 -0
  92. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/10x_logo.png +0 -0
  93. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/RR_logo_grass_background.png +0 -0
  94. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/RR_logo_green.svg +0 -0
  95. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/RR_logo_simple.png +0 -0
  96. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/about_us_cfl.jpg +0 -0
  97. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/about_us_hero.jpg +0 -0
  98. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/about_us_ocado.jpg +0 -0
  99. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/barefoot_logo.png +0 -0
  100. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/bcs_logo.png +0 -0
  101. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/clubs.png +0 -0
  102. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/coding_club_hero.jpg +0 -0
  103. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/coding_club_python_pack.png +0 -0
  104. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/colorboxImages/border.png +0 -0
  105. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/colorboxImages/controls.png +0 -0
  106. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/colorboxImages/loading.gif +0 -0
  107. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/colorboxImages/loading_background.png +0 -0
  108. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/colorboxImages/overlay.png +0 -0
  109. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/confirmation_tick.png +0 -0
  110. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/cross.png +0 -0
  111. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/dee.png +0 -0
  112. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/facebook.png +0 -0
  113. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/favicon.ico +0 -0
  114. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/get_involved_hero.png +0 -0
  115. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/gitbook.png +0 -0
  116. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/gitbook_space.png +0 -0
  117. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/github.png +0 -0
  118. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/github_hero.png +0 -0
  119. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/gla_logo.png +0 -0
  120. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/hamburger.png +0 -0
  121. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/help_and_support_hero.jpg +0 -0
  122. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/home_educate.png +0 -0
  123. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/home_educate_hero.jpg +0 -0
  124. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/home_learning_hero.jpg +0 -0
  125. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/home_play.png +0 -0
  126. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/home_play_hero.jpg +0 -0
  127. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/hope_logo.png +0 -0
  128. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/icl_logo.png +0 -0
  129. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/icon_controller.png +0 -0
  130. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/icon_free.png +0 -0
  131. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/icon_globe.png +0 -0
  132. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/icon_piechart.png +0 -0
  133. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/icon_step_by_step.png +0 -0
  134. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/icon_tracking.png +0 -0
  135. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/icon_uk_flag.png +0 -0
  136. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/kirsty.png +0 -0
  137. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/kurono_hero.jpg +0 -0
  138. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/kurono_landing_hero.png +0 -0
  139. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/kurono_logo.svg +0 -0
  140. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/kurono_logo_grey_background.svg +0 -0
  141. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/kurono_logo_mark.svg +0 -0
  142. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/kurono_resources_hero.jpg +0 -0
  143. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/kurono_story.png +0 -0
  144. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/logo_cfl.png +0 -0
  145. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/logo_cfl_powered.svg +0 -0
  146. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/logo_cfl_reminder_cards.jpg +0 -0
  147. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/logo_cfl_white_landscape.png +0 -0
  148. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/logo_ocado.png +0 -0
  149. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/logo_ocado_group.png +0 -0
  150. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/logo_ocado_group.svg +0 -0
  151. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/logo_ocado_group_white.svg +0 -0
  152. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/mc_saatchi_logo.png +0 -0
  153. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/nigel.png +0 -0
  154. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/ocado-swirl.svg +0 -0
  155. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/oval_blue.svg +0 -0
  156. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/oval_pink.svg +0 -0
  157. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/oval_yellow.svg +0 -0
  158. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/paper_plane.png +0 -0
  159. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/phil.png +0 -0
  160. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/polygon_blue.svg +0 -0
  161. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/polygon_pink.svg +0 -0
  162. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/polygon_yellow.svg +0 -0
  163. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/pressure_cooker_logo.png +0 -0
  164. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/rapid_router.png +0 -0
  165. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/rapid_router_landing_hero.png +0 -0
  166. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/rapidrouter.png +0 -0
  167. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/resources_hero.jpg +0 -0
  168. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/resources_montage.jpg +0 -0
  169. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/reuben.png +0 -0
  170. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/rob.png +0 -0
  171. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/rr_advanced.png +0 -0
  172. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/rr_beginner.png +0 -0
  173. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/rr_intermediate.png +0 -0
  174. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/sadface.png +0 -0
  175. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/sharon_harrison.jpg +0 -0
  176. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/sian.png +0 -0
  177. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/teaching_resources_hero.jpg +0 -0
  178. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/thumbnail_educate_kurono.png +0 -0
  179. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/thumbnail_educate_rapid_router.png +0 -0
  180. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/thumbnail_educate_resources.png +0 -0
  181. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/thumbnail_intro_c4l.jpg +0 -0
  182. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/thumbnail_kurono_resources.png +0 -0
  183. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/thumbnail_play_kurono.png +0 -0
  184. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/thumbnail_play_rapid_router.png +0 -0
  185. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/twitter.png +0 -0
  186. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/universities.png +0 -0
  187. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/wes.png +0 -0
  188. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/img/x_close_video.png +0 -0
  189. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/js/aimmoGame.js +0 -0
  190. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/js/bootstrap.min.js +0 -0
  191. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/js/carouselCards.js +0 -0
  192. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/js/common.js +0 -0
  193. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/js/independentLogin.js +0 -0
  194. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/js/independentRegistration.js +0 -0
  195. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/js/join_create_game_toggle.js +0 -0
  196. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/js/jquery.placeholder.js +0 -0
  197. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/js/levelControl.js +0 -0
  198. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/js/lib/jquery-video-lightning.js +0 -0
  199. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/js/lib/jquery.colorbox.js +0 -0
  200. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/js/lib/jquery.easy-ticker.js +0 -0
  201. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/js/lib/jquery.min.js +0 -0
  202. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/js/lib/modernizr-build.js +0 -0
  203. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/js/lib/papaparse.min.js +0 -0
  204. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/js/organisation_manage.js +0 -0
  205. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/js/passwordStrength.js +0 -0
  206. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/js/play.js +0 -0
  207. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/js/resetPassword.js +0 -0
  208. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/js/riveted.min.js +0 -0
  209. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/js/school.js +0 -0
  210. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/js/sticky_subnav.js +0 -0
  211. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/js/studentLogin.js +0 -0
  212. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/js/teach_browser.js +0 -0
  213. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/js/teach_class.js +0 -0
  214. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/js/teacherEditStudent.js +0 -0
  215. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/js/teacherLogin.js +0 -0
  216. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_alerts.scss +0 -0
  217. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_badges.scss +0 -0
  218. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_breadcrumbs.scss +0 -0
  219. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_button-groups.scss +0 -0
  220. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_buttons.scss +0 -0
  221. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_carousel.scss +0 -0
  222. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_close.scss +0 -0
  223. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_code.scss +0 -0
  224. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_component-animations.scss +0 -0
  225. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_dropdowns.scss +0 -0
  226. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_forms.scss +0 -0
  227. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_glyphicons.scss +0 -0
  228. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_grid.scss +0 -0
  229. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_input-groups.scss +0 -0
  230. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_jumbotron.scss +0 -0
  231. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_labels.scss +0 -0
  232. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_list-group.scss +0 -0
  233. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_media.scss +0 -0
  234. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_mixins.scss +0 -0
  235. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_modals.scss +0 -0
  236. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_navbar.scss +0 -0
  237. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_navs.scss +0 -0
  238. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_normalize.scss +0 -0
  239. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_pager.scss +0 -0
  240. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_pagination.scss +0 -0
  241. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_panels.scss +0 -0
  242. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_popovers.scss +0 -0
  243. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_print.scss +0 -0
  244. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_progress-bars.scss +0 -0
  245. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_responsive-embed.scss +0 -0
  246. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_responsive-utilities.scss +0 -0
  247. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_scaffolding.scss +0 -0
  248. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_tables.scss +0 -0
  249. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_theme.scss +0 -0
  250. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_thumbnails.scss +0 -0
  251. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_tooltip.scss +0 -0
  252. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_type.scss +0 -0
  253. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_utilities.scss +0 -0
  254. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_variables.scss +0 -0
  255. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_wells.scss +0 -0
  256. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_alerts.scss +0 -0
  257. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_background-variant.scss +0 -0
  258. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_border-radius.scss +0 -0
  259. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_breakpoints.scss +0 -0
  260. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_buttons.scss +0 -0
  261. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_center-block.scss +0 -0
  262. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_clearfix.scss +0 -0
  263. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_forms.scss +0 -0
  264. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_gradients.scss +0 -0
  265. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_grid-framework.scss +0 -0
  266. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_grid.scss +0 -0
  267. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_hide-text.scss +0 -0
  268. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_image.scss +0 -0
  269. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_labels.scss +0 -0
  270. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_list-group.scss +0 -0
  271. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_nav-divider.scss +0 -0
  272. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_nav-vertical-align.scss +0 -0
  273. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_opacity.scss +0 -0
  274. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_pagination.scss +0 -0
  275. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_panels.scss +0 -0
  276. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_progress-bar.scss +0 -0
  277. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_reset-filter.scss +0 -0
  278. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_reset-text.scss +0 -0
  279. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_resize.scss +0 -0
  280. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_responsive-visibility.scss +0 -0
  281. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_size.scss +0 -0
  282. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_tab-focus.scss +0 -0
  283. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_table-row.scss +0 -0
  284. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_text-emphasis.scss +0 -0
  285. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_text-overflow.scss +0 -0
  286. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_text-truncate.scss +0 -0
  287. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_vendor-prefixes.scss +0 -0
  288. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap.scss +0 -0
  289. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_mixins/_all.scss +0 -0
  290. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_mixins/_border-radius.scss +0 -0
  291. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_mixins/_box-shadow.scss +0 -0
  292. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_mixins/_hover.scss +0 -0
  293. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_mixins/_nav-divider.scss +0 -0
  294. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_partials/_dropdown.scss +0 -0
  295. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_partials/_glyphicons.scss +0 -0
  296. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_partials/_grid.scss +0 -0
  297. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_partials/_variables.scss +0 -0
  298. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_utilities/_align.scss +0 -0
  299. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_utilities/_background.scss +0 -0
  300. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_utilities/_borders.scss +0 -0
  301. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_utilities/_clearfix.scss +0 -0
  302. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_utilities/_cursor.scss +0 -0
  303. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_utilities/_display.scss +0 -0
  304. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_utilities/_flex.scss +0 -0
  305. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_utilities/_float.scss +0 -0
  306. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_utilities/_position.scss +0 -0
  307. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_utilities/_screenreaders.scss +0 -0
  308. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_utilities/_sizing.scss +0 -0
  309. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_utilities/_spacing.scss +0 -0
  310. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_utilities/_text.scss +0 -0
  311. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_utilities/_visibility.scss +0 -0
  312. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/colorbox.scss +0 -0
  313. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/modules/_all.scss +0 -0
  314. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/modules/_animation.scss +0 -0
  315. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/modules/_breakpoints.scss +0 -0
  316. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/modules/_card_constants.scss +0 -0
  317. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/modules/_colours.scss +0 -0
  318. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/modules/_homepage_constants.scss +0 -0
  319. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/modules/_levels.scss +0 -0
  320. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/modules/_mixins.scss +0 -0
  321. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/modules/_spacing.scss +0 -0
  322. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/partials/_banners.scss +0 -0
  323. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/partials/_base.scss +0 -0
  324. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/partials/_buttons.scss +0 -0
  325. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/partials/_carousel.scss +0 -0
  326. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/partials/_footer.scss +0 -0
  327. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/partials/_forms.scss +0 -0
  328. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/partials/_grids.scss +0 -0
  329. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/partials/_header.scss +0 -0
  330. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/partials/_images.scss +0 -0
  331. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/partials/_popup.scss +0 -0
  332. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/partials/_progress-bars.scss +0 -0
  333. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/partials/_subnavs.scss +0 -0
  334. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/partials/_tables.scss +0 -0
  335. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/partials/_text.scss +0 -0
  336. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/partials/_ui-dialog.scss +0 -0
  337. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/partials/_utils.scss +0 -0
  338. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/partials/_videos.scss +0 -0
  339. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/sass/styles.scss +0 -0
  340. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/video/aimmo_play_now_background_video.mp4 +0 -0
  341. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/static/portal/video/code for life .pdf +0 -0
  342. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/strings/__init__.py +0 -0
  343. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/strings/about.py +0 -0
  344. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/strings/coding_club.py +0 -0
  345. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/strings/help_and_support.py +0 -0
  346. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/strings/home_learning.py +0 -0
  347. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/strings/materials.py +0 -0
  348. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/strings/play.py +0 -0
  349. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/strings/student_aimmo_dashboard.py +0 -0
  350. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/strings/teach.py +0 -0
  351. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/strings/teacher_resources.py +0 -0
  352. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/403.html +0 -0
  353. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/404.html +0 -0
  354. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/500.html +0 -0
  355. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/captcha/includes/js_v2_invisible.html +0 -0
  356. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/captcha/widget_v2_invisible.html +0 -0
  357. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/email.html +0 -0
  358. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/email.txt +0 -0
  359. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/about.html +0 -0
  360. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/base.html +0 -0
  361. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/base_no_userprofile.html +0 -0
  362. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/coding_club.html +0 -0
  363. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/contribute.html +0 -0
  364. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/dotmailer_consent_form.html +0 -0
  365. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/email_invitation_sent.html +0 -0
  366. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/email_style_template.html +0 -0
  367. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/email_verification_failed.html +0 -0
  368. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/email_verification_needed.html +0 -0
  369. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/form_shapes.html +0 -0
  370. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/getinvolved.html +0 -0
  371. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/home.html +0 -0
  372. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/home_learning.html +0 -0
  373. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/locked_out.html +0 -0
  374. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/locked_out_school_student.html +0 -0
  375. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/login/independent_student.html +0 -0
  376. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/login/student.html +0 -0
  377. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/login/student_class_code.html +0 -0
  378. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/login/teacher.html +0 -0
  379. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/mouseflow.html +0 -0
  380. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/partials/aimmo_games_table.html +0 -0
  381. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/partials/banner.html +0 -0
  382. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/partials/benefits.html +0 -0
  383. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/partials/card_list.html +0 -0
  384. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/partials/character_list.html +0 -0
  385. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/partials/delete_popup.html +0 -0
  386. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/partials/footer.html +0 -0
  387. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/partials/header.html +0 -0
  388. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/partials/headline.html +0 -0
  389. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/partials/hero_card.html +0 -0
  390. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/partials/info_popup.html +0 -0
  391. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/partials/invite_admin_teacher.html +0 -0
  392. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/partials/popup.html +0 -0
  393. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/partials/register_newsletter_tickbox.html +0 -0
  394. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/partials/screentime_popup.html +0 -0
  395. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/partials/service_unavailable_popup.html +0 -0
  396. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/partials/session_popup.html +0 -0
  397. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/partials/teacher_non_dashboard_subnav.html +0 -0
  398. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/partials/teacher_non_dashboard_subnav_account.html +0 -0
  399. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/play/independent_student_dashboard.html +0 -0
  400. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/play/student_aimmo_dashboard.html +0 -0
  401. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/play/student_dashboard.html +0 -0
  402. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/play/student_edit_account.html +0 -0
  403. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/play/student_join_organisation.html +0 -0
  404. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/play.html +0 -0
  405. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/privacy_notice.html +0 -0
  406. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/register.html +0 -0
  407. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/reset_password.html +0 -0
  408. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/reset_password_confirm.html +0 -0
  409. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/reset_password_done.html +0 -0
  410. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/reset_password_email_sent.html +0 -0
  411. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/tag_manager/tag_manager_body.html +0 -0
  412. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/tag_manager/tag_manager_head.html +0 -0
  413. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/teach/base_registering.html +0 -0
  414. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/teach/class.html +0 -0
  415. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/teach/dashboard.html +0 -0
  416. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/teach/invited.html +0 -0
  417. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/teach/onboarding_classes.html +0 -0
  418. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/teach/onboarding_print.html +0 -0
  419. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/teach/onboarding_school.html +0 -0
  420. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/teach/onboarding_students.html +0 -0
  421. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/teach/teacher_add_external_student.html +0 -0
  422. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/teach/teacher_added_external_student.html +0 -0
  423. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/teach/teacher_aimmo_dashboard.html +0 -0
  424. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/teach/teacher_dismiss_students.html +0 -0
  425. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/teach/teacher_edit_class.html +0 -0
  426. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/teach/teacher_edit_student.html +0 -0
  427. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/teach/teacher_move_all_classes.html +0 -0
  428. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/teach/teacher_move_students.html +0 -0
  429. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/teach/teacher_move_students_to_class.html +0 -0
  430. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/teach.html +0 -0
  431. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/portal/terms.html +0 -0
  432. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/two_factor/_base.html +0 -0
  433. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/two_factor/_wizard_actions.html +0 -0
  434. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/two_factor/_wizard_actions_enable_2fa.html +0 -0
  435. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/two_factor/_wizard_actions_submit.html +0 -0
  436. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/two_factor/_wizard_forms.html +0 -0
  437. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/two_factor/_wizard_forms_token.html +0 -0
  438. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/two_factor/backup_token.html +0 -0
  439. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/two_factor/core/backup_tokens.html +0 -0
  440. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/two_factor/core/login.html +0 -0
  441. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/two_factor/core/setup.html +0 -0
  442. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/two_factor/core/setup_complete.html +0 -0
  443. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/two_factor/profile/disable.html +0 -0
  444. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/two_factor/profile/profile.html +0 -0
  445. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templates/two_factor/setup_wizard_token.html +0 -0
  446. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templatetags/__init__.py +0 -0
  447. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templatetags/app_tags.py +0 -0
  448. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templatetags/banner_tags.py +0 -0
  449. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templatetags/benefits_tags.py +0 -0
  450. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templatetags/card_list_tags.py +0 -0
  451. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templatetags/character_list_tags.py +0 -0
  452. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templatetags/future.py +0 -0
  453. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templatetags/headline_tags.py +0 -0
  454. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templatetags/hero_card_tags.py +0 -0
  455. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/templatetags/table_tags.py +0 -0
  456. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/__init__.py +0 -0
  457. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/base_test.py +0 -0
  458. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/conftest.py +0 -0
  459. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/migrations/__init__.py +0 -0
  460. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/migrations/test_migration_make_portaladmin_teacher.py +0 -0
  461. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/migrations/test_migration_preview_user_remove.py +0 -0
  462. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/migrations/test_migration_preview_users.py +0 -0
  463. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/migrations/test_migration_remove_front_page_news.py +0 -0
  464. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/migrations/test_migration_remove_guardian.py +0 -0
  465. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/migrations/test_migration_use_common_models.py +0 -0
  466. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/migrations/test_migration_verify_portaladmin.py +0 -0
  467. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/__init__.py +0 -0
  468. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/__init__.py +0 -0
  469. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/admin/__init__.py +0 -0
  470. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/admin/admin_base_page.py +0 -0
  471. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/admin/admin_data_page.py +0 -0
  472. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/admin/admin_map_page.py +0 -0
  473. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/base_page.py +0 -0
  474. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/email_verification_needed_page.py +0 -0
  475. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/forbidden_page.py +0 -0
  476. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/game_page.py +0 -0
  477. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/home_page.py +0 -0
  478. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/independent_login_page.py +0 -0
  479. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/kurono_teacher_dashboard_page.py +0 -0
  480. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/password_reset_form_page.py +0 -0
  481. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/password_reset_page.py +0 -0
  482. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/play/__init__.py +0 -0
  483. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/play/account_page.py +0 -0
  484. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/play/dashboard_page.py +0 -0
  485. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/play/join_school_or_club_page.py +0 -0
  486. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/play/play_base_page.py +0 -0
  487. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/play_page.py +0 -0
  488. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/resources_page.py +0 -0
  489. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/signup_page.py +0 -0
  490. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/student_login_class_code.py +0 -0
  491. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/student_login_page.py +0 -0
  492. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/teach/__init__.py +0 -0
  493. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/teach/add_independent_student_to_class_page.py +0 -0
  494. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/teach/added_independent_student_to_class_page.py +0 -0
  495. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/teach/class_page.py +0 -0
  496. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/teach/dashboard_page.py +0 -0
  497. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/teach/dismiss_students_page.py +0 -0
  498. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/teach/edit_student_page.py +0 -0
  499. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/teach/move_class_page.py +0 -0
  500. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/teach/move_classes_page.py +0 -0
  501. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/teach/move_students_disambiguate_page.py +0 -0
  502. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/teach/move_students_page.py +0 -0
  503. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/teach/onboarding_classes_page.py +0 -0
  504. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/teach/onboarding_organisation_page.py +0 -0
  505. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/teach/onboarding_student_list_page.py +0 -0
  506. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/teach/onboarding_students_page.py +0 -0
  507. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/teach/teach_base_page.py +0 -0
  508. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/teacher_login_page.py +0 -0
  509. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/selenium_test_case.py +0 -0
  510. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/snapshots/__init__.py +0 -0
  511. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/snapshots/snap_test_partials.py +0 -0
  512. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/test_2FA.py +0 -0
  513. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/test_admin.py +0 -0
  514. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/test_aimmo_dashboards.py +0 -0
  515. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/test_api.py +0 -0
  516. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/test_captcha_forms.py +0 -0
  517. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/test_class.py +0 -0
  518. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/test_daily_activities.py +0 -0
  519. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/test_emails.py +0 -0
  520. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/test_helper_methods.py +0 -0
  521. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/test_invite_teacher.py +0 -0
  522. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/test_middleware.py +0 -0
  523. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/test_newsletter_footer.py +0 -0
  524. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/test_organisation.py +0 -0
  525. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/test_partials.py +0 -0
  526. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/test_ratelimit.py +0 -0
  527. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/test_school_student.py +0 -0
  528. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/test_security.py +0 -0
  529. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/test_teacher.py +0 -0
  530. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/test_teacher_student.py +0 -0
  531. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/utils/__init__.py +0 -0
  532. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/utils/aimmo_games.py +0 -0
  533. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/utils/classes.py +0 -0
  534. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/tests/utils/messages.py +0 -0
  535. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/urls.py +0 -0
  536. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/views/__init__.py +0 -0
  537. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/views/about.py +0 -0
  538. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/views/admin.py +0 -0
  539. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/views/aimmo/__init__.py +0 -0
  540. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/views/aimmo/dashboard.py +0 -0
  541. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/views/api.py +0 -0
  542. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/views/cron/__init__.py +0 -0
  543. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/views/cron/user.py +0 -0
  544. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/views/dotmailer.py +0 -0
  545. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/views/email.py +0 -0
  546. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/views/home.py +0 -0
  547. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/views/legal.py +0 -0
  548. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/views/login/__init__.py +0 -0
  549. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/views/login/independent_student.py +0 -0
  550. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/views/login/student.py +0 -0
  551. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/views/login/teacher.py +0 -0
  552. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/views/organisation.py +0 -0
  553. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/views/play_landing_page.py +0 -0
  554. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/views/registration.py +0 -0
  555. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/views/student/__init__.py +0 -0
  556. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/views/student/edit_account_details.py +0 -0
  557. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/views/student/play.py +0 -0
  558. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/views/teach.py +0 -0
  559. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/views/teacher/__init__.py +0 -0
  560. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/views/teacher/dashboard.py +0 -0
  561. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/views/two_factor/__init__.py +0 -0
  562. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/views/two_factor/core.py +0 -0
  563. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/views/two_factor/form.py +0 -0
  564. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/views/two_factor/profile.py +0 -0
  565. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/portal/wsgi.py +0 -0
  566. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/pyproject.toml +0 -0
  567. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/setup.cfg +0 -0
  568. {codeforlife-portal-6.44.10 → codeforlife-portal-6.45.0}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: codeforlife-portal
3
- Version: 6.44.10
3
+ Version: 6.45.0
4
4
  Classifier: Programming Language :: Python
5
5
  Classifier: Programming Language :: Python :: 3.8
6
6
  Classifier: Framework :: Django
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: codeforlife-portal
3
- Version: 6.44.10
3
+ Version: 6.45.0
4
4
  Classifier: Programming Language :: Python
5
5
  Classifier: Programming Language :: Python :: 3.8
6
6
  Classifier: Framework :: Django
@@ -17,7 +17,7 @@ django-classy-tags==2.0.0
17
17
  libsass==0.23.0
18
18
  phonenumbers==8.12.12
19
19
  more-itertools==8.7.0
20
- cfl-common==6.44.10
20
+ cfl-common==6.45.0
21
21
  django-ratelimit==3.0.1
22
22
  django-preventconcurrentlogins==0.8.2
23
23
  django-csp==3.7
@@ -0,0 +1 @@
1
+ __version__ = "6.45.0"
@@ -277,15 +277,19 @@ class StudentJoinOrganisationForm(forms.Form):
277
277
 
278
278
  def clean(self):
279
279
  access_code = self.cleaned_data.get("access_code", None)
280
+ join_error_text = "The class code you entered either does not exist or is not currently accepting join requests. Please double check that you have entered the correct class code and contact the teacher of the class to ensure their class is currently accepting join requests."
280
281
 
281
282
  if access_code:
282
283
  classes = Class.objects.filter(access_code=access_code)
283
284
  if len(classes) != 1:
284
- raise forms.ValidationError("Cannot find the school or club and/or class")
285
+ raise forms.ValidationError(join_error_text)
286
+
285
287
  self.klass = classes[0]
286
- if not self.klass.always_accept_requests:
287
- if self.klass.accept_requests_until is None:
288
- raise forms.ValidationError("Cannot find the school or club and/or class")
289
- elif (self.klass.accept_requests_until - timezone.now()) < timedelta():
290
- raise forms.ValidationError("Cannot find the school or club and/or class")
288
+
289
+ if not self.klass.always_accept_requests and (
290
+ self.klass.accept_requests_until is None
291
+ or self.klass.accept_requests_until - timezone.now()
292
+ < timedelta()
293
+ ):
294
+ raise forms.ValidationError(join_error_text)
291
295
  return self.cleaned_data
@@ -283,7 +283,7 @@ class TestIndependentStudentFrontend(BaseTest):
283
283
  page = page.go_to_independent_student_login_page()
284
284
  page = page.independent_student_login_failure(username, password)
285
285
 
286
- errors = page.has_login_failed("independent_student_login_form", INVALID_LOGIN_MESSAGE)
286
+ page.has_login_failed("independent_student_login_form", INVALID_LOGIN_MESSAGE)
287
287
  assert page.has_login_failed("independent_student_login_form", INVALID_LOGIN_MESSAGE)
288
288
 
289
289
  verification_url = mock_send_dotdigital_email.call_args.kwargs["personalization_values"]["VERIFICATION_LINK"]
@@ -471,7 +471,9 @@ class TestIndependentStudentFrontend(BaseTest):
471
471
  )
472
472
 
473
473
  assert self.is_join_class_page(page)
474
- assert page.has_join_request_failed("Cannot find the school or club and/or class")
474
+ assert page.has_join_request_failed(
475
+ "The class code you entered either does not exist or is not currently accepting join requests. Please double check that you have entered the correct class code and contact the teacher of the class to ensure their class is currently accepting join requests."
476
+ )
475
477
 
476
478
  def test_join_class_not_accepting_requests(self):
477
479
  teacher_email, _ = signup_teacher_directly()
@@ -490,7 +492,9 @@ class TestIndependentStudentFrontend(BaseTest):
490
492
  )
491
493
 
492
494
  assert self.is_join_class_page(page)
493
- assert page.has_join_request_failed("Cannot find the school or club and/or class")
495
+ assert page.has_join_request_failed(
496
+ "The class code you entered either does not exist or is not currently accepting join requests. Please double check that you have entered the correct class code and contact the teacher of the class to ensure their class is currently accepting join requests."
497
+ )
494
498
 
495
499
  def test_join_class_revoked(self):
496
500
  teacher_email, _ = signup_teacher_directly()
@@ -53,8 +53,11 @@ class TestTeacherViews(TestCase):
53
53
  @classmethod
54
54
  def setUpTestData(cls):
55
55
  cls.email, cls.password = signup_teacher_directly()
56
+ cls.school = create_organisation_directly(cls.email)
56
57
  _, _, cls.class_access_code = create_class_directly(cls.email)
57
- _, _, cls.student = create_school_student_directly(cls.class_access_code)
58
+ _, cls.password_student, cls.student = create_school_student_directly(
59
+ cls.class_access_code
60
+ )
58
61
 
59
62
  def login(self):
60
63
  c = Client()
@@ -63,7 +66,9 @@ class TestTeacherViews(TestCase):
63
66
 
64
67
  def test_reminder_cards(self):
65
68
  c = self.login()
66
- url = reverse("teacher_print_reminder_cards", args=[self.class_access_code])
69
+ url = reverse(
70
+ "teacher_print_reminder_cards", args=[self.class_access_code]
71
+ )
67
72
 
68
73
  # First test with 2 dummy students
69
74
  NAME1 = "Test name"
@@ -97,7 +102,9 @@ class TestTeacherViews(TestCase):
97
102
  # page number
98
103
  students_per_page = REMINDER_CARDS_PDF_ROWS * REMINDER_CARDS_PDF_COLUMNS
99
104
  for _ in range(len(studentlist), students_per_page + 1):
100
- studentlist.append({"name": NAME1, "password": PASSWORD1, "login_url": URL})
105
+ studentlist.append(
106
+ {"name": NAME1, "password": PASSWORD1, "login_url": URL}
107
+ )
101
108
 
102
109
  assert len(studentlist) == students_per_page + 1
103
110
 
@@ -136,7 +143,9 @@ class TestTeacherViews(TestCase):
136
143
  reader = csv.reader(io.StringIO(content))
137
144
 
138
145
  access_code = self.class_access_code
139
- class_url = reverse("student_login", kwargs={"access_code": access_code})
146
+ class_url = reverse(
147
+ "student_login", kwargs={"access_code": access_code}
148
+ )
140
149
  row0 = next(reader)
141
150
  assert row0[0].strip() == access_code
142
151
  assert class_url in row0[1].strip()
@@ -175,7 +184,9 @@ class TestTeacherViews(TestCase):
175
184
 
176
185
  def test_daily_activity_student_details(self):
177
186
  c = self.login()
178
- url = reverse("teacher_print_reminder_cards", args=[self.class_access_code])
187
+ url = reverse(
188
+ "teacher_print_reminder_cards", args=[self.class_access_code]
189
+ )
179
190
 
180
191
  data = {
181
192
  "data": json.dumps(
@@ -221,6 +232,48 @@ class TestTeacherViews(TestCase):
221
232
  with pytest.raises(Exception):
222
233
  count_student_details_click("Wrong download method")
223
234
 
235
+ def test_release_verified_student(self):
236
+ c = Client()
237
+ student_login_url = reverse(
238
+ "student_login", args=[self.class_access_code]
239
+ )
240
+ response = c.post(
241
+ student_login_url,
242
+ {
243
+ "username": self.student.new_user.first_name,
244
+ "password": self.password_student,
245
+ },
246
+ )
247
+ assert response.status_code == 302
248
+
249
+ student = Student.objects.get(pk=self.student.pk)
250
+ assert student.user.is_verified
251
+
252
+ c.logout()
253
+ c.login(username=self.email, password=self.password)
254
+
255
+ release_url = reverse(
256
+ "teacher_dismiss_students", args=[self.class_access_code]
257
+ )
258
+ response = c.post(
259
+ release_url,
260
+ {
261
+ "form-TOTAL_FORMS": 1,
262
+ "form-INITIAL_FORMS": 1,
263
+ "form-MIN_NUM_FORMS": 0,
264
+ "form-MAX_NUM_FORMS": 1000,
265
+ "form-0-orig_name": self.student.new_user.first_name,
266
+ "form-0-name": self.student.new_user.first_name,
267
+ "form-0-email": "independent@gmail.com",
268
+ "form-0-confirm_email": "independent@gmail.com",
269
+ "submit_dismiss": "",
270
+ },
271
+ )
272
+ assert response.status_code == 302
273
+
274
+ student = Student.objects.get(pk=self.student.pk)
275
+ assert not student.user.is_verified
276
+
224
277
 
225
278
  class TestLoginViews(TestCase):
226
279
  @classmethod
@@ -238,7 +291,9 @@ class TestLoginViews(TestCase):
238
291
  teacher_email, teacher_password = signup_teacher_directly()
239
292
  create_organisation_directly(teacher_email)
240
293
  _, _, class_access_code = create_class_directly(teacher_email)
241
- student_name, student_password, _ = create_school_student_directly(class_access_code)
294
+ student_name, student_password, _ = create_school_student_directly(
295
+ class_access_code
296
+ )
242
297
 
243
298
  return (
244
299
  teacher_email,
@@ -271,9 +326,16 @@ class TestLoginViews(TestCase):
271
326
  _, _, name, password, class_access_code = self._set_up_test_data()
272
327
 
273
328
  if next_url:
274
- url = reverse("student_login", kwargs={"access_code": class_access_code}) + "?next=/"
329
+ url = (
330
+ reverse(
331
+ "student_login", kwargs={"access_code": class_access_code}
332
+ )
333
+ + "?next=/"
334
+ )
275
335
  else:
276
- url = reverse("student_login", kwargs={"access_code": class_access_code})
336
+ url = reverse(
337
+ "student_login", kwargs={"access_code": class_access_code}
338
+ )
277
339
 
278
340
  c = Client()
279
341
  response = c.post(url, {"username": name, "password": password})
@@ -312,7 +374,9 @@ class TestLoginViews(TestCase):
312
374
 
313
375
  def _get_user_class(self, name, class_access_code):
314
376
  klass = Class.objects.get(access_code=class_access_code)
315
- students = Student.objects.filter(new_user__first_name__iexact=name, class_field=klass)
377
+ students = Student.objects.filter(
378
+ new_user__first_name__iexact=name, class_field=klass
379
+ )
316
380
  assert len(students) == 1
317
381
  user = students[0].new_user
318
382
  return user, klass
@@ -354,7 +418,9 @@ class TestLoginViews(TestCase):
354
418
  _, _, name, password, class_access_code = self._set_up_test_data()
355
419
 
356
420
  c = Client()
357
- url = reverse("student_login", kwargs={"access_code": class_access_code})
421
+ url = reverse(
422
+ "student_login", kwargs={"access_code": class_access_code}
423
+ )
358
424
  c.post(url, {"username": name, "password": password})
359
425
 
360
426
  # check if there's a UserSession data within the last 10 secs
@@ -375,7 +441,9 @@ class TestLoginViews(TestCase):
375
441
  randomname = "randomname"
376
442
 
377
443
  c = Client()
378
- url = reverse("student_login", kwargs={"access_code": class_access_code})
444
+ url = reverse(
445
+ "student_login", kwargs={"access_code": class_access_code}
446
+ )
379
447
  c.post(url, {"username": randomname, "password": "xx"})
380
448
 
381
449
  # check if there's a UserSession data within the last 10 secs
@@ -401,7 +469,9 @@ class TestLoginViews(TestCase):
401
469
 
402
470
  def test_student_direct_login(self):
403
471
  _, _, _, _, class_access_code = self._set_up_test_data()
404
- student, login_id, _, _ = create_student_with_direct_login(class_access_code)
472
+ student, login_id, _, _ = create_student_with_direct_login(
473
+ class_access_code
474
+ )
405
475
 
406
476
  c = Client()
407
477
  assert c.login(user_id=student.new_user.id, login_id=login_id) == True
@@ -523,7 +593,9 @@ class TestViews(TestCase):
523
593
  c = Client()
524
594
 
525
595
  # Login and check initial data
526
- url = reverse("student_login", kwargs={"access_code": class_access_code})
596
+ url = reverse(
597
+ "student_login", kwargs={"access_code": class_access_code}
598
+ )
527
599
  c.post(url, {"username": student_name, "password": student_password})
528
600
 
529
601
  student_dashboard_url = reverse("student_details")
@@ -602,7 +674,9 @@ class TestViews(TestCase):
602
674
 
603
675
  # try again with the correct password
604
676
  url = reverse("delete_account")
605
- response = c.post(url, {"password": password, "unsubscribe_newsletter": "on"})
677
+ response = c.post(
678
+ url, {"password": password, "unsubscribe_newsletter": "on"}
679
+ )
606
680
 
607
681
  assert response.status_code == 302
608
682
  mock_send_dotdigital_email.assert_called_once()
@@ -684,7 +758,9 @@ class TestViews(TestCase):
684
758
 
685
759
  school_id = school.id
686
760
  school_name = school.name
687
- teachers = Teacher.objects.filter(school=school).order_by("new_user__last_name", "new_user__first_name")
761
+ teachers = Teacher.objects.filter(school=school).order_by(
762
+ "new_user__last_name", "new_user__first_name"
763
+ )
688
764
  assert len(teachers) == 3
689
765
 
690
766
  # one of the remaining teachers should be admin (the second in our case, as it's alphabetical)
@@ -715,7 +791,9 @@ class TestViews(TestCase):
715
791
  self.assertEqual(mock_send_dotdigital_email.call_count, 2)
716
792
 
717
793
  # 2 teachers left
718
- teachers = Teacher.objects.filter(school=school).order_by("new_user__last_name", "new_user__first_name")
794
+ teachers = Teacher.objects.filter(school=school).order_by(
795
+ "new_user__last_name", "new_user__first_name"
796
+ )
719
797
  assert len(teachers) == 2
720
798
 
721
799
  # teacher2 should still be admin, teacher4 is not passed admin role because there is teacher2
@@ -727,7 +805,9 @@ class TestViews(TestCase):
727
805
  # delete teacher4
728
806
  anonymise(user4)
729
807
 
730
- teachers = Teacher.objects.filter(school=school).order_by("new_user__last_name", "new_user__first_name")
808
+ teachers = Teacher.objects.filter(school=school).order_by(
809
+ "new_user__last_name", "new_user__first_name"
810
+ )
731
811
  assert len(teachers) == 1
732
812
  u = User.objects.get(id=usrid2)
733
813
  assert u.new_teacher.is_admin
@@ -785,13 +865,17 @@ class TestViews(TestCase):
785
865
  c.logout()
786
866
 
787
867
  @patch("common.helpers.emails.send_dotdigital_email")
788
- def test_registrations_increment_data(self, mock_send_dotdigital_email: Mock):
868
+ def test_registrations_increment_data(
869
+ self, mock_send_dotdigital_email: Mock
870
+ ):
789
871
  c = Client()
790
872
 
791
873
  total_activity = TotalActivity.objects.get(id=1)
792
874
  teacher_registration_count = total_activity.teacher_registrations
793
875
  student_registration_count = total_activity.student_registrations
794
- independent_registration_count = total_activity.independent_registrations
876
+ independent_registration_count = (
877
+ total_activity.independent_registrations
878
+ )
795
879
 
796
880
  response = c.post(
797
881
  reverse("register"),
@@ -811,7 +895,10 @@ class TestViews(TestCase):
811
895
 
812
896
  total_activity = TotalActivity.objects.get(id=1)
813
897
 
814
- assert total_activity.teacher_registrations == teacher_registration_count + 1
898
+ assert (
899
+ total_activity.teacher_registrations
900
+ == teacher_registration_count + 1
901
+ )
815
902
 
816
903
  response = c.post(
817
904
  reverse("register"),
@@ -833,7 +920,10 @@ class TestViews(TestCase):
833
920
 
834
921
  total_activity = TotalActivity.objects.get(id=1)
835
922
 
836
- assert total_activity.independent_registrations == independent_registration_count + 1
923
+ assert (
924
+ total_activity.independent_registrations
925
+ == independent_registration_count + 1
926
+ )
837
927
 
838
928
  teacher_email, teacher_password = signup_teacher_directly()
839
929
  create_organisation_directly(teacher_email)
@@ -849,7 +939,10 @@ class TestViews(TestCase):
849
939
 
850
940
  total_activity = TotalActivity.objects.get(id=1)
851
941
 
852
- assert total_activity.student_registrations == student_registration_count + 3
942
+ assert (
943
+ total_activity.student_registrations
944
+ == student_registration_count + 3
945
+ )
853
946
 
854
947
 
855
948
  # CRON view tests
@@ -868,8 +961,12 @@ class CronTestClient(APIClient):
868
961
  secure=False,
869
962
  **extra,
870
963
  ):
871
- wsgi_response = super().generic(method, path, data, content_type, secure, **extra)
872
- assert 200 <= wsgi_response.status_code < 300, f"Response has error status code: {wsgi_response.status_code}"
964
+ wsgi_response = super().generic(
965
+ method, path, data, content_type, secure, **extra
966
+ )
967
+ assert (
968
+ 200 <= wsgi_response.status_code < 300
969
+ ), f"Response has error status code: {wsgi_response.status_code}"
873
970
 
874
971
  return wsgi_response
875
972
 
@@ -888,7 +985,9 @@ class TestUser(CronTestCase):
888
985
  indy_email, _, _ = create_independent_student_directly()
889
986
 
890
987
  self.teacher_user = User.objects.get(email=teacher_email)
891
- self.teacher_user_profile = UserProfile.objects.get(user=self.teacher_user)
988
+ self.teacher_user_profile = UserProfile.objects.get(
989
+ user=self.teacher_user
990
+ )
892
991
 
893
992
  self.indy_user = User.objects.get(email=indy_email)
894
993
  self.indy_user_profile = UserProfile.objects.get(user=self.indy_user)
@@ -904,11 +1003,17 @@ class TestUser(CronTestCase):
904
1003
  assert_called: bool,
905
1004
  mock_send_dotdigital_email: Mock,
906
1005
  ):
907
- self.teacher_user.date_joined = timezone.now() - timedelta(days=days, hours=12)
1006
+ self.teacher_user.date_joined = timezone.now() - timedelta(
1007
+ days=days, hours=12
1008
+ )
908
1009
  self.teacher_user.save()
909
- self.student_user.date_joined = timezone.now() - timedelta(days=days, hours=12)
1010
+ self.student_user.date_joined = timezone.now() - timedelta(
1011
+ days=days, hours=12
1012
+ )
910
1013
  self.student_user.save()
911
- self.indy_user.date_joined = timezone.now() - timedelta(days=days, hours=12)
1014
+ self.indy_user.date_joined = timezone.now() - timedelta(
1015
+ days=days, hours=12
1016
+ )
912
1017
  self.indy_user.save()
913
1018
 
914
1019
  self.teacher_user_profile.is_verified = is_verified
@@ -919,9 +1024,13 @@ class TestUser(CronTestCase):
919
1024
  self.client.get(reverse(view_name))
920
1025
 
921
1026
  if assert_called:
922
- mock_send_dotdigital_email.assert_any_call(ANY, [self.teacher_user.email], personalization_values=ANY)
1027
+ mock_send_dotdigital_email.assert_any_call(
1028
+ ANY, [self.teacher_user.email], personalization_values=ANY
1029
+ )
923
1030
 
924
- mock_send_dotdigital_email.assert_any_call(ANY, [self.indy_user.email], personalization_values=ANY)
1031
+ mock_send_dotdigital_email.assert_any_call(
1032
+ ANY, [self.indy_user.email], personalization_values=ANY
1033
+ )
925
1034
 
926
1035
  # Check only two emails are sent - the student should never be included.
927
1036
  assert mock_send_dotdigital_email.call_count == 2
@@ -931,22 +1040,40 @@ class TestUser(CronTestCase):
931
1040
  mock_send_dotdigital_email.reset_mock()
932
1041
 
933
1042
  def test_first_verify_email_reminder_view(self):
934
- self.send_verify_email_reminder(6, False, "first-verify-email-reminder", False)
935
- self.send_verify_email_reminder(7, False, "first-verify-email-reminder", True)
936
- self.send_verify_email_reminder(7, True, "first-verify-email-reminder", False)
937
- self.send_verify_email_reminder(8, False, "first-verify-email-reminder", False)
1043
+ self.send_verify_email_reminder(
1044
+ 6, False, "first-verify-email-reminder", False
1045
+ )
1046
+ self.send_verify_email_reminder(
1047
+ 7, False, "first-verify-email-reminder", True
1048
+ )
1049
+ self.send_verify_email_reminder(
1050
+ 7, True, "first-verify-email-reminder", False
1051
+ )
1052
+ self.send_verify_email_reminder(
1053
+ 8, False, "first-verify-email-reminder", False
1054
+ )
938
1055
 
939
1056
  def test_second_verify_email_reminder_view(self):
940
- self.send_verify_email_reminder(13, False, "second-verify-email-reminder", False)
941
- self.send_verify_email_reminder(14, False, "second-verify-email-reminder", True)
942
- self.send_verify_email_reminder(14, True, "second-verify-email-reminder", False)
943
- self.send_verify_email_reminder(15, False, "second-verify-email-reminder", False)
1057
+ self.send_verify_email_reminder(
1058
+ 13, False, "second-verify-email-reminder", False
1059
+ )
1060
+ self.send_verify_email_reminder(
1061
+ 14, False, "second-verify-email-reminder", True
1062
+ )
1063
+ self.send_verify_email_reminder(
1064
+ 14, True, "second-verify-email-reminder", False
1065
+ )
1066
+ self.send_verify_email_reminder(
1067
+ 15, False, "second-verify-email-reminder", False
1068
+ )
944
1069
 
945
1070
  def test_anonymise_unverified_accounts_view(self):
946
1071
  now = timezone.now()
947
1072
 
948
1073
  for user in [self.teacher_user, self.indy_user, self.student_user]:
949
- user.date_joined = now - timedelta(days=USER_DELETE_UNVERIFIED_ACCOUNT_DAYS + 1)
1074
+ user.date_joined = now - timedelta(
1075
+ days=USER_DELETE_UNVERIFIED_ACCOUNT_DAYS + 1
1076
+ )
950
1077
  user.save()
951
1078
 
952
1079
  for user_profile in [self.teacher_user_profile, self.indy_user_profile]:
@@ -1011,7 +1138,9 @@ class TestUser(CronTestCase):
1011
1138
  new_user=indy_user,
1012
1139
  )
1013
1140
 
1014
- activity_today = DailyActivity.objects.get_or_create(date=datetime.now().date())[0]
1141
+ activity_today = DailyActivity.objects.get_or_create(
1142
+ date=datetime.now().date()
1143
+ )[0]
1015
1144
  daily_teacher_count = activity_today.anonymised_unverified_teachers
1016
1145
  daily_indy_count = activity_today.anonymised_unverified_independents
1017
1146
 
@@ -1034,16 +1163,30 @@ class TestUser(CronTestCase):
1034
1163
  assert indy_user_active == assert_active
1035
1164
  assert student_user_active
1036
1165
 
1037
- activity_today = DailyActivity.objects.get_or_create(date=datetime.now().date())[0]
1166
+ activity_today = DailyActivity.objects.get_or_create(
1167
+ date=datetime.now().date()
1168
+ )[0]
1038
1169
  total_activity = TotalActivity.objects.get(id=1)
1039
1170
 
1040
1171
  if not teacher_user_active:
1041
- assert activity_today.anonymised_unverified_teachers == daily_teacher_count + 1
1042
- assert total_activity.anonymised_unverified_teachers == total_teacher_count + 1
1172
+ assert (
1173
+ activity_today.anonymised_unverified_teachers
1174
+ == daily_teacher_count + 1
1175
+ )
1176
+ assert (
1177
+ total_activity.anonymised_unverified_teachers
1178
+ == total_teacher_count + 1
1179
+ )
1043
1180
 
1044
1181
  if not indy_user_active:
1045
- assert activity_today.anonymised_unverified_independents == daily_indy_count + 1
1046
- assert total_activity.anonymised_unverified_independents == total_indy_count + 1
1182
+ assert (
1183
+ activity_today.anonymised_unverified_independents
1184
+ == daily_indy_count + 1
1185
+ )
1186
+ assert (
1187
+ total_activity.anonymised_unverified_independents
1188
+ == total_indy_count + 1
1189
+ )
1047
1190
 
1048
1191
  teacher_user.delete()
1049
1192
  indy_user.delete()
@@ -552,15 +552,16 @@ def process_dismiss_student_form(request, formset, klass, access_code):
552
552
  student.new_user.first_name = data["name"]
553
553
  student.new_user.username = data["email"]
554
554
  student.new_user.email = data["email"]
555
+ student.user.is_verified = False
555
556
  student.save()
556
557
  student.new_user.save()
557
- student.new_user.userprofile.save()
558
+ student.user.save()
558
559
 
559
560
  # log the data
560
561
  joinrelease = JoinReleaseStudent.objects.create(student=student, action_type=JoinReleaseStudent.RELEASE)
561
562
  joinrelease.save()
562
563
 
563
- send_verification_email(request, student.new_user, data)
564
+ send_verification_email(request, student.new_user, data, school=klass.teacher.school)
564
565
 
565
566
  if not failed_users:
566
567
  messages.success(request, "The students have been released successfully from the class.")
@@ -1 +0,0 @@
1
- __version__ = "6.44.10"