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
@@ -9,12 +9,20 @@ table {
9
9
  @include _padding(2px, 10px, 2px, 10px);
10
10
  min-width: 70px;
11
11
  }
12
+
13
+ select {
14
+ margin: 0;
15
+ }
12
16
  }
13
17
 
14
18
  th {
15
19
  @include _padding(5px, 10px, 5px, 10px);
16
20
  font-weight: 500;
17
21
  color: $color-text-secondary;
22
+
23
+ p {
24
+ @include _padding(10px, 0px, 10px, 0px);
25
+ }
18
26
  }
19
27
 
20
28
  td {
@@ -36,10 +44,6 @@ th + th {
36
44
  border-left: 2px solid $color-background-secondary;
37
45
  }
38
46
 
39
- tr + tr {
40
- border-top: 2px solid $color-background-secondary;
41
- }
42
-
43
47
  .header-primary {
44
48
  th:not(.no-bg) {
45
49
  background-color: $color-table-header-primary;
@@ -50,6 +54,10 @@ tr + tr {
50
54
  td:not(.no-bg) {
51
55
  background-color: $color-background-tint-primary;
52
56
  }
57
+
58
+ tr + tr {
59
+ border-top: 2px solid $color-background-secondary;
60
+ }
53
61
  }
54
62
 
55
63
  .header-secondary {
@@ -90,22 +98,6 @@ tr + tr {
90
98
  width: 10px;
91
99
  }
92
100
 
93
- .status-indicator--off {
94
- background: $color-button-primary-action-danger;
95
- }
96
-
97
- .status-indicator--on {
98
- background: $color-button-primary-action-positive;
99
- }
100
-
101
- .status-indicator--standby {
102
- background: $color-button-primary-action-setup;
103
- }
104
-
105
- .status-indicator--game {
106
- margin: auto 2 * $spacing auto 0px;
107
- }
108
-
109
101
  .student-table {
110
102
  a[class^="button"] {
111
103
  padding: auto;
@@ -69,15 +69,6 @@ a:focus {
69
69
  font-weight: 600;
70
70
  }
71
71
 
72
- .kurono-overview__paragraph {
73
- @include _font-size(25px);
74
- @include _line-height(35px);
75
-
76
- + .kurono-overview__paragraph {
77
- @include _padding(8 * $spacing, 0px, 0px, 0px);
78
- }
79
- }
80
-
81
72
  .grid-benefits__text1 {
82
73
  grid-area: text1;
83
74
  }
@@ -189,6 +180,11 @@ blockquote {
189
180
  }
190
181
  }
191
182
 
183
+ .background--python-den {
184
+ background-color: $color-background-python-den;
185
+ color: $color-text-secondary;
186
+ }
187
+
192
188
  @media (min-width: $tablet-small-min-width) {
193
189
  .list--two-columns {
194
190
  columns: 2;
@@ -243,4 +239,4 @@ blockquote {
243
239
  body {
244
240
  font-size: 14px;
245
241
  }
246
- }
242
+ }
@@ -15,7 +15,6 @@
15
15
  @import "partials/text";
16
16
  @import "partials/ui-dialog";
17
17
  @import "partials/utils";
18
- @import "partials/videos";
19
18
 
20
19
  .content-footer-wrapper {
21
20
  display: flex;
portal/strings/about.py CHANGED
@@ -9,6 +9,11 @@ GETINVOLVED_BANNER = {
9
9
  "title": "Get involved",
10
10
  "subtitle": "How you can get involved with the creation of Code for Life products and resources",
11
11
  "image_class": "banner--picture--getinvolved",
12
+ "button": {
13
+ "external": True,
14
+ "text": "Opportunities with Code for Life",
15
+ "link": "https://2662351606-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M_6UDUiGoJDhr_OXetO%2Fuploads%2FPavvCifcuUeZZZLkV01C%2FOpportunities%20with%20Code%20for%20Life.pdf?alt=media",
16
+ },
12
17
  }
13
18
 
14
19
  CONTRIBUTE_BANNER = {
@@ -0,0 +1,9 @@
1
+ CODING_CLUB_BANNER = {
2
+ "title": "Coding clubs",
3
+ "subtitle": "A FREE set of slides and guides to run your own coding clubs",
4
+ "text": "",
5
+ "button": "",
6
+ "image_class": "banner--picture--coding-club",
7
+ "alt": "Boy using a laptop",
8
+ "image_description": "Credit: Jeswin Thomas, Unsplash",
9
+ }
portal/strings/play.py CHANGED
@@ -1,10 +1,12 @@
1
1
  PLAY_BANNER = {
2
2
  "title": "Play",
3
- "subtitle": "Anyone can learn how to code. We will help you learn how. It’s "
4
- "fun, free and easy.",
3
+ "subtitle": "Anyone can learn how to code. We will help you learn how. It’s " "fun, free and easy.",
5
4
  "text": "",
6
- "button": {"text": "Play Rapid Router", "link": "levels"},
5
+ "button": {"text": "Try Rapid Router", "link": "levels"},
6
+ "button2": {"text": "Try Python Den", "link": "python_levels"},
7
7
  "image_class": "banner--picture--play",
8
+ "alt": "Boy playing on ipad",
9
+ "image_description": "Credit: Annie Spratt, Unsplash",
8
10
  }
9
11
 
10
12
  PLAY_HEADLINE = {
@@ -12,6 +14,5 @@ PLAY_HEADLINE = {
12
14
  "description": "Whether you’re a parent, teacher or a student, our games support "
13
15
  "and guide you, making learning to code great fun. Get started with Rapid Router "
14
16
  "designed for students new to coding. Rapid Router is where you will build up your "
15
- "ability until you are ready to advance to Kurono, where you can test your skills "
16
- "in Python.",
17
+ "ability.",
17
18
  }
portal/strings/teach.py CHANGED
@@ -3,5 +3,5 @@ TEACH_BANNER = {
3
3
  "subtitle": "Get ready to teach the next generation of computer scientists",
4
4
  "text": "",
5
5
  "image_class": "banner--picture--educate",
6
- "image_description": "teacher and student at laptop, girl pointing at screen",
6
+ "alt": "Female teacher helping young female student on a laptop",
7
7
  }
@@ -4,12 +4,6 @@ RAPID_ROUTER_RESOURCES_BANNER = {
4
4
  "teach students Computing.",
5
5
  "text": "",
6
6
  "image_class": "banner--picture--play",
7
- }
8
-
9
- KURONO_RESOURCES_BANNER = {
10
- "title": "Kurono Resources",
11
- "subtitle": "We’ve created a comprehensive set of teaching materials to help you "
12
- "teach students the UK National Computing Curriculum.",
13
- "text": "",
14
- "image_class": "banner--picture--aimmo-resources",
7
+ "image_description": "Credit: Annie Spratt, Unsplash",
8
+ "alt": "Boy playing on ipad",
15
9
  }
@@ -0,0 +1,13 @@
1
+ TEN_YEAR_MAP_BANNER = {
2
+ "title": "Celebrate",
3
+ "subtitle": "Join us in celebrating our 10 year anniversary",
4
+ "text": "",
5
+ "image_class": "banner--picture--educate",
6
+ "alt": "Female teacher helping young female student on a laptop",
7
+ }
8
+
9
+ TEN_YEAR_MAP_HEADLINE = {
10
+ "title": "Code for Life is turning 10!",
11
+ "description": "For our 10th anniversary, we're going global! Click on the pins on the map "
12
+ "to check out what events are being run by our amazing volunteers from around the world.",
13
+ }
portal/templates/403.html CHANGED
@@ -1,8 +1,8 @@
1
1
  {% extends 'portal/base_no_userprofile.html' %}
2
- {% load staticfiles %}
2
+ {% load static %}
3
3
 
4
4
  {% block css %}
5
- <link rel="stylesheet" type="text/css" href='{% static "portal.css" %}'>
5
+ <link rel="stylesheet" type="text/css" href='{% static "portal/css/portal.css" %}'>
6
6
  <link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@500&display=swap" rel="stylesheet">
7
7
  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
8
8
  <link rel="shortcut icon" href="{% static 'portal/img/favicon.ico' %}" type="image/x-icon">
portal/templates/404.html CHANGED
@@ -1,5 +1,5 @@
1
1
  {% extends 'portal/base.html' %}
2
- {% load staticfiles %}
2
+ {% load static %}
3
3
 
4
4
  {% block content %}
5
5
 
portal/templates/500.html CHANGED
@@ -1,4 +1,4 @@
1
- {% load staticfiles %}
1
+ {% load static %}
2
2
  {% load app_tags %}
3
3
  <!DOCTYPE html>
4
4
  <html>
@@ -7,7 +7,7 @@
7
7
 
8
8
  {% include "common/onetrust_cookies_consent_notice.html" %}
9
9
 
10
- <link rel="stylesheet" type="text/css" href="{% static 'portal.css' %}">
10
+ <link rel="stylesheet" type="text/css" href="{% static 'portal/css/portal.css' %}">
11
11
  <link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@500&display=swap" rel="stylesheet">
12
12
  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
13
13
  <link rel="shortcut icon" href="{% static 'portal/img/favicon.ico' %}" type="image/x-icon">
@@ -1,8 +1,8 @@
1
- {# This is adapted from django-recaptcha 2.0.5 to work on multiple reCAPTCHA's on the same page #}
2
- {# See verifyCaptcha_{{ widget_uuid}} for the edit #}
1
+ <!-- This is adapted from django-recaptcha 4.0.0 to work on multiple
2
+ reCAPTCHA's on the same page
3
+ See verifyCaptcha_{{ widget_uuid}} for the edit #} -->
3
4
  <script src="https://{{ recaptcha_domain }}/recaptcha/api.js{% if api_params %}?{{ api_params }}{% endif %}"></script>
4
5
  <script type="text/javascript">
5
-
6
6
  // Submit function to be called, after reCAPTCHA was successful.
7
7
  var onSubmit_{{ widget_uuid }} = function(token) {
8
8
  console.log("reCAPTCHA validated for 'data-widget-uuid=\"{{ widget_uuid }}\"'. Submitting form...")
@@ -1,5 +1,5 @@
1
- {# copied from django-recaptcha 2.0.5 #}
2
- {% include "captcha/includes/js_v2_invisible.html" %}
1
+ <!-- copied from django-recaptcha 4.0.0 -->
2
+ {% include "django_recaptcha/includes/js_v2_invisible.html" %}
3
3
  <div class="g-recaptcha"
4
4
  {% for name, value in widget.attrs.items %}{% if value is not False %} {{ name }}{% if value is not True %}="{{ value|stringformat:'s' }}"{% endif %}{% endif %}{% endfor %}
5
5
  >
@@ -1,4 +1,6 @@
1
+ {% extends 'portal/email_style_template.html' %}
1
2
  {% load static %}
2
-
3
-
3
+ {% block email_content %}
4
+ <h1 style="text-align: center;color:rgb(224,0,77);font-family: 'space grotesk';font-size: 2rem;">{{ title }}</h1>
4
5
  {{ content|urlize|linebreaks }}
6
+ {% endblock email_content %}
@@ -0,0 +1,34 @@
1
+ {% load static %}
2
+ {% load app_tags %}
3
+ <!DOCTYPE html>
4
+ <html>
5
+ <head>
6
+ <title>Code For Life - maintenance</title>
7
+ <link rel="stylesheet" type="text/css" href="{% static 'portal/css/portal.css' %}">
8
+ <link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@500&display=swap" rel="stylesheet">
9
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
10
+ <link rel="shortcut icon" href="{% static 'portal/img/favicon.ico' %}" type="image/x-icon">
11
+ <link rel="icon" href="{% static 'portal/img/favicon.ico' %}" type="image/x-icon">
12
+ </head>
13
+ <body>
14
+ <div class="content-footer-wrapper">
15
+ <div id="contentWrapper">
16
+ {% block topBar %}
17
+ {% include 'portal/partials/header.html' %}
18
+ {% endblock topBar %}
19
+ <div class="content">
20
+ <div class="error-page background container">
21
+ <div class="row mx-0 d-flex justify-content-between">
22
+ <div class="flex-grow-1">
23
+ <h2>Works in progress!</h2>
24
+ <h5>Apologies! Dee is working on something important.</h5>
25
+ <p>The website is temporarily unavailable.</p>
26
+ </div>
27
+ <img title="Dee" alt="Dee" src="{% static 'portal/img/dee.png' %}"/>
28
+ </div>
29
+ </div>
30
+ </div>
31
+ </div>
32
+ </div>
33
+ </body>
34
+ </html>
@@ -1,5 +1,5 @@
1
1
  {% extends 'portal/base.html' %}
2
- {% load staticfiles %}
2
+ {% load static %}
3
3
  {% load app_tags %}
4
4
  {% load banner_tags %}
5
5
 
@@ -10,23 +10,25 @@
10
10
  {% block content %}
11
11
  <div class="background container">
12
12
  <section>
13
- <h4>Code For Life is a non profit initiative that delivers free, open-source games that help all students learn
14
- computing.</h4>
13
+ <h4>Code For Life is a non-profit initiative that delivers free,
14
+ open-source games that help all students learn computing.</h4>
15
15
  <div class="row homepage-info">
16
16
  <div class="col-sm-4">
17
17
  <h2 class="text--brand-tertiary">2014</h2>
18
- <p>The year that computing was added to the UK curriculum. We've been supporting teachers and students
19
- ever since.</p>
18
+ <p>The year that computing was added to the UK curriculum. We've
19
+ been supporting teachers and students ever since.</p>
20
20
  </div>
21
21
  <div class="col-sm-4">
22
22
  <h2 class="text--brand-tertiary">>160</h2>
23
- <p>Countries are taking part, with the UK, the USA, Brazil, Australia and Canada as top locations for
24
- schools signed up to CFL. Nearly 10,000 schools are registered globally.</p>
23
+ <p>Countries are taking part, with the UK, the USA, Brazil,
24
+ Australia and Canada as top locations for schools signed up
25
+ to CFL. Nearly 10,000 schools are registered globally.</p>
25
26
  </div>
26
27
  <div class="col-sm-4">
27
- <h2 class="text--brand-tertiary">>270,000</h2>
28
- <p>Active users so far, with numbers growing every day. In 2020 alone, close to 100,000 new people
29
- subscribed to our resources.</p>
28
+ <h2 class="text--brand-tertiary">>260,000</h2>
29
+ <p>Active users so far, with numbers growing every day. In 2020
30
+ alone, close to 100,000 new people subscribed to our
31
+ resources.</p>
30
32
  </div>
31
33
  </div>
32
34
  </section>
@@ -36,18 +38,23 @@
36
38
  <div class="row d-flex align-items-center">
37
39
  <div class="col-sm-6">
38
40
  <h5>What is Code for Life?</h5>
39
- <p>Code for Life (CFL) is a free, easy-to-use resource that provides teaching and lesson plans, user
40
- guides and engagement through our two fun coding games: Rapid Router and Kurono. These games are
41
- specially designed for people learning computing for the first time.</p>
42
- <p>The aim is to teach new coders the basic principles, to help them thrive in an increasingly digital
43
- world. CFL is primarily designed for and tested by primary school teachers. Our games are aligned
44
- with the UK's computing curriculum, so teachers can incorporate CFL into their lessons.</p>
45
- <p>Anyone looking to get into coding can also do so using the games and resources. We opened CFL
46
- resources to parents and the general public during the 2020 Covid-19 pandemic so that people
47
- don't need to be part of a school to have access.</p>
41
+ <p>Code for Life (CFL) is a free, easy-to-use resource that
42
+ provides teaching and lesson plans, user guides and
43
+ engagement through our fun coding games and resources.
44
+ These games are specially designed for people learning
45
+ computing for the first time.</p>
46
+ <p>The aim is to teach new coders the basic principles, to help
47
+ them thrive in an increasingly digital world. CFL is
48
+ primarily designed for and tested by primary school
49
+ teachers. Our games are aligned with the UK's computing
50
+ curriculum, so teachers can incorporate CFL into their
51
+ lessons.</p>
52
+ <p>But anyone looking to get into coding can also do so using
53
+ the games and resources.</p>
48
54
  </div>
49
55
  <div class="col-sm-6">
50
- <img title="What is Code for Life?" alt="What is Code for Life?" src="{% static 'portal/img/about_us_cfl.jpg' %}">
56
+ <img title="What is Code for Life?" alt="What is Code for Life?"
57
+ src="{% static 'portal/img/about_us_cfl.jpg' %}">
51
58
  </div>
52
59
  </div>
53
60
  </div>
@@ -55,20 +62,26 @@
55
62
  <div class="background container">
56
63
  <div class="row d-flex align-items-center">
57
64
  <div class="col-sm-6">
58
- <img title="Who is Ocado Group?" alt="Who is Ocado Group?" src="{% static 'portal/img/about_us_ocado.jpg' %}">
65
+ <img title="Who is Ocado Group?" alt="Who is Ocado Group?"
66
+ src="{% static 'portal/img/about_us_ocado.jpg' %}">
59
67
  </div>
60
68
  <div class="col-sm-6">
61
69
  <h5>Who is Ocado Group?</h5>
62
- <p>Ocado Group, the online grocery solutions provider, is powering the future of online retail. Ocado's
63
- tech and solutions are supplied to grocery businesses all around the world. It enables these
64
- forward-thinking retailers to do grocery online profitably, sustainably, and in a scalable manner.</p>
65
- <p>The Ocado Smart Platform (OSP) is the world's most advanced end-to-end e-Commerce, fulfilment and
66
- logistic platform.</p>
67
- <p><a target="_blank" href="https://www.ocadogroup.com/our-responsible-business/corporate-responsibility/skills-for-the-future">
68
- Skills for the Future</a> is one of Ocado Group's core Corporate Responsibility pillars, which is
69
- part of the Ocado Unlimited strategy (alongside Natural Resources and Responsible Sourcing). For Ocado
70
- Group, Skills for the Future means championing digital literacy. We want to inspire the next generation
71
- of STEM leaders, so that everyone can fully participate in society.</p>
70
+ <p>Ocado Group, the online grocery solutions provider, is powering
71
+ the future of online retail. Ocado's tech and solutions are
72
+ supplied to grocery businesses all around the world. It enables
73
+ these forward-thinking retailers to do grocery online
74
+ profitably, sustainably, and in a scalable manner.</p>
75
+ <p>The Ocado Smart Platform (OSP) is the world's most advanced
76
+ end-to-end e-Commerce, fulfilment and logistic platform.</p>
77
+ <p><a target="_blank" href="https://www.ocadogroup.com/sustainability/sustainability">
78
+ Our People and Skills for the Future</a> is one of Ocado Group's
79
+ core Sustainability pillars (alongside Environment and Natural
80
+ Resources and Platform Resilience and Innovation). For Ocado
81
+ Group, Our People and Skills for the Future means accelerating
82
+ the development of our people and championing digital literacy.
83
+ We want to inspire the next generation of STEM leaders, so that
84
+ everyone can fully participate in society.</p>
72
85
  </div>
73
86
  </div>
74
87
  </div>
@@ -79,21 +92,27 @@
79
92
  <div class="col-sm-6">
80
93
  <blockquote>
81
94
  <p class="says text--brand-primary">
82
- “We were delighted computing entered the UK curriculum in 2014. However, many teachers felt
83
- unprepared. And the lack of diversity in people studying STEM concerned us. So, we sought to
84
- make the subject appeal to a broader group of both students and teachers."
95
+ “We were delighted computing entered the UK curriculum
96
+ in 2014. However, many teachers felt unprepared. And the
97
+ lack of diversity in people studying STEM concerned us.
98
+ So, we sought to make the subject appeal to a broader
99
+ group of both students and teachers."
85
100
  </p>
86
101
  </blockquote>
87
- <p>Anne Marie Neatham, Commercial Director and COO Kindred, Ocado Group.</p>
102
+ <p>Anne Marie Neatham, Commercial Director and COO Kindred,
103
+ Ocado Group.</p>
88
104
  </div>
89
105
  <div class="col-sm-6">
90
- <p>With that in mind, CFL was developed by volunteers and interns from Ocado Technology - the
91
- technology arm of Ocado Group - and teacher Sharon Harrison, who created the Rapid Router learning
92
- materials. Anne Marie continues:</p>
106
+ <p>With that in mind, CFL was developed by volunteers and
107
+ interns from Ocado Technology - the technology arm of Ocado
108
+ Group - and teacher Sharon Harrison, who created the Rapid
109
+ Router learning materials. Anne Marie continues:</p>
93
110
  <blockquote>
94
111
  <p class="says text--brand-primary">
95
- “I'm proud this initiative has been breaking down stereotypes. Children are seeing that you
96
- don't have to fit a certain gender, race or personality type to get coding."
112
+ “I'm proud this initiative has been breaking down
113
+ stereotypes. Children are seeing that you don't have to
114
+ fit a certain gender, race or personality type to get
115
+ coding."
97
116
  </p>
98
117
  </blockquote>
99
118
  <p>Today, CFL is operated by a small core team and volunteers.</p>
@@ -107,29 +126,35 @@
107
126
  <div class="row">
108
127
  <div class="col-sm-6">
109
128
  <h5>Our team and volunteers</h5>
110
- <p>Code for Life would not have been possible without the time and skills volunteered by our talented
111
- developers and creatives at Ocado Technology. Thank you to everyone who has helped us get to where
112
- we are now.</p>
129
+ <p>Code for Life would not have been possible without the time and
130
+ skills volunteered by our talented developers and creatives at
131
+ Ocado Technology. Thank you to everyone who has helped us get to
132
+ where we are now.</p>
113
133
  <h5>Want to get involved?</h5>
114
- <p>We are open source, so anyone can ask to contribute. You can play with game-running JavaScript,
115
- Python/Django, animation using SVG and Raphael, and a lot more. We'd like input from all sorts of
116
- backgrounds, whether you're: a programmer looking for a creative outlet; a teacher hoping to shape
117
- the resources; or even a pupil putting your skills to the test.</p>
134
+ <p>We are open source, so anyone can ask to contribute. You can play
135
+ with game-running JavaScript, Python/Django, animation using SVG
136
+ and Raphael, and a lot more. We'd like input from all sorts of
137
+ backgrounds, whether you're: a programmer looking for a creative
138
+ outlet; a teacher hoping to shape the resources; or even a pupil
139
+ putting your skills to the test.</p>
118
140
  </div>
119
141
  <div class="col-sm-6">
120
142
  <h5>Developers</h5>
121
143
  <p>To contribute, head over to <a target="_blank" href="https://github.com/ocadotechnology/codeforlife-portal">GitHub</a>,
122
- check out the issue tracker, and get started. There you can suggest new features or assign yourself
123
- an issue to develop. You can find more info about how to do all these on our
144
+ check out the issue tracker, and get started. There you can
145
+ suggest new features or assign yourself an issue to develop. You
146
+ can find more info about how to do all these on our
124
147
  <a target="_blank" href="https://docs.codeforlife.education/">docs on Gitbook</a>.
125
148
  <h5>Teachers, parents, and creatives</h5>
126
- <p>Please get in touch through our <a class="freshdesk__contact-us">contact</a> form and let us know how
127
- you would like to get involved.</p>
128
- <p>We would like to thank our friends who have contributed to this initiative.</p>
149
+ <p>Please get in touch through our <a class="freshdesk__contact-us">contact</a>
150
+ form and let us know how you would like to get involved.</p>
151
+ <p>We would like to thank our friends who have contributed to this
152
+ initiative.</p>
129
153
  </div>
130
154
  </div>
131
155
  <section class="background">
132
- <h6>We would like to thank our friends who have contributed to this initiative</h6>
156
+ <h6>We would like to thank our friends who have contributed to this
157
+ initiative</h6>
133
158
  <div class="row image-row">
134
159
  <img title="10x" alt="10x logo" src="{% static 'portal/img/10x_logo.png' %}">
135
160
  <img title="BCS" alt="BCS logo" src="{% static 'portal/img/bcs_logo.png' %}">
@@ -140,10 +165,13 @@
140
165
  <img title="GLA" alt="GLA logo" src="{% static 'portal/img/gla_logo.png' %}">
141
166
  <img title="Pressure Cooker" alt="Pressure Cooker logo" src="{% static 'portal/img/pressure_cooker_logo.png' %}">
142
167
  </div>
143
- <p><small>10X, BCS Academy of Computing, Barefoot Computing, Computing at School, The National Museum of
144
- Computing, Imperial College London, M&C Saatchi, Alvaro Ramirez, Jason Fingland, Ramneet Loyall, Sharon
145
- Harrison, Keith Avery, Dale Coan, Rob Whitehouse, Mandy Nash, Tanya Nothard, Matt Trevor, Moy El-Bushra,
146
- Richard Siwiak, Peter Tondrow, Liz Pratt, Pressure Cooker Studios, GAL Education, Hope Education.</small></p>
168
+ <p><small>10X, BCS Academy of Computing, Barefoot Computing, Computing
169
+ at School, The National Museum of Computing, Imperial College
170
+ London, M&C Saatchi, Alvaro Ramirez, Jason Fingland, Ramneet Loyall,
171
+ Sharon Harrison, Keith Avery, Dale Coan, Rob Whitehouse, Mandy Nash,
172
+ Tanya Nothard, Matt Trevor, Moy El-Bushra, Richard Siwiak, Peter
173
+ Tondrow, Liz Pratt, Pressure Cooker Studios, GAL Education, Hope
174
+ Education.</small></p>
147
175
  </section>
148
176
  </div>
149
177
 
@@ -151,14 +179,18 @@
151
179
  <div class="container">
152
180
  <section>
153
181
  <h4>Dedicated to Sharon Harrison</h4>
154
- <img title="Sharon Harrison" alt="Sharon Harrison portrait" class="portrait" src="{% static 'portal/img/sharon_harrison.jpg' %}">
182
+ <img title="Sharon Harrison" alt="Sharon Harrison portrait"
183
+ class="portrait"
184
+ src="{% static 'portal/img/sharon_harrison.jpg' %}">
155
185
  <h5>1956 &mdash; 2015</h5>
156
186
  </section>
157
- <p><strong>Sharon was instrumental in helping to create Code for Life. At the beginning of 2014 she was
158
- recruited to act as our Educational Consultant. The project drew on her previous skills as a pioneering
187
+ <p><strong>Sharon was instrumental in helping to create Code for Life.
188
+ At the beginning of 2014 she was recruited to act as our Educational
189
+ Consultant. The project drew on her previous skills as a pioneering
159
190
  computing teacher and education consultant.</strong></p>
160
- <p>Sharon has left a lasting legacy by creating something which will help teach STEM skills to the next
161
- generation of computer scientists across the world.</p>
191
+ <p>Sharon has left a lasting legacy by creating something which will
192
+ help teach STEM skills to the next generation of computer scientists
193
+ across the world.</p>
162
194
  </div>
163
195
  </div>
164
196
  {% endblock content %}