codeforlife-portal 5.33.5__py2.py3-none-any.whl → 8.9.9__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (391) hide show
  1. cfl_common/common/__init__.py +1 -0
  2. cfl_common/common/app_settings.py +66 -0
  3. cfl_common/common/apps.py +6 -0
  4. cfl_common/common/context_processors.py +9 -0
  5. cfl_common/common/csp_config.py +85 -0
  6. cfl_common/common/helpers/__init__.py +0 -0
  7. cfl_common/common/helpers/data_migration_loader.py +42 -0
  8. cfl_common/common/helpers/emails.py +393 -0
  9. cfl_common/common/helpers/generators.py +52 -0
  10. cfl_common/common/helpers/organisation.py +10 -0
  11. cfl_common/common/mail.py +201 -0
  12. cfl_common/common/migrations/0001_initial.py +240 -0
  13. cfl_common/common/migrations/0002_emailverification.py +55 -0
  14. cfl_common/common/migrations/0003_aimmocharacter.py +31 -0
  15. cfl_common/common/migrations/0004_add_aimmocharacters.py +17 -0
  16. cfl_common/common/migrations/0005_add_worksheets.py +8 -0
  17. cfl_common/common/migrations/0006_update_aimmo_character_image_path.py +17 -0
  18. cfl_common/common/migrations/0007_add_pdf_names_to_first_two_worksheets.py +8 -0
  19. cfl_common/common/migrations/0008_unlock_worksheet_3.py +11 -0
  20. cfl_common/common/migrations/0009_add_blocked_time_to_teacher_and_student.py +24 -0
  21. cfl_common/common/migrations/0010_remove_teacher_title.py +18 -0
  22. cfl_common/common/migrations/0011_student_login_id.py +18 -0
  23. cfl_common/common/migrations/0012_usersession.py +39 -0
  24. cfl_common/common/migrations/0013_class_school.py +42 -0
  25. cfl_common/common/migrations/0014_login_type.py +29 -0
  26. cfl_common/common/migrations/0015_dailyactivity.py +31 -0
  27. cfl_common/common/migrations/0016_joinreleasestudent.py +42 -0
  28. cfl_common/common/migrations/0017_copy_email_to_username.py +18 -0
  29. cfl_common/common/migrations/0018_update_aimmo_character_image_path.py +15 -0
  30. cfl_common/common/migrations/0019_aimmocharacter_alt.py +16 -0
  31. cfl_common/common/migrations/0020_class_is_active_and_null_access_code.py +23 -0
  32. cfl_common/common/migrations/0021_school_is_active.py +28 -0
  33. cfl_common/common/migrations/0022_school_cleanup.py +29 -0
  34. cfl_common/common/migrations/0023_userprofile_aimmo_badges.py +22 -0
  35. cfl_common/common/migrations/0024_teacher_invited_by.py +25 -0
  36. cfl_common/common/migrations/0025_schoolteacherinvitation.py +47 -0
  37. cfl_common/common/migrations/0026_teacher_remove_join_request.py +22 -0
  38. cfl_common/common/migrations/0027_class_created_by.py +25 -0
  39. cfl_common/common/migrations/0028_coding_club_downloads.py +23 -0
  40. cfl_common/common/migrations/0029_dynamicelement.py +22 -0
  41. cfl_common/common/migrations/0030_add_maintenance_banner.py +25 -0
  42. cfl_common/common/migrations/0031_improve_admin_panel.py +56 -0
  43. cfl_common/common/migrations/0032_dailyactivity_level_control_submits.py +18 -0
  44. cfl_common/common/migrations/0033_password_reset_tracking_fields.py +23 -0
  45. cfl_common/common/migrations/0034_dailyactivity_daily_school_student_lockout_reset.py +18 -0
  46. cfl_common/common/migrations/0035_rename_lockout_fields.py +27 -0
  47. cfl_common/common/migrations/0036_rename_awaiting_email_verification_userprofile_is_verified.py +17 -0
  48. cfl_common/common/migrations/0037_migrate_email_verification.py +21 -0
  49. cfl_common/common/migrations/0038_delete_emailverification.py +16 -0
  50. cfl_common/common/migrations/0039_copy_email_to_username.py +18 -0
  51. cfl_common/common/migrations/0040_school_county.py +18 -0
  52. cfl_common/common/migrations/0041_populate_gb_counties.py +27 -0
  53. cfl_common/common/migrations/0042_totalactivity.py +25 -0
  54. cfl_common/common/migrations/0043_add_total_activity.py +30 -0
  55. cfl_common/common/migrations/0044_update_activity_models.py +33 -0
  56. cfl_common/common/migrations/0045_otp.py +23 -0
  57. cfl_common/common/migrations/0046_alter_school_country.py +19 -0
  58. cfl_common/common/migrations/0047_delete_school_postcode.py +16 -0
  59. cfl_common/common/migrations/0048_unique_school_names.py +42 -0
  60. cfl_common/common/migrations/0049_anonymise_orphan_users.py +29 -0
  61. cfl_common/common/migrations/0050_anonymise_orphan_schools.py +30 -0
  62. cfl_common/common/migrations/0051_verify_returning_users.py +26 -0
  63. cfl_common/common/migrations/0052_add_cse_fields.py +68 -0
  64. cfl_common/common/migrations/0053_clean_class_data.py +24 -0
  65. cfl_common/common/migrations/0054_delete_aimmo_models.py +20 -0
  66. cfl_common/common/migrations/0055_alter_schoolteacherinvitation_token.py +18 -0
  67. cfl_common/common/migrations/0056_set_non_school_teachers_as_non_admins.py +25 -0
  68. cfl_common/common/migrations/0057_teacher_teacher__is_admin.py +19 -0
  69. cfl_common/common/migrations/0058_userprofile_google_refresh_token_and_more.py +24 -0
  70. cfl_common/common/migrations/__init__.py +0 -0
  71. cfl_common/common/models.py +557 -0
  72. cfl_common/common/permissions.py +84 -0
  73. cfl_common/common/tests/__init__.py +0 -0
  74. cfl_common/common/tests/test_migration_anonymise_orphan_schools.py +30 -0
  75. cfl_common/common/tests/test_migration_anonymise_orphan_users.py +30 -0
  76. cfl_common/common/tests/test_migration_blocked_time.py +15 -0
  77. cfl_common/common/tests/test_migration_remove_teacher_title.py +13 -0
  78. cfl_common/common/tests/test_migration_unique_school_names.py +33 -0
  79. cfl_common/common/tests/test_migration_verify_returning_users.py +59 -0
  80. cfl_common/common/tests/test_models.py +87 -0
  81. cfl_common/common/tests/utils/__init__.py +0 -0
  82. cfl_common/common/tests/utils/classes.py +38 -0
  83. cfl_common/common/tests/utils/email.py +67 -0
  84. cfl_common/common/tests/utils/organisation.py +41 -0
  85. cfl_common/common/tests/utils/student.py +123 -0
  86. cfl_common/common/tests/utils/teacher.py +73 -0
  87. cfl_common/common/tests/utils/user.py +27 -0
  88. cfl_common/common/utils.py +56 -0
  89. cfl_common/setup.py +61 -0
  90. codeforlife_portal-8.9.9.dist-info/METADATA +226 -0
  91. {codeforlife_portal-5.33.5.dist-info → codeforlife_portal-8.9.9.dist-info}/RECORD +339 -241
  92. {codeforlife_portal-5.33.5.dist-info → codeforlife_portal-8.9.9.dist-info}/WHEEL +1 -1
  93. codeforlife_portal-8.9.9.dist-info/licenses/LICENSE.md +3 -0
  94. {codeforlife_portal-5.33.5.dist-info → codeforlife_portal-8.9.9.dist-info}/top_level.txt +1 -0
  95. deploy/middleware/maintenance.py +25 -0
  96. deploy/middleware/screentime_warning.py +29 -0
  97. deploy/middleware/security.py +5 -6
  98. deploy/middleware/session_timeout.py +4 -2
  99. deploy/middleware/tmp_basic_auth.py +41 -0
  100. example_project/portal_test_settings.py +239 -0
  101. example_project/settings.py +156 -17
  102. example_project/urls.py +5 -6
  103. portal/__init__.py +1 -1
  104. portal/admin.py +142 -29
  105. portal/app_settings.py +8 -7
  106. portal/forms/dotmailer.py +6 -4
  107. portal/forms/invite_teacher.py +19 -10
  108. portal/forms/organisation.py +137 -68
  109. portal/forms/play.py +53 -98
  110. portal/forms/registration.py +70 -164
  111. portal/forms/teach.py +147 -121
  112. portal/handlers.py +1 -2
  113. portal/helpers/decorators.py +30 -10
  114. portal/helpers/password.py +86 -47
  115. portal/helpers/ratelimit.py +32 -15
  116. portal/helpers/regexes.py +5 -0
  117. portal/helpers/request_handlers.py +10 -0
  118. portal/migrations/0044_auto_20150430_0959.py +6 -2
  119. portal/mixins/__init__.py +1 -0
  120. portal/mixins/cron_mixin.py +12 -0
  121. portal/permissions/__init__.py +1 -0
  122. portal/permissions/is_cron_request_from_google.py +14 -0
  123. portal/static/portal/img/10_years_anniversary.png +0 -0
  124. portal/static/portal/img/RR_logo_grass_background.png +0 -0
  125. portal/static/portal/img/coding_club_hero.jpg +0 -0
  126. portal/static/portal/img/coding_club_python_pack.png +0 -0
  127. portal/static/portal/img/facebook.png +0 -0
  128. portal/static/portal/img/gitbook.png +0 -0
  129. portal/static/portal/img/howe_dell_1.png +0 -0
  130. portal/static/portal/img/howe_dell_2.png +0 -0
  131. portal/static/portal/img/howe_dell_3.png +0 -0
  132. portal/static/portal/img/logo_cfl.png +0 -0
  133. portal/static/portal/img/logo_cfl_powered.svg +35 -0
  134. portal/static/portal/img/logo_cfl_reminder_cards.jpg +0 -0
  135. portal/static/portal/img/logo_ocado_group.png +0 -0
  136. portal/static/portal/img/logo_python_den.svg +21 -0
  137. portal/static/portal/img/long_europe_map.png +0 -0
  138. portal/static/portal/img/python_den.png +0 -0
  139. portal/static/portal/img/python_den_banner.svg +26 -0
  140. portal/static/portal/img/rapid_router_landing_hero.png +0 -0
  141. portal/static/portal/img/rr_advanced.png +0 -0
  142. portal/static/portal/img/ten_year_map_pin.svg +1 -0
  143. portal/static/portal/img/thumbnail_educate_rapid_router.png +0 -0
  144. portal/static/portal/img/thumbnail_educate_resources.png +0 -0
  145. portal/static/portal/img/thumbnail_play_rapid_router.png +0 -0
  146. portal/static/portal/img/thumbnail_python_den.png +0 -0
  147. portal/static/portal/img/twitter.png +0 -0
  148. portal/static/portal/js/carouselCards.js +25 -0
  149. portal/static/portal/js/common.js +96 -1
  150. portal/static/portal/js/independentLogin.js +16 -0
  151. portal/static/portal/js/independentRegistration.js +86 -0
  152. portal/static/portal/js/levelControl.js +77 -0
  153. portal/static/portal/js/lib/jquery.min.js +2 -0
  154. portal/static/portal/js/organisation_manage.js +142 -14
  155. portal/static/portal/js/passwordStrength.js +154 -64
  156. portal/static/portal/js/resetPassword.js +23 -0
  157. portal/static/portal/js/riveted.min.js +238 -239
  158. portal/static/portal/js/school.js +13 -0
  159. portal/static/portal/js/studentLogin.js +16 -0
  160. portal/static/portal/js/teacherEditStudent.js +23 -0
  161. portal/static/portal/js/teacherLogin.js +16 -0
  162. portal/static/portal/js/tenYearMap.js +14 -0
  163. portal/static/portal/sass/colorbox.scss +0 -1
  164. portal/static/portal/sass/modules/_colours.scss +1 -0
  165. portal/static/portal/sass/modules/_levels.scss +1 -1
  166. portal/static/portal/sass/modules/_mixins.scss +21 -0
  167. portal/static/portal/sass/partials/_banners.scss +4 -177
  168. portal/static/portal/sass/partials/_buttons.scss +12 -15
  169. portal/static/portal/sass/partials/_carousel.scss +129 -0
  170. portal/static/portal/sass/partials/_footer.scss +21 -22
  171. portal/static/portal/sass/partials/_forms.scss +60 -5
  172. portal/static/portal/sass/partials/_grids.scss +34 -61
  173. portal/static/portal/sass/partials/_header.scss +28 -20
  174. portal/static/portal/sass/partials/_images.scss +292 -39
  175. portal/static/portal/sass/partials/_popup.scss +18 -15
  176. portal/static/portal/sass/partials/_tables.scss +12 -20
  177. portal/static/portal/sass/partials/_text.scss +6 -10
  178. portal/static/portal/sass/styles.scss +0 -1
  179. portal/static/portal/video/code for life .pdf +0 -0
  180. portal/strings/about.py +5 -0
  181. portal/strings/coding_club.py +9 -0
  182. portal/strings/play.py +6 -5
  183. portal/strings/teach.py +1 -1
  184. portal/strings/teacher_resources.py +2 -8
  185. portal/strings/ten_year_map.py +13 -0
  186. portal/templates/403.html +2 -2
  187. portal/templates/404.html +1 -1
  188. portal/templates/500.html +2 -2
  189. portal/templates/{captcha → django_recaptcha}/includes/js_v2_invisible.html +3 -3
  190. portal/templates/{captcha → django_recaptcha}/widget_v2_invisible.html +2 -2
  191. portal/templates/email.html +4 -2
  192. portal/templates/maintenance.html +34 -0
  193. portal/templates/portal/about.html +94 -62
  194. portal/templates/portal/base.html +176 -152
  195. portal/templates/portal/coding_club.html +100 -0
  196. portal/templates/portal/contribute.html +56 -52
  197. portal/templates/portal/email_invitation_sent.html +1 -1
  198. portal/templates/portal/email_style_template.html +374 -0
  199. portal/templates/portal/email_verification_failed.html +1 -1
  200. portal/templates/portal/email_verification_needed.html +9 -9
  201. portal/templates/portal/form_shapes.html +20 -8
  202. portal/templates/portal/getinvolved.html +6 -6
  203. portal/templates/portal/home.html +35 -10
  204. portal/templates/portal/home_learning.html +19 -19
  205. portal/templates/portal/locked_out.html +0 -1
  206. portal/templates/portal/locked_out_school_student.html +16 -0
  207. portal/templates/portal/login/independent_student.html +31 -15
  208. portal/templates/portal/login/student.html +10 -7
  209. portal/templates/portal/login/student_class_code.html +7 -4
  210. portal/templates/portal/login/teacher.html +34 -17
  211. portal/templates/portal/partials/banner.html +18 -4
  212. portal/templates/portal/partials/benefits.html +1 -1
  213. portal/templates/portal/partials/card_list.html +34 -24
  214. portal/templates/portal/partials/character_list.html +5 -5
  215. portal/templates/portal/partials/cookie_list.html +161 -0
  216. portal/templates/portal/partials/delete_popup.html +18 -0
  217. portal/templates/portal/partials/footer.html +57 -26
  218. portal/templates/portal/partials/header.html +118 -117
  219. portal/templates/portal/partials/hero_card.html +4 -3
  220. portal/templates/portal/partials/info_popup.html +3 -3
  221. portal/templates/portal/partials/invite_admin_teacher.html +23 -0
  222. portal/templates/portal/partials/popup.html +7 -2
  223. portal/templates/portal/partials/register_newsletter_tickbox.html +2 -5
  224. portal/templates/portal/partials/screentime_popup.html +14 -0
  225. portal/templates/portal/partials/service_unavailable_popup.html +17 -0
  226. portal/templates/portal/partials/session_popup.html +19 -0
  227. portal/templates/portal/play/student_dashboard.html +42 -29
  228. portal/templates/portal/play/student_edit_account.html +64 -9
  229. portal/templates/portal/play.html +61 -41
  230. portal/templates/portal/privacy_notice.html +697 -0
  231. portal/templates/portal/register.html +122 -92
  232. portal/templates/portal/reset_password.html +20 -40
  233. portal/templates/portal/reset_password_confirm.html +9 -4
  234. portal/templates/portal/reset_password_email_sent.html +15 -13
  235. portal/templates/portal/teach/base_registering.html +1 -1
  236. portal/templates/portal/teach/class.html +4 -6
  237. portal/templates/portal/teach/dashboard.html +212 -117
  238. portal/templates/portal/teach/invited.html +90 -0
  239. portal/templates/portal/teach/onboarding_classes.html +5 -3
  240. portal/templates/portal/teach/onboarding_print.html +1 -1
  241. portal/templates/portal/teach/onboarding_school.html +26 -139
  242. portal/templates/portal/teach/onboarding_students.html +1 -1
  243. portal/templates/portal/teach/teacher_dismiss_students.html +73 -55
  244. portal/templates/portal/teach/teacher_edit_class.html +168 -11
  245. portal/templates/portal/teach/teacher_edit_student.html +12 -5
  246. portal/templates/portal/teach/teacher_move_all_classes.html +25 -38
  247. portal/templates/portal/teach/teacher_move_students_to_class.html +1 -1
  248. portal/templates/portal/teach.html +61 -42
  249. portal/templates/portal/ten_year_map.html +147 -0
  250. portal/templates/portal/terms.html +191 -42
  251. portal/templates/two_factor/core/login.html +71 -59
  252. portal/templates/two_factor/core/setup.html +58 -49
  253. portal/templates/two_factor/profile/disable.html +1 -1
  254. portal/templates/two_factor/profile/profile.html +35 -17
  255. portal/templatetags/app_tags.py +59 -84
  256. portal/templatetags/card_list_tags.py +0 -4
  257. portal/tests/base_test.py +14 -3
  258. portal/tests/conftest.py +0 -15
  259. portal/tests/migrations/test_migration_make_portaladmin_teacher.py +2 -6
  260. portal/tests/migrations/test_migration_preview_users.py +3 -9
  261. portal/tests/migrations/test_migration_remove_guardian.py +1 -3
  262. portal/tests/migrations/test_migration_use_common_models.py +2 -6
  263. portal/tests/migrations/test_migration_verify_portaladmin.py +1 -3
  264. portal/tests/pageObjects/portal/admin/admin_base_page.py +0 -21
  265. portal/tests/pageObjects/portal/base_page.py +16 -26
  266. portal/tests/pageObjects/portal/email_verification_needed_page.py +3 -2
  267. portal/tests/pageObjects/portal/game_page.py +12 -19
  268. portal/tests/pageObjects/portal/home_page.py +13 -15
  269. portal/tests/pageObjects/portal/independent_login_page.py +13 -17
  270. portal/tests/pageObjects/portal/password_reset_form_page.py +20 -4
  271. portal/tests/pageObjects/portal/password_reset_page.py +25 -0
  272. portal/tests/pageObjects/portal/play/account_page.py +18 -27
  273. portal/tests/pageObjects/portal/play/dashboard_page.py +4 -4
  274. portal/tests/pageObjects/portal/play/join_school_or_club_page.py +8 -10
  275. portal/tests/pageObjects/portal/play/play_base_page.py +5 -3
  276. portal/tests/pageObjects/portal/signup_page.py +28 -59
  277. portal/tests/pageObjects/portal/student_login_class_code.py +6 -9
  278. portal/tests/pageObjects/portal/student_login_page.py +6 -8
  279. portal/tests/pageObjects/portal/teach/add_independent_student_to_class_page.py +3 -3
  280. portal/tests/pageObjects/portal/teach/added_independent_student_to_class_page.py +3 -1
  281. portal/tests/pageObjects/portal/teach/class_page.py +36 -13
  282. portal/tests/pageObjects/portal/teach/dashboard_page.py +43 -84
  283. portal/tests/pageObjects/portal/teach/dismiss_students_page.py +7 -5
  284. portal/tests/pageObjects/portal/teach/edit_student_page.py +10 -8
  285. portal/tests/pageObjects/portal/teach/move_class_page.py +5 -10
  286. portal/tests/pageObjects/portal/teach/move_classes_page.py +4 -2
  287. portal/tests/pageObjects/portal/teach/move_students_disambiguate_page.py +4 -2
  288. portal/tests/pageObjects/portal/teach/move_students_page.py +6 -13
  289. portal/tests/pageObjects/portal/teach/onboarding_classes_page.py +5 -3
  290. portal/tests/pageObjects/portal/teach/onboarding_organisation_page.py +11 -49
  291. portal/tests/pageObjects/portal/teach/onboarding_student_list_page.py +7 -12
  292. portal/tests/pageObjects/portal/teach/onboarding_students_page.py +4 -27
  293. portal/tests/pageObjects/portal/teach/teach_base_page.py +6 -4
  294. portal/tests/pageObjects/portal/teacher_login_page.py +10 -16
  295. portal/tests/selenium_test_case.py +3 -43
  296. portal/tests/snapshots/snap_test_partials.py +11 -165
  297. portal/tests/test_2FA.py +15 -33
  298. portal/tests/test_admin.py +15 -97
  299. portal/tests/test_api.py +212 -91
  300. portal/tests/test_captcha_forms.py +2 -2
  301. portal/tests/test_class.py +374 -24
  302. portal/tests/test_emails.py +83 -20
  303. portal/tests/{test_newsletter_footer.py → test_global_forms.py} +5 -5
  304. portal/tests/test_helper_methods.py +30 -0
  305. portal/tests/test_independent_student.py +255 -144
  306. portal/tests/test_invite_teacher.py +318 -10
  307. portal/tests/test_middleware.py +96 -9
  308. portal/tests/test_organisation.py +78 -262
  309. portal/tests/test_partials.py +0 -88
  310. portal/tests/test_ratelimit.py +218 -36
  311. portal/tests/test_school_student.py +35 -40
  312. portal/tests/test_security.py +12 -31
  313. portal/tests/test_teacher.py +425 -325
  314. portal/tests/test_teacher_student.py +103 -91
  315. portal/tests/test_views.py +900 -76
  316. portal/tests/utils/classes.py +2 -2
  317. portal/tests/utils/messages.py +13 -28
  318. portal/urls.py +235 -166
  319. portal/views/admin.py +0 -332
  320. portal/views/api.py +82 -48
  321. portal/views/cron/__init__.py +1 -0
  322. portal/views/cron/user.py +322 -0
  323. portal/views/dotmailer.py +9 -1
  324. portal/views/email.py +33 -77
  325. portal/views/google_analytics.py +28 -0
  326. portal/views/home.py +126 -97
  327. portal/views/legal.py +13 -0
  328. portal/views/login/independent_student.py +5 -5
  329. portal/views/login/student.py +51 -14
  330. portal/views/login/teacher.py +2 -6
  331. portal/views/organisation.py +20 -189
  332. portal/views/registration.py +97 -17
  333. portal/views/student/edit_account_details.py +99 -72
  334. portal/views/student/play.py +81 -62
  335. portal/views/teacher/dashboard.py +421 -149
  336. portal/views/teacher/teach.py +226 -177
  337. portal/views/two_factor/core.py +22 -19
  338. portal/views/two_factor/profile.py +2 -2
  339. codeforlife_portal-5.33.5.dist-info/LICENSE.md +0 -577
  340. codeforlife_portal-5.33.5.dist-info/METADATA +0 -38
  341. deploy/permissions.py +0 -2
  342. example_project/manage.py +0 -10
  343. portal/autoconfig.py +0 -141
  344. portal/csp_config.py +0 -60
  345. portal/forms/add_game.py +0 -33
  346. portal/helpers/location.py +0 -121
  347. portal/static/portal/img/kurono_hero.jpg +0 -0
  348. portal/static/portal/img/kurono_landing_hero.png +0 -0
  349. portal/static/portal/img/kurono_logo.svg +0 -1
  350. portal/static/portal/img/kurono_logo_grey_background.svg +0 -1
  351. portal/static/portal/img/kurono_logo_mark.svg +0 -1
  352. portal/static/portal/img/kurono_resources_hero.jpg +0 -0
  353. portal/static/portal/img/kurono_story.png +0 -0
  354. portal/static/portal/img/ocado-swirl.svg +0 -22
  355. portal/static/portal/img/thumbnail_educate_kurono.png +0 -0
  356. portal/static/portal/img/thumbnail_educate_resources_and_progress_tracking.png +0 -0
  357. portal/static/portal/img/thumbnail_kurono_resources.png +0 -0
  358. portal/static/portal/img/thumbnail_play_kurono.png +0 -0
  359. portal/static/portal/img/x_close_video.png +0 -0
  360. portal/static/portal/js/aimmoGame.js +0 -106
  361. portal/static/portal/js/deleteWorkspaces.js +0 -14
  362. portal/static/portal/js/fuzzySchoolLookup.js +0 -46
  363. portal/static/portal/js/lib/jquery-3.5.1.min.js +0 -2
  364. portal/static/portal/js/lib/jquery-ui-1.12.1.min.js +0 -13
  365. portal/static/portal/sass/partials/_videos.scss +0 -10
  366. portal/static/portal/video/aimmo_play_now_background_video.mp4 +0 -0
  367. portal/strings/student_aimmo_dashboard.py +0 -6
  368. portal/templates/portal/admin/aggregated_data.html +0 -35
  369. portal/templates/portal/admin/map.html +0 -70
  370. portal/templates/portal/mouseflow.html +0 -9
  371. portal/templates/portal/partials/aimmo_games_table.html +0 -83
  372. portal/templates/portal/partials/register_over_required_age_tickbox.html +0 -9
  373. portal/templates/portal/play/independent_student_dashboard.html +0 -64
  374. portal/templates/portal/play/student_aimmo_dashboard.html +0 -63
  375. portal/templates/portal/privacy_policy.html +0 -483
  376. portal/templates/portal/reset_password_email.html +0 -9
  377. portal/templates/portal/teach/invite.html +0 -25
  378. portal/templates/portal/teach/teacher_aimmo_dashboard.html +0 -95
  379. portal/templates/portal/teach/teacher_resources.html +0 -68
  380. portal/templatetags/character_list_tags.py +0 -16
  381. portal/tests/pageObjects/portal/kurono_teacher_dashboard_page.py +0 -49
  382. portal/tests/pageObjects/portal/student_password_reset_form_page.py +0 -23
  383. portal/tests/pageObjects/portal/teach/onboarding_revoke_request_page.py +0 -20
  384. portal/tests/pageObjects/portal/teacher_password_reset_form_page.py +0 -23
  385. portal/tests/test_aimmo_dashboards.py +0 -172
  386. portal/tests/test_location.py +0 -217
  387. portal/tests/utils/aimmo_games.py +0 -30
  388. portal/views/aimmo/dashboard.py +0 -119
  389. portal/views/privacy_policy.py +0 -9
  390. portal/views/teacher/teacher_resources.py +0 -42
  391. {portal/views/aimmo → cfl_common}/__init__.py +0 -0
@@ -14,19 +14,18 @@
14
14
  </section>
15
15
  <div class="row">
16
16
  <div class="col-sm-6">
17
- <p>Rapid Router is our shopping delivery game that makes it easy for children aged 5–14 to learn
18
- how to code using Blockly and Python.</p>
19
- <p>The game and lessons support the English National Curriculum Computing strand, and Teachers across
20
- the world love them.</p>
17
+ <p>Rapid Router is our shopping delivery game that teaches children aged 5–14 to learn how to code using
18
+ Blockly. The pupils can then progress to Python Den to continue to build up their skills.</p>
19
+ <p>The game and lessons support the English National Curriculum Computing strand, and teachers across the
20
+ world love them.</p>
21
+ <p>Now, we’ve made lessons available for parents and caregivers to teach at home, so we can #KeepKidsCoding.
22
+ They're free and easy, but most of all, they’re fun!</p>
21
23
  </div>
22
24
  <div class="col-sm-6">
23
- <p>We’ve made lessons available for parents and caregivers to teach at home, so we can
24
- #KeepKidsCoding. If you're a curious independent student this will also be perfect for you.
25
- The lessons are free and easy, but most of all, they’re fun!
26
- </p>
27
- <p>To begin, you can read our learning guide and start at Level 1.
28
- We encourage you to first register as an independent student to ensure the level progress is saved.
29
- </p>
25
+ <p>Read our learning guide and start at Level 1, unless your child has played before. To start playing, you
26
+ need to first register as an independent student. This will ensure that the level progress is saved.</p>
27
+ <p>If you would like to keep updated on our products and receive emails about Code for Life, please
28
+ <a href="#newsletter_form">sign up to our updates</a>.</p>
30
29
  </div>
31
30
  </div>
32
31
  <div class="background text-right">
@@ -56,9 +55,9 @@
56
55
  algorithms, and learn how to create and debug simple programs. Designed for children aged 5–7,
57
56
  but start here if you’ve never played Rapid Router.
58
57
  </div>
59
- <a class="button" href="https://code-for-life.gitbook.io/independent-student-resources/beginner/" target="_blank">
58
+ <a class="button" href="https://code-for-life.gitbook.io/independent-student-resources/rapid-router-resources/beginner" target="_blank">
60
59
  <button class="button--primary button--icon">
61
- Go to lessons<span class="iconify" data-icon="mdi:open-in-new">
60
+ Go to lessons<span class="iconify" data-icon="mdi:open-in-new"></span>
62
61
  </button>
63
62
  </a>
64
63
  </div>
@@ -122,9 +121,9 @@
122
121
  programming constructs. Designed for children aged 8–11, but anyone can progress here if
123
122
  ready.
124
123
  </div>
125
- <a class="button" href="https://code-for-life.gitbook.io/independent-student-resources/intermediate/" target="_blank">
124
+ <a class="button" href="https://code-for-life.gitbook.io/independent-student-resources/rapid-router-resources/intermediate" target="_blank">
126
125
  <button class="button--primary button--icon">
127
- Go to lessons<span class="iconify" data-icon="mdi:open-in-new">
126
+ Go to lessons<span class="iconify" data-icon="mdi:open-in-new"></span>
128
127
  </button>
129
128
  </a>
130
129
  </div>
@@ -151,9 +150,9 @@
151
150
  <div>Let’s get advanced! Learn about repeat loops and selection, variables, and how to create
152
151
  efficient code. Designed for children aged 12–14, but open to all.
153
152
  </div>
154
- <a class="button" href="https://code-for-life.gitbook.io/independent-student-resources/advanced/" target="_blank">
153
+ <a class="button" href="https://code-for-life.gitbook.io/independent-student-resources/rapid-router-resources/advanced" target="_blank">
155
154
  <button class="button--primary button--icon">
156
- Go to lessons<span class="iconify" data-icon="mdi:open-in-new">
155
+ Go to lessons<span class="iconify" data-icon="mdi:open-in-new"></span>
157
156
  </button>
158
157
  </a>
159
158
  </div>
@@ -172,10 +171,11 @@
172
171
  <h6>Session 3 & 4</h6>
173
172
  <p>Extra tasks for children who want a challenge! Watch the if...do video to learn about selection
174
173
  statements. Ask your child to explain how their finished program works!</p>
174
+ <h6>Session 5</h6>
175
+ <p>Learn more about if...else through traffic lights. In the Traffic Lights levels in Rapid Router, traffic light is a variable that either contains red or green.</p>
175
176
  <h6>Extended</h6>
176
177
  <p>Build on everything learned so far with traffic lights, limited blocks, procedures and brain teasers.
177
- Older children might even like to start learning to program using the Python language using levels
178
- 80 onwards.</p>
178
+ Older children might even like to start learning to program using the Python language using <a href="{% url 'python_levels' %}">Python Den</a>.</p>
179
179
  </div>
180
180
  </div>
181
181
  </div>
@@ -1,6 +1,5 @@
1
1
  {% extends 'portal/base.html' %}
2
2
  {% load static %}
3
- {% load staticfiles %}
4
3
 
5
4
  {% block content %}
6
5
  <div class="error-page background container">
@@ -0,0 +1,16 @@
1
+ {% extends 'portal/base.html' %}
2
+ {% load static %}
3
+
4
+ {% block content %}
5
+ <div class="error-page background container">
6
+ <div class="row mx-0 d-flex justify-content-between">
7
+ <div class="flex-grow-1">
8
+ <h2>Temporary lock out!</h2>
9
+ <h5>Your account has been temporarily blocked as there were too many unsuccessful requests.</h5>
10
+ <p>If you wish to proceed, please ask your teacher to reset your password.
11
+ Alternatively, you will need to wait 24 hours for your account to be unlocked again.</p>
12
+ </div>
13
+ <img title="Phil" alt="Phil" src="{% static 'portal/img/phil.png' %}"/>
14
+ </div>
15
+ </div>
16
+ {% endblock content %}
@@ -1,32 +1,48 @@
1
1
  {% extends 'portal/form_shapes.html' %}
2
- {% load staticfiles %}
2
+ {% load static %}
3
3
  {% load app_tags %}
4
4
 
5
5
  {% block form_content %}
6
6
  <div id="independent_login_page"></div>
7
- <h4 class="center-block">Log in as an independent student</h4>
7
+ <h4 class="center-block">Welcome</h4>
8
+ <h5>Please enter your login details.</h5>
8
9
  <form id="independent_student_login_form" method="post" autocomplete="off">
9
10
 
10
11
  {% csrf_token %}
11
12
 
12
13
  {{ form.non_field_errors }}
13
14
 
14
- <label for="id_{{ form.username.html_name }}">{{ form.username.label }}</label>
15
- {{ form.username }}
16
- {{ form.username.errors }}
15
+ <div class="form__input">
16
+ {{ form.username }}
17
+ <small>{{ form.username.help_text }}</small>
18
+ {{ form.username.errors }}
19
+ </div>
17
20
 
18
- <label for="id_{{ form.password.html_name }}">{{ form.password.label }}</label>
19
- {{ form.password }}
20
- {{ form.password.errors }}
21
+ <div class="form--row">
22
+ <div class="input--icon">
23
+ {{ form.password }} <span id="password-field-icon" class="iconify" data-icon="material-symbols:visibility-off"></span>
24
+ </div>
25
+ <small>{{ form.password.help_text }}</small>
26
+ {{ form.password.errors }}
27
+ </div>
21
28
 
22
29
  {{ form.captcha }}
23
30
 
24
- <button type="submit" name="independent_student_login" class="button button--home button--login">Log in</button>
31
+ <div class="background">
32
+ <p class="text-left"><strong>Forgotten your password?</strong></p>
33
+ <p class="text-left">Don't worry, you can
34
+ <a id="student_forgotten_password_button" href="{% url 'student_password_reset' %}">reset your password</a>.
35
+ </p>
36
+ </div>
37
+
38
+ <p class="text-left"><strong>Part of a school or club?</strong>
39
+ <a href="{% url 'student_login_access_code' %}">Log in here</a>.
40
+ </p>
41
+
42
+ <div class="d-flex justify-content-end row">
43
+ <button type="submit" name="independent_student_login"
44
+ class="button button--home button--login button-right-arrow">Log in</button>
45
+ </div>
25
46
  </form>
26
-
27
- <p><strong>Forgotten your password?</strong></p>
28
- <p>Don't worry, you can
29
- <a id="student_forgotten_password_button" href="{% url 'student_password_reset' %}">reset your password</a>.
30
- </p>
31
- <p>Part of a school or club? <a href="{% url 'student_login_access_code' %}">Log in here</a>.</p>
47
+ <script type="text/javascript" src="{% static 'portal/js/independentLogin.js' %}"></script>
32
48
  {% endblock form_content %}
@@ -1,5 +1,5 @@
1
1
  {% extends 'portal/form_shapes.html' %}
2
- {% load staticfiles %}
2
+ {% load static %}
3
3
  {% load app_tags %}
4
4
 
5
5
  {% block form_content %}
@@ -18,15 +18,18 @@
18
18
  {{ form.username.errors }}
19
19
  </div>
20
20
 
21
- <div class="form__input">
22
- {{ form.password }}
21
+ <div class="form--row">
22
+ <div class="input--icon">
23
+ {{ form.password }} <span id="password-field-icon" class="iconify" data-icon="material-symbols:visibility-off"></span>
24
+ </div>
23
25
  <small>{{ form.password.help_text }}</small>
24
26
  {{ form.password.errors }}
25
27
  </div>
26
28
 
27
- <button type="submit" name="school_login" class="button button--primary button--login"
28
- onclick="deleteAllLocalStorageWorkspaces();">Log in</button>
29
+ <div class="d-flex justify-content-end row">
30
+ <button type="submit" name="school_login" class="button button--primary button--login button-right-arrow">
31
+ Log in</button>
32
+ </div>
29
33
  </form>
30
-
31
- <p>Forgotten your login details? Please check with your teacher.</p>
34
+ <script type="text/javascript" src="{% static 'portal/js/studentLogin.js' %}"></script>
32
35
  {% endblock form_content %}
@@ -1,5 +1,5 @@
1
1
  {% extends 'portal/form_shapes.html' %}
2
- {% load staticfiles %}
2
+ {% load static %}
3
3
  {% load app_tags %}
4
4
 
5
5
  {% block form_content %}
@@ -18,8 +18,11 @@
18
18
  {{ form.access_code.errors }}
19
19
  </div>
20
20
 
21
- <button type="submit" name="school_login_class_code" class="button button--primary button--login">Log in</button>
22
- </form>
21
+ <p class="background text-left"><strong>Forgotten your login details? Please check with your teacher.</strong></p>
23
22
 
24
- <p>Forgotten your login details? Please check with your teacher.</p>
23
+ <div class="d-flex justify-content-end row">
24
+ <button type="submit" name="school_login_class_code"
25
+ class="button button--primary button--login button-right-arrow">Log in</button>
26
+ </div>
27
+ </form>
25
28
  {% endblock form_content %}
@@ -1,5 +1,5 @@
1
1
  {% extends 'portal/base.html' %}
2
- {% load staticfiles %}
2
+ {% load static %}
3
3
  {% load app_tags %}
4
4
 
5
5
  {% block css %}
@@ -20,11 +20,16 @@
20
20
 
21
21
  {% if wizard.steps.current == 'auth' %}
22
22
  <section class="row mx-0">
23
- <span class="oval-blue login-shape-left"></span>
24
- <span class="polygon-yellow login-shape-right"></span>
23
+ <span class="login-shape-left">
24
+ <img src="{% static 'portal/img/oval_blue.svg' %}" alt="Blue oval">
25
+ </span>
26
+ <span class="login-shape-right">
27
+ <img src="{% static 'portal/img/polygon_yellow.svg' %}" alt="Yellow polygon">
28
+ </span>
25
29
  <div class="form--login is-flex form--register--teacher">
26
30
  <div class="form col-xs-12 col-sm-8 col-md-8 col-lg-9 center-block">
27
- <h4 class="center-block">Log in as a teacher</h4>
31
+ <h4 class="center-block">Welcome</h4>
32
+ <h5>Please enter your login details.</h5>
28
33
  <form id="form-login-teacher" method="post" autocomplete="off">
29
34
 
30
35
  {% csrf_token %}
@@ -32,24 +37,34 @@
32
37
 
33
38
  {{ form.non_field_errors }}
34
39
 
35
- <label for="id_{{ form.username.html_name }}">{{ form.username.label }}</label>
36
- {{ form.username }}
37
- {{ form.username.errors }}
40
+ <div class="form__input">
41
+ {{ form.username }}
42
+ <small>{{ form.username.help_text }}</small>
43
+ {{ form.username.errors }}
44
+ </div>
38
45
 
39
- <label for="id_{{ form.password.html_name }}">{{ form.password.label }}</label>
40
- {{ form.password }}
41
- {{ form.password.errors }}
46
+ <div class="form--row">
47
+ <div class="input--icon">
48
+ {{ form.password }} <span id="password-field-icon" class="iconify" data-icon="material-symbols:visibility-off"></span>
49
+ </div>
50
+ <small>{{ form.password.help_text }}</small>
51
+ {{ form.password.errors }}
52
+ </div>
42
53
 
43
54
  {{ form.captcha }}
44
55
 
45
- <button type="submit" name="login_view" class="button button--primary button--login"
46
- onclick="deleteAllLocalStorageWorkspaces();">Log in</button>
47
- </form>
56
+ <div class="background">
57
+ <p class="text-left"><strong>Forgotten your password?</strong></p>
58
+ <p class="text-left">Don't worry, you can
59
+ <a id="teacher_forgotten_password_button" href="{% url 'teacher_password_reset' %}">reset your password</a>.
60
+ </p>
61
+ </div>
48
62
 
49
- <p><strong>Forgotten your password?</strong></p>
50
- <p>Don&rsquo;t worry, you can
51
- <a id="teacher_forgotten_password_button" href="{% url 'teacher_password_reset' %}">reset your password</a>.
52
- </p>
63
+ <div class="d-flex justify-content-end row">
64
+ <button type="submit" name="login_view"
65
+ class="button button--primary button--login button-right-arrow">Log in</button>
66
+ </div>
67
+ </form>
53
68
  </div>
54
69
  </div>
55
70
  </section>
@@ -57,4 +72,6 @@
57
72
  {% include "two_factor/core/login.html" %}
58
73
  {% endif %}
59
74
 
75
+ <script type="text/javascript" src="{% static 'portal/js/teacherLogin.js' %}"></script>
76
+
60
77
  {% endblock content %}
@@ -10,15 +10,29 @@
10
10
  {% if text %}
11
11
  <p>{{ text }}</p>
12
12
  {% endif %}
13
- {% if button %}
14
- <a href="{% url button.link %}" class="button button--primary button-right-arrow">{{ button.text}}</a>
15
- {% endif %}
13
+ <div class="button-group">
14
+ {% if button %}
15
+ {% if button.external %}
16
+ <a href="{{ button.link }}" target="_blank" class="button button--primary button-right-arrow">{{ button.text }}</a>
17
+ {% else %}
18
+ <a href="{% url button.link %}" class="button button--primary button-right-arrow">{{ button.text}}</a>
19
+ {% endif %}
20
+ {% endif %}
21
+ {% if button2 %}
22
+ {% if button.external %}
23
+ <a href="{{ button2.link }}" target="_blank" class="button button--primary button-right-arrow">{{ button2.text }}</a>
24
+ {% else %}
25
+ <a href="{% url button2.link %}" class="button button--primary button-right-arrow">{{ button2.text}}</a>
26
+ {% endif %}
27
+ {% endif %}
28
+ </div>
16
29
  </div>
17
30
  <div>
18
31
  <div class="banner--picture">
19
32
  <div class="banner--picture__inside1">
20
33
  <div class="banner--picture__inside2 {{ image_class }}"
21
- {% if image_description %}title="{{ image_description }}"{% endif %}>
34
+ {% if image_description %}title="{{ image_description }}"{% endif %}
35
+ {% if alt %} alt="{{ alt }}" {% endif %}>
22
36
  </div>
23
37
  </div>
24
38
  </div>
@@ -1,4 +1,4 @@
1
- {% load staticfiles %}
1
+ {% load static %}
2
2
 
3
3
  <div class="grid-benefits col-sm-8 col-center">
4
4
  {% if image1 %}
@@ -1,29 +1,39 @@
1
- {% load staticfiles %}
1
+ {% load static %}
2
2
  {% load app_tags %}
3
3
 
4
- <div class="grid grid-worksheets grid__fit">
5
- {% for card in cards %}
6
- <div class="card">
7
- <div class="card__images">
8
- <img class="card__image" src="{{ card.image | cloud_storage }}">
9
- {% if card.thumbnail_text %}
10
- <h3 class="card__thumbnail">{{ card.thumbnail_text }}</h3>
11
- {% elif card.thumbnail_image %}
12
- <img class="card__thumbnail" src="{{ card.thumbnail_image | cloud_storage }}">
13
- {% endif %}
14
- </div>
15
- <div class="card__text">
16
- <h5 class="card__title">{{ card.title }}</h5>
17
- {% if card.description %}
18
- <p>{{ card.description }}</p>
19
- {% elif card.button_text %}
20
- <div class="button-group button-group__icon">
21
- <a target="_blank" href="{{ card.button_link }}" class="button button--primary button-right-arrow">
22
- {{ card.button_text }}
23
- </a>
4
+ <script type="text/javascript" src="{% static 'portal/js/carouselCards.js' %}"></script>
5
+
6
+ <div id="carouselCards" class="carousel carousel-cards slide" data-ride="carousel" data-interval="false">
7
+ <div class="carousel-inner" role="listbox">
8
+ {% for card in cards %}
9
+ <div class="item col-xs-4 {% if forloop.first %}active{% endif %}">
10
+ <div class="card">
11
+ <div class="card__images">
12
+ <img class="card__image" src="{{ card.image | cloud_storage }}">
13
+ </div>
14
+ <div class="card__text">
15
+ <h5 class="card__title">{{ card.title }}</h5>
16
+ {% if card.description %}
17
+ <p>{{ card.description }}</p>
18
+ {% endif %}
24
19
  </div>
25
- {% endif %}
20
+ </div>
26
21
  </div>
27
- </div>
28
- {% endfor %}
22
+ {% endfor %}
23
+ </div>
24
+
25
+ <div class="carousel-nav text-center">
26
+ <a class="button prev disabled" data-target="#carouselCards" data-slide="prev">
27
+ <span class="iconify" data-icon="mdi:chevron-left" aria-hidden="true"></span>
28
+ <span class="sr-only">Previous</span>
29
+ </a>
30
+ <a class="button next" data-target="#carouselCards" data-slide="next">
31
+ <span class="iconify" data-icon="mdi:chevron-right" aria-hidden="true"></span>
32
+ <span class="sr-only">Next</span>
33
+ </a>
34
+ </div>
29
35
  </div>
36
+
37
+ <script>
38
+ setUpCarouselCards({{ cards | length }})
39
+ </script>
@@ -1,12 +1,12 @@
1
- {% load staticfiles %}
1
+ {% load static %}
2
2
  {% load app_tags %}
3
3
 
4
4
  <div class="grid grid-characters grid__fit">
5
5
  {% for character in characters %}
6
- <div class="card">
7
- <h5 class="card__title">{{ character.name }}</h5>
8
- <img class="card__image" src="{{ character.image_path | cloud_storage }}">
9
- <p class="card__text">{{ character.description }}</p>
6
+ <div>
7
+ <img class="grid-character-image" src="{{ character.image_path | cloud_storage }}" alt="{{ character.alt }}">
8
+ <h5 class="grid-character-title">{{ character.name }}</h5>
9
+ <p>{{ character.description }}</p>
10
10
  </div>
11
11
  {% endfor %}
12
12
  </div>
@@ -0,0 +1,161 @@
1
+ <h6>Strictly Necessary Cookies</h6>
2
+
3
+ <table class="table table-bordered header-primary">
4
+ <colgroup>
5
+ <col span="1" style="width: 23%;">
6
+ <col span="1" style="width: 20%;">
7
+ <col span="1" style="width: 47%;">
8
+ <col span="1" style="width: 10%;">
9
+ </colgroup>
10
+ <tr>
11
+ <th><strong>Cookie name</strong></th>
12
+ <th><strong>Host</strong></th>
13
+ <th><strong>Description</strong></th>
14
+ <th><strong>Expiry</strong></th>
15
+ </tr>
16
+ <tr>
17
+ <td><p>OptanonAlertBoxClosed</p></td>
18
+ <td><p>codeforlife.education</p></td>
19
+ <td><p>This cookie is set by the cookie compliance solution from OneTrust. It is set after visitors have
20
+ seen a cookie information notice and in some cases only when they actively close the notice down. It
21
+ enables the website not to show the message more than once to a user. It contains no personal
22
+ information.</p>
23
+ </td>
24
+ <td><p>1 year</p></td>
25
+ </tr>
26
+ <tr>
27
+ <td><p>OptanonConsent</p></td>
28
+ <td><p>codeforlife.education</p></td>
29
+ <td><p>This cookie is set by the cookie compliance solution from OneTrust. It stores information about
30
+ the categories of cookies the site uses and whether visitors have given or withdrawn consent for the
31
+ use of each category. This enables site owners to prevent cookies in each category from being set in
32
+ the users browser, when consent is not given. It contains no information that can identify the site
33
+ visitor.</p>
34
+ </td>
35
+ <td><p>1 year</p></td>
36
+ </tr>
37
+ <tr>
38
+ <td><p>csrftoken</p></td>
39
+ <td><p>codeforlife.education</p></td>
40
+ <td><p>This cookie is associated with the Django web development platform for Python. It is designed to
41
+ help protect a site against a particular type of software attack on web forms.</p>
42
+ </td>
43
+ <td><p>1 year</p></td>
44
+ </tr>
45
+ <tr>
46
+ <td><p>sessionid</p></td>
47
+ <td><p>codeforlife.education</p></td>
48
+ <td><p>This cookie is associated with the Django web development platform for Python. It contains a
49
+ special session id to identify each browser and its associated session with the site.</p>
50
+ </td>
51
+ <td><p>Session</p></td>
52
+ </tr>
53
+ <tr>
54
+ <td><p>_GRECAPTCHA</p></td>
55
+ <td><p>www.google.com</p></td>
56
+ <td><p>Cookie used by Google Recaptcha. It is used for risk analysis in spam protection and may store
57
+ browsing device information.</p>
58
+ </td>
59
+ <td><p>5 months</p></td>
60
+ </tr>
61
+ </table>
62
+
63
+ <h6>Analytics / Performance Cookies</h6>
64
+
65
+ <table class="table table-bordered header-primary">
66
+ <colgroup>
67
+ <col span="1" style="width: 23%;">
68
+ <col span="1" style="width: 20%;">
69
+ <col span="1" style="width: 47%;">
70
+ <col span="1" style="width: 10%;">
71
+ </colgroup>
72
+ <tr>
73
+ <th><strong>Cookie name</strong></th>
74
+ <th><strong>Host</strong></th>
75
+ <th><strong>Description</strong></th>
76
+ <th><strong>Expiry</strong></th>
77
+ </tr>
78
+ <tr>
79
+ <td><p>_ga</p></td>
80
+ <td><p>codeforlife.education</p></td>
81
+ <td><p>This cookie is associated with Google Universal Analytics - which is a significant update to
82
+ Google's more commonly used analytics service. This cookie is used to distinguish unique users by
83
+ assigning a randomly generated number as a client identifier. It is included in each page request in
84
+ a site and used to calculate visitor, session and campaign data for the sites analytics reports.</p>
85
+ </td>
86
+ <td><p>1 year</p></td>
87
+ </tr>
88
+ <tr>
89
+ <td><p>_gid</p></td>
90
+ <td><p>codeforlife.education</p></td>
91
+ <td><p>This cookie is associated with Google Universal Analytics. It is used to store and count page
92
+ views.</p>
93
+ </td>
94
+ <td><p>A few seconds</p></td>
95
+ </tr>
96
+ <tr>
97
+ <td><p>_ga_xxxxxxxxxx</p></td>
98
+ <td><p>codeforlife.education</p></td>
99
+ <td><p>This cookie is associated with Google Universal Analytics. Used to distinguish unique users by
100
+ assigning a randomly generated number as a client identifier. Its primary purpose is to help website
101
+ owners measure visitor interactions, track site usage, and provide personalised experiences to
102
+ enhance user engagement.</p>
103
+ </td>
104
+ <td><p>1 year</p></td>
105
+ </tr>
106
+ <tr>
107
+ <td><p>_gat_UA-xxxxxxxx-x</p></td>
108
+ <td><p>codeforlife.education</p></td>
109
+ <td><p>This cookie is associated with Google Tag Manager. It is used to store to provide technical
110
+ monitoring and limit the amount of data recorded by Google on high-traffic sites.</p>
111
+ </td>
112
+ <td><p>1 minute</p></td>
113
+ </tr>
114
+ <tr>
115
+ <td><p>_gat_gtag_UA_xxxxxxxx_x</p></td>
116
+ <td><p>codeforlife.education</p></td>
117
+ <td><p>This cookie is associated with Google Tag Manager. It is used to store a unique user ID.</p>
118
+ </td>
119
+ <td><p>1 minute</p></td>
120
+ </tr>
121
+ </table>
122
+
123
+ <h6>Functional Cookies</h6>
124
+
125
+ <table class="table table-bordered header-primary">
126
+ <colgroup>
127
+ <col span="1" style="width: 23%;">
128
+ <col span="1" style="width: 20%;">
129
+ <col span="1" style="width: 47%;">
130
+ <col span="1" style="width: 10%;">
131
+ </colgroup>
132
+ <tr>
133
+ <th><strong>Cookie name</strong></th>
134
+ <th><strong>Host</strong></th>
135
+ <th><strong>Description</strong></th>
136
+ <th><strong>Expiry</strong></th>
137
+ </tr>
138
+ <tr>
139
+ <td><p>preferredLanguage</p></td>
140
+ <td><p>codeforlife.education</p></td>
141
+ <td><p>This cookie is used to remember your selected language preference in Rapid Router and Python Den,
142
+ so you don't have to keep selecting it every time you load a new level.</p>
143
+ </td>
144
+ <td><p>Session</p></td>
145
+ </tr>
146
+ <tr>
147
+ <td><p>muted</p></td>
148
+ <td><p>codeforlife.education</p></td>
149
+ <td><p>This cookie is used to remember your muted setting in Rapid Router and Python Den, so you don't
150
+ have to keep setting it every time you load a new level.</p>
151
+ </td>
152
+ <td><p>Session</p></td>
153
+ </tr>
154
+ <tr>
155
+ <td><p>__cf_bm</p></td>
156
+ <td><p>pwnedpasswords.com</p></td>
157
+ <td><p>This cookie is used by CloudFlare to read and filter requests from bots.</p>
158
+ </td>
159
+ <td><p>30 minutes</p></td>
160
+ </tr>
161
+ </table>
@@ -0,0 +1,18 @@
1
+ {# A popup for delete account with Review classes button. #}
2
+ <section id="popup-delete-review" class="popup-wrapper">
3
+ <div class="popup-box">
4
+ <div>
5
+ <button class="close popup-box__close" type="button" id="close_popup_button" onclick="hideDeleteAccountPopup()" aria-label="Close">
6
+ <span class="iconify" data-icon="mdi:close"></span>
7
+ </button>
8
+ </div>
9
+ <div class="popup-box__title"></div>
10
+ <div class="popup-box__msg"></div>
11
+ <div class="popup-box__buttons justify-content-center">
12
+ <a id="review_button" class="button button--primary" href="{% url 'dashboard' %}#classes" onclick="$('#tab-classes').click(); hideDeleteAccountPopup();" aria-labelledby="review_button">Review classes</a>
13
+ <a id="cancel_popup_button" class="button button--secondary button--secondary--dark" onclick="hideDeleteAccountPopup()" aria-labelledby="cancel_popup_button">Cancel</a>
14
+ <a id="delete_button" class='button button--primary button--primary--danger button--icon' data-delete-path="{% url 'delete_account' %}" onclick="" aria-labelledby="delete_button">
15
+ Delete <span class="iconify" data-icon="mdi:delete-outline"></span></a>
16
+ </div>
17
+ </div>
18
+ </section>