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
@@ -24,6 +24,22 @@
24
24
  calculate-rem($margin-bottom) calculate-rem($margin-left);
25
25
  }
26
26
 
27
+ @mixin _margin-top($margin-top) {
28
+ margin-top: calculate-rem($margin-top);
29
+ }
30
+
31
+ @mixin _margin-bottom($margin-bottom) {
32
+ margin-bottom: calculate-rem($margin-bottom);
33
+ }
34
+
35
+ @mixin _margin-right($margin-right) {
36
+ margin-right: calculate-rem($margin-right);
37
+ }
38
+
39
+ @mixin _margin-left($margin-left) {
40
+ margin-left: calculate-rem($margin-left);
41
+ }
42
+
27
43
  @mixin _top($top) {
28
44
  top: calculate-rem($top);
29
45
  }
@@ -39,6 +55,11 @@
39
55
  calculate-rem($radius-bottom-left);
40
56
  }
41
57
 
58
+ @mixin _border-radius-all($radius) {
59
+ border-radius: calculate-rem($radius) calculate-rem($radius)
60
+ calculate-rem($radius) calculate-rem($radius);
61
+ }
62
+
42
63
  @mixin _box-shadow($h-offset, $v-offset, $blur, $spread, $color) {
43
64
  box-shadow: calculate-rem($h-offset) calculate-rem($v-offset)
44
65
  calculate-rem($blur) calculate-rem($spread) $color;
@@ -34,25 +34,6 @@
34
34
  .banner--rapid-router--content {
35
35
  @include _padding(30px, 0px, 30px, 0px);
36
36
  }
37
-
38
- .banner--aimmo--content {
39
- @include _padding(20 * $spacing, 0px, 20 * $spacing, 0px);
40
- display: flex;
41
- justify-content: center;
42
- }
43
- }
44
-
45
- .banner--aimmo-landing--content {
46
- @include _padding(14 * $spacing, 0px, 14 * $spacing, 0px);
47
- align-items: center;
48
- display: flex;
49
- flex-direction: column;
50
- justify-content: center;
51
-
52
- .kurono-logo {
53
- @include _padding(0px, 0px, 5 * $spacing, 0px);
54
- width: 80vw;
55
- }
56
37
  }
57
38
 
58
39
  .banner--picture {
@@ -85,6 +66,10 @@
85
66
  background-image: url("../img/home_educate_hero.jpg");
86
67
  }
87
68
 
69
+ .banner--picture--coding-club {
70
+ background-image: url("../img/coding_club_hero.jpg")
71
+ }
72
+
88
73
  .banner--picture--play {
89
74
  background-image: url("../img/home_play_hero.jpg");
90
75
  }
@@ -117,14 +102,6 @@
117
102
  background-image: url("../img/teaching_resources_hero.jpg");
118
103
  }
119
104
 
120
- .banner--picture--aimmo {
121
- background-image: url("../img/kurono_hero.jpg");
122
- }
123
-
124
- .banner--picture--aimmo-resources {
125
- background-image: url("../img/kurono_resources_hero.jpg");
126
- }
127
-
128
105
  .banner--homepage {
129
106
  display: flex;
130
107
  justify-content: center;
@@ -237,86 +214,6 @@
237
214
  }
238
215
  }
239
216
 
240
- .banner--aimmo-home {
241
- .dropdown {
242
- width: 50%;
243
-
244
- button,
245
- ul {
246
- @include _margin(0px, 0px, 0px, 0px);
247
- width: 100%;
248
- z-index: $hover-content-level;
249
- }
250
-
251
- li {
252
- border-bottom: 1px solid $color-table-border;
253
- }
254
-
255
- .dropdown-menu__option__text {
256
- border-bottom: 1px solid transparent;
257
- overflow: hidden;
258
- text-overflow: ellipsis;
259
- white-space: normal;
260
-
261
- &:hover {
262
- border-bottom: 1px solid $color-text-gray;
263
- }
264
- }
265
-
266
- .glyphicon {
267
- @include _font-size(10px);
268
- @include _padding(8px, 0px, 0px, 0px);
269
- }
270
- }
271
- }
272
-
273
- .banner--teacher--create-aimmo-game {
274
- align-items: start;
275
-
276
- .kurono-logo {
277
- @include _padding(20px, 0px, 25px, 0px);
278
- display: flex;
279
- flex-direction: column;
280
- height: 100%;
281
- justify-content: center;
282
-
283
- img {
284
- width: 123 * $spacing;
285
- }
286
- }
287
-
288
- .button-group {
289
- display: flex;
290
- align-items: flex-end;
291
- }
292
-
293
- #create-game-form {
294
- padding: 0;
295
-
296
- .errorlist {
297
- display: none;
298
- }
299
-
300
- label {
301
- color: white;
302
- }
303
-
304
- input,
305
- select {
306
- height: auto;
307
- margin: 0;
308
-
309
- &::placeholder {
310
- color: $color-error;
311
- }
312
- }
313
- }
314
-
315
- img {
316
- @include _margin(14px, 0px, 0px, 0px);
317
- }
318
- }
319
-
320
217
  .banner--rapid-router {
321
218
  background-image: url("../img/rapid_router_landing_hero.png");
322
219
  background-position: center center;
@@ -332,46 +229,6 @@
332
229
  }
333
230
  }
334
231
 
335
- .banner--aimmo {
336
- background-image: url("../img/kurono_landing_hero.png");
337
- background-position: center center;
338
- background-repeat: no-repeat;
339
- background-size: cover;
340
-
341
- img {
342
- @include _margin(60px, 0px, 60px, 0px);
343
- width: 40%;
344
- }
345
-
346
- &.banner img {
347
- width: 25%;
348
- }
349
- }
350
-
351
- .banner--aimmo--video--container {
352
- @include _padding(12 * $spacing, 0px, 12 * $spacing, 0px);
353
- align-items: center;
354
- display: flex;
355
- justify-content: center;
356
- position: relative;
357
- }
358
-
359
- .banner--aimmo--video {
360
- left: 0px;
361
- height: 100%;
362
- object-fit: cover;
363
- overflow: hidden;
364
- position: absolute;
365
- top: 0px;
366
- width: 100%;
367
- z-index: $behind-content-level;
368
- }
369
-
370
- .banner--aimmo--video--text {
371
- @include _padding(10 * $spacing, 10 * $spacing, 10 * $spacing, 10 * $spacing);
372
- color: $color-text-secondary;
373
- }
374
-
375
232
  .banner--resources {
376
233
  @include _padding(0px, 0px, 30px, 0px);
377
234
  align-items: center;
@@ -424,14 +281,6 @@
424
281
  }
425
282
  }
426
283
 
427
- @media (min-width: $tablet-small-min-width) {
428
- .banner--aimmo-landing--content {
429
- .kurono-logo {
430
- width: 615px;
431
- }
432
- }
433
- }
434
-
435
284
  @media (max-width: $tablet-small-min-width) {
436
285
  .banner--picture {
437
286
  margin: 0 auto 0 auto;
@@ -460,28 +309,6 @@
460
309
  }
461
310
  }
462
311
 
463
- .banner--aimmo {
464
- @include _padding(50px, 0px, 150px, 0px);
465
- flex-direction: column;
466
-
467
- .button {
468
- margin-bottom: 50px;
469
- }
470
- }
471
-
472
- .banner--aimmo-landing--content {
473
- @include _padding(8 * $spacing, 8 * $spacing, 8 * $spacing, 8 * $spacing);
474
- }
475
-
476
- .banner--aimmo--video {
477
- max-height: 300px;
478
- object-fit: none;
479
- }
480
-
481
- .banner--aimmo--video--container {
482
- @include _padding(0px, 0px, 0px, 0px);
483
- }
484
-
485
312
  .banner--game {
486
313
  .banner--game__text {
487
314
  @include _padding(10px, 50px, 30px, 50px);
@@ -89,7 +89,6 @@ table {
89
89
  color: $color-text-primary;
90
90
  box-shadow: none;
91
91
  }
92
-
93
92
  }
94
93
 
95
94
  /* Outlined button */
@@ -150,6 +149,17 @@ table {
150
149
  }
151
150
  }
152
151
 
152
+ .button-email {
153
+ &:after {
154
+ content: "\e0be";
155
+ font-family: "Material Icons Outlined";
156
+ position: relative;
157
+ top: 2px;
158
+ left: 5px;
159
+ line-height: 0.9em;
160
+ }
161
+ }
162
+
153
163
  .button--regular,
154
164
  .ui-dialog-buttonset button {
155
165
  @include _padding(10px, 15px, 10px, 15px);
@@ -161,8 +171,6 @@ table {
161
171
  }
162
172
 
163
173
  .button--menu {
164
- background-color: transparent;
165
- border-radius: 0;
166
174
  text-decoration: none;
167
175
  }
168
176
 
@@ -233,6 +241,7 @@ td .button--primary {
233
241
 
234
242
  .button--dropdown {
235
243
  @extend .dropdown;
244
+ width: 20vw;
236
245
  align-items: center;
237
246
  background: transparent;
238
247
  border: 2px solid $color-secondary-600;
@@ -448,18 +457,6 @@ td .button--primary {
448
457
  }
449
458
  }
450
459
 
451
- .grid-kurono-sessions__accordion-button {
452
- .icon-drop-down:before {
453
- content: "arrow_drop_down";
454
- }
455
-
456
- &[aria-expanded="true"] {
457
- .icon-drop-down:before {
458
- content: "arrow_drop_up";
459
- }
460
- }
461
- }
462
-
463
460
  .button--menu__item--teacher {
464
461
  background-color: $color-background-teach;
465
462
  }
@@ -13,6 +13,7 @@
13
13
  &.next,
14
14
  &.prev {
15
15
  display: flex;
16
+ flex-wrap: wrap;
16
17
  }
17
18
 
18
19
  > .carousel-image-wrapper {
@@ -47,3 +48,131 @@
47
48
  margin: 1px;
48
49
  }
49
50
  }
51
+
52
+ /* 3 cards visible on desktop, scroll one at a time */
53
+ .carousel-cards {
54
+ .carousel-inner {
55
+ display: flex;
56
+
57
+ .next,
58
+ .prev {
59
+ display: flex;
60
+ width: 33.33333333%;
61
+ }
62
+
63
+ .item {
64
+ align-items: stretch;
65
+ background-color: transparent;
66
+ @include _padding(13px, 13px, 13px, 13px); // padding for card shadow
67
+
68
+ .card {
69
+ margin: 0;
70
+ }
71
+ }
72
+
73
+ /* show 3 items */
74
+ .active,
75
+ .active + .item,
76
+ .active + .item + .item {
77
+ display: flex;
78
+ }
79
+
80
+ .item.active:not(.right):not(.left),
81
+ .item.active:not(.right):not(.left) + .item,
82
+ .item.active:not(.right):not(.left) + .item + .item {
83
+ transition: none;
84
+ }
85
+
86
+ .item.next {
87
+ position: relative;
88
+ transform: translate3d(0, 0, 0);
89
+ }
90
+
91
+ /* next animation */
92
+ .active.left + .item.next.left,
93
+ .item.next.left + .item,
94
+ .item.next.left + .item + .item,
95
+ .item.next.left + .item + .item + .item {
96
+ position: relative;
97
+ transform: translate3d(-100%, 0, 0);
98
+ visibility: visible;
99
+ }
100
+
101
+ /* prev animation */
102
+ .active.right + .item.prev.right,
103
+ .item.prev.right + .item,
104
+ .item.prev.right + .item + .item,
105
+ .item.prev.right + .item + .item + .item {
106
+ display: flex;
107
+ position: relative;
108
+ transform: translate3d(100%, 0, 0);
109
+ visibility: visible;
110
+ }
111
+
112
+ /* position previous card outside carousel for animation */
113
+ .item.prev.right {
114
+ display: flex;
115
+ position: absolute;
116
+ top: 0;
117
+ left: 0;
118
+ z-index: -1;
119
+ visibility: visible;
120
+ height: 100%;
121
+ }
122
+
123
+ /* position next card outside carousel for animation */
124
+ .active.item + .item + .item + .item {
125
+ display: flex;
126
+ position: absolute;
127
+ top: 0;
128
+ right: -33.33333333%;
129
+ z-index: -1;
130
+ visibility: visible;
131
+ height: 100%;
132
+ }
133
+ }
134
+
135
+ .carousel-nav {
136
+ .button {
137
+ @include _font-size(40px);
138
+ border-radius: calculate-rem(20px);
139
+ line-height: 0;
140
+ min-width: auto;
141
+
142
+ &.disabled {
143
+ opacity: 0.38;
144
+ pointer-events: none;
145
+ cursor: default;
146
+ }
147
+
148
+ &:hover:not(.disabled) {
149
+ background-color: rgba(0, 0, 0, 0.04);
150
+ }
151
+ }
152
+ }
153
+ }
154
+
155
+ .carousel-cards-container {
156
+ /* shrink padding because cards have their own */
157
+ @include _padding(0px, 2px, 0px, 2px);
158
+ }
159
+
160
+ .carousel-button {
161
+ margin-top: 2rem;
162
+ }
163
+
164
+ .carousel-image {
165
+ margin-top: 15px;
166
+ }
167
+
168
+ .carousel-image--column {
169
+ padding-right: 20px;
170
+ }
171
+
172
+ .carousel-column--images {
173
+ margin-top: -15px;
174
+ }
175
+
176
+ .carousel-header {
177
+ margin-top: 0rem !important;
178
+ }
@@ -54,23 +54,18 @@
54
54
  }
55
55
  }
56
56
 
57
- .external-links {
58
- @include _margin(20px, 0px, 20px, 0px);
59
- align-items: center;
60
- display: flex;
61
- justify-content: space-between;
62
- }
63
-
64
- .social-media a,
65
- .social-media a:hover {
66
- color: $color-text-secondary;
67
- display: flex;
68
- }
69
-
70
57
  .social-media {
71
- @include _font-size(58px);
58
+ @include _font-size(48px);
59
+ @include _margin(40px, 0px, 0px, 0px);
72
60
  align-items: center;
73
61
  display: flex;
62
+
63
+ a,
64
+ a:hover {
65
+ @include _margin(0px, 20px, 0px, 0px);
66
+ color: $color-text-secondary;
67
+ display: flex;
68
+ }
74
69
  }
75
70
 
76
71
  input[type="email"] {
@@ -87,7 +82,6 @@
87
82
 
88
83
  .footer-links {
89
84
  @include _margin(0px, -15px, 0px, -15px);
90
-
91
85
  text-align: left;
92
86
  }
93
87
 
@@ -97,10 +91,6 @@
97
91
  border: 0;
98
92
  }
99
93
 
100
- .social-media a {
101
- @include _margin(0px, 20px, 0px, 0px);
102
- }
103
-
104
94
  .form--row__input {
105
95
  flex: 1;
106
96
  }
@@ -119,7 +109,6 @@
119
109
  display: grid;
120
110
  }
121
111
 
122
- .external-links,
123
112
  .form--row {
124
113
  flex-direction: column;
125
114
  }
@@ -132,8 +121,7 @@
132
121
 
133
122
  @media (max-width: $tablet-small-max-width) and (min-width: $tablet-small-min-width) {
134
123
  .footer {
135
- .button,
136
- .external-links {
124
+ .button {
137
125
  margin: 0;
138
126
  }
139
127
 
@@ -146,11 +134,22 @@
146
134
  @media (max-width: $mobile-max-width) {
147
135
  .footer {
148
136
  .button {
137
+ height: 50px;
149
138
  width: 100%;
150
139
  }
151
140
 
141
+ .form__checkbox {
142
+ @include _margin(5px, 0px, 20px, 0px);
143
+ }
144
+
152
145
  .landscape-logo {
153
146
  max-width: 60%;
154
147
  }
148
+
149
+ .social-media {
150
+ @include _font-size(70px);
151
+ @include _margin(50px, 0px, 25px, 0px);
152
+ justify-content: space-between;
153
+ }
155
154
  }
156
155
  }
@@ -4,6 +4,13 @@
4
4
  width: 100%;
5
5
  }
6
6
 
7
+ .non-styled--form {
8
+ padding: 0;
9
+ & > button {
10
+ margin: 0;
11
+ }
12
+ }
13
+
7
14
  /* Chrome, Safari, Edge, Opera */
8
15
  input::-webkit-outer-spin-button,
9
16
  input::-webkit-inner-spin-button {
@@ -77,6 +84,38 @@ form {
77
84
  padding: 0;
78
85
  text-align: left;
79
86
  }
87
+
88
+ #episodes {
89
+ p {
90
+ @include _padding(10px, 0px, 10px, 0px);
91
+ }
92
+ }
93
+
94
+ .panel {
95
+ @include _margin-bottom(5px);
96
+ }
97
+
98
+ .panel-intro,
99
+ .panel-header {
100
+ label {
101
+ @include _margin-right(9px);
102
+ }
103
+
104
+ input[type="checkbox"] {
105
+ height: 20px;
106
+ width: 20px;
107
+ }
108
+ }
109
+
110
+ .panel-body {
111
+ label {
112
+ @include _margin-right(11px);
113
+ }
114
+
115
+ input[type="checkbox"] {
116
+ height: 10px;
117
+ }
118
+ }
80
119
  }
81
120
 
82
121
  .form--login {
@@ -138,8 +177,9 @@ form {
138
177
  color: $color-text-secondary;
139
178
  background-color: $color-primary-400;
140
179
 
141
- a,
142
- a:hover {
180
+ a:not(.button--home),
181
+ a:not(.button--home):hover,
182
+ a:not(.button--home):focus {
143
183
  color: $color-text-secondary;
144
184
  }
145
185
 
@@ -158,7 +198,8 @@ form {
158
198
  background-color: $color-tertiary;
159
199
 
160
200
  a,
161
- a:hover {
201
+ a:hover,
202
+ a:focus {
162
203
  color: $color-text-secondary;
163
204
  }
164
205
 
@@ -201,6 +242,17 @@ form {
201
242
  flex-direction: column;
202
243
  }
203
244
 
245
+ .form__dob-input {
246
+ @include _margin(0px, -10px, 0px, -10px);
247
+ display: flex;
248
+ flex: 1;
249
+ justify-content: space-between;
250
+
251
+ select {
252
+ @include _margin(0px, 10px, 0px, 10px);
253
+ }
254
+ }
255
+
204
256
  @media (min-width: $mobile-max-width) {
205
257
  .registration {
206
258
  display: flex;
@@ -220,7 +272,7 @@ form {
220
272
  display: flex;
221
273
  align-items: center;
222
274
  font-size: 75%;
223
- padding: 1.2% 0% 2.5% 1.2%;
275
+ padding: 1.2% 0% 1.2% 1.2%;
224
276
  }
225
277
 
226
278
  .form-div {
@@ -245,7 +297,8 @@ form {
245
297
  }
246
298
  }
247
299
 
248
- .form--register--text p {
300
+ .form--register--text p,
301
+ .form--register--text small {
249
302
  text-align: left;
250
303
  }
251
304
 
@@ -286,6 +339,8 @@ form {
286
339
  }
287
340
 
288
341
  .form--row {
342
+ @include _margin-top(5px);
343
+ @include _margin-bottom(5px);
289
344
  align-items: center;
290
345
  display: flex;
291
346
  flex-wrap: wrap;