codeforlife-portal 5.32.2__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 (393) 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.32.2.dist-info → codeforlife_portal-8.9.9.dist-info}/RECORD +341 -238
  92. {codeforlife_portal-5.32.2.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.32.2.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 +31 -0
  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 +10 -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 -73
  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 +138 -15
  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 +237 -164
  319. portal/views/admin.py +0 -332
  320. portal/views/api.py +82 -68
  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/__init__.py +0 -0
  338. portal/views/two_factor/core.py +28 -0
  339. portal/views/two_factor/form.py +7 -0
  340. portal/views/two_factor/profile.py +11 -0
  341. codeforlife_portal-5.32.2.dist-info/LICENSE.md +0 -577
  342. codeforlife_portal-5.32.2.dist-info/METADATA +0 -38
  343. deploy/permissions.py +0 -2
  344. example_project/manage.py +0 -10
  345. portal/autoconfig.py +0 -140
  346. portal/csp_config.py +0 -60
  347. portal/forms/add_game.py +0 -33
  348. portal/helpers/location.py +0 -121
  349. portal/static/portal/img/kurono_hero.jpg +0 -0
  350. portal/static/portal/img/kurono_landing_hero.png +0 -0
  351. portal/static/portal/img/kurono_logo.svg +0 -1
  352. portal/static/portal/img/kurono_logo_grey_background.svg +0 -1
  353. portal/static/portal/img/kurono_logo_mark.svg +0 -1
  354. portal/static/portal/img/kurono_resources_hero.jpg +0 -0
  355. portal/static/portal/img/kurono_story.png +0 -0
  356. portal/static/portal/img/ocado-swirl.svg +0 -22
  357. portal/static/portal/img/thumbnail_educate_kurono.png +0 -0
  358. portal/static/portal/img/thumbnail_educate_resources_and_progress_tracking.png +0 -0
  359. portal/static/portal/img/thumbnail_kurono_resources.png +0 -0
  360. portal/static/portal/img/thumbnail_play_kurono.png +0 -0
  361. portal/static/portal/img/x_close_video.png +0 -0
  362. portal/static/portal/js/aimmoGame.js +0 -106
  363. portal/static/portal/js/deleteWorkspaces.js +0 -14
  364. portal/static/portal/js/fuzzySchoolLookup.js +0 -46
  365. portal/static/portal/js/lib/jquery-3.5.1.min.js +0 -2
  366. portal/static/portal/js/lib/jquery-ui-1.12.1.min.js +0 -13
  367. portal/static/portal/sass/partials/_videos.scss +0 -10
  368. portal/static/portal/video/aimmo_play_now_background_video.mp4 +0 -0
  369. portal/strings/student_aimmo_dashboard.py +0 -6
  370. portal/templates/portal/admin/aggregated_data.html +0 -35
  371. portal/templates/portal/admin/map.html +0 -70
  372. portal/templates/portal/mouseflow.html +0 -9
  373. portal/templates/portal/partials/aimmo_games_table.html +0 -83
  374. portal/templates/portal/partials/register_over_required_age_tickbox.html +0 -9
  375. portal/templates/portal/play/independent_student_dashboard.html +0 -64
  376. portal/templates/portal/play/student_aimmo_dashboard.html +0 -63
  377. portal/templates/portal/privacy_policy.html +0 -483
  378. portal/templates/portal/reset_password_email.html +0 -9
  379. portal/templates/portal/teach/invite.html +0 -25
  380. portal/templates/portal/teach/teacher_aimmo_dashboard.html +0 -95
  381. portal/templates/portal/teach/teacher_resources.html +0 -68
  382. portal/templatetags/character_list_tags.py +0 -16
  383. portal/tests/pageObjects/portal/kurono_teacher_dashboard_page.py +0 -49
  384. portal/tests/pageObjects/portal/student_password_reset_form_page.py +0 -23
  385. portal/tests/pageObjects/portal/teach/onboarding_revoke_request_page.py +0 -20
  386. portal/tests/pageObjects/portal/teacher_password_reset_form_page.py +0 -23
  387. portal/tests/test_aimmo_dashboards.py +0 -172
  388. portal/tests/test_location.py +0 -217
  389. portal/tests/utils/aimmo_games.py +0 -30
  390. portal/views/aimmo/dashboard.py +0 -119
  391. portal/views/privacy_policy.py +0 -9
  392. portal/views/teacher/teacher_resources.py +0 -42
  393. {portal/views/aimmo → cfl_common}/__init__.py +0 -0
@@ -1,4 +1,4 @@
1
- {% load staticfiles %}
1
+ {% load static %}
2
2
  {% load app_tags %}
3
3
 
4
4
  <div class="footer">
@@ -9,46 +9,77 @@
9
9
  <div class="col-sm-4 col-xs-12">
10
10
  <p><a href="{% url 'about' %}">About us</a></p>
11
11
  <p><a class="freshdesk__contact-us">Help and support</a></p>
12
- <p><a class="optanon-toggle-display">Cookie settings</a></p>
12
+ <p><a href="https://2662351606-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M_6UDUiGoJDhr_OXetO%2Fuploads%2FHx2kJLPwUER9Ez7gdQFp%2F2023_Impact_Report_Final.pdf?alt=media"
13
+ target="_blank">Impact Report 2023</a></p>
14
+ <p><a href="https://2662351606-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M_6UDUiGoJDhr_OXetO%2Fuploads%2FzLy8JN9TSFpzunetkWET%2FImpact_Report_24.V.10.pdf?alt=media"
15
+ target="_blank">Impact Report 2024</a></p>
13
16
  </div>
14
17
  <div class="col-sm-4 col-xs-12">
15
- <p><a href="{% url 'privacy_policy' %}">Privacy policy</a></p>
18
+ <p><a href="{% url 'privacy_notice' %}">Privacy notice</a></p>
16
19
  <p><a href="{% url 'terms' %}">Terms of use</a></p>
20
+ <p><a class="optanon-toggle-display">Cookie settings</a></p>
21
+ <p><a href="https://docs.codeforlife.education/">CFL community</a></p>
17
22
  </div>
18
23
  <div class="col-sm-4 col-xs-12">
19
24
  <p><a href="{% url 'home-learning' %}">Home learning</a></p>
20
25
  <p><a href="{% url 'getinvolved' %}">Get involved</a></p>
26
+ <p><a href="{% url 'codingClub' %}">Coding clubs</a></p>
27
+ <p><a href="https://2662351606-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M_6UDUiGoJDhr_OXetO%2Fuploads%2FPavvCifcuUeZZZLkV01C%2FOpportunities%20with%20Code%20for%20Life.pdf?alt=media"
28
+ target="_blank">Opportunities with CFL</a></p>
21
29
  </div>
22
30
  </div>
23
- <form id="newsletter_form" action="{% url 'process_newsletter_form' %}" method="post">
24
- {{ news_form.non_field_errors }}
25
- <div class="form--row">
26
- <div class="form--row__input">
27
- <label>{{ news_form.email.label }}</label>
28
- <div class="input--icon">
29
- {{ news_form.email }}
30
- <span class="iconify" data-icon="mdi:email-outline"></span>
31
+ </div>
32
+ <div class="col-sm-4 hidden-xs">
33
+ <a target="_blank" href="https://www.ocadogroup.com/sustainability/sustainability">
34
+ <img title="Ocado Group" alt="Ocado Group" src="{% static 'portal/img/logo_cfl_powered.svg' %}">
35
+ </a>
36
+ </div>
37
+ </div>
38
+ <div class="row">
39
+ <form id="newsletter_form" action="{% url 'process_newsletter_form' %}" method="post">
40
+ <div class="col-sm-8">
41
+ <div>
42
+ {{ news_form.non_field_errors }}
43
+ <div class="form--row">
44
+ <div class="form--row__input">
45
+ <label>{{ news_form.email.label }}</label>
46
+ <div class="input--icon">
47
+ {{ news_form.email }}
48
+ <span class="iconify" data-icon="mdi:email-outline"></span>
49
+ </div>
50
+ <small>{{ news_form.email.help_text }}</small>
51
+ {{ news_form.email.errors }}
31
52
  </div>
32
- <small>{{ news_form.email.help_text }}</small>
33
- {{ news_form.email.errors }}
34
53
  </div>
35
- <button type="submit" id="submit_newsletter" name="submit" value="Submit" class="button button--primary">Sign up</button>
54
+ <div class="form--row justify-content-between">
55
+ <div class="form__checkbox">
56
+ <div class="form__checkbox-input">
57
+ {{ news_form.age_verification }}
58
+ </div>
59
+ <p class="p-0">Please confirm that you are over 18.</p>
60
+ </div>
61
+ <button type="submit" id="submit_newsletter" name="submit" value="Submit" class="button button--primary m-0">Sign up</button>
62
+ </div>
36
63
  </div>
37
- </form>
38
- </div>
39
- <div class="col-sm-4">
40
- <img class="landscape-logo hidden-sm hidden-xs" title="Code for Life" alt="Code for Life" src="{% static 'portal/img/logo_cfl_white_landscape.png' %}">
41
- <div class="external-links">
42
64
  <div class="social-media">
43
- <a target="_blank" href="https://www.facebook.com/codeforlifeuk/"><span class="iconify" data-icon="mdi:facebook"></span></a>
44
- <a target="_blank" href="https://twitter.com/codeforlifeuk"><span class="iconify" data-icon="ant-design:twitter-circle-filled"></span></a>
65
+ <a target="_blank" href="https://www.facebook.com/codeforlifeuk/"><span class="iconify" data-icon="simple-icons:facebook"></span></a>
66
+ <a target="_blank" href="https://www.instagram.com/codeforlife_uk/"><span class="iconify" data-icon="simple-icons:instagram"></span></a>
67
+ <a target="_blank" href="https://www.linkedin.com/company/code-for-life-uk/"><span class="iconify" data-icon="simple-icons:linkedin"></span></a>
68
+ <a target="_blank" href="https://twitter.com/codeforlifeuk"><span class="iconify" data-icon="ri:twitter-x-line"></span></a>
69
+ <a target="_blank" href="https://www.youtube.com/@CodeForLife-uk"><span class="iconify" data-icon="simple-icons:youtube"></span></a>
70
+ </div>
71
+ <div class="visible-xs">
72
+ <a target="_blank" href="https://www.ocadogroup.com/sustainability/sustainability">
73
+ <img title="Ocado Group" alt="Ocado Group" src="{% static 'portal/img/logo_cfl_powered.svg' %}">
74
+ </a>
45
75
  </div>
46
- <img class="landscape-logo visible-sm visible-xs" title="Code for Life" alt="Code for Life" src="{% static 'portal/img/logo_cfl_white_landscape.png' %}">
47
- <a target="_blank" href="https://www.ocadogroup.com/our-responsible-business/corporate-responsibility/skills-for-the-future">
48
- <img title="Ocado Group" alt="Ocado Group" src="{% static 'portal/img/logo_ocado_group_white.svg' %}">
49
- </a>
50
76
  </div>
51
- </div>
77
+ <div class="col-sm-4">
78
+ <div class="is-flex justify-content-center justify-content-sm-end">
79
+ <img title="10 years anniversary" alt="10 years anniversary" src="{% static 'portal/img/10_years_anniversary.png' %}">
80
+ </div>
81
+ </div>
82
+ </form>
52
83
  </div>
53
84
  <p class="copyright">&copy; Ocado Group {% now "Y" %}</p>
54
85
  </div>
@@ -1,4 +1,4 @@
1
- {% load staticfiles %}
1
+ {% load static %}
2
2
  {% load app_tags %}
3
3
 
4
4
  <div class="header">
@@ -15,98 +15,91 @@
15
15
  {% else %}
16
16
  <a href="{% url 'home' %}">
17
17
  {% endif %}
18
- <img class="logo" src="{% static 'portal/img/logo_cfl.png' %}">
18
+ <img class="logo" src="{% static 'portal/img/logo_cfl.png' %}" alt="Code for Life logo">
19
19
  </a>
20
- <a class="menu__brand--ocado" target="_blank" href="https://www.ocadogroup.com/our-responsible-business/corporate-responsibility/skills-for-the-future">
21
- <img title="Proudly developed by Ocado Group" alt="Proudly developed by Ocado Group"
20
+ <a class="menu__brand--ocado" target="_blank" href="https://www.ocadogroup.com/sustainability/sustainability">
21
+ <img title="Proudly developed by Ocado Group" alt="Ocado Group logo"
22
22
  src="{% static 'portal/img/logo_ocado_group.svg' %}">
23
23
  </a>
24
24
  <span class="material-icons-outlined visible-sm visible-xs" data-toggle="collapse" data-target="#menu-items">
25
25
  menu
26
26
  </span>
27
- </div>
28
- {% if user|is_logged_in %}
29
- <div class="menu__left-side col-md-7">
30
- {% if user|is_logged_in_as_teacher %}
31
- <div class="menu--title">Teacher</div>
32
- {% if user|has_teacher_finished_onboarding %}
33
- <a href="{% url 'dashboard' %}" class="button--menu button--menu--secondary button--menu--enabled">Dashboard</a>
34
- <div class="dropdown">
35
- <a id="games_button"
36
- class="button--menu button--menu--secondary button--menu--enabled">
37
- Games <span class="material-icons-outlined md-32">arrow_drop_down</span></a>
38
- <div class="dropdown-content">
39
- <a href="{% url 'levels' %}"><small>Rapid Router</small></a>
40
- <a href="{% url_for_aimmo_dashboard %}" id="teacher_kurono_dashboard_button"><small>Kurono</small></a>
27
+ <div class="menu__left-side hidden-sm hidden-xs">
28
+ {% if user|is_logged_in %}
29
+ {% if user|is_logged_in_as_teacher %}
30
+ {% if user|has_teacher_finished_onboarding %}
31
+ <a href="{% url 'dashboard' %}" class="button--menu button--menu--secondary button--menu--enabled">Dashboard</a>
32
+ <div class="dropdown">
33
+ <a id="games_button"
34
+ class="button--menu button--menu--secondary button--menu--enabled">
35
+ Games <span class="material-icons-outlined md-32">arrow_drop_down</span></a>
36
+ <div class="dropdown-content">
37
+ <a href="{% url 'levels' %}"><small>Rapid Router</small></a>
38
+ <a href="{% url 'python_levels' %}"><small>Python Den</small></a>
39
+ </div>
41
40
  </div>
42
- </div>
43
- <div class="dropdown">
44
- <a id="teaching_resources_button"
45
- class="button--menu button--menu--secondary button--menu--enabled">
46
- Teaching Resources <span class="material-icons-outlined md-32">arrow_drop_down</span></a>
47
- <div class="dropdown-content">
48
- <a id="rapid_router_resources_button" href="{% url 'teaching_resources' %}">
49
- <small>Rapid Router</small></a>
50
- <a id="kurono_resources_button" href="{% url 'kurono_teaching_resources' %}">
51
- <small>Kurono</small></a>
41
+ <div class="dropdown">
42
+ <a id="teaching_resources_button"
43
+ class="button--menu button--menu--secondary button--menu--enabled">
44
+ Resources <span class="material-icons-outlined md-32">arrow_drop_down</span></a>
45
+ <div class="dropdown-content">
46
+ <a id="rapid_router_resources_button" href="https://code-for-life.gitbook.io/teaching-resources/" target="_blank">
47
+ <small>Rapid Router</small> <span class="iconify" data-icon="mdi:open-in-new"></span></a>
48
+ <a href="https://code-for-life.gitbook.io/python-lessons-with-raspberry-pi-ide/DGiFT28ihVJK7ghZQHqu" target="_blank">
49
+ <small>Python Den</small> <span class="iconify" data-icon="mdi:open-in-new"></span></a>
50
+ <a href="{% url 'codingClub' %}"><small>Coding Clubs</small></a>
51
+ </div>
52
52
  </div>
53
- </div>
54
- {% else %}
55
- <a href="{% url 'onboarding-organisation' %}" class="button--menu button--menu--secondary button--menu--enabled">Dashboard</a>
56
- <a class="button--menu button--menu--secondary button--menu--disabled">Games</a>
57
- <a class="button--menu button--menu--secondary button--menu--disabled">Teaching Resources</a>
58
- {% endif %}
59
- {% else %}
60
- {% if user|is_independent_student %}
61
- <div class="menu--title">Independent</div>
53
+ {% else %}
54
+ <a href="{% url 'onboarding-organisation' %}" class="button--menu button--menu--secondary button--menu--enabled">Dashboard</a>
55
+ <a class="button--menu button--menu--secondary button--menu--disabled">Games</a>
56
+ <a class="button--menu button--menu--secondary button--menu--disabled">Resources</a>
57
+ {% endif %}
62
58
  {% else %}
63
- <div class="menu--title">Student</div>
64
- {% endif %}
65
- <a
66
- {% if user|is_independent_student %}
59
+ <a
60
+ {% if user|is_independent_student %}
67
61
  href="{% url 'independent_student_details' %}"
68
- {% else %}
62
+ {% else %}
69
63
  href="{% url 'student_details' %}"
70
- {% endif %}
71
- id="student_dashboard_button"
72
- class="button--menu button--menu--secondary button--menu--enabled">Dashboard</a>
73
- <div class="dropdown">
74
- <a class="button--menu button--menu--secondary button--menu--enabled">
75
- Games
76
- <span class="material-icons-outlined md-32">arrow_drop_down</span>
77
- </a>
78
- <div class="dropdown-content">
79
- <a href="{% url 'levels' %}"><small>Rapid Router</small></a>
80
- {% if not user|is_independent_student %}
81
- <a href="{% url_for_aimmo_dashboard %}"><small>Kurono</small></a>
82
64
  {% endif %}
83
- </div>
84
- </div>
85
- {% if user|is_logged_in_as_school_user %}
86
- <a href="{% url 'scoreboard' %}" id="student_scoreboards_button"
87
- class="button--menu button--menu--secondary button--menu--enabled">Scoreboard</a>
88
- {% endif %}
89
- <!-- independent student -->
90
- {% if not user.new_student.class_field %}
65
+ id="student_dashboard_button"
66
+ class="button--menu button--menu--secondary button--menu--enabled">Dashboard</a>
91
67
  <div class="dropdown">
92
- <a id="teaching_resources_button"
93
- class="button--menu button--menu--secondary button--menu--enabled">
94
- Learning Resources <span class="material-icons-outlined md-32">arrow_drop_down</span></a>
68
+ <a class="button--menu button--menu--secondary button--menu--enabled">
69
+ Games
70
+ <span class="material-icons-outlined md-32">arrow_drop_down</span>
71
+ </a>
95
72
  <div class="dropdown-content">
96
- <a href="https://code-for-life.gitbook.io/independent-student-resources/" target="_blank">
97
- <small>Rapid Router</small></a>
73
+ <a href="{% url 'levels' %}"><small>Rapid Router</small></a>
74
+ <a href="{% url 'python_levels' %}"><small>Python Den</small></a>
98
75
  </div>
99
76
  </div>
77
+ {% if user|is_logged_in_as_school_user %}
78
+ <a href="{% url 'scoreboard' %}" id="student_scoreboards_button"
79
+ class="button--menu button--menu--secondary button--menu--enabled">Scoreboard</a>
80
+ {% endif %}
81
+ <!-- independent student -->
82
+ {% if not user.new_student.class_field %}
83
+ <div class="dropdown">
84
+ <a id="teaching_resources_button"
85
+ class="button--menu button--menu--secondary button--menu--enabled">
86
+ Resources <span class="material-icons-outlined md-32">arrow_drop_down</span></a>
87
+ <div class="dropdown-content">
88
+ <a href="https://code-for-life.gitbook.io/independent-student-resources/" target="_blank">
89
+ <small>Rapid Router</small><span class="iconify" data-icon="mdi:open-in-new"></span></a>
90
+ <a href="{% url 'codingClub' %}"><small>Coding Clubs</small></a>
91
+ </div>
92
+ </div>
93
+ {% endif %}
100
94
  {% endif %}
101
- {% endif %}
102
- {% else %}
103
- <div class="menu__left-side col-md-5">
95
+ {% else %}
104
96
  <a href="{% url 'teach' %}" class="button--menu button--menu--primary button--menu--enabled">Teachers</a>
105
97
  <a href="{% url 'play' %}" class="button--menu button--menu--primary button--menu--enabled">Students</a>
106
- {% endif %}
98
+ {% endif %}
99
+ </div>
107
100
  </div>
108
101
  {% if user|is_logged_in %}
109
- <div class="menu__right-side col-md-4">
102
+ <div class="menu__right-side">
110
103
  <div class="dropdown header__account-details-dropdown">
111
104
  <button id="logout_menu" class="button--regular button--secondary button--dropdown header__account-details-dropdown"
112
105
  data-toggle="dropdown">
@@ -114,8 +107,7 @@
114
107
  </button>
115
108
  <ul class="dropdown-menu header__account-details-dropdown-menu">
116
109
  <li class="dropdown-menu__option">
117
- <a class="button--regular" id="logout_button" aria-labelledby="Log out"
118
- href="{% url 'logout_view' %}" onclick="deleteAllLocalStorageWorkspaces();">
110
+ <a class="button--regular" id="logout_button" aria-labelledby="Log out" href="{% url 'logout_view' %}">
119
111
  <div class="dropdown-menu__option__text">Log out</div>
120
112
  <span class="material-icons-outlined">logout</span></a>
121
113
  </li>
@@ -123,8 +115,8 @@
123
115
  {% if user|has_teacher_finished_onboarding %}
124
116
  <li class="dropdown-menu__option">
125
117
  {# if the current page is teacher dashboard, trigger a tab change instead #}
126
- <a class="button--regular" aria-labelledby="Update account details"
127
- href="{% url 'dashboard' %}#account" {% if request.resolver_match.view_name == 'dashboard' %}onclick="$('#tab-account').click();"{% endif %}>
118
+ <a class="button--regular" aria-labelledby="Update account details" id="update_account_detail_button"
119
+ href="{% url 'dashboard' %}?account=true#account" {% if request.resolver_match.view_name == 'dashboard' %}onclick="$('#tab-account').click();"{% endif %}>
128
120
  <div class="dropdown-menu__option__text">Update account details</div>
129
121
  <span class="material-icons-outlined">manage_accounts</span></a>
130
122
  </li>
@@ -146,36 +138,36 @@
146
138
  {% endif %}
147
139
  </ul>
148
140
  </div>
149
- {% else %}
150
- <div class="menu__right-side col-md-5">
151
- <a href="{% url 'register' %}" id="signup_button" class="button button--primary button--register register">Register</a>
152
- <div class="dropdown">
153
- <button id="login_dropdown" class="button--regular button--secondary button--header--login button--dropdown"
154
- data-toggle="dropdown">
155
- <div class="dropdown__text">Log in</div>
156
- </button>
157
- <ul class="dropdown-menu header__login-options-dropdown-menu">
158
- <li class="dropdown-menu__option">
159
- <a id="teacher_login_button" class="button--regular" aria-labelledby="Teacher" href="{% url 'teacher_login' %}">
160
- <div class="dropdown-menu__option__text">Teacher</div>
161
- <span class="material-icons-outlined">chevron_right</span>
162
- </a>
163
- </li>
164
- <li class="dropdown-menu__option">
165
- <a id="student_login_button" class="button--regular" aria-labelledby="Student" href="{% url 'student_login_access_code' %}">
166
- <div class="dropdown-menu__option__text">Student</div>
167
- <span class="material-icons-outlined">chevron_right</span>
168
- </a>
169
- </li>
170
- <li class="dropdown-menu__option">
171
- <a id="independent_login_button" class="button--regular" aria-labelledby="Independent" href="{% url 'independent_student_login' %}">
172
- <div class="dropdown-menu__option__text">Independent</div>
173
- <span class="material-icons-outlined">chevron_right</span>
174
- </a>
175
- </li>
176
- </ul>
177
- </div>
178
- {% endif %}
141
+ {% else %}
142
+ <div class="menu__right-side">
143
+ <a href="{% url 'register' %}" id="signup_button" class="button button--primary button--register register">Register for FREE</a>
144
+ <div class="dropdown">
145
+ <button id="login_dropdown" class="button--regular button--secondary button--header--login button--dropdown"
146
+ data-toggle="dropdown">
147
+ <div class="dropdown__text">Log in</div>
148
+ </button>
149
+ <ul class="dropdown-menu header__login-options-dropdown-menu">
150
+ <li class="dropdown-menu__option">
151
+ <a id="teacher_login_button" class="button--regular" aria-labelledby="Teacher" href="{% url 'teacher_login' %}">
152
+ <div class="dropdown-menu__option__text">Teacher</div>
153
+ <span data-nosnippet class="material-icons-outlined">chevron_right</span>
154
+ </a>
155
+ </li>
156
+ <li class="dropdown-menu__option">
157
+ <a id="student_login_button" class="button--regular" aria-labelledby="Student" href="{% url 'student_login_access_code' %}">
158
+ <div class="dropdown-menu__option__text">Student</div>
159
+ <span data-nosnippet class="material-icons-outlined">chevron_right</span>
160
+ </a>
161
+ </li>
162
+ <li class="dropdown-menu__option">
163
+ <a id="independent_login_button" class="button--regular" aria-labelledby="Independent" href="{% url 'independent_student_login' %}">
164
+ <div class="dropdown-menu__option__text">Independent</div>
165
+ <span data-nosnippet class="material-icons-outlined">chevron_right</span>
166
+ </a>
167
+ </li>
168
+ </ul>
169
+ </div>
170
+ {% endif %}
179
171
  </div>
180
172
  </div>
181
173
  <div id="menu-items" class="collapse">
@@ -191,13 +183,15 @@
191
183
  href="{% url 'dashboard' %}">School / Club<span class="material-icons-outlined md-32">chevron_right</span></a>
192
184
  <a class="button button--menu__item button--menu__item__sub"
193
185
  href="{% url 'levels' %}">Rapid Router<span class="material-icons-outlined md-32">chevron_right</span></a>
186
+ <a class="button button--menu__item button--menu__item__sub"
187
+ href="{% url 'python_levels' %}">Python Den<span class="material-icons-outlined md-32">chevron_right</span></a>
194
188
  <button class="button--menu__item button--menu__item__sub
195
189
  button--menu__item--sub-header" data-toggle="collapse" data-target="#resources-tabs">Teaching Resources</button>
196
190
  <div id="resources-tabs" class="collapse">
197
191
  <a class="button button--menu__item button--menu__item__sub__sub"
198
- href="{% url 'teaching_resources' %}">Rapid Router<span class="material-icons-outlined md-32">chevron_right</span></a>
192
+ href="https://code-for-life.gitbook.io/teaching-resources/" target="_blank">Rapid Router<span class="material-icons-outlined md-32">chevron_right</span></a>
199
193
  <a class="button button--menu__item button--menu__item__sub__sub"
200
- href="{% url 'kurono_teaching_resources' %}">Kurono<span class="material-icons-outlined md-32">chevron_right</span></a>
194
+ href="https://code-for-life.gitbook.io/python-lessons-with-raspberry-pi-ide/DGiFT28ihVJK7ghZQHqu" target="_blank">Python Den<span class="material-icons-outlined md-32">chevron_right</span></a>
201
195
  </div>
202
196
  </div>
203
197
  {% else %}
@@ -216,10 +210,8 @@
216
210
  <div id="games-tabs" class="collapse">
217
211
  <a class="button button--menu__item button--menu__item--{% if user|is_independent_student %}independent{% else %}student{% endif %} button--menu__item__sub"
218
212
  href="{% url 'levels' %}">Rapid Router<span class="material-icons-outlined md-32">chevron_right</span></a>
219
- {% if not user|is_independent_student %}
220
- <a class="button button--menu__item button--menu__item--student button--menu__item__sub"
221
- href="{% url_for_aimmo_dashboard %}">Kurono<span class="material-icons-outlined md-32">chevron_right</span></a>
222
- {% endif %}
213
+ <a class="button button--menu__item button--menu__item--{% if user|is_independent_student %}independent{% else %}student{% endif %} button--menu__item__sub"
214
+ href="{% url 'python_levels' %}">Python Den<span class="material-icons-outlined md-32">chevron_right</span></a>
223
215
  </div>
224
216
  {% if user|is_logged_in_as_school_user %}
225
217
  <a class="button button--menu__item button--menu__item--student"
@@ -239,16 +231,16 @@
239
231
  {% endif %}
240
232
  {% else %}
241
233
  <a class="button button--menu__item button--register"
242
- href="{% url 'register' %}">Register now</a>
234
+ href="{% url 'register' %}">Register now for FREE</a>
243
235
  <button class="button--menu__item button--menu__item--sub-header login"
244
236
  data-toggle="collapse" data-target="#login-tabs">Log in</button>
245
237
  <div id="login-tabs" class="collapse">
246
238
  <a class="button button--menu__item button--menu__item__sub"
247
- href="{% url 'teacher_login' %}">Teacher<span class="material-icons-outlined md-32">chevron_right</span></a>
239
+ href="{% url 'teacher_login' %}">Teacher<span data-nosnippet class="material-icons-outlined md-32">chevron_right</span></a>
248
240
  <a class="button button--menu__item button--menu__item__sub"
249
- href="{% url 'student_login_access_code' %}">Student<span class="material-icons-outlined md-32">chevron_right</span></a>
241
+ href="{% url 'student_login_access_code' %}">Student<span data-nosnippet class="material-icons-outlined md-32">chevron_right</span></a>
250
242
  <a class="button button--menu__item button--menu__item__sub"
251
- href="{% url 'independent_student_login' %}">Independent<span class="material-icons-outlined md-32">chevron_right</span></a>
243
+ href="{% url 'independent_student_login' %}">Independent<span data-nosnippet class="material-icons-outlined md-32">chevron_right</span></a>
252
244
  </div>
253
245
  <a class="button button--menu__item" href="{% url 'teach' %}">Teacher
254
246
  <span class="material-icons-outlined md-32">chevron_right</span></a>
@@ -259,9 +251,15 @@
259
251
  <span class="material-icons-outlined md-32">chevron_right</span></a>
260
252
  <a class="button button--menu__item freshdesk__contact-us">Help and support
261
253
  <span class="material-icons-outlined md-32">chevron_right</span></a>
254
+ <a class="button button--menu__item" target="_blank"
255
+ href="https://2662351606-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M_6UDUiGoJDhr_OXetO%2Fuploads%2FHx2kJLPwUER9Ez7gdQFp%2F2023_Impact_Report_Final.pdf?alt=media">
256
+ Impact Report 2023<span class="material-icons-outlined md-32">chevron_right</span></a>
257
+ <a class="button button--menu__item" target="_blank"
258
+ href="https://2662351606-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M_6UDUiGoJDhr_OXetO%2Fuploads%2FzLy8JN9TSFpzunetkWET%2FImpact_Report_24.V.10.pdf?alt=media">
259
+ Impact Report 2024<span class="material-icons-outlined md-32">chevron_right</span></a>
262
260
  <a class="button button--menu__item optanon-toggle-display">Cookie settings
263
261
  <span class="material-icons-outlined md-32">chevron_right</span></a>
264
- <a class="button button--menu__item" href="{% url 'privacy_policy' %}">Privacy policy
262
+ <a class="button button--menu__item" href="{% url 'privacy_notice' %}">Privacy notice
265
263
  <span class="material-icons-outlined md-32">chevron_right</span></a>
266
264
  <a class="button button--menu__item" href="{% url 'terms' %}">Terms of use
267
265
  <span class="material-icons-outlined md-32">chevron_right</span></a>
@@ -269,6 +267,9 @@
269
267
  <span class="material-icons-outlined md-32">chevron_right</span></a>
270
268
  <a class="button button--menu__item" href="{% url 'getinvolved' %}">Get involved
271
269
  <span class="material-icons-outlined md-32">chevron_right</span></a>
270
+ <a class="button button--menu__item" target="_blank"
271
+ href="https://2662351606-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M_6UDUiGoJDhr_OXetO%2Fuploads%2FPavvCifcuUeZZZLkV01C%2FOpportunities%20with%20Code%20for%20Life.pdf?alt=media">Opportunities with CFL
272
+ <span class="material-icons-outlined md-32">chevron_right</span></a>
272
273
  {% if user|is_logged_in %}
273
274
  {% if user|is_logged_in_as_teacher %}
274
275
  {% if user|has_teacher_finished_onboarding %}
@@ -1,13 +1,14 @@
1
- {% load staticfiles %}
1
+ {% load static %}
2
2
  {% load app_tags %}
3
3
 
4
- <div class="card">
4
+ <div class="card activated-card">
5
+ <div class="activated-text">Activated</div>
5
6
  <img class="card__image" src="{{ image | cloud_storage }}">
6
7
  <div class="card__text">
7
8
  <h4 class="card__title">{{ title }}</h4>
8
9
  <p>{{ description }}</p>
9
10
  <div class="button-group button-group__icon">
10
- <a target="_blank" href="{{ button1.url }}" class="button button--primary button--icon">
11
+ <a target="_blank" href="{{ button1.url }}" class="button button--secondary button--secondary--dark button--icon">
11
12
  {{ button1.text }}<span class="iconify" data-icon="mdi:open-in-new"></span>
12
13
  </a>
13
14
  <a href="{% url button2.url id=button2.url_args %}" class="button button--primary button-right-arrow">
@@ -1,13 +1,13 @@
1
- {% load staticfiles %}
1
+ {% load static %}
2
2
  {# An info popup with a close button in the top-right corner. #}
3
3
  <section id="info-popup" class="popup-wrapper">
4
4
  <div class="popup-box">
5
5
  <div class="popup-box__title justify-content-end">
6
- <button type="button" onclick="hideInfoPopup()" class="close m-0" aria-label="Close" style="min-width:0;">
6
+ <button type="button" onclick="hideInfoPopup()" class="close popup-box__close" aria-label="Close">
7
7
  <span class="iconify" data-icon="mdi:close"></span>
8
8
  </button>
9
9
  </div>
10
- <div class="popup-box__title pt-0"><h5 class="mt-1"></h5></div>
10
+ <div class="popup-box__title"><h5 class="mt-1"></h5></div>
11
11
  <div class="popup-box__msg"></div>
12
12
  </div>
13
13
  </section>
@@ -0,0 +1,23 @@
1
+ {# A popup for inviting teacher as admin #}
2
+ <section id="popup-make-admin-teacher" class="popup-wrapper">
3
+ <div class="popup-box">
4
+ <div>
5
+ <button class="close popup-box__close" type="button" id="close_popup_button" onclick="hideMakeAdminTeacherPopup()" aria-label="Close">
6
+ <span class="iconify" data-icon="mdi:close"></span>
7
+ </button>
8
+ </div>
9
+ <div class="popup-box__title">Assigning admin permissions</div>
10
+ <div class="popup-box__msg mt-4">
11
+ <p>You are about to add admin permissions to another teacher's account.
12
+ Teachers with admin permissions will have the same permissions as you.
13
+ </p>
14
+ <p class="my-4"><strong>Do you wish to proceed?</strong></p>
15
+ <p><strong class="text-danger">Accepting means you understand class data will be shared.</strong></p>
16
+ </div>
17
+ <div class="popup-box__buttons justify-content-center">
18
+ <a id="cancel_admin_popup_button" class="button button--primary" onclick="hideMakeAdminTeacherPopup()" aria-labelledby="cancel_admin_popup_button">Cancel</a>
19
+ <a id="add_admin_button" class="button button--primary button--primary--danger button--icon" onclick="" aria-labelledby="add_admin_button">
20
+ Add as admin <span class="iconify" data-icon="mdi:add"></span></a>
21
+ </div>
22
+ </div>
23
+ </section>
@@ -1,8 +1,13 @@
1
- {% load staticfiles %}
1
+ {% load static %}
2
2
  {# A confirmation popup with Cancel and Confirm buttons. #}
3
3
  <section id="popup" class="popup-wrapper">
4
4
  <div class="popup-box">
5
- <div class="popup-box__title"><h3></h3></div>
5
+ <div>
6
+ <button type="button" onclick="hidePopupConfirmation()" class="close popup-box__close" aria-label="Close">
7
+ <span class="iconify" data-icon="mdi:close"></span>
8
+ </button>
9
+ </div>
10
+ <div class="popup-box__title"></div>
6
11
  <div class="popup-box__msg"></div>
7
12
  <div class="popup-box__buttons">
8
13
  <a id="cancel_button" class="button button--small button--secondary button--secondary--dark" onclick="hidePopupConfirmation()" aria-labelledby="cancel_button"> Cancel </a>
@@ -2,8 +2,5 @@
2
2
  <div class="form__checkbox-input">
3
3
  {{ newsletter_ticked }}
4
4
  </div>
5
- <p class="semi-bold">
6
- Please confirm that you are happy for us to send you emails in the future. You can view our
7
- <a href="{% url 'terms' %}">privacy policy</a> for more information.
8
- </p>
9
- </div>
5
+ <p class="semi-bold">Sign up to receive updates about Code for Life games and teaching resources.</p>
6
+ </div>
@@ -0,0 +1,14 @@
1
+ {% load static %}
2
+ {# A screen-time warning popup with a Continue button. #}
3
+ <section id="screentime-popup" class="popup-wrapper text-center">
4
+ <div class="popup-box">
5
+ <div class="popup-box__title flex-column justify-content-center">
6
+ <div><img width="100" src="{% static 'common/img/brain.svg' %}"/></div>
7
+ <div class="my-4">Time for a break?</div>
8
+ </div>
9
+ <div class="popup-box__msg">You have been using the Code for Life website for a while. Remember to take regular screen breaks to recharge those brain cells!</div>
10
+ <div class="popup-box__buttons mt-0">
11
+ <a id="screentime_continue_button" class='button button--primary' onclick="hideScreentimePopup()" aria-labelledby="screentime_continue_button"> Continue </a>
12
+ </div>
13
+ </div>
14
+ </section>
@@ -0,0 +1,17 @@
1
+ {% load static %}
2
+ {# A screen-time warning popup with a Continue button. #}
3
+ <section id="service-unavailable-popup" class="popup-wrapper">
4
+ <div class="popup-box">
5
+ <div class="popup-box__title flex-column justify-content-center">
6
+ <div class="popup-box__title">
7
+ <h5 class="mt-1"></h5>
8
+ </div>
9
+ <div class="popup-box__msg"></div>
10
+ <div class="popup-box__buttons mt-0">
11
+ <a id="screentime_continue_button"
12
+ class='button button--primary'
13
+ onclick="hideServiceUnavailable()"
14
+ aria-labelledby="screentime_continue_button">Confirm</a>
15
+ </div>
16
+ </div>
17
+ </section>
@@ -0,0 +1,19 @@
1
+ {% load static %}
2
+ {# A session expiry warning popup with a "Wait, I'm still here!" button. #}
3
+ <section id="session-popup" class="popup-wrapper text-center">
4
+ <div class="popup-box">
5
+ <div class="popup-box__title d-flex justify-content-center">
6
+ <h4>Where did you go? 👀</h4>
7
+ </div>
8
+ <p class="popup-box__msg">We noticed that you have been inactive for a while. Are you still there? For your
9
+ online safety we will log you out in:</p>
10
+ <div class="d-flex justify-content-center">
11
+ <h4><span id="minutes">2</span> min <span id="seconds">00</span> secs</h4>
12
+ </div>
13
+ <p class="popup-box__msg">You may lose progress unless you continue or save.</p>
14
+ <div class="popup-box__buttons mt-0">
15
+ <a id="session_continue_button" class="button button--primary" onclick="hideSessionPopup()"
16
+ aria-labelledby="session_continue_button">Wait, I'm still here!</a>
17
+ </div>
18
+ </div>
19
+ </section>