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
@@ -3,9 +3,15 @@
3
3
  {% load app_tags %}
4
4
 
5
5
  {% block subNav %}
6
+ {% if user|is_independent_student %}
7
+ <section class="banner banner--independent-student row mx-0">
8
+ {% else %}
6
9
  <section class="banner banner--student row mx-0">
10
+ {% endif %}
7
11
  <div>
8
- <h1 class="banner__text--primary">Welcome, {{ user|make_into_username }}</h1>
12
+ <h1 class="banner__text--primary">
13
+ Welcome, {{ user|make_into_username }}
14
+ </h1>
9
15
  <h4>This is where you can access your games</h4>
10
16
  </div>
11
17
  </section>
@@ -14,31 +20,39 @@
14
20
  {% block content %}
15
21
  <div id="play_dashboard_page">
16
22
  <div class="background container">
17
- <section><h4>Your class games</h4></section>
23
+ <section><h4>Your games</h4></section>
18
24
  <div class="grid-games col-center col-sm-9">
19
25
  <div class="card">
20
26
  <div class="card__images">
21
- <img title="Rapid Router" alt="Rapid Router" class="card__image" src="{% static 'portal/img/RR_logo_green.svg' %}">
27
+ <img title="Rapid Router" alt="Rapid Router"
28
+ class="card__image"
29
+ src="{% static 'portal/img/RR_logo_grass_background.png' %}">
22
30
  </div>
23
31
  <div class="card__text">
24
32
  <h5 class="card__title">Rapid Router</h5>
25
- <p>Rapid Router guides you, and makes learning to code easy and great fun. Using Blockly, you can
26
- advance through the levels to become an Ocado delivery hero.</p>
33
+ <p>Rapid Router guides you, and makes learning to code easy
34
+ and great fun. Using Blockly, you can advance through
35
+ the levels to become an Ocado delivery hero.</p>
27
36
  <div class="button-group">
28
- <a href="{% url 'levels'%}" class="button button--primary">Play</a>
37
+ <a href="{% url 'levels'%}"
38
+ class="button button--primary">Play</a>
29
39
  </div>
30
40
  </div>
31
41
  </div>
32
42
  <div class="card">
33
43
  <div class="card__images">
34
- <img title="Kurono" alt="Kurono" class="card__image" src="{% static 'portal/img/kurono_logo_grey_background.svg' %}">
44
+ <img title="Python Den" alt="Python Den"
45
+ class="card__image"
46
+ src="{% static 'portal/img/python_den.png' %}">
35
47
  </div>
36
48
  <div class="card__text">
37
- <h5 class="card__title">Kurono</h5>
38
- <p>It is the year 2405 and the museum is in big trouble! The priceless artifacts are lost and scattered
39
- across timelines. Your team&rsquo;s mission is to travel through time and bring them back into the museum.</p>
49
+ <h5 class="card__title">Python Den</h5>
50
+ <p>The Python Den takes you on a programming journey from
51
+ beginner to syntax superhero. Build a good solid
52
+ foundation of Python to start your coding career!</p>
40
53
  <div class="button-group">
41
- <a href="{% url 'student_aimmo_dashboard' %}" class="button button--primary">Play</a>
54
+ <a href="{% url 'python_levels'%}"
55
+ class="button button--primary">Play</a>
42
56
  </div>
43
57
  </div>
44
58
  </div>
@@ -48,31 +62,30 @@
48
62
  <div class="container">
49
63
  <div class="text-center">
50
64
  <section><img title="Rapid Router logo" alt="Rapid Router logo" src="{% static 'portal/img/RR_logo_simple.png' %}"></section>
51
- <h4>You have completed {{ num_completed }} Rapid Router level{{ num_completed|pluralize }}!</h4>
52
- <h4>You have {{ num_top_scores }} top score{{ num_top_scores|pluralize }}!</h4>
53
- <h4>You have a score of {{ total_score }}. There are {{ total_available_score }} available points.</h4>
54
- {% if total_custom_available_score %}
55
- <h4>You have a score of {{ total_custom_score }} out of {{ total_custom_available_score }} available points on custom levels.</h4>
65
+ <h4>You have completed {{ rapid_router.num_completed }} Rapid Router level{{ rapid_router.num_completed|pluralize }}!</h4>
66
+ <h4>You have {{ rapid_router.num_top_scores }} top score{{ rapid_router.num_top_scores|pluralize }}!</h4>
67
+ <h4>You have a score of {{ rapid_router.total_score }}. There are {{ rapid_router.total_available_score }} available points.</h4>
68
+ {% if rapid_router.total_custom_available_score %}
69
+ <h4>You have a score of {{ rapid_router.total_custom_score }} out of {{ rapid_router.total_custom_available_score }} available points on custom levels.</h4>
56
70
  {% endif %}
57
71
  <section>
58
- <a href="{% url 'scoreboard' %}" class="button button--primary button-right-arrow">Check scoreboard</a>
72
+ <a href="{% url 'scoreboard' %}"
73
+ class="button button--primary button-right-arrow">
74
+ Check scoreboard
75
+ </a>
59
76
  </section>
60
77
  </div>
61
78
  </div>
62
79
  </div>
63
- <div class="background container">
64
- <section>
65
- <div class="row">
66
- <img title="Kurono logo" alt="Kurono logo" class="col-xs-offset-3 col-sm-offset-4 col-xs-6 col-sm-4"
67
- src="{% static 'portal/img/kurono_logo.svg' %}">
80
+ <div class="background background--python-den">
81
+ <div class="container">
82
+ <div class="text-center">
83
+ <section><img title="Python Den logo" alt="Python Den logo" src="{% static 'portal/img/logo_python_den.svg' %}"></section>
84
+ <h4>You have completed {{ python_den.num_completed }} Python Den level{{ python_den.num_completed|pluralize }}!</h4>
85
+ <h4>You have {{ python_den.num_top_scores }} top score{{ python_den.num_top_scores|pluralize }}!</h4>
86
+ <h4>You have a score of {{ python_den.total_score }}. There are {{ python_den.total_available_score }} available points.</h4>
68
87
  </div>
69
- {% if worksheet_id %}
70
- <h4>You are exploring Challenge {{ worksheet_id }} with your class!</h4>
71
- <img class="col-center col-sm-9" title="Kurono active game" alt="Kurono active game" src="{{ worksheet_image | cloud_storage }}">
72
- {% else %}
73
- <h4>You do not have any Kurono games yet.</h4>
74
- {% endif %}
75
- </section>
88
+ </div>
76
89
  </div>
77
90
  </div>
78
91
  {% endblock %}
@@ -14,7 +14,23 @@
14
14
  </section>
15
15
  {% endblock subNav %}
16
16
 
17
+ {% block scripts %}
18
+ {{ block.super }}
19
+ <script type="text/javascript" src="{% static 'portal/js/organisation_manage.js' %}"></script>
20
+ <script type="text/javascript" src="{% static 'portal/js/passwordStrength.js' %}"></script>
21
+ <script>
22
+ var INDEP_STUDENT_PASSWORD_FIELD_ID = '{{ form.password.auto_id }}';
23
+ </script>
24
+ <script>
25
+ {% if delete_account_confirm %}
26
+ showDeleteAccountConfirmation("{{ delete_account_form.delete_password.value }}", "{{ delete_account_form.unsubscribe_newsletter.value }}", false)
27
+ {% endif %}
28
+ </script>
29
+ {% endblock scripts %}
30
+
17
31
  {% block content %}
32
+ {% include "portal/partials/delete_popup.html" %}
33
+
18
34
  <div id="play_account_page"></div>
19
35
  <div class="background container">
20
36
  <section><h4>
@@ -26,7 +42,7 @@
26
42
  </h4></section>
27
43
 
28
44
  {% if user.new_student.class_field %}
29
- <p>You may edit your password below. It must be long enough and hard enough to stop your friends guessing it and
45
+ <p>You may edit your password below. It must be long enough and hard enough to stop your friends guessing it and
30
46
  stealing all of your hard work. Choose something memorable though.</p>
31
47
  <p>If you have any problems, ask a teacher to help you.</p>
32
48
  {% else %}
@@ -35,7 +51,7 @@
35
51
  Please ensure your password is strong enough to be secure.</p>
36
52
  {% endif %}
37
53
 
38
- <form id="student_account_form" method="post">
54
+ <form autocomplete="off" id="student_account_form" method="post">
39
55
  {% csrf_token %}
40
56
  {{ form.non_field_errors }}
41
57
 
@@ -64,20 +80,23 @@
64
80
  <div class="form--row__input col-md-4">
65
81
  <div class="input--icon">
66
82
  {{ form.password }}
67
- <span class="iconify" data-icon="mdi:security"></span>
83
+ <span id="password-field-icon" class="iconify" data-icon="material-symbols:visibility-off"></span>
68
84
  </div>
69
85
  <small>{{ form.password.help_text }}</small>
70
86
  {{ form.password.errors }}
71
87
  </div>
72
88
  <div class="form--row__input col-md-4">
73
- {{ form.confirm_password }}
89
+ <div class="input--icon">
90
+ {{ form.confirm_password }}
91
+ <span id="confirm-password-field-icon" class="iconify" data-icon="material-symbols:visibility-off"></span>
92
+ </div>
74
93
  <small>{{ form.confirm_password.help_text }}</small>
75
94
  {{ form.confirm_password.errors }}
76
95
  </div>
77
96
  <div class="form--row__input col-md-4">
78
97
  <div class="input--icon">
79
98
  {{ form.current_password }}
80
- <span class="iconify" data-icon="mdi:security"></span>
99
+ <span id="current-password-field-icon" class="iconify" data-icon="material-symbols:visibility-off"></span>
81
100
  </div>
82
101
  <small>{{ form.current_password.help_text }}</small>
83
102
  {{ form.current_password.errors }}
@@ -113,11 +132,47 @@
113
132
  <a class="button button--primary" href="{% url 'student_join_organisation' %}">Join</a>
114
133
  </div>
115
134
  </div>
135
+ <div id="delete-indy-account" class="background">
136
+ <div class="container">
137
+ <h5>Delete account</h5>
138
+ <p>If you no longer wish to have a Code for Life account, you can delete it by confirming below.
139
+ You will receive an email to confirm this decision.
140
+ </p>
141
+ <p><b>This can't be reversed.</b>
142
+ </p>
143
+
144
+ <form autocomplete="off" method="post" id="form-delete-indy-account">
145
+
146
+ {% csrf_token %}
147
+
148
+ {{ delete_account_form.non_field_errors }}
149
+
150
+ <div class="row form--row">
151
+ <div class="form--row__input col-sm-6 col-md-4">
152
+ <div class="input--icon">
153
+ {{ delete_account_form.delete_password }}
154
+ <span id="delete-password-field-icon" class="iconify" data-icon="material-symbols:visibility-off"></span>
155
+ </div>
156
+ <small>{{ delete_account_form.delete_password.help_text }}</small>
157
+ {{ delete_account_form.delete_password.errors }}
158
+ </div>
159
+ <div class="form--row__input col-sm-6 col-md-8">
160
+ <div class="form__checkbox">
161
+ <div class="form__checkbox-input">
162
+ {{ delete_account_form.unsubscribe_newsletter }}
163
+ </div>
164
+ <label for="id_{{ delete_account_form.unsubscribe_newsletter.html_name }}">{{ delete_account_form.unsubscribe_newsletter.label }}</label>
165
+ </div>
166
+ {{ delete_account_form.unsubscribe_newsletter.errors }}
167
+ </div>
168
+ </div>
169
+ <button id="delete_account_button" class="button button--primary button--primary--danger button--icon" name="delete_account">
170
+ Delete account <span class="iconify" data-icon="mdi:delete-outline"></span>
171
+ </button>
172
+ </form>
173
+ </div>
174
+ </div>
116
175
  {% endif %}
117
176
 
118
- <script type="text/javascript" src="{% static 'portal/js/passwordStrength.js' %}"></script>
119
- <script>
120
- var INDEP_STUDENT_PASSWORD_FIELD_ID = '{{ form.password.auto_id }}';
121
- </script>
122
177
 
123
178
  {% endblock %}
@@ -1,7 +1,6 @@
1
1
  {% extends 'portal/base.html' %}
2
2
  {% load static %}
3
- {% load staticfiles %}
4
- {% load app_tags banner_tags headline_tags character_list_tags %}
3
+ {% load app_tags banner_tags headline_tags %}
5
4
 
6
5
  {% block subNav %}
7
6
  {% banner banner_name="BANNER" %}
@@ -15,35 +14,41 @@
15
14
 
16
15
  <div class="background container">
17
16
  <section class="banner--rapid-router">
18
- <img title="Rapid Router logo" alt="Rapid Router logo" src="{% static 'common/img/RR_logo.svg' %}">
17
+ <img title="Rapid Router logo"
18
+ alt="Banner image of Rapid Router logo and game"
19
+ src="{% static 'common/img/RR_logo.svg' %}">
19
20
  </section>
20
21
  <div class="background row d-flex">
21
22
  <div class="col-sm-6 d-flex flex-column">
22
23
  <div class="flex-grow-1">
23
24
  <h5 class="mt-0">Starting with Blockly</h5>
24
- <p>Starting with Blockly, you can learn to become a coding superhero, amaze your friends with your high
25
- scores. Create levels for your friends and compete for the most coins.</p>
25
+ <p>Starting with Blockly, you can learn to become a coding
26
+ superhero, amaze your friends with your high scores. Create
27
+ levels for your friends and compete for the most coins.</p>
26
28
  <p>If you are not part of a school, you can <a href="{% url 'register' %}">register here</a>.</p>
27
29
  </div>
28
30
  <div class="row my-4">
29
31
  <div class="col-sm-12">
30
- <a href="https://docs.codeforlife.education/rapid-router/blockly-guide" class="button button--primary button--icon col-sm-8" target="_blank">
32
+ <a href="https://code-for-life.gitbook.io/rapid-router/blockly-guide"
33
+ class="button button--primary button--icon col-sm-8"
34
+ target="_blank">
31
35
  Learn more about Blockly<span class="iconify" data-icon="mdi:open-in-new"></span></a>
32
36
  </div>
33
37
  </div>
34
38
  <div class="row">
35
39
  <div class="col-sm-12">
36
- <a href="{% url 'levels' %}" class="button button--primary button--icon col-sm-8">
37
- Play Rapid Router <span class="iconify" data-icon="mdi:chevron-right"></span></a>
40
+ <a href="{% url 'levels' %}"
41
+ class="button button--primary button--icon col-sm-8">
42
+ Try Rapid Router <span class="iconify" data-icon="mdi:chevron-right"></span></a>
38
43
  </div>
39
44
  </div>
40
45
  </div>
41
46
  <div class="col-sm-6">
42
- <img src="{% static 'portal/img/thumbnail_play_rapid_router.png' %}">
43
- <!-- TODO: to add the video, replace the link below and uncomment
44
- <a href="https://www.youtube-nocookie.com/embed/PQFyF3R6Xts?rel=0&amp;autoplay=1" class="youtube">
45
- <img title="Watch Video" alt="Watch Video" src="{% static 'portal/img/thumbnail_intro_rr.jpg' %}">
46
- </a> -->
47
+ <a href="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FdCZE3FuBgH5fHsGocKGv%2Fuploads%2FSEr3nRjqHATuyL3c4Zdt%2FCode%20for%20Life%20-%20Rapid%20Router%20for%20students.mp4?alt=media"
48
+ class="youtube">
49
+ <img src="{% static 'portal/img/thumbnail_play_rapid_router.png' %}"
50
+ alt="Image of Rapid Router game with try button in bottom right corner">
51
+ </a>
47
52
  </div>
48
53
  </div>
49
54
  </div>
@@ -52,59 +57,74 @@
52
57
  <h4>Meet the characters</h4>
53
58
  <div class="container image-row text-left">
54
59
  <div>
55
- <img title="Wes" alt="Wes image" src="{% static 'portal/img/wes.png' %}">
60
+ <img title="Wes" alt="Illustration of Wes"
61
+ src="{% static 'portal/img/wes.png' %}">
56
62
  <h5>Wes</h5>
57
- <p>Wes is as cunning as a fox, which is weird, because he's actually a wolf.</p>
63
+ <p>Wes is as cunning as a fox, which is weird, because he's actually
64
+ a wolf.</p>
58
65
  </div>
59
66
  <div>
60
- <img title="Kirsty" alt="Kirsty image" src="{% static 'portal/img/kirsty.png' %}">
67
+ <img title="Kirsty" alt="Illustration of Kirsty"
68
+ src="{% static 'portal/img/kirsty.png' %}">
61
69
  <h5>Kirsty</h5>
62
- <p>Kirsty is a girl with big ambitions. Her biggest ambition is to take the crown, and rule the world!</p>
70
+ <p>Kirsty is a girl with big ambitions. Her biggest ambition is to
71
+ take the crown, and rule the world!</p>
63
72
  </div>
64
73
  <div>
65
- <img title="Dee" alt="Dee image" src="{% static 'portal/img/dee.png' %}">
74
+ <img title="Dee" alt="Illustration of Dee"
75
+ src="{% static 'portal/img/dee.png' %}">
66
76
  <h5>Dee</h5>
67
- <p>Dee is a Mark II DeliviBot. She's super friendly and her wire hair sparks when she laughs.</p>
77
+ <p>Dee is a Mark II DeliviBot. She's super friendly and her wire
78
+ hair sparks when she laughs.</p>
68
79
  </div>
69
80
  <div>
70
- <img title="Nigel" alt="Nigel image" src="{% static 'portal/img/nigel.png' %}">
81
+ <img title="Nigel" alt="Illustration of Nigel"
82
+ src="{% static 'portal/img/nigel.png' %}">
71
83
  <h5>Nigel</h5>
72
- <p>Nigel is the tallest kid in his class, and he's growing taller by the day.</p>
84
+ <p>Nigel is the tallest kid in his class, and he's growing taller by
85
+ the day.</p>
73
86
  </div>
74
87
  <div>
75
- <img title="Phil" alt="Phil image" src="{% static 'portal/img/phil.png' %}">
88
+ <img title="Phil" alt="Illustration of Phil"
89
+ src="{% static 'portal/img/phil.png' %}">
76
90
  <h5>Phil</h5>
77
- <p>Phil is a Boarsnark, however, he is different to most Boarsnarks because he's very kind, and very gentle.</p>
91
+ <p>Phil is a Boarsnark, however, he is different to most Boarsnarks
92
+ because he's very kind, and very gentle.</p>
78
93
  </div>
79
94
  </div>
80
95
  </section>
81
96
 
82
97
  <div class="background container">
83
- <section class="banner--aimmo">
84
- <img title="Kurono logo" alt="Kurono logo" src="{% static 'portal/img/kurono_logo.svg' %}">
98
+ <section>
99
+ <img title="Python Den logo"
100
+ alt="Banner image of Python Den logo and game"
101
+ src="{% static 'portal/img/python_den_banner.svg' %}">
85
102
  </section>
86
103
  <div class="background row d-flex">
104
+ <div class="col-sm-6">
105
+ <img src="{% static 'portal/img/python_den.png' %}"
106
+ alt="Python Den logo and characters">
107
+ </div>
87
108
  <div class="col-sm-6 d-flex flex-column">
88
109
  <div class="flex-grow-1">
89
- <h5 class="mt-0">Progressing to Python</h5>
90
- <p>Kurono guides you and makes learning to code great fun.</p>
91
- <p>Using Python, you can travel with your classmates through time to collect all the museum artefacts.</p>
92
- <p>Ask your teacher or tutor to <a href="{% url 'register' %}">register</a>.</p>
110
+ <h5 class="mt-0">Python programming</h5>
111
+ <p>The Python Den is an exploration of Python programming
112
+ through a comprehensive course with free lesson plans,
113
+ videos and worksheets to support you in your learning.</p>
114
+ <p>From foundational syntax to advanced concepts like loops
115
+ and data manipulation, each session is a new challenge.</p>
116
+ <p>We aim to provide a tried-and-tested, structured set of
117
+ lessons that you can use at home or in class, no matter
118
+ your own level of experience.</p>
93
119
  </div>
94
- <div>
95
- <a href="{% url 'student_login_access_code' %}" class="button button--primary button-right-arrow" >Login to get started</a>
120
+ <div class="row my-4">
121
+ <div class="col-sm-12">
122
+ <a href="{% url 'python_levels' %}"
123
+ class="button button--primary button--icon col-sm-8">
124
+ Try Python Den <span class="iconify" data-icon="mdi:chevron-right"></span></a>
125
+ </div>
96
126
  </div>
97
127
  </div>
98
- <div class="col-sm-6">
99
- <img src="{% static 'portal/img/thumbnail_play_kurono.png' %}">
100
- </div>
101
- </div>
102
- </div>
103
-
104
- <div class="background background--primary">
105
- <div class="container">
106
- <h4 class="text-center">Meet the characters</h4>
107
- {% character_list %}
108
128
  </div>
109
129
  </div>
110
130