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
@@ -8,291 +8,290 @@
8
8
  /* Universal module definition */
9
9
 
10
10
  (function (root, factory) {
11
- if (typeof define === 'function' && define.amd) {
12
- // AMD
13
- define([], factory);
14
- } else if (typeof module === 'object' && module.exports) {
15
- // CommonJS
16
- module.exports = factory();
17
- } else {
18
- // Browser global
19
- root.riveted = factory();
20
- }
11
+ if (typeof define === 'function' && define.amd) {
12
+ // AMD
13
+ define([], factory);
14
+ } else if (typeof module === 'object' && module.exports) {
15
+ // CommonJS
16
+ module.exports = factory();
17
+ } else {
18
+ // Browser global
19
+ root.riveted = factory();
20
+ }
21
21
  }(this, function () {
22
22
 
23
- /* Riveted */
24
-
25
- var riveted = (function() {
26
-
27
- var started = false,
28
- stopped = false,
29
- turnedOff = false,
30
- clockTime = 0,
31
- startTime = new Date(),
32
- clockTimer = null,
33
- idleTimer = null,
34
- sendEvent,
35
- sendUserTiming,
36
- reportInterval,
37
- idleTimeout,
38
- nonInteraction,
39
- universalGA,
40
- classicGA,
41
- universalSendCommand,
42
- googleTagManager,
43
- gaGlobal;
44
-
45
- function init(options) {
46
-
47
- // Set up options and defaults
48
- options = options || {};
49
- reportInterval = parseInt(options.reportInterval, 10) || 5;
50
- idleTimeout = parseInt(options.idleTimeout, 10) || 30;
51
- gaGlobal = options.gaGlobal || 'ga';
52
-
53
- /*
54
- * Determine which version of GA is being used
55
- * "ga", "_gaq", and "dataLayer" are the possible globals
56
- */
57
-
58
- if (typeof window[gaGlobal] === "function") {
59
- universalGA = true;
60
- }
61
-
62
- if (typeof _gaq !== "undefined" && typeof _gaq.push === "function") {
63
- classicGA = true;
64
- }
65
-
66
- if (typeof dataLayer !== "undefined" && typeof dataLayer.push === "function") {
67
- googleTagManager = true;
68
- }
69
-
70
- if ('gaTracker' in options && typeof options.gaTracker === 'string') {
71
- universalSendCommand = options.gaTracker + '.send';
72
- } else {
73
- universalSendCommand = 'send';
74
- }
75
-
76
- if (typeof options.eventHandler == 'function') {
77
- sendEvent = options.eventHandler;
78
- }
79
-
80
- if (typeof options.userTimingHandler == 'function') {
81
- sendUserTiming = options.userTimingHandler;
82
- }
83
-
84
- if ('nonInteraction' in options && (options.nonInteraction === false || options.nonInteraction === 'false')) {
85
- nonInteraction = false;
86
- } else {
87
- nonInteraction = true;
88
- }
89
-
90
- // Basic activity event listeners
91
- addListener(document, 'keydown', trigger);
92
- addListener(document, 'click', trigger);
93
- addListener(window, 'mousemove', throttle(trigger, 500));
94
- addListener(window, 'scroll', throttle(trigger, 500));
95
-
96
- // Page visibility listeners
97
- addListener(document, 'visibilitychange', visibilityChange);
98
- addListener(document, 'webkitvisibilitychange', visibilityChange);
99
- }
23
+ /* Riveted */
24
+
25
+ var riveted = (function() {
26
+
27
+ var started = false,
28
+ stopped = false,
29
+ turnedOff = false,
30
+ clockTime = 0,
31
+ startTime = new Date(),
32
+ clockTimer = null,
33
+ idleTimer = null,
34
+ sendEvent,
35
+ sendUserTiming,
36
+ reportInterval,
37
+ idleTimeout,
38
+ nonInteraction,
39
+ universalGA,
40
+ classicGA,
41
+ universalSendCommand,
42
+ googleTagManager,
43
+ gaGlobal;
44
+
45
+ function init(options) {
46
+
47
+ // Set up options and defaults
48
+ options = options || {};
49
+ reportInterval = parseInt(options.reportInterval, 10) || 5;
50
+ idleTimeout = parseInt(options.idleTimeout, 10) || 30;
51
+ gaGlobal = options.gaGlobal || 'ga';
52
+
53
+ /*
54
+ * Determine which version of GA is being used
55
+ * "ga", "_gaq", and "dataLayer" are the possible globals
56
+ */
57
+
58
+ if (typeof window[gaGlobal] === "function") {
59
+ universalGA = true;
60
+ }
61
+
62
+ if (typeof _gaq !== "undefined" && typeof _gaq.push === "function") {
63
+ classicGA = true;
64
+ }
65
+
66
+ if (typeof dataLayer !== "undefined" && typeof dataLayer.push === "function") {
67
+ googleTagManager = true;
68
+ }
69
+
70
+ if ('gaTracker' in options && typeof options.gaTracker === 'string') {
71
+ universalSendCommand = options.gaTracker + '.send';
72
+ } else {
73
+ universalSendCommand = 'send';
74
+ }
75
+
76
+ if (typeof options.eventHandler == 'function') {
77
+ sendEvent = options.eventHandler;
78
+ }
79
+
80
+ if (typeof options.userTimingHandler == 'function') {
81
+ sendUserTiming = options.userTimingHandler;
82
+ }
83
+
84
+ if ('nonInteraction' in options && (options.nonInteraction === false || options.nonInteraction === 'false')) {
85
+ nonInteraction = false;
86
+ } else {
87
+ nonInteraction = true;
88
+ }
89
+
90
+ // Basic activity event listeners
91
+ addListener(document, 'keydown', trigger);
92
+ addListener(document, 'click', trigger);
93
+ addListener(window, 'mousemove', throttle(trigger, 500));
94
+ addListener(window, 'scroll', throttle(trigger, 500));
95
+
96
+ // Page visibility listeners
97
+ addListener(document, 'visibilitychange', visibilityChange);
98
+ addListener(document, 'webkitvisibilitychange', visibilityChange);
99
+ }
100
100
 
101
101
 
102
- /*
103
- * Throttle function borrowed from:
104
- * Underscore.js 1.5.2
105
- * http://underscorejs.org
106
- * (c) 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
107
- * Underscore may be freely distributed under the MIT license.
108
- */
109
-
110
- function throttle(func, wait) {
111
- var context, args, result;
112
- var timeout = null;
113
- var previous = 0;
114
- var later = function() {
115
- previous = new Date;
116
- timeout = null;
117
- result = func.apply(context, args);
118
- };
119
- return function() {
120
- var now = new Date;
121
- if (!previous) previous = now;
122
- var remaining = wait - (now - previous);
123
- context = this;
124
- args = arguments;
125
- if (remaining <= 0) {
126
- clearTimeout(timeout);
127
- timeout = null;
128
- previous = now;
129
- result = func.apply(context, args);
130
- } else if (!timeout) {
131
- timeout = setTimeout(later, remaining);
102
+ /*
103
+ * Throttle function borrowed from:
104
+ * Underscore.js 1.5.2
105
+ * http://underscorejs.org
106
+ * (c) 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
107
+ * Underscore may be freely distributed under the MIT license.
108
+ */
109
+
110
+ function throttle(func, wait) {
111
+ var context, args, result;
112
+ var timeout = null;
113
+ var previous = 0;
114
+ var later = function() {
115
+ previous = new Date;
116
+ timeout = null;
117
+ result = func.apply(context, args);
118
+ };
119
+ return function() {
120
+ var now = new Date;
121
+ if (!previous) previous = now;
122
+ var remaining = wait - (now - previous);
123
+ context = this;
124
+ args = arguments;
125
+ if (remaining <= 0) {
126
+ clearTimeout(timeout);
127
+ timeout = null;
128
+ previous = now;
129
+ result = func.apply(context, args);
130
+ } else if (!timeout) {
131
+ timeout = setTimeout(later, remaining);
132
+ }
133
+ return result;
134
+ };
132
135
  }
133
- return result;
134
- };
135
- }
136
136
 
137
- /*
138
- * Cross-browser event listening
139
- */
140
-
141
- function addListener(element, eventName, handler) {
142
- if (element.addEventListener) {
143
- element.addEventListener(eventName, handler, false);
144
- }
145
- else if (element.attachEvent) {
146
- element.attachEvent('on' + eventName, handler);
147
- }
148
- else {
149
- element['on' + eventName] = handler;
150
- }
151
- }
137
+ /*
138
+ * Cross-browser event listening
139
+ */
140
+
141
+ function addListener(element, eventName, handler) {
142
+ if (element.addEventListener) {
143
+ element.addEventListener(eventName, handler, false);
144
+ }
145
+ else if (element.attachEvent) {
146
+ element.attachEvent('on' + eventName, handler);
147
+ }
148
+ else {
149
+ element['on' + eventName] = handler;
150
+ }
151
+ }
152
152
 
153
- /*
154
- * Function for logging User Timing event on initial interaction
155
- */
153
+ /*
154
+ * Function for logging User Timing event on initial interaction
155
+ */
156
156
 
157
- sendUserTiming = function (timingValue) {
157
+ sendUserTiming = function (timingValue) {
158
158
 
159
- if (googleTagManager) {
159
+ if (googleTagManager) {
160
160
 
161
- dataLayer.push({'event':'RivetedTiming', 'eventCategory':'Riveted', 'timingVar': 'First Interaction', 'timingValue': timingValue});
161
+ dataLayer.push({'event':'RivetedTiming', 'eventCategory':'Riveted', 'timingVar': 'First Interaction', 'timingValue': timingValue});
162
162
 
163
- } else {
163
+ } else {
164
164
 
165
- if (universalGA) {
166
- window[gaGlobal](universalSendCommand, 'timing', 'Riveted', 'First Interaction', timingValue);
167
- }
165
+ if (universalGA) {
166
+ window[gaGlobal](universalSendCommand, 'timing', 'Riveted', 'First Interaction', timingValue);
167
+ }
168
168
 
169
- if (classicGA) {
170
- _gaq.push(['_trackTiming', 'Riveted', 'First Interaction', timingValue, null, 100]);
171
- }
169
+ if (classicGA) {
170
+ _gaq.push(['_trackTiming', 'Riveted', 'First Interaction', timingValue, null, 100]);
171
+ }
172
172
 
173
- }
173
+ }
174
174
 
175
- };
175
+ };
176
176
 
177
- /*
178
- * Function for logging ping events
179
- */
177
+ /*
178
+ * Function for logging ping events
179
+ */
180
180
 
181
- sendEvent = function (time) {
181
+ sendEvent = function (time) {
182
182
 
183
- if (googleTagManager) {
183
+ if (googleTagManager) {
184
184
 
185
- dataLayer.push({'event':'Riveted', 'eventCategory':'Riveted', 'eventAction': 'Time Spent', 'eventLabel': time, 'eventValue': reportInterval, 'eventNonInteraction': nonInteraction});
185
+ dataLayer.push({'event':'Riveted', 'eventCategory':'Riveted', 'eventAction': 'Time Spent', 'eventLabel': time, 'eventValue': reportInterval, 'eventNonInteraction': nonInteraction});
186
186
 
187
- } else {
187
+ } else {
188
188
 
189
- if (universalGA) {
190
- window[gaGlobal](universalSendCommand, 'event', 'Riveted', 'Time Spent', time.toString(), reportInterval, {'nonInteraction': nonInteraction});
191
- }
189
+ if (universalGA) {
190
+ window[gaGlobal](universalSendCommand, 'event', 'Riveted', 'Time Spent', time.toString(), reportInterval, {'nonInteraction': nonInteraction});
191
+ }
192
192
 
193
- if (classicGA) {
194
- _gaq.push(['_trackEvent', 'Riveted', 'Time Spent', time.toString(), reportInterval, nonInteraction]);
195
- }
193
+ if (classicGA) {
194
+ _gaq.push(['_trackEvent', 'Riveted', 'Time Spent', time.toString(), reportInterval, nonInteraction]);
195
+ }
196
196
 
197
- }
197
+ }
198
198
 
199
- };
199
+ };
200
200
 
201
- function setIdle() {
202
- clearTimeout(idleTimer);
203
- stopClock();
204
- }
201
+ function setIdle() {
202
+ clearTimeout(idleTimer);
203
+ stopClock();
204
+ }
205
205
 
206
- function visibilityChange() {
207
- if (document.hidden || document.webkitHidden) {
208
- setIdle();
209
- }
210
- }
206
+ function visibilityChange() {
207
+ if (document.hidden || document.webkitHidden) {
208
+ setIdle();
209
+ }
210
+ }
211
211
 
212
- function clock() {
213
- clockTime += 1;
214
- if (clockTime > 0 && (clockTime % reportInterval === 0)) {
215
- sendEvent(clockTime);
216
- }
212
+ function clock() {
213
+ clockTime += 1;
214
+ if (clockTime > 0 && (clockTime % reportInterval === 0)) {
215
+ sendEvent(clockTime);
216
+ }
217
217
 
218
- }
218
+ }
219
219
 
220
- function stopClock() {
221
- stopped = true;
222
- clearInterval(clockTimer);
223
- }
220
+ function stopClock() {
221
+ stopped = true;
222
+ clearInterval(clockTimer);
223
+ }
224
224
 
225
- function turnOff() {
226
- setIdle();
227
- turnedOff = true;
228
- }
225
+ function turnOff() {
226
+ setIdle();
227
+ turnedOff = true;
228
+ }
229
229
 
230
- function turnOn() {
231
- turnedOff = false;
232
- }
230
+ function turnOn() {
231
+ turnedOff = false;
232
+ }
233
233
 
234
- function restartClock() {
235
- stopped = false;
236
- clearInterval(clockTimer);
237
- clockTimer = setInterval(clock, 1000);
238
- }
234
+ function restartClock() {
235
+ stopped = false;
236
+ clearInterval(clockTimer);
237
+ clockTimer = setInterval(clock, 1000);
238
+ }
239
239
 
240
- function startRiveted() {
240
+ function startRiveted() {
241
241
 
242
- // Calculate seconds from start to first interaction
243
- var currentTime = new Date();
244
- var diff = currentTime - startTime;
242
+ // Calculate seconds from start to first interaction
243
+ var currentTime = new Date();
244
+ var diff = currentTime - startTime;
245
245
 
246
- // Set global
247
- started = true;
246
+ // Set global
247
+ started = true;
248
248
 
249
- // Send User Timing Event
250
- sendUserTiming(diff);
249
+ // Send User Timing Event
250
+ sendUserTiming(diff);
251
251
 
252
- // Start clock
253
- clockTimer = setInterval(clock, 1000);
252
+ // Start clock
253
+ clockTimer = setInterval(clock, 1000);
254
254
 
255
- }
255
+ }
256
256
 
257
- function resetRiveted() {
258
- startTime = new Date();
259
- clockTime = 0;
260
- started = false;
261
- stopped = false;
262
- clearInterval(clockTimer);
263
- clearTimeout(idleTimer);
264
- }
257
+ function resetRiveted() {
258
+ startTime = new Date();
259
+ clockTime = 0;
260
+ started = false;
261
+ stopped = false;
262
+ clearInterval(clockTimer);
263
+ clearTimeout(idleTimer);
264
+ }
265
265
 
266
- function trigger() {
266
+ function trigger() {
267
267
 
268
- if (turnedOff) {
269
- return;
270
- }
268
+ if (turnedOff) {
269
+ return;
270
+ }
271
271
 
272
- if (!started) {
273
- startRiveted();
274
- }
272
+ if (!started) {
273
+ startRiveted();
274
+ }
275
275
 
276
- if (stopped) {
277
- restartClock();
278
- }
276
+ if (stopped) {
277
+ restartClock();
278
+ }
279
279
 
280
- clearTimeout(idleTimer);
281
- idleTimer = setTimeout(setIdle, idleTimeout * 1000 + 100);
282
- }
280
+ clearTimeout(idleTimer);
281
+ idleTimer = setTimeout(setIdle, idleTimeout * 1000 + 100);
282
+ }
283
283
 
284
- return {
285
- init: init,
286
- trigger: trigger,
287
- setIdle: setIdle,
288
- on: turnOn,
289
- off: turnOff,
290
- reset: resetRiveted
291
- };
284
+ return {
285
+ init: init,
286
+ trigger: trigger,
287
+ setIdle: setIdle,
288
+ on: turnOn,
289
+ off: turnOff,
290
+ reset: resetRiveted
291
+ };
292
292
 
293
- })();
293
+ })();
294
294
 
295
- return riveted;
295
+ return riveted;
296
296
 
297
297
  }));
298
-
@@ -0,0 +1,13 @@
1
+ $(document).ready(() => {
2
+ if ($("#id_country").val() !== 'GB') {
3
+ $('#form-row-county').hide();
4
+ }
5
+
6
+ $('#id_country').on('change', (event) => {
7
+ if (event.target.value === 'GB') {
8
+ $('#form-row-county').show();
9
+ } else {
10
+ $('#form-row-county').hide();
11
+ }
12
+ });
13
+ });
@@ -0,0 +1,16 @@
1
+ $(document).ready(() => {
2
+ $('#form-login-school').on('click', '#password-field-icon', () => {
3
+ let inputType;
4
+ let dataIcon = $('#password-field-icon').attr('data-icon');
5
+ if (dataIcon === 'material-symbols:visibility') {
6
+ inputType = 'password';
7
+ dataIcon = 'material-symbols:visibility-off';
8
+ } else {
9
+ inputType = 'text';
10
+ dataIcon = 'material-symbols:visibility';
11
+ }
12
+
13
+ $('#id_password').attr('type', inputType);
14
+ $('#password-field-icon').attr('data-icon', dataIcon);
15
+ });
16
+ });
@@ -0,0 +1,23 @@
1
+ $(document).ready(() => {
2
+ $('#edit-student-password-form').on(
3
+ 'click',
4
+ '#password-field-icon, #confirm-password-field-icon',
5
+ () => {
6
+ let inputType;
7
+ let dataIcon = $('#password-field-icon').attr('data-icon');
8
+ if (dataIcon === 'material-symbols:visibility') {
9
+ inputType = 'password';
10
+ dataIcon = 'material-symbols:visibility-off';
11
+ } else {
12
+ inputType = 'text';
13
+ dataIcon = 'material-symbols:visibility';
14
+ }
15
+
16
+ $('#id_password').attr('type', inputType);
17
+ $('#id_confirm_password').attr('type', inputType);
18
+
19
+ $('#password-field-icon').attr('data-icon', dataIcon);
20
+ $('#confirm-password-field-icon').attr('data-icon', dataIcon);
21
+ }
22
+ );
23
+ });
@@ -0,0 +1,16 @@
1
+ $(document).ready(() => {
2
+ $('#form-login-teacher').on('click', '#password-field-icon', () => {
3
+ let inputType;
4
+ let dataIcon = $('#password-field-icon').attr('data-icon');
5
+ if (dataIcon === 'material-symbols:visibility') {
6
+ inputType = 'password';
7
+ dataIcon = 'material-symbols:visibility-off';
8
+ } else {
9
+ inputType = 'text';
10
+ dataIcon = 'material-symbols:visibility';
11
+ }
12
+
13
+ $('#id_auth-password').attr('type', inputType);
14
+ $('#password-field-icon').attr('data-icon', dataIcon);
15
+ });
16
+ });
@@ -0,0 +1,14 @@
1
+ let currentActivePin;
2
+
3
+ function setActivePin(city) {
4
+ if (currentActivePin) {
5
+ currentActivePin.setAttribute("fill", "#FFC709");
6
+ }
7
+
8
+ currentActivePin = document.getElementById(city + "-pin").getElementsByTagName("svg")[0]
9
+ currentActivePin.setAttribute("fill", "#EE0857");
10
+ }
11
+
12
+ $(document).ready(function () {
13
+ setActivePin("hatfield");
14
+ });
@@ -51,7 +51,6 @@
51
51
  #cboxPrevious:hover{background-position:-75px -25px;}
52
52
  #cboxNext{position:absolute; bottom:0; left:27px; background:url(../img/colorboxImages/controls.png) no-repeat -50px 0; width:25px; height:25px; text-indent:-9999px;}
53
53
  #cboxNext:hover{background-position:-50px -25px;}
54
- #cboxClose{position:absolute; top:0; right:0; background:url(../img/x_close_video.png) no-repeat; width:52px; height:52px; text-indent:-9999px;}
55
54
 
56
55
  /*
57
56
  The following fixes a problem where IE7 and IE8 replace a PNG's alpha transparency with a black fill
@@ -107,6 +107,7 @@ $color-background-danger: #ff0000;
107
107
  $color-background-tint-primary: #f1ecec;
108
108
  $color-background-sub-banner: $color-secondary-300;
109
109
  $color-background-box-shadow: rgba(0, 0, 0, 0.2);
110
+ $color-background-python-den: #213ce7;
110
111
  // Popups & Messages
111
112
  $color-ui-dialog-border: #808080;
112
113
  $color-ui-widget-overlay: #666666;
@@ -1,4 +1,4 @@
1
1
  $hover-content-level: 100;
2
2
  $nav-bar-level: 1001;
3
- $popup-overlay-level: 300;
3
+ $popup-overlay-level: 1100;
4
4
  $behind-content-level: -100;