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.
- cfl_common/common/__init__.py +1 -0
- cfl_common/common/app_settings.py +66 -0
- cfl_common/common/apps.py +6 -0
- cfl_common/common/context_processors.py +9 -0
- cfl_common/common/csp_config.py +85 -0
- cfl_common/common/helpers/__init__.py +0 -0
- cfl_common/common/helpers/data_migration_loader.py +42 -0
- cfl_common/common/helpers/emails.py +393 -0
- cfl_common/common/helpers/generators.py +52 -0
- cfl_common/common/helpers/organisation.py +10 -0
- cfl_common/common/mail.py +201 -0
- cfl_common/common/migrations/0001_initial.py +240 -0
- cfl_common/common/migrations/0002_emailverification.py +55 -0
- cfl_common/common/migrations/0003_aimmocharacter.py +31 -0
- cfl_common/common/migrations/0004_add_aimmocharacters.py +17 -0
- cfl_common/common/migrations/0005_add_worksheets.py +8 -0
- cfl_common/common/migrations/0006_update_aimmo_character_image_path.py +17 -0
- cfl_common/common/migrations/0007_add_pdf_names_to_first_two_worksheets.py +8 -0
- cfl_common/common/migrations/0008_unlock_worksheet_3.py +11 -0
- cfl_common/common/migrations/0009_add_blocked_time_to_teacher_and_student.py +24 -0
- cfl_common/common/migrations/0010_remove_teacher_title.py +18 -0
- cfl_common/common/migrations/0011_student_login_id.py +18 -0
- cfl_common/common/migrations/0012_usersession.py +39 -0
- cfl_common/common/migrations/0013_class_school.py +42 -0
- cfl_common/common/migrations/0014_login_type.py +29 -0
- cfl_common/common/migrations/0015_dailyactivity.py +31 -0
- cfl_common/common/migrations/0016_joinreleasestudent.py +42 -0
- cfl_common/common/migrations/0017_copy_email_to_username.py +18 -0
- cfl_common/common/migrations/0018_update_aimmo_character_image_path.py +15 -0
- cfl_common/common/migrations/0019_aimmocharacter_alt.py +16 -0
- cfl_common/common/migrations/0020_class_is_active_and_null_access_code.py +23 -0
- cfl_common/common/migrations/0021_school_is_active.py +28 -0
- cfl_common/common/migrations/0022_school_cleanup.py +29 -0
- cfl_common/common/migrations/0023_userprofile_aimmo_badges.py +22 -0
- cfl_common/common/migrations/0024_teacher_invited_by.py +25 -0
- cfl_common/common/migrations/0025_schoolteacherinvitation.py +47 -0
- cfl_common/common/migrations/0026_teacher_remove_join_request.py +22 -0
- cfl_common/common/migrations/0027_class_created_by.py +25 -0
- cfl_common/common/migrations/0028_coding_club_downloads.py +23 -0
- cfl_common/common/migrations/0029_dynamicelement.py +22 -0
- cfl_common/common/migrations/0030_add_maintenance_banner.py +25 -0
- cfl_common/common/migrations/0031_improve_admin_panel.py +56 -0
- cfl_common/common/migrations/0032_dailyactivity_level_control_submits.py +18 -0
- cfl_common/common/migrations/0033_password_reset_tracking_fields.py +23 -0
- cfl_common/common/migrations/0034_dailyactivity_daily_school_student_lockout_reset.py +18 -0
- cfl_common/common/migrations/0035_rename_lockout_fields.py +27 -0
- cfl_common/common/migrations/0036_rename_awaiting_email_verification_userprofile_is_verified.py +17 -0
- cfl_common/common/migrations/0037_migrate_email_verification.py +21 -0
- cfl_common/common/migrations/0038_delete_emailverification.py +16 -0
- cfl_common/common/migrations/0039_copy_email_to_username.py +18 -0
- cfl_common/common/migrations/0040_school_county.py +18 -0
- cfl_common/common/migrations/0041_populate_gb_counties.py +27 -0
- cfl_common/common/migrations/0042_totalactivity.py +25 -0
- cfl_common/common/migrations/0043_add_total_activity.py +30 -0
- cfl_common/common/migrations/0044_update_activity_models.py +33 -0
- cfl_common/common/migrations/0045_otp.py +23 -0
- cfl_common/common/migrations/0046_alter_school_country.py +19 -0
- cfl_common/common/migrations/0047_delete_school_postcode.py +16 -0
- cfl_common/common/migrations/0048_unique_school_names.py +42 -0
- cfl_common/common/migrations/0049_anonymise_orphan_users.py +29 -0
- cfl_common/common/migrations/0050_anonymise_orphan_schools.py +30 -0
- cfl_common/common/migrations/0051_verify_returning_users.py +26 -0
- cfl_common/common/migrations/0052_add_cse_fields.py +68 -0
- cfl_common/common/migrations/0053_clean_class_data.py +24 -0
- cfl_common/common/migrations/0054_delete_aimmo_models.py +20 -0
- cfl_common/common/migrations/0055_alter_schoolteacherinvitation_token.py +18 -0
- cfl_common/common/migrations/0056_set_non_school_teachers_as_non_admins.py +25 -0
- cfl_common/common/migrations/0057_teacher_teacher__is_admin.py +19 -0
- cfl_common/common/migrations/0058_userprofile_google_refresh_token_and_more.py +24 -0
- cfl_common/common/migrations/__init__.py +0 -0
- cfl_common/common/models.py +557 -0
- cfl_common/common/permissions.py +84 -0
- cfl_common/common/tests/__init__.py +0 -0
- cfl_common/common/tests/test_migration_anonymise_orphan_schools.py +30 -0
- cfl_common/common/tests/test_migration_anonymise_orphan_users.py +30 -0
- cfl_common/common/tests/test_migration_blocked_time.py +15 -0
- cfl_common/common/tests/test_migration_remove_teacher_title.py +13 -0
- cfl_common/common/tests/test_migration_unique_school_names.py +33 -0
- cfl_common/common/tests/test_migration_verify_returning_users.py +59 -0
- cfl_common/common/tests/test_models.py +87 -0
- cfl_common/common/tests/utils/__init__.py +0 -0
- cfl_common/common/tests/utils/classes.py +38 -0
- cfl_common/common/tests/utils/email.py +67 -0
- cfl_common/common/tests/utils/organisation.py +41 -0
- cfl_common/common/tests/utils/student.py +123 -0
- cfl_common/common/tests/utils/teacher.py +73 -0
- cfl_common/common/tests/utils/user.py +27 -0
- cfl_common/common/utils.py +56 -0
- cfl_common/setup.py +61 -0
- codeforlife_portal-8.9.9.dist-info/METADATA +226 -0
- {codeforlife_portal-5.32.2.dist-info → codeforlife_portal-8.9.9.dist-info}/RECORD +341 -238
- {codeforlife_portal-5.32.2.dist-info → codeforlife_portal-8.9.9.dist-info}/WHEEL +1 -1
- codeforlife_portal-8.9.9.dist-info/licenses/LICENSE.md +3 -0
- {codeforlife_portal-5.32.2.dist-info → codeforlife_portal-8.9.9.dist-info}/top_level.txt +1 -0
- deploy/middleware/maintenance.py +25 -0
- deploy/middleware/screentime_warning.py +29 -0
- deploy/middleware/security.py +5 -6
- deploy/middleware/session_timeout.py +31 -0
- deploy/middleware/tmp_basic_auth.py +41 -0
- example_project/portal_test_settings.py +239 -0
- example_project/settings.py +156 -17
- example_project/urls.py +5 -6
- portal/__init__.py +1 -1
- portal/admin.py +142 -29
- portal/app_settings.py +10 -7
- portal/forms/dotmailer.py +6 -4
- portal/forms/invite_teacher.py +19 -10
- portal/forms/organisation.py +137 -68
- portal/forms/play.py +53 -98
- portal/forms/registration.py +70 -164
- portal/forms/teach.py +147 -121
- portal/handlers.py +1 -2
- portal/helpers/decorators.py +30 -10
- portal/helpers/password.py +86 -47
- portal/helpers/ratelimit.py +32 -15
- portal/helpers/regexes.py +5 -0
- portal/helpers/request_handlers.py +10 -0
- portal/migrations/0044_auto_20150430_0959.py +6 -2
- portal/mixins/__init__.py +1 -0
- portal/mixins/cron_mixin.py +12 -0
- portal/permissions/__init__.py +1 -0
- portal/permissions/is_cron_request_from_google.py +14 -0
- portal/static/portal/img/10_years_anniversary.png +0 -0
- portal/static/portal/img/RR_logo_grass_background.png +0 -0
- portal/static/portal/img/coding_club_hero.jpg +0 -0
- portal/static/portal/img/coding_club_python_pack.png +0 -0
- portal/static/portal/img/facebook.png +0 -0
- portal/static/portal/img/gitbook.png +0 -0
- portal/static/portal/img/howe_dell_1.png +0 -0
- portal/static/portal/img/howe_dell_2.png +0 -0
- portal/static/portal/img/howe_dell_3.png +0 -0
- portal/static/portal/img/logo_cfl.png +0 -0
- portal/static/portal/img/logo_cfl_powered.svg +35 -0
- portal/static/portal/img/logo_cfl_reminder_cards.jpg +0 -0
- portal/static/portal/img/logo_ocado_group.png +0 -0
- portal/static/portal/img/logo_python_den.svg +21 -0
- portal/static/portal/img/long_europe_map.png +0 -0
- portal/static/portal/img/python_den.png +0 -0
- portal/static/portal/img/python_den_banner.svg +26 -0
- portal/static/portal/img/rapid_router_landing_hero.png +0 -0
- portal/static/portal/img/rr_advanced.png +0 -0
- portal/static/portal/img/ten_year_map_pin.svg +1 -0
- portal/static/portal/img/thumbnail_educate_rapid_router.png +0 -0
- portal/static/portal/img/thumbnail_educate_resources.png +0 -0
- portal/static/portal/img/thumbnail_play_rapid_router.png +0 -0
- portal/static/portal/img/thumbnail_python_den.png +0 -0
- portal/static/portal/img/twitter.png +0 -0
- portal/static/portal/js/carouselCards.js +25 -0
- portal/static/portal/js/common.js +96 -1
- portal/static/portal/js/independentLogin.js +16 -0
- portal/static/portal/js/independentRegistration.js +86 -0
- portal/static/portal/js/levelControl.js +77 -0
- portal/static/portal/js/lib/jquery.min.js +2 -0
- portal/static/portal/js/organisation_manage.js +142 -14
- portal/static/portal/js/passwordStrength.js +154 -64
- portal/static/portal/js/resetPassword.js +23 -0
- portal/static/portal/js/riveted.min.js +238 -239
- portal/static/portal/js/school.js +13 -0
- portal/static/portal/js/studentLogin.js +16 -0
- portal/static/portal/js/teacherEditStudent.js +23 -0
- portal/static/portal/js/teacherLogin.js +16 -0
- portal/static/portal/js/tenYearMap.js +14 -0
- portal/static/portal/sass/colorbox.scss +0 -1
- portal/static/portal/sass/modules/_colours.scss +1 -0
- portal/static/portal/sass/modules/_levels.scss +1 -1
- portal/static/portal/sass/modules/_mixins.scss +21 -0
- portal/static/portal/sass/partials/_banners.scss +4 -177
- portal/static/portal/sass/partials/_buttons.scss +12 -15
- portal/static/portal/sass/partials/_carousel.scss +129 -0
- portal/static/portal/sass/partials/_footer.scss +21 -22
- portal/static/portal/sass/partials/_forms.scss +60 -5
- portal/static/portal/sass/partials/_grids.scss +34 -61
- portal/static/portal/sass/partials/_header.scss +28 -20
- portal/static/portal/sass/partials/_images.scss +292 -39
- portal/static/portal/sass/partials/_popup.scss +18 -15
- portal/static/portal/sass/partials/_tables.scss +12 -20
- portal/static/portal/sass/partials/_text.scss +6 -10
- portal/static/portal/sass/styles.scss +0 -1
- portal/static/portal/video/code for life .pdf +0 -0
- portal/strings/about.py +5 -0
- portal/strings/coding_club.py +9 -0
- portal/strings/play.py +6 -5
- portal/strings/teach.py +1 -1
- portal/strings/teacher_resources.py +2 -8
- portal/strings/ten_year_map.py +13 -0
- portal/templates/403.html +2 -2
- portal/templates/404.html +1 -1
- portal/templates/500.html +2 -2
- portal/templates/{captcha → django_recaptcha}/includes/js_v2_invisible.html +3 -3
- portal/templates/{captcha → django_recaptcha}/widget_v2_invisible.html +2 -2
- portal/templates/email.html +4 -2
- portal/templates/maintenance.html +34 -0
- portal/templates/portal/about.html +94 -62
- portal/templates/portal/base.html +176 -152
- portal/templates/portal/coding_club.html +100 -0
- portal/templates/portal/contribute.html +56 -52
- portal/templates/portal/email_invitation_sent.html +1 -1
- portal/templates/portal/email_style_template.html +374 -0
- portal/templates/portal/email_verification_failed.html +1 -1
- portal/templates/portal/email_verification_needed.html +9 -9
- portal/templates/portal/form_shapes.html +20 -8
- portal/templates/portal/getinvolved.html +6 -6
- portal/templates/portal/home.html +35 -10
- portal/templates/portal/home_learning.html +19 -19
- portal/templates/portal/locked_out.html +0 -1
- portal/templates/portal/locked_out_school_student.html +16 -0
- portal/templates/portal/login/independent_student.html +31 -15
- portal/templates/portal/login/student.html +10 -7
- portal/templates/portal/login/student_class_code.html +7 -4
- portal/templates/portal/login/teacher.html +34 -17
- portal/templates/portal/partials/banner.html +18 -4
- portal/templates/portal/partials/benefits.html +1 -1
- portal/templates/portal/partials/card_list.html +34 -24
- portal/templates/portal/partials/character_list.html +5 -5
- portal/templates/portal/partials/cookie_list.html +161 -0
- portal/templates/portal/partials/delete_popup.html +18 -0
- portal/templates/portal/partials/footer.html +57 -26
- portal/templates/portal/partials/header.html +118 -117
- portal/templates/portal/partials/hero_card.html +4 -3
- portal/templates/portal/partials/info_popup.html +3 -3
- portal/templates/portal/partials/invite_admin_teacher.html +23 -0
- portal/templates/portal/partials/popup.html +7 -2
- portal/templates/portal/partials/register_newsletter_tickbox.html +2 -5
- portal/templates/portal/partials/screentime_popup.html +14 -0
- portal/templates/portal/partials/service_unavailable_popup.html +17 -0
- portal/templates/portal/partials/session_popup.html +19 -0
- portal/templates/portal/play/student_dashboard.html +42 -29
- portal/templates/portal/play/student_edit_account.html +64 -9
- portal/templates/portal/play.html +61 -41
- portal/templates/portal/privacy_notice.html +697 -0
- portal/templates/portal/register.html +122 -92
- portal/templates/portal/reset_password.html +20 -40
- portal/templates/portal/reset_password_confirm.html +9 -4
- portal/templates/portal/reset_password_email_sent.html +15 -13
- portal/templates/portal/teach/base_registering.html +1 -1
- portal/templates/portal/teach/class.html +4 -6
- portal/templates/portal/teach/dashboard.html +212 -117
- portal/templates/portal/teach/invited.html +90 -0
- portal/templates/portal/teach/onboarding_classes.html +5 -3
- portal/templates/portal/teach/onboarding_print.html +1 -1
- portal/templates/portal/teach/onboarding_school.html +26 -139
- portal/templates/portal/teach/onboarding_students.html +1 -1
- portal/templates/portal/teach/teacher_dismiss_students.html +73 -55
- portal/templates/portal/teach/teacher_edit_class.html +168 -11
- portal/templates/portal/teach/teacher_edit_student.html +12 -5
- portal/templates/portal/teach/teacher_move_all_classes.html +25 -38
- portal/templates/portal/teach/teacher_move_students_to_class.html +1 -1
- portal/templates/portal/teach.html +61 -42
- portal/templates/portal/ten_year_map.html +147 -0
- portal/templates/portal/terms.html +191 -42
- portal/templates/two_factor/core/login.html +71 -59
- portal/templates/two_factor/core/setup.html +58 -49
- portal/templates/two_factor/profile/disable.html +1 -1
- portal/templates/two_factor/profile/profile.html +35 -17
- portal/templatetags/app_tags.py +59 -84
- portal/templatetags/card_list_tags.py +0 -4
- portal/tests/base_test.py +14 -3
- portal/tests/conftest.py +0 -15
- portal/tests/migrations/test_migration_make_portaladmin_teacher.py +2 -6
- portal/tests/migrations/test_migration_preview_users.py +3 -9
- portal/tests/migrations/test_migration_remove_guardian.py +1 -3
- portal/tests/migrations/test_migration_use_common_models.py +2 -6
- portal/tests/migrations/test_migration_verify_portaladmin.py +1 -3
- portal/tests/pageObjects/portal/admin/admin_base_page.py +0 -21
- portal/tests/pageObjects/portal/base_page.py +16 -26
- portal/tests/pageObjects/portal/email_verification_needed_page.py +3 -2
- portal/tests/pageObjects/portal/game_page.py +12 -19
- portal/tests/pageObjects/portal/home_page.py +13 -15
- portal/tests/pageObjects/portal/independent_login_page.py +13 -17
- portal/tests/pageObjects/portal/password_reset_form_page.py +20 -4
- portal/tests/pageObjects/portal/password_reset_page.py +25 -0
- portal/tests/pageObjects/portal/play/account_page.py +18 -27
- portal/tests/pageObjects/portal/play/dashboard_page.py +4 -4
- portal/tests/pageObjects/portal/play/join_school_or_club_page.py +8 -10
- portal/tests/pageObjects/portal/play/play_base_page.py +5 -3
- portal/tests/pageObjects/portal/signup_page.py +28 -59
- portal/tests/pageObjects/portal/student_login_class_code.py +6 -9
- portal/tests/pageObjects/portal/student_login_page.py +6 -8
- portal/tests/pageObjects/portal/teach/add_independent_student_to_class_page.py +3 -3
- portal/tests/pageObjects/portal/teach/added_independent_student_to_class_page.py +3 -1
- portal/tests/pageObjects/portal/teach/class_page.py +36 -13
- portal/tests/pageObjects/portal/teach/dashboard_page.py +43 -84
- portal/tests/pageObjects/portal/teach/dismiss_students_page.py +7 -5
- portal/tests/pageObjects/portal/teach/edit_student_page.py +10 -8
- portal/tests/pageObjects/portal/teach/move_class_page.py +5 -10
- portal/tests/pageObjects/portal/teach/move_classes_page.py +4 -2
- portal/tests/pageObjects/portal/teach/move_students_disambiguate_page.py +4 -2
- portal/tests/pageObjects/portal/teach/move_students_page.py +6 -13
- portal/tests/pageObjects/portal/teach/onboarding_classes_page.py +5 -3
- portal/tests/pageObjects/portal/teach/onboarding_organisation_page.py +11 -49
- portal/tests/pageObjects/portal/teach/onboarding_student_list_page.py +7 -12
- portal/tests/pageObjects/portal/teach/onboarding_students_page.py +4 -27
- portal/tests/pageObjects/portal/teach/teach_base_page.py +6 -4
- portal/tests/pageObjects/portal/teacher_login_page.py +10 -16
- portal/tests/selenium_test_case.py +3 -43
- portal/tests/snapshots/snap_test_partials.py +11 -165
- portal/tests/test_2FA.py +15 -33
- portal/tests/test_admin.py +15 -97
- portal/tests/test_api.py +212 -73
- portal/tests/test_captcha_forms.py +2 -2
- portal/tests/test_class.py +374 -24
- portal/tests/test_emails.py +83 -20
- portal/tests/{test_newsletter_footer.py → test_global_forms.py} +5 -5
- portal/tests/test_helper_methods.py +30 -0
- portal/tests/test_independent_student.py +255 -144
- portal/tests/test_invite_teacher.py +318 -10
- portal/tests/test_middleware.py +138 -15
- portal/tests/test_organisation.py +78 -262
- portal/tests/test_partials.py +0 -88
- portal/tests/test_ratelimit.py +218 -36
- portal/tests/test_school_student.py +35 -40
- portal/tests/test_security.py +12 -31
- portal/tests/test_teacher.py +425 -325
- portal/tests/test_teacher_student.py +103 -91
- portal/tests/test_views.py +900 -76
- portal/tests/utils/classes.py +2 -2
- portal/tests/utils/messages.py +13 -28
- portal/urls.py +237 -164
- portal/views/admin.py +0 -332
- portal/views/api.py +82 -68
- portal/views/cron/__init__.py +1 -0
- portal/views/cron/user.py +322 -0
- portal/views/dotmailer.py +9 -1
- portal/views/email.py +33 -77
- portal/views/google_analytics.py +28 -0
- portal/views/home.py +126 -97
- portal/views/legal.py +13 -0
- portal/views/login/independent_student.py +5 -5
- portal/views/login/student.py +51 -14
- portal/views/login/teacher.py +2 -6
- portal/views/organisation.py +20 -189
- portal/views/registration.py +97 -17
- portal/views/student/edit_account_details.py +99 -72
- portal/views/student/play.py +81 -62
- portal/views/teacher/dashboard.py +421 -149
- portal/views/teacher/teach.py +226 -177
- portal/views/two_factor/__init__.py +0 -0
- portal/views/two_factor/core.py +28 -0
- portal/views/two_factor/form.py +7 -0
- portal/views/two_factor/profile.py +11 -0
- codeforlife_portal-5.32.2.dist-info/LICENSE.md +0 -577
- codeforlife_portal-5.32.2.dist-info/METADATA +0 -38
- deploy/permissions.py +0 -2
- example_project/manage.py +0 -10
- portal/autoconfig.py +0 -140
- portal/csp_config.py +0 -60
- portal/forms/add_game.py +0 -33
- portal/helpers/location.py +0 -121
- portal/static/portal/img/kurono_hero.jpg +0 -0
- portal/static/portal/img/kurono_landing_hero.png +0 -0
- portal/static/portal/img/kurono_logo.svg +0 -1
- portal/static/portal/img/kurono_logo_grey_background.svg +0 -1
- portal/static/portal/img/kurono_logo_mark.svg +0 -1
- portal/static/portal/img/kurono_resources_hero.jpg +0 -0
- portal/static/portal/img/kurono_story.png +0 -0
- portal/static/portal/img/ocado-swirl.svg +0 -22
- portal/static/portal/img/thumbnail_educate_kurono.png +0 -0
- portal/static/portal/img/thumbnail_educate_resources_and_progress_tracking.png +0 -0
- portal/static/portal/img/thumbnail_kurono_resources.png +0 -0
- portal/static/portal/img/thumbnail_play_kurono.png +0 -0
- portal/static/portal/img/x_close_video.png +0 -0
- portal/static/portal/js/aimmoGame.js +0 -106
- portal/static/portal/js/deleteWorkspaces.js +0 -14
- portal/static/portal/js/fuzzySchoolLookup.js +0 -46
- portal/static/portal/js/lib/jquery-3.5.1.min.js +0 -2
- portal/static/portal/js/lib/jquery-ui-1.12.1.min.js +0 -13
- portal/static/portal/sass/partials/_videos.scss +0 -10
- portal/static/portal/video/aimmo_play_now_background_video.mp4 +0 -0
- portal/strings/student_aimmo_dashboard.py +0 -6
- portal/templates/portal/admin/aggregated_data.html +0 -35
- portal/templates/portal/admin/map.html +0 -70
- portal/templates/portal/mouseflow.html +0 -9
- portal/templates/portal/partials/aimmo_games_table.html +0 -83
- portal/templates/portal/partials/register_over_required_age_tickbox.html +0 -9
- portal/templates/portal/play/independent_student_dashboard.html +0 -64
- portal/templates/portal/play/student_aimmo_dashboard.html +0 -63
- portal/templates/portal/privacy_policy.html +0 -483
- portal/templates/portal/reset_password_email.html +0 -9
- portal/templates/portal/teach/invite.html +0 -25
- portal/templates/portal/teach/teacher_aimmo_dashboard.html +0 -95
- portal/templates/portal/teach/teacher_resources.html +0 -68
- portal/templatetags/character_list_tags.py +0 -16
- portal/tests/pageObjects/portal/kurono_teacher_dashboard_page.py +0 -49
- portal/tests/pageObjects/portal/student_password_reset_form_page.py +0 -23
- portal/tests/pageObjects/portal/teach/onboarding_revoke_request_page.py +0 -20
- portal/tests/pageObjects/portal/teacher_password_reset_form_page.py +0 -23
- portal/tests/test_aimmo_dashboards.py +0 -172
- portal/tests/test_location.py +0 -217
- portal/tests/utils/aimmo_games.py +0 -30
- portal/views/aimmo/dashboard.py +0 -119
- portal/views/privacy_policy.py +0 -9
- portal/views/teacher/teacher_resources.py +0 -42
- {portal/views/aimmo → cfl_common}/__init__.py +0 -0
|
@@ -1,90 +1,70 @@
|
|
|
1
|
-
{% load
|
|
1
|
+
{% load static %}
|
|
2
2
|
{% load app_tags %}
|
|
3
|
-
|
|
4
3
|
{% load sekizai_tags %}
|
|
5
|
-
|
|
6
4
|
<!DOCTYPE html>
|
|
7
5
|
<html>
|
|
8
|
-
<head>
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
src="
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
<script type="text/javascript" src="{% static 'portal/js/sticky_subnav.js' %}"></script>
|
|
51
|
-
<script src="https://code.iconify.design/2/2.0.3/iconify.min.js"
|
|
52
|
-
integrity="sha256-pRhh6noOilGT8GyGitRuoRwdp5k1p8QJW2lvyGz4B9M="
|
|
53
|
-
crossorigin="anonymous"></script>
|
|
54
|
-
{% block check_user_status %}
|
|
55
|
-
<script>
|
|
6
|
+
<head>
|
|
7
|
+
{% render_block "css" %}
|
|
8
|
+
<title>
|
|
9
|
+
{% block title %}Code for Life{% endblock %}
|
|
10
|
+
</title>
|
|
11
|
+
<meta name="msapplication-config" content="none"/>
|
|
12
|
+
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
|
13
|
+
<script type="text/javascript" src="{% static 'portal/js/lib/jquery.min.js' %}"></script>
|
|
14
|
+
{% include "common/onetrust_cookies_consent_notice.html" %}
|
|
15
|
+
{% block head %}
|
|
16
|
+
{% endblock head %}
|
|
17
|
+
{% block css %}
|
|
18
|
+
<link href="{% static 'portal/css/portal.css' %}" type="text/css" rel="stylesheet">
|
|
19
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
20
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
21
|
+
<link href="https://fonts.googleapis.com/icon?family=Material+Icons+Outlined"
|
|
22
|
+
rel="stylesheet">
|
|
23
|
+
<link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@500&display=swap"
|
|
24
|
+
rel="stylesheet">
|
|
25
|
+
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap"
|
|
26
|
+
rel="stylesheet">
|
|
27
|
+
<link rel="shortcut icon"
|
|
28
|
+
href="{% static 'portal/img/favicon.ico' %}"
|
|
29
|
+
type="image/x-icon">
|
|
30
|
+
<link rel="icon"
|
|
31
|
+
href="{% static 'portal/img/favicon.ico' %}"
|
|
32
|
+
type="image/x-icon">
|
|
33
|
+
{% endblock css %}
|
|
34
|
+
{% include "portal/tag_manager/tag_manager_head.html" %}
|
|
35
|
+
<script type="text/javascript" src="{% static 'portal/js/lib/modernizr-build.js' %}"></script>
|
|
36
|
+
<script type="text/javascript" src="{% static 'portal/js/common.js' %}"></script>
|
|
37
|
+
<script type="text/javascript" src="{% static 'portal/js/jquery.placeholder.js' %}"></script>
|
|
38
|
+
<script type="text/javascript" src="{% static 'portal/js/lib/jquery.colorbox.js' %}"></script>
|
|
39
|
+
<script type="text/javascript" src="{% static 'portal/js/lib/papaparse.min.js' %}"></script>
|
|
40
|
+
<script type="text/javascript" src="{% static 'portal/js/sticky_subnav.js' %}"></script>
|
|
41
|
+
<script type="text/javascript" src="{% static 'portal/js/bootstrap.min.js' %}"></script>
|
|
42
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>
|
|
43
|
+
<script src="https://code.iconify.design/2/2.0.3/iconify.min.js"
|
|
44
|
+
integrity="sha256-pRhh6noOilGT8GyGitRuoRwdp5k1p8QJW2lvyGz4B9M="
|
|
45
|
+
crossorigin="anonymous"></script>
|
|
46
|
+
{% block check_user_status %}
|
|
47
|
+
<script>
|
|
56
48
|
// Set to 'TEACHER', 'SCHOOL_STUDENT', 'INDEPENDENT_STUDENT', or 'UNTRACKED'
|
|
57
49
|
USER_STATUS = '{{ user|get_user_status }}';
|
|
58
50
|
DEVELOPER = '{{ user|is_developer }}' === 'True';
|
|
59
51
|
BETA = '{{ request|has_beta_access }}' === 'True';
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
ga('send', {
|
|
77
|
-
hitType: 'event',
|
|
78
|
-
eventCategory: category_name,
|
|
79
|
-
eventAction: action,
|
|
80
|
-
eventLabel: label_name
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
</script>
|
|
84
|
-
|
|
85
|
-
<script src="/static/portal/js/riveted.min.js"></script>
|
|
86
|
-
<script>riveted.init();</script>
|
|
87
|
-
<script>
|
|
52
|
+
</script>
|
|
53
|
+
{% endblock check_user_status %}
|
|
54
|
+
{% block google_analytics %}
|
|
55
|
+
{% if request|is_production %}
|
|
56
|
+
<!-- Google tag (gtag.js) -->
|
|
57
|
+
<script async src="https://www.googletagmanager.com/gtag/js?id=G-R81N6YZYT7"></script>
|
|
58
|
+
<script>
|
|
59
|
+
window.dataLayer = window.dataLayer || [];
|
|
60
|
+
function gtag(){dataLayer.push(arguments);}
|
|
61
|
+
gtag('js', new Date());
|
|
62
|
+
|
|
63
|
+
gtag('config', 'G-R81N6YZYT7');
|
|
64
|
+
</script>
|
|
65
|
+
<script src="/static/portal/js/riveted.min.js"></script>
|
|
66
|
+
<script>riveted.init();</script>
|
|
67
|
+
<script>
|
|
88
68
|
function send_event(name_of_file, action){
|
|
89
69
|
ga('send', {
|
|
90
70
|
hitType: 'event',
|
|
@@ -93,81 +73,89 @@
|
|
|
93
73
|
eventLabel: name_of_file
|
|
94
74
|
});
|
|
95
75
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
</head>
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
{%
|
|
103
|
-
|
|
104
|
-
{%
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
76
|
+
</script>
|
|
77
|
+
{% endif %}
|
|
78
|
+
{% endblock google_analytics %}
|
|
79
|
+
</head>
|
|
80
|
+
<body id="top">
|
|
81
|
+
{% include "portal/tag_manager/tag_manager_body.html" %}
|
|
82
|
+
{% render_block "js" %}
|
|
83
|
+
<div class="content-footer-wrapper">
|
|
84
|
+
{% block contentWrapper %}
|
|
85
|
+
<div {% block pageID %}id="contentWrapper"{% endblock %}>
|
|
86
|
+
{% block topBar %}
|
|
87
|
+
{% include 'portal/partials/header.html' %}
|
|
88
|
+
{% endblock topBar %}
|
|
89
|
+
{% block subNav %}
|
|
90
|
+
{% endblock subNav %}
|
|
91
|
+
<div id="messages">
|
|
92
|
+
{% if messages %}
|
|
93
|
+
<div class="sub-nav--message">
|
|
94
|
+
{% for message in messages %}
|
|
95
|
+
<div class="sub-nav {{ message.tags }}">
|
|
96
|
+
<div class="container">
|
|
97
|
+
<div class="row">
|
|
98
|
+
<div class="d-flex col-sm-12 align-items-center">
|
|
99
|
+
{% if 'error' in message.tags or 'warning' in message.tags %}
|
|
100
|
+
<span class="material-icons-outlined md-32">error</span>
|
|
101
|
+
{% else %}
|
|
102
|
+
<span class="material-icons-outlined md-32">info</span>
|
|
103
|
+
{% endif %}
|
|
104
|
+
<p class="flex-grow-1">
|
|
105
|
+
{% if 'safe' in message.tags %}
|
|
106
|
+
{{ message|safe }}
|
|
107
|
+
{% else %}
|
|
108
|
+
{{ message }}
|
|
109
|
+
{% endif %}
|
|
110
|
+
</p>
|
|
111
|
+
<a class="x-icon"><span class="sr-only">Close</span> <span class="iconify" data-icon="mdi:close"></span></a>
|
|
112
|
+
</div>
|
|
113
|
+
</div>
|
|
114
|
+
</div>
|
|
115
|
+
</div>
|
|
116
|
+
{% endfor %}
|
|
132
117
|
</div>
|
|
133
|
-
|
|
118
|
+
{% endif %}
|
|
134
119
|
</div>
|
|
135
|
-
|
|
136
|
-
{% endfor %}
|
|
137
|
-
</div>
|
|
138
|
-
{% endif %}
|
|
139
|
-
</div>
|
|
140
|
-
<!--[if lt IE 10]>
|
|
120
|
+
<!--[if lt IE 10]>
|
|
141
121
|
<ul class="messages">
|
|
142
122
|
<li class="error">You appear to be using an old version of Internet Explorer. You will be unable to play Rapid Router, unless you upgrade to Internet Explorer 10, or consider using another browser.</li>
|
|
143
123
|
</ul>
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
124
|
+
<![endif]-->
|
|
125
|
+
{% block contentDiv %}
|
|
126
|
+
<div class="content">
|
|
127
|
+
{% block content %}
|
|
128
|
+
{% block base_new_content %}{% endblock %}
|
|
129
|
+
{% endblock content %}
|
|
130
|
+
</div>
|
|
131
|
+
{% endblock contentDiv %}
|
|
132
|
+
<div class="push"></div>
|
|
133
|
+
</div>
|
|
134
|
+
{% endblock contentWrapper %}
|
|
135
|
+
{% if request.session.screentime_warning_timeout %}
|
|
136
|
+
{% include "portal/partials/screentime_popup.html" %}
|
|
137
|
+
<script>setTimeout(showScreentimePopup, {{ request.session.screentime_warning_timeout }});</script>
|
|
138
|
+
{% endif %}
|
|
139
|
+
{% if request.session.last_request %}
|
|
140
|
+
{% include "portal/partials/session_popup.html" %}
|
|
141
|
+
<script>
|
|
142
|
+
// showing the popup after 28 minutes so it adds up to 30 minutes with the 2 minute countdown
|
|
143
|
+
setTimeout(showSessionPopup, 1680000);
|
|
144
|
+
</script>
|
|
145
|
+
{% endif %}
|
|
146
|
+
{% block footer %}
|
|
147
|
+
{% include 'portal/partials/footer.html' %}
|
|
148
|
+
{% endblock footer %}
|
|
153
149
|
</div>
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
</div>
|
|
158
|
-
{% endblock contentWrapper %}
|
|
159
|
-
|
|
160
|
-
{% block footer %}
|
|
161
|
-
{% include 'portal/partials/footer.html' %}
|
|
162
|
-
{% endblock footer %}
|
|
163
|
-
</div>
|
|
164
|
-
|
|
165
|
-
<div id="confirmation-dialog" title=""></div>
|
|
166
|
-
|
|
167
|
-
{% block scripts %}
|
|
168
|
-
<script>
|
|
150
|
+
<div id="confirmation-dialog" title=""></div>
|
|
151
|
+
{% block scripts %}
|
|
152
|
+
<script>
|
|
169
153
|
let bannerHeight;
|
|
170
154
|
|
|
155
|
+
// store current hash, then remove it so the page doesn't jump to the section
|
|
156
|
+
const currentHash = window.location.hash
|
|
157
|
+
window.location.hash = ''
|
|
158
|
+
|
|
171
159
|
$(function() {
|
|
172
160
|
$('input, textarea').placeholder();
|
|
173
161
|
});
|
|
@@ -210,21 +198,57 @@
|
|
|
210
198
|
});
|
|
211
199
|
}
|
|
212
200
|
|
|
201
|
+
function updateLocationHash(hash) {
|
|
202
|
+
// using replaceState as changing hash directly will scroll to element
|
|
203
|
+
history.replaceState({}, '', hash)
|
|
204
|
+
}
|
|
205
|
+
|
|
213
206
|
$(document).ready(function() {
|
|
214
207
|
bannerHeight = $('.sticky-subnav').height();
|
|
215
208
|
if(!bannerHeight) {
|
|
216
209
|
bannerHeight = $('.menu').height() * 1.25
|
|
217
210
|
}
|
|
218
211
|
animateScroll(bannerHeight);
|
|
212
|
+
|
|
213
|
+
// select the tab based on the current location hash
|
|
214
|
+
const tabs = $('.sub-nav [data-toggle="tab"]')
|
|
215
|
+
const tabNames = tabs.map((index, element) => $(element).attr('href')).toArray()
|
|
216
|
+
const currentTabIndex = tabNames.indexOf(currentHash)
|
|
217
|
+
if (currentTabIndex < 0) {
|
|
218
|
+
updateLocationHash(tabNames[0])
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
updateLocationHash(tabNames[currentTabIndex])
|
|
222
|
+
tabs[currentTabIndex].click()
|
|
223
|
+
animate($(tabNames[currentTabIndex]).offset().top - bannerHeight)
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// make each tab update the current location hash on click
|
|
227
|
+
tabs.on('shown.bs.tab', (event) => {
|
|
228
|
+
updateLocationHash(event.target.hash)
|
|
229
|
+
window.scrollTo(0, 0)
|
|
230
|
+
})
|
|
219
231
|
});
|
|
220
|
-
</script>
|
|
221
|
-
{% include "common/freshdesk_widget.html" %}
|
|
222
|
-
<script>
|
|
232
|
+
</script>
|
|
233
|
+
{% include "common/freshdesk_widget.html" %}
|
|
234
|
+
<script>
|
|
223
235
|
FreshworksWidget('hide');
|
|
224
236
|
$('.freshdesk__contact-us').on('click', function() {
|
|
225
237
|
FreshworksWidget('open');
|
|
226
238
|
});
|
|
227
|
-
</script>
|
|
228
|
-
|
|
229
|
-
|
|
239
|
+
</script>
|
|
240
|
+
<script>
|
|
241
|
+
// disable newsletter signup button by default
|
|
242
|
+
const newsletterSubmitButton = $('#submit_newsletter');
|
|
243
|
+
newsletterSubmitButton.addClass("disabled");
|
|
244
|
+
newsletterSubmitButton.prop("disabled", true);
|
|
245
|
+
|
|
246
|
+
// enable them or disable it depending on age verification checkbox
|
|
247
|
+
$('#id_age_verification').on("click", function() {
|
|
248
|
+
newsletterSubmitButton.prop("disabled", !this.checked);
|
|
249
|
+
newsletterSubmitButton.toggleClass("disabled", !this.checked);
|
|
250
|
+
});
|
|
251
|
+
</script>
|
|
252
|
+
{% endblock scripts %}
|
|
253
|
+
</body>
|
|
230
254
|
</html>
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
{% extends 'portal/base.html' %}
|
|
2
|
+
{% load static %}
|
|
3
|
+
{% load app_tags %}
|
|
4
|
+
{% load banner_tags %}
|
|
5
|
+
|
|
6
|
+
{% block content %}
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
{% banner banner_name="BANNER" %}
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
<div class="background container">
|
|
13
|
+
<section>
|
|
14
|
+
<h4>Who are the club packs aimed at?</h4>
|
|
15
|
+
</section>
|
|
16
|
+
<div class="row">
|
|
17
|
+
<div class="col-sm-12">
|
|
18
|
+
<p>
|
|
19
|
+
The FREE resource packs are aimed at two different groups, the first is aimed at students ages
|
|
20
|
+
between 7-11yrs with an interest in learning Python. The second pack is aimed at students 12yrs
|
|
21
|
+
and up, including adults. This moves at a much faster pace and also introduces students to
|
|
22
|
+
setting up an environment on their own computer.
|
|
23
|
+
</p>
|
|
24
|
+
<p>
|
|
25
|
+
Both packs are a condensed learning pathway using our game Rapid Router alongside suggested
|
|
26
|
+
session plan and slides.
|
|
27
|
+
</p>
|
|
28
|
+
</div>
|
|
29
|
+
</div>
|
|
30
|
+
</div>
|
|
31
|
+
|
|
32
|
+
<div class="background background--primary">
|
|
33
|
+
<div class="container">
|
|
34
|
+
<div class="row d-flex">
|
|
35
|
+
<div class="col-sm-6 d-flex flex-column">
|
|
36
|
+
<div class="flex-grow-1">
|
|
37
|
+
<h4 class="mt-0">Primary coding club</h4>
|
|
38
|
+
<p>
|
|
39
|
+
Download your FREE coding club pack for students aged 7-11. This pack introduces
|
|
40
|
+
students to the first principles of Python at a faster pace than the regular lesson
|
|
41
|
+
plans. It is aimed at students already interested in learning coding and can be used in clubs,
|
|
42
|
+
at home or in school, on or offline.
|
|
43
|
+
</div>
|
|
44
|
+
<div>
|
|
45
|
+
{% if user|is_logged_in_as_teacher %}
|
|
46
|
+
<a id="primary_pack" target="_blank" type="submit" class="button button--primary button--icon" href="https://code-for-life.gitbook.io/teaching-resources/code-club-resources-primary/">
|
|
47
|
+
Get started with our Primary coding club pack<span class="iconify" data-icon="mdi:open-in-new"></span>
|
|
48
|
+
</a>
|
|
49
|
+
{% else %}
|
|
50
|
+
<a id="primary_pack" target="_blank" type="submit" class="button button--primary button--icon" href="https://code-for-life.gitbook.io/code-for-life-primary-club-resources">
|
|
51
|
+
View Primary coding club pack<span class="iconify" data-icon="mdi:open-in-new"></span>
|
|
52
|
+
</a>
|
|
53
|
+
{% endif %}
|
|
54
|
+
</div>
|
|
55
|
+
</div>
|
|
56
|
+
<div class="col-sm-6 d-flex flex-column">
|
|
57
|
+
<div class="flex-grow-1">
|
|
58
|
+
<img title="Primary coding club" alt="Primary coding club" src="{% static 'portal/img/about_us_cfl.jpg' %}">
|
|
59
|
+
</div>
|
|
60
|
+
</div>
|
|
61
|
+
</div>
|
|
62
|
+
</div>
|
|
63
|
+
</div>
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
<div class="background">
|
|
67
|
+
<div class="container">
|
|
68
|
+
<div class="row d-flex">
|
|
69
|
+
<div class="col-sm-6 d-flex flex-column">
|
|
70
|
+
<div class="flex-grow-1">
|
|
71
|
+
<img title="Python coding club" alt="Python coding club" src="{% static 'portal/img/coding_club_python_pack.png' %}">
|
|
72
|
+
</div>
|
|
73
|
+
</div>
|
|
74
|
+
<div class="col-sm-6 d-flex flex-column">
|
|
75
|
+
<div class="flex-grow-1">
|
|
76
|
+
<h4 class="mt-0">Python coding club</h4>
|
|
77
|
+
<p>
|
|
78
|
+
Download your FREE coding club pack for students aged 12 and above.
|
|
79
|
+
This pack is a fast-paced introduction to Python. It is aimed at students already interested
|
|
80
|
+
in learning coding, individuals looking to learn and run their own club, or adults wanting to
|
|
81
|
+
try coding out. It is designed to be used in face-to-face or online clubs.
|
|
82
|
+
</p>
|
|
83
|
+
</div>
|
|
84
|
+
<div>
|
|
85
|
+
{% if user|is_logged_in_as_teacher %}
|
|
86
|
+
<a id="python_pack" target="_blank" type="submit" class="button button--primary button--icon" href="https://code-for-life.gitbook.io/teaching-resources/rapid-introduction-to-python-code-club">
|
|
87
|
+
Get started with our Python coding club packs<span class="iconify" data-icon="mdi:open-in-new"></span>
|
|
88
|
+
</a>
|
|
89
|
+
{% else %}
|
|
90
|
+
<a id="python_pack" target="_blank" type="submit" class="button button--primary button--icon" href="https://code-for-life.gitbook.io/code-for-life-python-club-resources">
|
|
91
|
+
View Python coding club packs<span class="iconify" data-icon="mdi:open-in-new"></span>
|
|
92
|
+
</a>
|
|
93
|
+
{% endif %}
|
|
94
|
+
</div>
|
|
95
|
+
</div>
|
|
96
|
+
</div>
|
|
97
|
+
</div>
|
|
98
|
+
</div>
|
|
99
|
+
|
|
100
|
+
{% endblock content %}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{% extends 'portal/base.html' %}
|
|
2
|
-
{% load
|
|
2
|
+
{% load static %}
|
|
3
3
|
{% load app_tags %}
|
|
4
4
|
{% load banner_tags %}
|
|
5
5
|
|
|
@@ -10,60 +10,60 @@
|
|
|
10
10
|
{% block content %}
|
|
11
11
|
<div class="background container">
|
|
12
12
|
<section>
|
|
13
|
-
<
|
|
13
|
+
<h3>How to get involved and gain experience</h3>
|
|
14
14
|
</section>
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
principles and programming foundations
|
|
21
|
-
</p>
|
|
22
|
-
</div>
|
|
23
|
-
<div class="col-sm-6">
|
|
24
|
-
<p>Recognising a need to support teachers and students in navigating the uncharted territory,
|
|
25
|
-
Ocado Technology deployed an army of internal volunteers who worked after hours, fuelled by
|
|
26
|
-
free pizzas and fizzy drinks.
|
|
27
|
-
</p>
|
|
28
|
-
<p>What came out of this, is what you see today, used by educators and learners from over 150
|
|
29
|
-
countries. Our products are open-source and free forever.
|
|
30
|
-
</p>
|
|
31
|
-
</div>
|
|
15
|
+
<div class="row">
|
|
16
|
+
<div class="col-sm-6">
|
|
17
|
+
<p>Code for Life would not have been possible without the dedication
|
|
18
|
+
of our volunteers.</p>
|
|
19
|
+
<p>In 2014, computing was added to the UK curriculum, requiring
|
|
20
|
+
schools to teach coding principles and programming foundations.</p>
|
|
32
21
|
</div>
|
|
33
|
-
<div class="
|
|
34
|
-
<a
|
|
35
|
-
|
|
36
|
-
|
|
22
|
+
<div class="col-sm-6">
|
|
23
|
+
<p>Recognising a need to support teachers and students in navigating
|
|
24
|
+
the uncharted territory, Ocado Technology deployed an army of
|
|
25
|
+
internal volunteers who worked after hours, fuelled by free
|
|
26
|
+
pizzas and fizzy drinks.</p>
|
|
27
|
+
<p>What came out of this, is what you see today, used by educators
|
|
28
|
+
and learners from over 180 countries. Our products are
|
|
29
|
+
open-source and free forever.</p>
|
|
37
30
|
</div>
|
|
38
31
|
</div>
|
|
32
|
+
<div class="text-right">
|
|
33
|
+
<a href="https://docs.codeforlife.education/" target="_blank"
|
|
34
|
+
class="button button--primary button-right-arrow">
|
|
35
|
+
Read our developer guide
|
|
36
|
+
</a>
|
|
37
|
+
</div>
|
|
39
38
|
</div>
|
|
40
39
|
|
|
41
40
|
<div class="background background--primary">
|
|
42
|
-
<div class="
|
|
43
|
-
<div class="
|
|
44
|
-
<div class="col-
|
|
41
|
+
<div class="container">
|
|
42
|
+
<div class="row d-flex flex-column-reverse flex-md-row">
|
|
43
|
+
<div class="col-12 col-md-6 order-1 order-md-0">
|
|
45
44
|
<h4>Our products</h4>
|
|
46
45
|
|
|
47
|
-
<p><b>The
|
|
48
|
-
<p>This is the gateway for users to get to know who we are and
|
|
49
|
-
|
|
50
|
-
|
|
46
|
+
<p><b>The website</b></p>
|
|
47
|
+
<p>This is the gateway for users to get to know who we are and
|
|
48
|
+
what we do. It hosts our web-based games and plenty of
|
|
49
|
+
teaching resources, and the teacher dashboard for class
|
|
50
|
+
management.</p>
|
|
51
51
|
|
|
52
52
|
<p><b>Rapid Router</b></p>
|
|
53
|
-
<p>An introduction to coding that is aimed at
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
</p>
|
|
53
|
+
<p>An introduction to coding that is aimed at ages 5 to 14.
|
|
54
|
+
Built on Blockly, it's a visual programming language similar
|
|
55
|
+
to Scratch. Rapid Router is our flagship game with the
|
|
56
|
+
biggest user base.</p>
|
|
58
57
|
|
|
59
|
-
<p><b>
|
|
60
|
-
<p>
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
58
|
+
<p><b>Python Den</b></p>
|
|
59
|
+
<p>Our new Python Den uses Blockly, Blockly/Python split
|
|
60
|
+
screen, and an IDE. It takes students from no previous
|
|
61
|
+
Python experience to a foundation in Python, helping
|
|
62
|
+
prepare them for GCSE and beyond.</p>
|
|
64
63
|
</div>
|
|
65
|
-
<div class="col-
|
|
66
|
-
<img title="Rapid Router" alt="Rapid Router"
|
|
64
|
+
<div class="col-12 col-md-6 order-0 order-md-1">
|
|
65
|
+
<img title="Rapid Router" alt="Rapid Router"
|
|
66
|
+
src="{% static 'portal/img/rapidrouter.png' %}" class="img-fluid">
|
|
67
67
|
</div>
|
|
68
68
|
</div>
|
|
69
69
|
</div>
|
|
@@ -72,20 +72,24 @@
|
|
|
72
72
|
<div class="background container">
|
|
73
73
|
<div class="row">
|
|
74
74
|
<div class="col-sm-6 bg-image">
|
|
75
|
-
<img title="Gitbook" alt="Gitbook"
|
|
75
|
+
<img title="Gitbook" alt="Gitbook"
|
|
76
|
+
src="{% static 'portal/img/gitbook.png' %}" class="img-border">
|
|
76
77
|
</div>
|
|
77
78
|
<div class="col-sm-6">
|
|
78
79
|
<h4>How you can contribute</h4>
|
|
79
|
-
<p>Today, there is a small dedicated team working full
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
80
|
+
<p>Today, there is a small dedicated team working full-time on Code
|
|
81
|
+
for Life. Our community, made up of dedicated teachers, tutors,
|
|
82
|
+
students, and volunteers, has played a vital part in Code For
|
|
83
|
+
Life's growth. The resources and games are aligned to the UK
|
|
84
|
+
National Curriculum and have reached over 260,000 active users
|
|
85
|
+
across 180 countries, and over 660,000 users since the launch in
|
|
86
|
+
2014. We need your help to grow even more.</p>
|
|
87
|
+
<p>If contributing to open-source projects to support education in
|
|
88
|
+
coding and technology sounds exciting for you, we'd love to have
|
|
89
|
+
you on board!</p>
|
|
87
90
|
<div class="text-right">
|
|
88
|
-
<a href="https://docs.codeforlife.education/" target="_blank"
|
|
91
|
+
<a href="https://docs.codeforlife.education/" target="_blank"
|
|
92
|
+
class="button button--primary button-right-arrow">
|
|
89
93
|
Read our developer guide
|
|
90
94
|
</a>
|
|
91
95
|
</div>
|