codeforlife-portal 6.42.0__tar.gz → 6.43.1__tar.gz
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.
Potentially problematic release.
This version of codeforlife-portal might be problematic. Click here for more details.
- {codeforlife-portal-6.42.0/codeforlife_portal.egg-info → codeforlife-portal-6.43.1}/PKG-INFO +1 -1
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1/codeforlife_portal.egg-info}/PKG-INFO +1 -1
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/codeforlife_portal.egg-info/requires.txt +1 -1
- codeforlife-portal-6.43.1/portal/__init__.py +1 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/test_api.py +93 -26
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/test_organisation.py +5 -3
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/views/login/student.py +32 -11
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/views/teacher/dashboard.py +56 -32
- codeforlife-portal-6.42.0/portal/__init__.py +0 -1
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/LICENSE.md +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/MANIFEST.in +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/README.md +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/codeforlife_portal.egg-info/SOURCES.txt +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/codeforlife_portal.egg-info/dependency_links.txt +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/codeforlife_portal.egg-info/not-zip-safe +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/codeforlife_portal.egg-info/top_level.txt +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/deploy/__init__.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/deploy/captcha.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/deploy/middleware/__init__.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/deploy/middleware/admin_access.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/deploy/middleware/basicauth.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/deploy/middleware/exceptionlogging.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/deploy/middleware/screentime_warning.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/deploy/middleware/security.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/deploy/middleware/session_timeout.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/deploy/static/apple-touch-icon-120x120.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/deploy/static/apple-touch-icon-152x152.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/deploy/static/apple-touch-icon-180x180.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/deploy/static/apple-touch-icon-76x76.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/deploy/static/apple-touch-icon.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/deploy/static/robots.txt +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/deploy/templates/deploy/csrf_failure.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/deploy/views.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/admin.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/app_settings.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/backends.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/beta.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/context_processors.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/forms/__init__.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/forms/add_game.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/forms/admin.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/forms/dotmailer.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/forms/error_messages.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/forms/invite_teacher.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/forms/organisation.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/forms/play.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/forms/registration.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/forms/teach.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/handlers.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/helpers/__init__.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/helpers/captcha.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/helpers/decorators.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/helpers/password.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/helpers/ratelimit.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/helpers/regexes.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/helpers/request_handlers.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/migrations/0001_squashed_0041_new_news.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/migrations/0042_school_country.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/migrations/0043_auto_20150430_0952.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/migrations/0044_auto_20150430_0959.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/migrations/0045_auto_20150430_1446.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/migrations/0046_auto_20150723_1101.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/migrations/0047_remove_userprofile_avatar.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/migrations/0048_plural_management_frontnews.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/migrations/0049_refactor_emailverifications.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/migrations/0050_refactor_emailverifications_2.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/migrations/0051_add_missing_ev_records.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/migrations/0052_refactor_emailverifications_3.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/migrations/0053_refactor_teacher_student_1.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/migrations/0054_pending_join_request_can_be_blank.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/migrations/0055_add_preview_user.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/migrations/0056_remove_preview_user.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/migrations/0057_delete_frontpagenews.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/migrations/0058_move_to_common_models.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/migrations/0059_move_email_verifications_to_common.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/migrations/0060_delete_guardian.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/migrations/0061_make_portaladmin_teacher.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/migrations/0062_verify_portaladmin.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/migrations/__init__.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/mixins/__init__.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/mixins/cron_mixin.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/models.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/permissions/__init__.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/permissions/is_cron_request_from_google.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/pipeline_compilers/__init__.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/pipeline_compilers/libsass_compiler.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/fonts/bootstrap/glyphicons-halflings-regular.eot +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/fonts/bootstrap/glyphicons-halflings-regular.svg +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/fonts/bootstrap/glyphicons-halflings-regular.ttf +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/fonts/bootstrap/glyphicons-halflings-regular.woff +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/fonts/bootstrap/glyphicons-halflings-regular.woff2 +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/10_years_anniversary.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/10x_logo.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/RR_logo_grass_background.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/RR_logo_green.svg +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/RR_logo_simple.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/about_us_cfl.jpg +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/about_us_hero.jpg +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/about_us_ocado.jpg +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/barefoot_logo.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/bcs_logo.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/clubs.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/coding_club_hero.jpg +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/coding_club_python_pack.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/colorboxImages/border.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/colorboxImages/controls.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/colorboxImages/loading.gif +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/colorboxImages/loading_background.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/colorboxImages/overlay.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/confirmation_tick.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/cross.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/dee.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/facebook.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/favicon.ico +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/get_involved_hero.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/gitbook.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/gitbook_space.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/github.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/github_hero.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/gla_logo.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/hamburger.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/help_and_support_hero.jpg +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/home_educate.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/home_educate_hero.jpg +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/home_learning_hero.jpg +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/home_play.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/home_play_hero.jpg +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/hope_logo.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/icl_logo.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/icon_controller.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/icon_free.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/icon_globe.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/icon_piechart.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/icon_step_by_step.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/icon_tracking.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/icon_uk_flag.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/kirsty.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/kurono_hero.jpg +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/kurono_landing_hero.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/kurono_logo.svg +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/kurono_logo_grey_background.svg +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/kurono_logo_mark.svg +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/kurono_resources_hero.jpg +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/kurono_story.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/logo_cfl.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/logo_cfl_reminder_cards.jpg +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/logo_cfl_white_landscape.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/logo_ocado.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/logo_ocado_group.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/logo_ocado_group.svg +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/logo_ocado_group_white.svg +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/mc_saatchi_logo.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/nigel.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/ocado-swirl.svg +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/oval_blue.svg +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/oval_pink.svg +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/oval_yellow.svg +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/paper_plane.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/phil.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/polygon_blue.svg +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/polygon_pink.svg +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/polygon_yellow.svg +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/pressure_cooker_logo.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/rapid_router.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/rapid_router_landing_hero.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/rapidrouter.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/resources_hero.jpg +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/resources_montage.jpg +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/reuben.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/rob.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/rr_advanced.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/rr_beginner.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/rr_intermediate.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/sadface.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/sharon_harrison.jpg +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/sian.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/teaching_resources_hero.jpg +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/thumbnail_educate_kurono.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/thumbnail_educate_rapid_router.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/thumbnail_educate_resources.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/thumbnail_intro_c4l.jpg +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/thumbnail_kurono_resources.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/thumbnail_play_kurono.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/thumbnail_play_rapid_router.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/twitter.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/universities.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/wes.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/img/x_close_video.png +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/js/aimmoGame.js +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/js/bootstrap.min.js +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/js/carouselCards.js +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/js/common.js +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/js/independentLogin.js +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/js/independentRegistration.js +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/js/join_create_game_toggle.js +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/js/jquery.placeholder.js +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/js/levelControl.js +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/js/lib/jquery-video-lightning.js +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/js/lib/jquery.colorbox.js +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/js/lib/jquery.easy-ticker.js +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/js/lib/jquery.min.js +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/js/lib/modernizr-build.js +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/js/lib/papaparse.min.js +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/js/organisation_manage.js +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/js/passwordStrength.js +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/js/play.js +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/js/resetPassword.js +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/js/riveted.min.js +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/js/school.js +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/js/sticky_subnav.js +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/js/studentLogin.js +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/js/teach_browser.js +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/js/teach_class.js +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/js/teacherEditStudent.js +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/js/teacherLogin.js +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/_alerts.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/_badges.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/_breadcrumbs.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/_button-groups.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/_buttons.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/_carousel.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/_close.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/_code.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/_component-animations.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/_dropdowns.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/_forms.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/_glyphicons.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/_grid.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/_input-groups.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/_jumbotron.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/_labels.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/_list-group.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/_media.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/_mixins.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/_modals.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/_navbar.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/_navs.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/_normalize.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/_pager.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/_pagination.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/_panels.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/_popovers.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/_print.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/_progress-bars.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/_responsive-embed.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/_responsive-utilities.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/_scaffolding.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/_tables.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/_theme.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/_thumbnails.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/_tooltip.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/_type.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/_utilities.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/_variables.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/_wells.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/mixins/_alerts.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/mixins/_background-variant.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/mixins/_border-radius.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/mixins/_breakpoints.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/mixins/_buttons.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/mixins/_center-block.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/mixins/_clearfix.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/mixins/_forms.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/mixins/_gradients.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/mixins/_grid-framework.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/mixins/_grid.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/mixins/_hide-text.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/mixins/_image.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/mixins/_labels.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/mixins/_list-group.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/mixins/_nav-divider.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/mixins/_nav-vertical-align.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/mixins/_opacity.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/mixins/_pagination.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/mixins/_panels.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/mixins/_progress-bar.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/mixins/_reset-filter.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/mixins/_reset-text.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/mixins/_resize.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/mixins/_responsive-visibility.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/mixins/_size.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/mixins/_tab-focus.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/mixins/_table-row.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/mixins/_text-emphasis.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/mixins/_text-overflow.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/mixins/_text-truncate.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap/mixins/_vendor-prefixes.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap_mixins/_all.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap_mixins/_border-radius.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap_mixins/_box-shadow.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap_mixins/_hover.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap_mixins/_nav-divider.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap_partials/_dropdown.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap_partials/_glyphicons.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap_partials/_grid.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap_partials/_variables.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap_utilities/_align.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap_utilities/_background.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap_utilities/_borders.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap_utilities/_clearfix.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap_utilities/_cursor.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap_utilities/_display.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap_utilities/_flex.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap_utilities/_float.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap_utilities/_position.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap_utilities/_screenreaders.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap_utilities/_sizing.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap_utilities/_spacing.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap_utilities/_text.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/bootstrap_utilities/_visibility.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/colorbox.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/modules/_all.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/modules/_animation.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/modules/_breakpoints.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/modules/_card_constants.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/modules/_colours.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/modules/_homepage_constants.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/modules/_levels.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/modules/_mixins.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/modules/_spacing.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/partials/_banners.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/partials/_base.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/partials/_buttons.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/partials/_carousel.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/partials/_footer.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/partials/_forms.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/partials/_grids.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/partials/_header.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/partials/_images.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/partials/_popup.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/partials/_progress-bars.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/partials/_subnavs.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/partials/_tables.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/partials/_text.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/partials/_ui-dialog.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/partials/_utils.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/partials/_videos.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/sass/styles.scss +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/video/aimmo_play_now_background_video.mp4 +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/static/portal/video/code for life .pdf +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/strings/__init__.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/strings/about.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/strings/coding_club.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/strings/help_and_support.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/strings/home_learning.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/strings/materials.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/strings/play.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/strings/student_aimmo_dashboard.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/strings/teach.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/strings/teacher_resources.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/403.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/404.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/500.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/captcha/includes/js_v2_invisible.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/captcha/widget_v2_invisible.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/email.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/email.txt +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/about.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/base.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/base_no_userprofile.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/coding_club.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/contribute.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/dotmailer_consent_form.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/email_invitation_sent.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/email_style_template.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/email_verification_failed.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/email_verification_needed.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/form_shapes.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/getinvolved.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/home.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/home_learning.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/locked_out.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/locked_out_school_student.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/login/independent_student.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/login/student.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/login/student_class_code.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/login/teacher.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/mouseflow.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/partials/aimmo_games_table.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/partials/banner.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/partials/benefits.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/partials/card_list.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/partials/character_list.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/partials/delete_popup.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/partials/footer.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/partials/header.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/partials/headline.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/partials/hero_card.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/partials/info_popup.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/partials/invite_admin_teacher.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/partials/popup.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/partials/register_newsletter_tickbox.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/partials/screentime_popup.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/partials/service_unavailable_popup.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/partials/session_popup.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/partials/teacher_non_dashboard_subnav.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/partials/teacher_non_dashboard_subnav_account.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/play/independent_student_dashboard.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/play/student_aimmo_dashboard.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/play/student_dashboard.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/play/student_edit_account.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/play/student_join_organisation.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/play.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/privacy_notice.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/register.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/reset_password.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/reset_password_confirm.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/reset_password_done.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/reset_password_email_sent.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/tag_manager/tag_manager_body.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/tag_manager/tag_manager_head.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/teach/base_registering.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/teach/class.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/teach/dashboard.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/teach/invited.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/teach/onboarding_classes.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/teach/onboarding_print.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/teach/onboarding_school.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/teach/onboarding_students.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/teach/teacher_add_external_student.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/teach/teacher_added_external_student.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/teach/teacher_aimmo_dashboard.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/teach/teacher_dismiss_students.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/teach/teacher_edit_class.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/teach/teacher_edit_student.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/teach/teacher_move_all_classes.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/teach/teacher_move_students.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/teach/teacher_move_students_to_class.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/teach.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/portal/terms.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/two_factor/_base.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/two_factor/_wizard_actions.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/two_factor/_wizard_actions_enable_2fa.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/two_factor/_wizard_actions_submit.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/two_factor/_wizard_forms.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/two_factor/_wizard_forms_token.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/two_factor/backup_token.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/two_factor/core/backup_tokens.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/two_factor/core/login.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/two_factor/core/setup.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/two_factor/core/setup_complete.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/two_factor/profile/disable.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/two_factor/profile/profile.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templates/two_factor/setup_wizard_token.html +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templatetags/__init__.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templatetags/app_tags.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templatetags/banner_tags.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templatetags/benefits_tags.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templatetags/card_list_tags.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templatetags/character_list_tags.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templatetags/future.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templatetags/headline_tags.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templatetags/hero_card_tags.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/templatetags/table_tags.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/__init__.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/base_test.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/conftest.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/migrations/__init__.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/migrations/test_migration_make_portaladmin_teacher.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/migrations/test_migration_preview_user_remove.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/migrations/test_migration_preview_users.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/migrations/test_migration_remove_front_page_news.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/migrations/test_migration_remove_guardian.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/migrations/test_migration_use_common_models.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/migrations/test_migration_verify_portaladmin.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/__init__.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/portal/__init__.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/portal/admin/__init__.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/portal/admin/admin_base_page.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/portal/admin/admin_data_page.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/portal/admin/admin_map_page.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/portal/base_page.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/portal/email_verification_needed_page.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/portal/forbidden_page.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/portal/game_page.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/portal/home_page.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/portal/independent_login_page.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/portal/kurono_teacher_dashboard_page.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/portal/password_reset_form_page.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/portal/password_reset_page.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/portal/play/__init__.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/portal/play/account_page.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/portal/play/dashboard_page.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/portal/play/join_school_or_club_page.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/portal/play/play_base_page.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/portal/play_page.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/portal/resources_page.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/portal/signup_page.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/portal/student_login_class_code.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/portal/student_login_page.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/portal/teach/__init__.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/portal/teach/add_independent_student_to_class_page.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/portal/teach/added_independent_student_to_class_page.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/portal/teach/class_page.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/portal/teach/dashboard_page.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/portal/teach/dismiss_students_page.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/portal/teach/edit_student_page.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/portal/teach/move_class_page.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/portal/teach/move_classes_page.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/portal/teach/move_students_disambiguate_page.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/portal/teach/move_students_page.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/portal/teach/onboarding_classes_page.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/portal/teach/onboarding_organisation_page.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/portal/teach/onboarding_student_list_page.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/portal/teach/onboarding_students_page.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/portal/teach/teach_base_page.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/pageObjects/portal/teacher_login_page.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/selenium_test_case.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/snapshots/__init__.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/snapshots/snap_test_partials.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/test_2FA.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/test_admin.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/test_aimmo_dashboards.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/test_captcha_forms.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/test_class.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/test_daily_activities.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/test_emails.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/test_helper_methods.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/test_independent_student.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/test_invite_teacher.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/test_middleware.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/test_newsletter_footer.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/test_partials.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/test_ratelimit.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/test_school_student.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/test_security.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/test_teacher.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/test_teacher_student.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/test_views.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/utils/__init__.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/utils/aimmo_games.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/utils/classes.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/tests/utils/messages.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/urls.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/views/__init__.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/views/about.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/views/admin.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/views/aimmo/__init__.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/views/aimmo/dashboard.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/views/api.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/views/cron/__init__.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/views/cron/user.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/views/dotmailer.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/views/email.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/views/home.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/views/legal.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/views/login/__init__.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/views/login/independent_student.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/views/login/teacher.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/views/organisation.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/views/play_landing_page.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/views/registration.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/views/student/__init__.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/views/student/edit_account_details.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/views/student/play.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/views/teach.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/views/teacher/__init__.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/views/teacher/teach.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/views/two_factor/__init__.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/views/two_factor/core.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/views/two_factor/form.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/views/two_factor/profile.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/portal/wsgi.py +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/pyproject.toml +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/setup.cfg +0 -0
- {codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/setup.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "6.43.1"
|
|
@@ -5,7 +5,10 @@ from unittest.mock import patch
|
|
|
5
5
|
import pytest
|
|
6
6
|
from common.models import Class, School, Student, Teacher
|
|
7
7
|
from common.tests.utils.classes import create_class_directly
|
|
8
|
-
from common.tests.utils.organisation import
|
|
8
|
+
from common.tests.utils.organisation import (
|
|
9
|
+
create_organisation_directly,
|
|
10
|
+
join_teacher_to_organisation,
|
|
11
|
+
)
|
|
9
12
|
from common.tests.utils.student import create_school_student_directly
|
|
10
13
|
from common.tests.utils.teacher import signup_teacher_directly
|
|
11
14
|
from common.tests.utils.user import create_user_directly, get_superuser
|
|
@@ -19,7 +22,10 @@ from rest_framework.test import APIClient, APITestCase
|
|
|
19
22
|
|
|
20
23
|
class APITests(APITestCase):
|
|
21
24
|
def test_valid_date_registered(self):
|
|
22
|
-
url = reverse(
|
|
25
|
+
url = reverse(
|
|
26
|
+
"registered-users",
|
|
27
|
+
kwargs={"year": "2016", "month": "04", "day": "01"},
|
|
28
|
+
)
|
|
23
29
|
superuser = get_superuser()
|
|
24
30
|
self.client.force_authenticate(user=superuser)
|
|
25
31
|
response = self.client.get(url)
|
|
@@ -27,14 +33,20 @@ class APITests(APITestCase):
|
|
|
27
33
|
assert_that(isinstance(response.data, int))
|
|
28
34
|
|
|
29
35
|
def test_invalid_date_registered(self):
|
|
30
|
-
url = reverse(
|
|
36
|
+
url = reverse(
|
|
37
|
+
"registered-users",
|
|
38
|
+
kwargs={"year": "2016", "month": "05", "day": "35"},
|
|
39
|
+
)
|
|
31
40
|
superuser = get_superuser()
|
|
32
41
|
self.client.force_authenticate(user=superuser)
|
|
33
42
|
response = self.client.get(url)
|
|
34
43
|
assert_that(response, has_status_code(status.HTTP_404_NOT_FOUND))
|
|
35
44
|
|
|
36
45
|
def test_valid_date_lastconnectedsince(self):
|
|
37
|
-
url = reverse(
|
|
46
|
+
url = reverse(
|
|
47
|
+
"last-connected-since",
|
|
48
|
+
kwargs={"year": "2016", "month": "04", "day": "01"},
|
|
49
|
+
)
|
|
38
50
|
superuser = get_superuser()
|
|
39
51
|
self.client.force_authenticate(user=superuser)
|
|
40
52
|
response = self.client.get(url)
|
|
@@ -42,7 +54,10 @@ class APITests(APITestCase):
|
|
|
42
54
|
assert_that(isinstance(response.data, int))
|
|
43
55
|
|
|
44
56
|
def test_invalid_date_lastconnectedsince(self):
|
|
45
|
-
url = reverse(
|
|
57
|
+
url = reverse(
|
|
58
|
+
"last-connected-since",
|
|
59
|
+
kwargs={"year": "2016", "month": "05", "day": "35"},
|
|
60
|
+
)
|
|
46
61
|
superuser = get_superuser()
|
|
47
62
|
self.client.force_authenticate(user=superuser)
|
|
48
63
|
response = self.client.get(url)
|
|
@@ -67,7 +82,9 @@ class APITests(APITestCase):
|
|
|
67
82
|
assert len(response.data) == 1
|
|
68
83
|
|
|
69
84
|
@patch("portal.views.api.IS_CLOUD_SCHEDULER_FUNCTION", return_value=True)
|
|
70
|
-
def test_get_inactive_users_if_appengine(
|
|
85
|
+
def test_get_inactive_users_if_appengine(
|
|
86
|
+
self, mock_is_cloud_scheduler_function
|
|
87
|
+
):
|
|
71
88
|
client = APIClient()
|
|
72
89
|
create_user_directly(active=False)
|
|
73
90
|
create_user_directly(active=True)
|
|
@@ -86,7 +103,9 @@ class APITests(APITestCase):
|
|
|
86
103
|
assert response.status_code == status.HTTP_403_FORBIDDEN
|
|
87
104
|
|
|
88
105
|
@patch("portal.views.api.IS_CLOUD_SCHEDULER_FUNCTION", return_value=True)
|
|
89
|
-
def test_delete_inactive_users_if_appengine(
|
|
106
|
+
def test_delete_inactive_users_if_appengine(
|
|
107
|
+
self, mock_is_cloud_scheduler_function
|
|
108
|
+
):
|
|
90
109
|
client = APIClient()
|
|
91
110
|
create_user_directly(active=False)
|
|
92
111
|
create_user_directly(active=False)
|
|
@@ -94,14 +113,25 @@ class APITests(APITestCase):
|
|
|
94
113
|
response = client.get(url)
|
|
95
114
|
users = response.data
|
|
96
115
|
assert len(users) == 2
|
|
116
|
+
|
|
117
|
+
# NOTE: Migration 0049 causes user 34 (created via migration 0001) to
|
|
118
|
+
# be marked as inactive. Slightly tweaked this test so it still
|
|
119
|
+
# passes but takes into account this new anonymisation.
|
|
120
|
+
old_deleted_users = list(User.objects.filter(is_active=False))
|
|
121
|
+
assert len(old_deleted_users) == 1
|
|
122
|
+
|
|
97
123
|
response = client.delete(url)
|
|
98
124
|
assert mock_is_cloud_scheduler_function.called
|
|
99
125
|
assert response.status_code == status.HTTP_204_NO_CONTENT
|
|
126
|
+
|
|
100
127
|
for user in users:
|
|
101
128
|
with pytest.raises(User.DoesNotExist):
|
|
102
129
|
User.objects.get(username=user["username"])
|
|
130
|
+
|
|
103
131
|
deleted_users = list(User.objects.filter(is_active=False))
|
|
104
|
-
|
|
132
|
+
new_deleted_users_count = len(deleted_users) - len(old_deleted_users)
|
|
133
|
+
assert new_deleted_users_count == 2
|
|
134
|
+
|
|
105
135
|
for user in deleted_users:
|
|
106
136
|
assert user.first_name == "Deleted"
|
|
107
137
|
assert user.last_name == "User"
|
|
@@ -112,27 +142,41 @@ class APITests(APITestCase):
|
|
|
112
142
|
assert len(response.data) == 0
|
|
113
143
|
|
|
114
144
|
@patch("portal.views.api.IS_CLOUD_SCHEDULER_FUNCTION", return_value=True)
|
|
115
|
-
def test_orphan_schools_and_classes_are_anonymised(
|
|
145
|
+
def test_orphan_schools_and_classes_are_anonymised(
|
|
146
|
+
self, mock_is_cloud_scheduler_function
|
|
147
|
+
):
|
|
116
148
|
client = APIClient()
|
|
117
149
|
# Create a school with an active teacher
|
|
118
150
|
school1_teacher1_email, _ = signup_teacher_directly()
|
|
119
151
|
school1 = create_organisation_directly(school1_teacher1_email)
|
|
120
|
-
klass11, _, access_code11 = create_class_directly(
|
|
152
|
+
klass11, _, access_code11 = create_class_directly(
|
|
153
|
+
school1_teacher1_email
|
|
154
|
+
)
|
|
121
155
|
_, _, student11 = create_school_student_directly(access_code11)
|
|
122
156
|
|
|
123
157
|
# Create a school with one active non-admin teacher and one inactive admin teacher
|
|
124
158
|
school2_teacher1_email, _ = signup_teacher_directly()
|
|
125
159
|
school2_teacher2_email, _ = signup_teacher_directly()
|
|
126
160
|
school2 = create_organisation_directly(school2_teacher1_email)
|
|
127
|
-
join_teacher_to_organisation(
|
|
128
|
-
|
|
161
|
+
join_teacher_to_organisation(
|
|
162
|
+
school2_teacher2_email, school2.name, is_admin=True
|
|
163
|
+
)
|
|
164
|
+
klass21, _, access_code21 = create_class_directly(
|
|
165
|
+
school2_teacher1_email
|
|
166
|
+
)
|
|
129
167
|
_, _, student21 = create_school_student_directly(access_code21)
|
|
130
|
-
klass22, _, access_code22 = create_class_directly(
|
|
168
|
+
klass22, _, access_code22 = create_class_directly(
|
|
169
|
+
school2_teacher2_email
|
|
170
|
+
)
|
|
131
171
|
_, _, student22 = create_school_student_directly(access_code22)
|
|
132
|
-
school2_teacher1 = Teacher.objects.get(
|
|
172
|
+
school2_teacher1 = Teacher.objects.get(
|
|
173
|
+
new_user__email=school2_teacher1_email
|
|
174
|
+
)
|
|
133
175
|
school2_teacher1.is_admin = False
|
|
134
176
|
school2_teacher1.save()
|
|
135
|
-
school2_teacher2 = Teacher.objects.get(
|
|
177
|
+
school2_teacher2 = Teacher.objects.get(
|
|
178
|
+
new_user__email=school2_teacher2_email
|
|
179
|
+
)
|
|
136
180
|
school2_teacher2.new_user.is_active = False
|
|
137
181
|
school2_teacher2.new_user.save()
|
|
138
182
|
|
|
@@ -141,28 +185,40 @@ class APITests(APITestCase):
|
|
|
141
185
|
school3_teacher2_email, _ = signup_teacher_directly()
|
|
142
186
|
school3 = create_organisation_directly(school3_teacher1_email)
|
|
143
187
|
join_teacher_to_organisation(school3_teacher2_email, school3.name)
|
|
144
|
-
klass31, _, access_code31 = create_class_directly(
|
|
188
|
+
klass31, _, access_code31 = create_class_directly(
|
|
189
|
+
school3_teacher1_email
|
|
190
|
+
)
|
|
145
191
|
_, _, student31 = create_school_student_directly(access_code31)
|
|
146
|
-
klass32, _, access_code32 = create_class_directly(
|
|
192
|
+
klass32, _, access_code32 = create_class_directly(
|
|
193
|
+
school3_teacher2_email
|
|
194
|
+
)
|
|
147
195
|
_, _, student32 = create_school_student_directly(access_code32)
|
|
148
|
-
school3_teacher1 = Teacher.objects.get(
|
|
196
|
+
school3_teacher1 = Teacher.objects.get(
|
|
197
|
+
new_user__email=school3_teacher1_email
|
|
198
|
+
)
|
|
149
199
|
school3_teacher1.new_user.is_active = False
|
|
150
200
|
school3_teacher1.new_user.save()
|
|
151
|
-
school3_teacher2 = Teacher.objects.get(
|
|
201
|
+
school3_teacher2 = Teacher.objects.get(
|
|
202
|
+
new_user__email=school3_teacher2_email
|
|
203
|
+
)
|
|
152
204
|
school3_teacher2.new_user.is_active = False
|
|
153
205
|
school3_teacher2.new_user.save()
|
|
154
206
|
|
|
155
207
|
# Create a school with no active teachers
|
|
156
208
|
school4_teacher1_email, _ = signup_teacher_directly()
|
|
157
209
|
school4 = create_organisation_directly(school4_teacher1_email)
|
|
158
|
-
school4_teacher1 = Teacher.objects.get(
|
|
210
|
+
school4_teacher1 = Teacher.objects.get(
|
|
211
|
+
new_user__email=school4_teacher1_email
|
|
212
|
+
)
|
|
159
213
|
school4_teacher1.new_user.is_active = False
|
|
160
214
|
school4_teacher1.new_user.save()
|
|
161
215
|
|
|
162
216
|
# Create a school with no teachers
|
|
163
217
|
school5_teacher1_email, _ = signup_teacher_directly()
|
|
164
218
|
school5 = create_organisation_directly(school5_teacher1_email)
|
|
165
|
-
school5_teacher1 = Teacher.objects.get(
|
|
219
|
+
school5_teacher1 = Teacher.objects.get(
|
|
220
|
+
new_user__email=school5_teacher1_email
|
|
221
|
+
)
|
|
166
222
|
school5_teacher1.delete()
|
|
167
223
|
|
|
168
224
|
# Call the API
|
|
@@ -182,7 +238,9 @@ class APITests(APITestCase):
|
|
|
182
238
|
assert Student.objects.filter(pk=student21.pk).exists()
|
|
183
239
|
assert not Student.objects.get(pk=student22.pk).new_user.is_active
|
|
184
240
|
# Also check the first teacher is now an admin
|
|
185
|
-
assert Teacher.objects.get(
|
|
241
|
+
assert Teacher.objects.get(
|
|
242
|
+
new_user__email=school2_teacher1_email
|
|
243
|
+
).is_admin
|
|
186
244
|
|
|
187
245
|
# Check the third school is anonymised together with its classes and students
|
|
188
246
|
assert not School.objects.filter(name=school3.name).exists()
|
|
@@ -250,14 +308,19 @@ class APITests(APITestCase):
|
|
|
250
308
|
last_name=random_account["last_name"],
|
|
251
309
|
)
|
|
252
310
|
|
|
253
|
-
assert
|
|
311
|
+
assert (
|
|
312
|
+
len(User.objects.all())
|
|
313
|
+
== len(random_accounts) + initial_users_length
|
|
314
|
+
)
|
|
254
315
|
|
|
255
316
|
client.login(username=admin_username, password=admin_password)
|
|
256
317
|
response = client.get(reverse("remove_fake_accounts"))
|
|
257
318
|
assert response.status_code == 204
|
|
258
319
|
|
|
259
320
|
# check if after deletion all the users are still there
|
|
260
|
-
assert
|
|
321
|
+
assert (
|
|
322
|
+
len(User.objects.all()) == initial_users_length + 2
|
|
323
|
+
) # mentioned in the fake_accounts description
|
|
261
324
|
|
|
262
325
|
|
|
263
326
|
def has_status_code(status_code):
|
|
@@ -272,7 +335,11 @@ class HasStatusCode(BaseMatcher):
|
|
|
272
335
|
return response.status_code == self.status_code
|
|
273
336
|
|
|
274
337
|
def describe_to(self, description):
|
|
275
|
-
description.append_text("has status code ").append_text(
|
|
338
|
+
description.append_text("has status code ").append_text(
|
|
339
|
+
self.status_code
|
|
340
|
+
)
|
|
276
341
|
|
|
277
342
|
def describe_mismatch(self, response, mismatch_description):
|
|
278
|
-
mismatch_description.append_text("had status code ").append_text(
|
|
343
|
+
mismatch_description.append_text("had status code ").append_text(
|
|
344
|
+
response.status_code
|
|
345
|
+
)
|
|
@@ -4,9 +4,11 @@ import time
|
|
|
4
4
|
|
|
5
5
|
from common.models import Teacher
|
|
6
6
|
from common.tests.utils.classes import create_class_directly
|
|
7
|
-
from common.tests.utils.organisation import (
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
from common.tests.utils.organisation import (
|
|
8
|
+
create_organisation,
|
|
9
|
+
create_organisation_directly,
|
|
10
|
+
join_teacher_to_organisation,
|
|
11
|
+
)
|
|
10
12
|
from common.tests.utils.student import create_school_student_directly
|
|
11
13
|
from common.tests.utils.teacher import signup_teacher_directly
|
|
12
14
|
from selenium.webdriver.common.by import By
|
|
@@ -51,7 +51,8 @@ class StudentLoginView(LoginView):
|
|
|
51
51
|
class_name = self.kwargs["access_code"].upper()
|
|
52
52
|
messages.info(
|
|
53
53
|
request,
|
|
54
|
-
f"<strong>You are logged in to class: "
|
|
54
|
+
f"<strong>You are logged in to class: "
|
|
55
|
+
f"{escape(class_name)}</strong>",
|
|
55
56
|
extra_tags="safe message--student",
|
|
56
57
|
)
|
|
57
58
|
|
|
@@ -72,7 +73,9 @@ class StudentLoginView(LoginView):
|
|
|
72
73
|
klass = classes[0]
|
|
73
74
|
|
|
74
75
|
name = form.cleaned_data.get("username")
|
|
75
|
-
students = Student.objects.filter(
|
|
76
|
+
students = Student.objects.filter(
|
|
77
|
+
new_user__first_name__iexact=name, class_field=klass
|
|
78
|
+
)
|
|
76
79
|
try:
|
|
77
80
|
student = students[0]
|
|
78
81
|
except IndexError:
|
|
@@ -81,32 +84,44 @@ class StudentLoginView(LoginView):
|
|
|
81
84
|
raise Exception(msg)
|
|
82
85
|
|
|
83
86
|
# Log the login time, class, and login type
|
|
84
|
-
session = UserSession(
|
|
87
|
+
session = UserSession(
|
|
88
|
+
user=student.new_user, class_field=klass, login_type=login_type
|
|
89
|
+
)
|
|
85
90
|
session.save()
|
|
86
91
|
|
|
92
|
+
student.user.is_verified = True
|
|
93
|
+
student.user.save()
|
|
94
|
+
|
|
87
95
|
def form_valid(self, form):
|
|
88
96
|
"""Security check complete. Log the user in."""
|
|
89
|
-
|
|
90
97
|
# Reset ratelimit cache upon successful login
|
|
91
98
|
clear_ratelimit_cache_for_user(form.cleaned_data["username"])
|
|
92
99
|
|
|
93
|
-
login_type = self.kwargs.get(
|
|
100
|
+
login_type = self.kwargs.get(
|
|
101
|
+
"login_type", "classlink"
|
|
102
|
+
) # default to "classlink" if not specified
|
|
94
103
|
|
|
95
104
|
self._add_login_data(form, login_type)
|
|
96
105
|
return super(StudentLoginView, self).form_valid(form)
|
|
97
106
|
|
|
98
107
|
def post(self, request, *args, **kwargs):
|
|
99
108
|
"""
|
|
100
|
-
If the first name and access code found under the url inputted in the
|
|
101
|
-
|
|
102
|
-
|
|
109
|
+
If the first name and access code found under the url inputted in the
|
|
110
|
+
form corresponds to that of a blocked account, this redirects the user
|
|
111
|
+
to the locked out page. However, if the lockout time is more than 24
|
|
112
|
+
hours before this is executed, the account is unlocked.
|
|
103
113
|
"""
|
|
104
114
|
username = request.POST.get("username")
|
|
105
115
|
|
|
106
116
|
# get access code from the current url
|
|
107
117
|
access_code = get_access_code_from_request(request)
|
|
108
|
-
if Student.objects.filter(
|
|
109
|
-
|
|
118
|
+
if Student.objects.filter(
|
|
119
|
+
new_user__first_name=username, class_field__access_code=access_code
|
|
120
|
+
).exists():
|
|
121
|
+
student = Student.objects.get(
|
|
122
|
+
new_user__first_name=username,
|
|
123
|
+
class_field__access_code=access_code,
|
|
124
|
+
)
|
|
110
125
|
|
|
111
126
|
if student.blocked_time is not None:
|
|
112
127
|
if has_user_lockout_expired(student):
|
|
@@ -129,9 +144,15 @@ def student_direct_login(request, user_id, login_id):
|
|
|
129
144
|
if user:
|
|
130
145
|
# Log the login time and class
|
|
131
146
|
student = Student.objects.get(new_user=user)
|
|
132
|
-
session = UserSession(
|
|
147
|
+
session = UserSession(
|
|
148
|
+
user=user, class_field=student.class_field, login_type="direct"
|
|
149
|
+
)
|
|
133
150
|
session.save()
|
|
134
151
|
|
|
135
152
|
login(request, user)
|
|
153
|
+
|
|
154
|
+
student.user.is_verified = True
|
|
155
|
+
student.user.save()
|
|
156
|
+
|
|
136
157
|
return HttpResponseRedirect(reverse_lazy("student_details"))
|
|
137
158
|
return HttpResponseRedirect(reverse_lazy("home"))
|
|
@@ -2,12 +2,24 @@ from datetime import timedelta
|
|
|
2
2
|
from uuid import uuid4
|
|
3
3
|
|
|
4
4
|
from common import email_messages
|
|
5
|
-
from common.helpers.emails import (
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
from common.helpers.emails import (
|
|
6
|
+
INVITE_FROM,
|
|
7
|
+
NOTIFICATION_EMAIL,
|
|
8
|
+
DotmailerUserType,
|
|
9
|
+
add_to_dotmailer,
|
|
10
|
+
generate_token,
|
|
11
|
+
send_email,
|
|
12
|
+
update_email,
|
|
13
|
+
)
|
|
8
14
|
from common.helpers.generators import get_random_username
|
|
9
|
-
from common.
|
|
10
|
-
|
|
15
|
+
from common.mail import campaign_ids, send_dotdigital_email
|
|
16
|
+
from common.models import (
|
|
17
|
+
Class,
|
|
18
|
+
JoinReleaseStudent,
|
|
19
|
+
SchoolTeacherInvitation,
|
|
20
|
+
Student,
|
|
21
|
+
Teacher,
|
|
22
|
+
)
|
|
11
23
|
from common.permissions import check_teacher_authorised, logged_in_as_teacher
|
|
12
24
|
from common.utils import using_two_factor
|
|
13
25
|
from django.contrib import messages as messages
|
|
@@ -16,7 +28,7 @@ from django.contrib.auth.decorators import login_required, user_passes_test
|
|
|
16
28
|
from django.contrib.auth.models import User
|
|
17
29
|
from django.http import Http404, HttpResponseRedirect
|
|
18
30
|
from django.shortcuts import get_object_or_404, render
|
|
19
|
-
from django.urls import reverse_lazy
|
|
31
|
+
from django.urls import reverse, reverse_lazy
|
|
20
32
|
from django.utils import timezone
|
|
21
33
|
from django.views.decorators.http import require_POST
|
|
22
34
|
from game.level_management import levels_shared_with, unshare_level
|
|
@@ -25,14 +37,20 @@ from two_factor.utils import devices_for_user
|
|
|
25
37
|
from portal.forms.invite_teacher import InviteTeacherForm
|
|
26
38
|
from portal.forms.organisation import OrganisationForm
|
|
27
39
|
from portal.forms.registration import DeleteAccountForm
|
|
28
|
-
from portal.forms.teach import (
|
|
29
|
-
|
|
30
|
-
|
|
40
|
+
from portal.forms.teach import (
|
|
41
|
+
ClassCreationForm,
|
|
42
|
+
InvitedTeacherForm,
|
|
43
|
+
TeacherAddExternalStudentForm,
|
|
44
|
+
TeacherEditAccountForm,
|
|
45
|
+
)
|
|
31
46
|
from portal.helpers.decorators import ratelimit
|
|
32
47
|
from portal.helpers.password import check_update_password
|
|
33
|
-
from portal.helpers.ratelimit import (
|
|
34
|
-
|
|
35
|
-
|
|
48
|
+
from portal.helpers.ratelimit import (
|
|
49
|
+
RATELIMIT_LOGIN_GROUP,
|
|
50
|
+
RATELIMIT_LOGIN_RATE,
|
|
51
|
+
RATELIMIT_METHOD,
|
|
52
|
+
clear_ratelimit_cache_for_user,
|
|
53
|
+
)
|
|
36
54
|
|
|
37
55
|
from .teach import create_class
|
|
38
56
|
|
|
@@ -380,19 +398,22 @@ def invite_toggle_admin(request, invite_id):
|
|
|
380
398
|
|
|
381
399
|
if invite.invited_teacher_is_admin:
|
|
382
400
|
messages.success(request, "Administrator invite status has been given successfully")
|
|
383
|
-
|
|
401
|
+
send_dotdigital_email(
|
|
402
|
+
campaign_ids["admin_given"],
|
|
403
|
+
[invite.invited_teacher_email],
|
|
404
|
+
personalization_values={
|
|
405
|
+
"SCHOOL_CLUB_NAME": invite.school,
|
|
406
|
+
"MANAGEMENT_LINK": request.build_absolute_uri(reverse("dashboard")),
|
|
407
|
+
},
|
|
408
|
+
)
|
|
384
409
|
|
|
385
410
|
else:
|
|
386
411
|
messages.success(request, "Administrator invite status has been revoked successfully")
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
emailMessage["subject"],
|
|
393
|
-
emailMessage["message"],
|
|
394
|
-
emailMessage["subject"],
|
|
395
|
-
)
|
|
412
|
+
send_dotdigital_email(
|
|
413
|
+
campaign_ids["admin_revoked"],
|
|
414
|
+
[invite.invited_teacher_email],
|
|
415
|
+
personalization_values={"SCHOOL_CLUB_NAME": invite.school},
|
|
416
|
+
)
|
|
396
417
|
|
|
397
418
|
return HttpResponseRedirect(reverse_lazy("dashboard"))
|
|
398
419
|
|
|
@@ -411,7 +432,14 @@ def organisation_toggle_admin(request, pk):
|
|
|
411
432
|
|
|
412
433
|
if teacher.is_admin:
|
|
413
434
|
messages.success(request, "Administrator status has been given successfully.")
|
|
414
|
-
|
|
435
|
+
send_dotdigital_email(
|
|
436
|
+
campaign_ids["admin_given"],
|
|
437
|
+
[teacher.new_user.email],
|
|
438
|
+
personalization_values={
|
|
439
|
+
"SCHOOL_CLUB_NAME": teacher.school.name,
|
|
440
|
+
"MANAGEMENT_LINK": request.build_absolute_uri(reverse("dashboard")),
|
|
441
|
+
},
|
|
442
|
+
)
|
|
415
443
|
else:
|
|
416
444
|
# Remove access to all levels that are from other teachers' students
|
|
417
445
|
[
|
|
@@ -420,15 +448,11 @@ def organisation_toggle_admin(request, pk):
|
|
|
420
448
|
if hasattr(level.owner, "student") and not teacher.teaches(level.owner)
|
|
421
449
|
]
|
|
422
450
|
messages.success(request, "Administrator status has been revoked successfully.")
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
email_message["subject"],
|
|
429
|
-
email_message["message"],
|
|
430
|
-
email_message["subject"],
|
|
431
|
-
)
|
|
451
|
+
send_dotdigital_email(
|
|
452
|
+
campaign_ids["admin_revoked"],
|
|
453
|
+
[teacher.new_user.email],
|
|
454
|
+
personalization_values={"SCHOOL_CLUB_NAME": teacher.school.name},
|
|
455
|
+
)
|
|
432
456
|
|
|
433
457
|
return HttpResponseRedirect(reverse_lazy("dashboard"))
|
|
434
458
|
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "6.42.0"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/codeforlife_portal.egg-info/SOURCES.txt
RENAMED
|
File without changes
|
|
File without changes
|
{codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/codeforlife_portal.egg-info/not-zip-safe
RENAMED
|
File without changes
|
{codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/codeforlife_portal.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/deploy/middleware/exceptionlogging.py
RENAMED
|
File without changes
|
{codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/deploy/middleware/screentime_warning.py
RENAMED
|
File without changes
|
|
File without changes
|
{codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/deploy/middleware/session_timeout.py
RENAMED
|
File without changes
|
{codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/deploy/static/apple-touch-icon-120x120.png
RENAMED
|
File without changes
|
{codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/deploy/static/apple-touch-icon-152x152.png
RENAMED
|
File without changes
|
{codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/deploy/static/apple-touch-icon-180x180.png
RENAMED
|
File without changes
|
{codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/deploy/static/apple-touch-icon-76x76.png
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codeforlife-portal-6.42.0 → codeforlife-portal-6.43.1}/deploy/templates/deploy/csrf_failure.html
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|