codeforlife-portal 6.44.9__tar.gz → 6.45.0__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.44.9/codeforlife_portal.egg-info → codeforlife-portal-6.45.0}/PKG-INFO +1 -1
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0/codeforlife_portal.egg-info}/PKG-INFO +1 -1
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/codeforlife_portal.egg-info/requires.txt +1 -1
- codeforlife-portal-6.45.0/portal/__init__.py +1 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/forms/play.py +10 -6
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/test_independent_student.py +7 -3
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/test_views.py +188 -45
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/views/teacher/teach.py +3 -2
- codeforlife-portal-6.44.9/portal/__init__.py +0 -1
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/LICENSE.md +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/MANIFEST.in +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/README.md +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/codeforlife_portal.egg-info/SOURCES.txt +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/codeforlife_portal.egg-info/dependency_links.txt +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/codeforlife_portal.egg-info/not-zip-safe +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/codeforlife_portal.egg-info/top_level.txt +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/deploy/__init__.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/deploy/captcha.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/deploy/middleware/__init__.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/deploy/middleware/admin_access.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/deploy/middleware/basicauth.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/deploy/middleware/exceptionlogging.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/deploy/middleware/screentime_warning.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/deploy/middleware/security.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/deploy/middleware/session_timeout.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/deploy/static/apple-touch-icon-120x120.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/deploy/static/apple-touch-icon-152x152.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/deploy/static/apple-touch-icon-180x180.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/deploy/static/apple-touch-icon-76x76.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/deploy/static/apple-touch-icon.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/deploy/static/robots.txt +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/deploy/templates/deploy/csrf_failure.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/deploy/views.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/admin.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/app_settings.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/backends.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/beta.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/context_processors.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/forms/__init__.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/forms/add_game.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/forms/admin.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/forms/dotmailer.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/forms/error_messages.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/forms/invite_teacher.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/forms/organisation.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/forms/registration.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/forms/teach.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/handlers.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/helpers/__init__.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/helpers/captcha.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/helpers/decorators.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/helpers/password.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/helpers/ratelimit.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/helpers/regexes.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/helpers/request_handlers.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/migrations/0001_squashed_0041_new_news.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/migrations/0042_school_country.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/migrations/0043_auto_20150430_0952.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/migrations/0044_auto_20150430_0959.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/migrations/0045_auto_20150430_1446.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/migrations/0046_auto_20150723_1101.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/migrations/0047_remove_userprofile_avatar.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/migrations/0048_plural_management_frontnews.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/migrations/0049_refactor_emailverifications.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/migrations/0050_refactor_emailverifications_2.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/migrations/0051_add_missing_ev_records.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/migrations/0052_refactor_emailverifications_3.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/migrations/0053_refactor_teacher_student_1.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/migrations/0054_pending_join_request_can_be_blank.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/migrations/0055_add_preview_user.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/migrations/0056_remove_preview_user.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/migrations/0057_delete_frontpagenews.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/migrations/0058_move_to_common_models.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/migrations/0059_move_email_verifications_to_common.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/migrations/0060_delete_guardian.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/migrations/0061_make_portaladmin_teacher.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/migrations/0062_verify_portaladmin.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/migrations/__init__.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/mixins/__init__.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/mixins/cron_mixin.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/models.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/permissions/__init__.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/permissions/is_cron_request_from_google.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/pipeline_compilers/__init__.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/pipeline_compilers/libsass_compiler.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/fonts/bootstrap/glyphicons-halflings-regular.eot +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/fonts/bootstrap/glyphicons-halflings-regular.svg +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/fonts/bootstrap/glyphicons-halflings-regular.ttf +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/fonts/bootstrap/glyphicons-halflings-regular.woff +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/fonts/bootstrap/glyphicons-halflings-regular.woff2 +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/10_years_anniversary.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/10x_logo.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/RR_logo_grass_background.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/RR_logo_green.svg +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/RR_logo_simple.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/about_us_cfl.jpg +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/about_us_hero.jpg +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/about_us_ocado.jpg +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/barefoot_logo.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/bcs_logo.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/clubs.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/coding_club_hero.jpg +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/coding_club_python_pack.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/colorboxImages/border.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/colorboxImages/controls.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/colorboxImages/loading.gif +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/colorboxImages/loading_background.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/colorboxImages/overlay.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/confirmation_tick.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/cross.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/dee.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/facebook.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/favicon.ico +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/get_involved_hero.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/gitbook.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/gitbook_space.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/github.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/github_hero.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/gla_logo.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/hamburger.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/help_and_support_hero.jpg +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/home_educate.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/home_educate_hero.jpg +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/home_learning_hero.jpg +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/home_play.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/home_play_hero.jpg +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/hope_logo.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/icl_logo.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/icon_controller.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/icon_free.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/icon_globe.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/icon_piechart.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/icon_step_by_step.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/icon_tracking.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/icon_uk_flag.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/kirsty.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/kurono_hero.jpg +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/kurono_landing_hero.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/kurono_logo.svg +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/kurono_logo_grey_background.svg +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/kurono_logo_mark.svg +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/kurono_resources_hero.jpg +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/kurono_story.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/logo_cfl.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/logo_cfl_powered.svg +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/logo_cfl_reminder_cards.jpg +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/logo_cfl_white_landscape.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/logo_ocado.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/logo_ocado_group.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/logo_ocado_group.svg +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/logo_ocado_group_white.svg +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/mc_saatchi_logo.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/nigel.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/ocado-swirl.svg +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/oval_blue.svg +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/oval_pink.svg +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/oval_yellow.svg +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/paper_plane.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/phil.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/polygon_blue.svg +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/polygon_pink.svg +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/polygon_yellow.svg +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/pressure_cooker_logo.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/rapid_router.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/rapid_router_landing_hero.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/rapidrouter.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/resources_hero.jpg +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/resources_montage.jpg +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/reuben.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/rob.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/rr_advanced.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/rr_beginner.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/rr_intermediate.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/sadface.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/sharon_harrison.jpg +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/sian.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/teaching_resources_hero.jpg +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/thumbnail_educate_kurono.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/thumbnail_educate_rapid_router.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/thumbnail_educate_resources.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/thumbnail_intro_c4l.jpg +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/thumbnail_kurono_resources.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/thumbnail_play_kurono.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/thumbnail_play_rapid_router.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/twitter.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/universities.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/wes.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/img/x_close_video.png +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/js/aimmoGame.js +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/js/bootstrap.min.js +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/js/carouselCards.js +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/js/common.js +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/js/independentLogin.js +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/js/independentRegistration.js +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/js/join_create_game_toggle.js +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/js/jquery.placeholder.js +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/js/levelControl.js +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/js/lib/jquery-video-lightning.js +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/js/lib/jquery.colorbox.js +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/js/lib/jquery.easy-ticker.js +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/js/lib/jquery.min.js +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/js/lib/modernizr-build.js +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/js/lib/papaparse.min.js +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/js/organisation_manage.js +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/js/passwordStrength.js +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/js/play.js +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/js/resetPassword.js +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/js/riveted.min.js +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/js/school.js +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/js/sticky_subnav.js +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/js/studentLogin.js +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/js/teach_browser.js +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/js/teach_class.js +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/js/teacherEditStudent.js +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/js/teacherLogin.js +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_alerts.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_badges.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_breadcrumbs.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_button-groups.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_buttons.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_carousel.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_close.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_code.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_component-animations.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_dropdowns.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_forms.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_glyphicons.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_grid.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_input-groups.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_jumbotron.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_labels.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_list-group.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_media.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_mixins.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_modals.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_navbar.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_navs.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_normalize.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_pager.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_pagination.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_panels.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_popovers.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_print.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_progress-bars.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_responsive-embed.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_responsive-utilities.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_scaffolding.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_tables.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_theme.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_thumbnails.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_tooltip.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_type.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_utilities.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_variables.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/_wells.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_alerts.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_background-variant.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_border-radius.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_breakpoints.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_buttons.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_center-block.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_clearfix.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_forms.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_gradients.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_grid-framework.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_grid.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_hide-text.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_image.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_labels.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_list-group.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_nav-divider.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_nav-vertical-align.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_opacity.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_pagination.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_panels.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_progress-bar.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_reset-filter.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_reset-text.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_resize.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_responsive-visibility.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_size.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_tab-focus.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_table-row.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_text-emphasis.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_text-overflow.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_text-truncate.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap/mixins/_vendor-prefixes.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_mixins/_all.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_mixins/_border-radius.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_mixins/_box-shadow.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_mixins/_hover.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_mixins/_nav-divider.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_partials/_dropdown.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_partials/_glyphicons.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_partials/_grid.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_partials/_variables.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_utilities/_align.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_utilities/_background.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_utilities/_borders.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_utilities/_clearfix.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_utilities/_cursor.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_utilities/_display.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_utilities/_flex.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_utilities/_float.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_utilities/_position.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_utilities/_screenreaders.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_utilities/_sizing.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_utilities/_spacing.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_utilities/_text.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/bootstrap_utilities/_visibility.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/colorbox.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/modules/_all.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/modules/_animation.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/modules/_breakpoints.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/modules/_card_constants.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/modules/_colours.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/modules/_homepage_constants.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/modules/_levels.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/modules/_mixins.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/modules/_spacing.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/partials/_banners.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/partials/_base.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/partials/_buttons.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/partials/_carousel.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/partials/_footer.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/partials/_forms.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/partials/_grids.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/partials/_header.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/partials/_images.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/partials/_popup.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/partials/_progress-bars.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/partials/_subnavs.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/partials/_tables.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/partials/_text.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/partials/_ui-dialog.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/partials/_utils.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/partials/_videos.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/sass/styles.scss +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/video/aimmo_play_now_background_video.mp4 +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/static/portal/video/code for life .pdf +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/strings/__init__.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/strings/about.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/strings/coding_club.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/strings/help_and_support.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/strings/home_learning.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/strings/materials.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/strings/play.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/strings/student_aimmo_dashboard.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/strings/teach.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/strings/teacher_resources.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/403.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/404.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/500.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/captcha/includes/js_v2_invisible.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/captcha/widget_v2_invisible.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/email.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/email.txt +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/about.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/base.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/base_no_userprofile.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/coding_club.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/contribute.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/dotmailer_consent_form.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/email_invitation_sent.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/email_style_template.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/email_verification_failed.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/email_verification_needed.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/form_shapes.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/getinvolved.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/home.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/home_learning.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/locked_out.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/locked_out_school_student.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/login/independent_student.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/login/student.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/login/student_class_code.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/login/teacher.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/mouseflow.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/partials/aimmo_games_table.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/partials/banner.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/partials/benefits.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/partials/card_list.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/partials/character_list.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/partials/delete_popup.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/partials/footer.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/partials/header.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/partials/headline.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/partials/hero_card.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/partials/info_popup.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/partials/invite_admin_teacher.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/partials/popup.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/partials/register_newsletter_tickbox.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/partials/screentime_popup.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/partials/service_unavailable_popup.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/partials/session_popup.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/partials/teacher_non_dashboard_subnav.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/partials/teacher_non_dashboard_subnav_account.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/play/independent_student_dashboard.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/play/student_aimmo_dashboard.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/play/student_dashboard.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/play/student_edit_account.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/play/student_join_organisation.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/play.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/privacy_notice.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/register.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/reset_password.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/reset_password_confirm.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/reset_password_done.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/reset_password_email_sent.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/tag_manager/tag_manager_body.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/tag_manager/tag_manager_head.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/teach/base_registering.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/teach/class.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/teach/dashboard.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/teach/invited.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/teach/onboarding_classes.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/teach/onboarding_print.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/teach/onboarding_school.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/teach/onboarding_students.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/teach/teacher_add_external_student.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/teach/teacher_added_external_student.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/teach/teacher_aimmo_dashboard.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/teach/teacher_dismiss_students.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/teach/teacher_edit_class.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/teach/teacher_edit_student.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/teach/teacher_move_all_classes.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/teach/teacher_move_students.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/teach/teacher_move_students_to_class.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/teach.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/portal/terms.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/two_factor/_base.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/two_factor/_wizard_actions.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/two_factor/_wizard_actions_enable_2fa.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/two_factor/_wizard_actions_submit.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/two_factor/_wizard_forms.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/two_factor/_wizard_forms_token.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/two_factor/backup_token.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/two_factor/core/backup_tokens.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/two_factor/core/login.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/two_factor/core/setup.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/two_factor/core/setup_complete.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/two_factor/profile/disable.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/two_factor/profile/profile.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templates/two_factor/setup_wizard_token.html +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templatetags/__init__.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templatetags/app_tags.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templatetags/banner_tags.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templatetags/benefits_tags.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templatetags/card_list_tags.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templatetags/character_list_tags.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templatetags/future.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templatetags/headline_tags.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templatetags/hero_card_tags.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/templatetags/table_tags.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/__init__.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/base_test.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/conftest.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/migrations/__init__.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/migrations/test_migration_make_portaladmin_teacher.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/migrations/test_migration_preview_user_remove.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/migrations/test_migration_preview_users.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/migrations/test_migration_remove_front_page_news.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/migrations/test_migration_remove_guardian.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/migrations/test_migration_use_common_models.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/migrations/test_migration_verify_portaladmin.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/__init__.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/__init__.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/admin/__init__.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/admin/admin_base_page.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/admin/admin_data_page.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/admin/admin_map_page.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/base_page.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/email_verification_needed_page.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/forbidden_page.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/game_page.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/home_page.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/independent_login_page.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/kurono_teacher_dashboard_page.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/password_reset_form_page.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/password_reset_page.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/play/__init__.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/play/account_page.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/play/dashboard_page.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/play/join_school_or_club_page.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/play/play_base_page.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/play_page.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/resources_page.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/signup_page.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/student_login_class_code.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/student_login_page.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/teach/__init__.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/teach/add_independent_student_to_class_page.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/teach/added_independent_student_to_class_page.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/teach/class_page.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/teach/dashboard_page.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/teach/dismiss_students_page.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/teach/edit_student_page.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/teach/move_class_page.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/teach/move_classes_page.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/teach/move_students_disambiguate_page.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/teach/move_students_page.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/teach/onboarding_classes_page.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/teach/onboarding_organisation_page.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/teach/onboarding_student_list_page.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/teach/onboarding_students_page.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/teach/teach_base_page.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/pageObjects/portal/teacher_login_page.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/selenium_test_case.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/snapshots/__init__.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/snapshots/snap_test_partials.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/test_2FA.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/test_admin.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/test_aimmo_dashboards.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/test_api.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/test_captcha_forms.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/test_class.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/test_daily_activities.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/test_emails.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/test_helper_methods.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/test_invite_teacher.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/test_middleware.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/test_newsletter_footer.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/test_organisation.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/test_partials.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/test_ratelimit.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/test_school_student.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/test_security.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/test_teacher.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/test_teacher_student.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/utils/__init__.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/utils/aimmo_games.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/utils/classes.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/utils/messages.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/urls.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/views/__init__.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/views/about.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/views/admin.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/views/aimmo/__init__.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/views/aimmo/dashboard.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/views/api.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/views/cron/__init__.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/views/cron/user.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/views/dotmailer.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/views/email.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/views/home.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/views/legal.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/views/login/__init__.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/views/login/independent_student.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/views/login/student.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/views/login/teacher.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/views/organisation.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/views/play_landing_page.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/views/registration.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/views/student/__init__.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/views/student/edit_account_details.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/views/student/play.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/views/teach.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/views/teacher/__init__.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/views/teacher/dashboard.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/views/two_factor/__init__.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/views/two_factor/core.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/views/two_factor/form.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/views/two_factor/profile.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/wsgi.py +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/pyproject.toml +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/setup.cfg +0 -0
- {codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/setup.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "6.45.0"
|
|
@@ -277,15 +277,19 @@ class StudentJoinOrganisationForm(forms.Form):
|
|
|
277
277
|
|
|
278
278
|
def clean(self):
|
|
279
279
|
access_code = self.cleaned_data.get("access_code", None)
|
|
280
|
+
join_error_text = "The class code you entered either does not exist or is not currently accepting join requests. Please double check that you have entered the correct class code and contact the teacher of the class to ensure their class is currently accepting join requests."
|
|
280
281
|
|
|
281
282
|
if access_code:
|
|
282
283
|
classes = Class.objects.filter(access_code=access_code)
|
|
283
284
|
if len(classes) != 1:
|
|
284
|
-
raise forms.ValidationError(
|
|
285
|
+
raise forms.ValidationError(join_error_text)
|
|
286
|
+
|
|
285
287
|
self.klass = classes[0]
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
288
|
+
|
|
289
|
+
if not self.klass.always_accept_requests and (
|
|
290
|
+
self.klass.accept_requests_until is None
|
|
291
|
+
or self.klass.accept_requests_until - timezone.now()
|
|
292
|
+
< timedelta()
|
|
293
|
+
):
|
|
294
|
+
raise forms.ValidationError(join_error_text)
|
|
291
295
|
return self.cleaned_data
|
{codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/portal/tests/test_independent_student.py
RENAMED
|
@@ -283,7 +283,7 @@ class TestIndependentStudentFrontend(BaseTest):
|
|
|
283
283
|
page = page.go_to_independent_student_login_page()
|
|
284
284
|
page = page.independent_student_login_failure(username, password)
|
|
285
285
|
|
|
286
|
-
|
|
286
|
+
page.has_login_failed("independent_student_login_form", INVALID_LOGIN_MESSAGE)
|
|
287
287
|
assert page.has_login_failed("independent_student_login_form", INVALID_LOGIN_MESSAGE)
|
|
288
288
|
|
|
289
289
|
verification_url = mock_send_dotdigital_email.call_args.kwargs["personalization_values"]["VERIFICATION_LINK"]
|
|
@@ -471,7 +471,9 @@ class TestIndependentStudentFrontend(BaseTest):
|
|
|
471
471
|
)
|
|
472
472
|
|
|
473
473
|
assert self.is_join_class_page(page)
|
|
474
|
-
assert page.has_join_request_failed(
|
|
474
|
+
assert page.has_join_request_failed(
|
|
475
|
+
"The class code you entered either does not exist or is not currently accepting join requests. Please double check that you have entered the correct class code and contact the teacher of the class to ensure their class is currently accepting join requests."
|
|
476
|
+
)
|
|
475
477
|
|
|
476
478
|
def test_join_class_not_accepting_requests(self):
|
|
477
479
|
teacher_email, _ = signup_teacher_directly()
|
|
@@ -490,7 +492,9 @@ class TestIndependentStudentFrontend(BaseTest):
|
|
|
490
492
|
)
|
|
491
493
|
|
|
492
494
|
assert self.is_join_class_page(page)
|
|
493
|
-
assert page.has_join_request_failed(
|
|
495
|
+
assert page.has_join_request_failed(
|
|
496
|
+
"The class code you entered either does not exist or is not currently accepting join requests. Please double check that you have entered the correct class code and contact the teacher of the class to ensure their class is currently accepting join requests."
|
|
497
|
+
)
|
|
494
498
|
|
|
495
499
|
def test_join_class_revoked(self):
|
|
496
500
|
teacher_email, _ = signup_teacher_directly()
|
|
@@ -53,8 +53,11 @@ class TestTeacherViews(TestCase):
|
|
|
53
53
|
@classmethod
|
|
54
54
|
def setUpTestData(cls):
|
|
55
55
|
cls.email, cls.password = signup_teacher_directly()
|
|
56
|
+
cls.school = create_organisation_directly(cls.email)
|
|
56
57
|
_, _, cls.class_access_code = create_class_directly(cls.email)
|
|
57
|
-
_,
|
|
58
|
+
_, cls.password_student, cls.student = create_school_student_directly(
|
|
59
|
+
cls.class_access_code
|
|
60
|
+
)
|
|
58
61
|
|
|
59
62
|
def login(self):
|
|
60
63
|
c = Client()
|
|
@@ -63,7 +66,9 @@ class TestTeacherViews(TestCase):
|
|
|
63
66
|
|
|
64
67
|
def test_reminder_cards(self):
|
|
65
68
|
c = self.login()
|
|
66
|
-
url = reverse(
|
|
69
|
+
url = reverse(
|
|
70
|
+
"teacher_print_reminder_cards", args=[self.class_access_code]
|
|
71
|
+
)
|
|
67
72
|
|
|
68
73
|
# First test with 2 dummy students
|
|
69
74
|
NAME1 = "Test name"
|
|
@@ -97,7 +102,9 @@ class TestTeacherViews(TestCase):
|
|
|
97
102
|
# page number
|
|
98
103
|
students_per_page = REMINDER_CARDS_PDF_ROWS * REMINDER_CARDS_PDF_COLUMNS
|
|
99
104
|
for _ in range(len(studentlist), students_per_page + 1):
|
|
100
|
-
studentlist.append(
|
|
105
|
+
studentlist.append(
|
|
106
|
+
{"name": NAME1, "password": PASSWORD1, "login_url": URL}
|
|
107
|
+
)
|
|
101
108
|
|
|
102
109
|
assert len(studentlist) == students_per_page + 1
|
|
103
110
|
|
|
@@ -136,7 +143,9 @@ class TestTeacherViews(TestCase):
|
|
|
136
143
|
reader = csv.reader(io.StringIO(content))
|
|
137
144
|
|
|
138
145
|
access_code = self.class_access_code
|
|
139
|
-
class_url = reverse(
|
|
146
|
+
class_url = reverse(
|
|
147
|
+
"student_login", kwargs={"access_code": access_code}
|
|
148
|
+
)
|
|
140
149
|
row0 = next(reader)
|
|
141
150
|
assert row0[0].strip() == access_code
|
|
142
151
|
assert class_url in row0[1].strip()
|
|
@@ -175,7 +184,9 @@ class TestTeacherViews(TestCase):
|
|
|
175
184
|
|
|
176
185
|
def test_daily_activity_student_details(self):
|
|
177
186
|
c = self.login()
|
|
178
|
-
url = reverse(
|
|
187
|
+
url = reverse(
|
|
188
|
+
"teacher_print_reminder_cards", args=[self.class_access_code]
|
|
189
|
+
)
|
|
179
190
|
|
|
180
191
|
data = {
|
|
181
192
|
"data": json.dumps(
|
|
@@ -221,6 +232,48 @@ class TestTeacherViews(TestCase):
|
|
|
221
232
|
with pytest.raises(Exception):
|
|
222
233
|
count_student_details_click("Wrong download method")
|
|
223
234
|
|
|
235
|
+
def test_release_verified_student(self):
|
|
236
|
+
c = Client()
|
|
237
|
+
student_login_url = reverse(
|
|
238
|
+
"student_login", args=[self.class_access_code]
|
|
239
|
+
)
|
|
240
|
+
response = c.post(
|
|
241
|
+
student_login_url,
|
|
242
|
+
{
|
|
243
|
+
"username": self.student.new_user.first_name,
|
|
244
|
+
"password": self.password_student,
|
|
245
|
+
},
|
|
246
|
+
)
|
|
247
|
+
assert response.status_code == 302
|
|
248
|
+
|
|
249
|
+
student = Student.objects.get(pk=self.student.pk)
|
|
250
|
+
assert student.user.is_verified
|
|
251
|
+
|
|
252
|
+
c.logout()
|
|
253
|
+
c.login(username=self.email, password=self.password)
|
|
254
|
+
|
|
255
|
+
release_url = reverse(
|
|
256
|
+
"teacher_dismiss_students", args=[self.class_access_code]
|
|
257
|
+
)
|
|
258
|
+
response = c.post(
|
|
259
|
+
release_url,
|
|
260
|
+
{
|
|
261
|
+
"form-TOTAL_FORMS": 1,
|
|
262
|
+
"form-INITIAL_FORMS": 1,
|
|
263
|
+
"form-MIN_NUM_FORMS": 0,
|
|
264
|
+
"form-MAX_NUM_FORMS": 1000,
|
|
265
|
+
"form-0-orig_name": self.student.new_user.first_name,
|
|
266
|
+
"form-0-name": self.student.new_user.first_name,
|
|
267
|
+
"form-0-email": "independent@gmail.com",
|
|
268
|
+
"form-0-confirm_email": "independent@gmail.com",
|
|
269
|
+
"submit_dismiss": "",
|
|
270
|
+
},
|
|
271
|
+
)
|
|
272
|
+
assert response.status_code == 302
|
|
273
|
+
|
|
274
|
+
student = Student.objects.get(pk=self.student.pk)
|
|
275
|
+
assert not student.user.is_verified
|
|
276
|
+
|
|
224
277
|
|
|
225
278
|
class TestLoginViews(TestCase):
|
|
226
279
|
@classmethod
|
|
@@ -238,7 +291,9 @@ class TestLoginViews(TestCase):
|
|
|
238
291
|
teacher_email, teacher_password = signup_teacher_directly()
|
|
239
292
|
create_organisation_directly(teacher_email)
|
|
240
293
|
_, _, class_access_code = create_class_directly(teacher_email)
|
|
241
|
-
student_name, student_password, _ = create_school_student_directly(
|
|
294
|
+
student_name, student_password, _ = create_school_student_directly(
|
|
295
|
+
class_access_code
|
|
296
|
+
)
|
|
242
297
|
|
|
243
298
|
return (
|
|
244
299
|
teacher_email,
|
|
@@ -271,9 +326,16 @@ class TestLoginViews(TestCase):
|
|
|
271
326
|
_, _, name, password, class_access_code = self._set_up_test_data()
|
|
272
327
|
|
|
273
328
|
if next_url:
|
|
274
|
-
url =
|
|
329
|
+
url = (
|
|
330
|
+
reverse(
|
|
331
|
+
"student_login", kwargs={"access_code": class_access_code}
|
|
332
|
+
)
|
|
333
|
+
+ "?next=/"
|
|
334
|
+
)
|
|
275
335
|
else:
|
|
276
|
-
url = reverse(
|
|
336
|
+
url = reverse(
|
|
337
|
+
"student_login", kwargs={"access_code": class_access_code}
|
|
338
|
+
)
|
|
277
339
|
|
|
278
340
|
c = Client()
|
|
279
341
|
response = c.post(url, {"username": name, "password": password})
|
|
@@ -312,7 +374,9 @@ class TestLoginViews(TestCase):
|
|
|
312
374
|
|
|
313
375
|
def _get_user_class(self, name, class_access_code):
|
|
314
376
|
klass = Class.objects.get(access_code=class_access_code)
|
|
315
|
-
students = Student.objects.filter(
|
|
377
|
+
students = Student.objects.filter(
|
|
378
|
+
new_user__first_name__iexact=name, class_field=klass
|
|
379
|
+
)
|
|
316
380
|
assert len(students) == 1
|
|
317
381
|
user = students[0].new_user
|
|
318
382
|
return user, klass
|
|
@@ -354,7 +418,9 @@ class TestLoginViews(TestCase):
|
|
|
354
418
|
_, _, name, password, class_access_code = self._set_up_test_data()
|
|
355
419
|
|
|
356
420
|
c = Client()
|
|
357
|
-
url = reverse(
|
|
421
|
+
url = reverse(
|
|
422
|
+
"student_login", kwargs={"access_code": class_access_code}
|
|
423
|
+
)
|
|
358
424
|
c.post(url, {"username": name, "password": password})
|
|
359
425
|
|
|
360
426
|
# check if there's a UserSession data within the last 10 secs
|
|
@@ -375,7 +441,9 @@ class TestLoginViews(TestCase):
|
|
|
375
441
|
randomname = "randomname"
|
|
376
442
|
|
|
377
443
|
c = Client()
|
|
378
|
-
url = reverse(
|
|
444
|
+
url = reverse(
|
|
445
|
+
"student_login", kwargs={"access_code": class_access_code}
|
|
446
|
+
)
|
|
379
447
|
c.post(url, {"username": randomname, "password": "xx"})
|
|
380
448
|
|
|
381
449
|
# check if there's a UserSession data within the last 10 secs
|
|
@@ -401,7 +469,9 @@ class TestLoginViews(TestCase):
|
|
|
401
469
|
|
|
402
470
|
def test_student_direct_login(self):
|
|
403
471
|
_, _, _, _, class_access_code = self._set_up_test_data()
|
|
404
|
-
student, login_id, _, _ = create_student_with_direct_login(
|
|
472
|
+
student, login_id, _, _ = create_student_with_direct_login(
|
|
473
|
+
class_access_code
|
|
474
|
+
)
|
|
405
475
|
|
|
406
476
|
c = Client()
|
|
407
477
|
assert c.login(user_id=student.new_user.id, login_id=login_id) == True
|
|
@@ -523,7 +593,9 @@ class TestViews(TestCase):
|
|
|
523
593
|
c = Client()
|
|
524
594
|
|
|
525
595
|
# Login and check initial data
|
|
526
|
-
url = reverse(
|
|
596
|
+
url = reverse(
|
|
597
|
+
"student_login", kwargs={"access_code": class_access_code}
|
|
598
|
+
)
|
|
527
599
|
c.post(url, {"username": student_name, "password": student_password})
|
|
528
600
|
|
|
529
601
|
student_dashboard_url = reverse("student_details")
|
|
@@ -602,7 +674,9 @@ class TestViews(TestCase):
|
|
|
602
674
|
|
|
603
675
|
# try again with the correct password
|
|
604
676
|
url = reverse("delete_account")
|
|
605
|
-
response = c.post(
|
|
677
|
+
response = c.post(
|
|
678
|
+
url, {"password": password, "unsubscribe_newsletter": "on"}
|
|
679
|
+
)
|
|
606
680
|
|
|
607
681
|
assert response.status_code == 302
|
|
608
682
|
mock_send_dotdigital_email.assert_called_once()
|
|
@@ -684,7 +758,9 @@ class TestViews(TestCase):
|
|
|
684
758
|
|
|
685
759
|
school_id = school.id
|
|
686
760
|
school_name = school.name
|
|
687
|
-
teachers = Teacher.objects.filter(school=school).order_by(
|
|
761
|
+
teachers = Teacher.objects.filter(school=school).order_by(
|
|
762
|
+
"new_user__last_name", "new_user__first_name"
|
|
763
|
+
)
|
|
688
764
|
assert len(teachers) == 3
|
|
689
765
|
|
|
690
766
|
# one of the remaining teachers should be admin (the second in our case, as it's alphabetical)
|
|
@@ -715,7 +791,9 @@ class TestViews(TestCase):
|
|
|
715
791
|
self.assertEqual(mock_send_dotdigital_email.call_count, 2)
|
|
716
792
|
|
|
717
793
|
# 2 teachers left
|
|
718
|
-
teachers = Teacher.objects.filter(school=school).order_by(
|
|
794
|
+
teachers = Teacher.objects.filter(school=school).order_by(
|
|
795
|
+
"new_user__last_name", "new_user__first_name"
|
|
796
|
+
)
|
|
719
797
|
assert len(teachers) == 2
|
|
720
798
|
|
|
721
799
|
# teacher2 should still be admin, teacher4 is not passed admin role because there is teacher2
|
|
@@ -727,7 +805,9 @@ class TestViews(TestCase):
|
|
|
727
805
|
# delete teacher4
|
|
728
806
|
anonymise(user4)
|
|
729
807
|
|
|
730
|
-
teachers = Teacher.objects.filter(school=school).order_by(
|
|
808
|
+
teachers = Teacher.objects.filter(school=school).order_by(
|
|
809
|
+
"new_user__last_name", "new_user__first_name"
|
|
810
|
+
)
|
|
731
811
|
assert len(teachers) == 1
|
|
732
812
|
u = User.objects.get(id=usrid2)
|
|
733
813
|
assert u.new_teacher.is_admin
|
|
@@ -785,13 +865,17 @@ class TestViews(TestCase):
|
|
|
785
865
|
c.logout()
|
|
786
866
|
|
|
787
867
|
@patch("common.helpers.emails.send_dotdigital_email")
|
|
788
|
-
def test_registrations_increment_data(
|
|
868
|
+
def test_registrations_increment_data(
|
|
869
|
+
self, mock_send_dotdigital_email: Mock
|
|
870
|
+
):
|
|
789
871
|
c = Client()
|
|
790
872
|
|
|
791
873
|
total_activity = TotalActivity.objects.get(id=1)
|
|
792
874
|
teacher_registration_count = total_activity.teacher_registrations
|
|
793
875
|
student_registration_count = total_activity.student_registrations
|
|
794
|
-
independent_registration_count =
|
|
876
|
+
independent_registration_count = (
|
|
877
|
+
total_activity.independent_registrations
|
|
878
|
+
)
|
|
795
879
|
|
|
796
880
|
response = c.post(
|
|
797
881
|
reverse("register"),
|
|
@@ -811,7 +895,10 @@ class TestViews(TestCase):
|
|
|
811
895
|
|
|
812
896
|
total_activity = TotalActivity.objects.get(id=1)
|
|
813
897
|
|
|
814
|
-
assert
|
|
898
|
+
assert (
|
|
899
|
+
total_activity.teacher_registrations
|
|
900
|
+
== teacher_registration_count + 1
|
|
901
|
+
)
|
|
815
902
|
|
|
816
903
|
response = c.post(
|
|
817
904
|
reverse("register"),
|
|
@@ -833,7 +920,10 @@ class TestViews(TestCase):
|
|
|
833
920
|
|
|
834
921
|
total_activity = TotalActivity.objects.get(id=1)
|
|
835
922
|
|
|
836
|
-
assert
|
|
923
|
+
assert (
|
|
924
|
+
total_activity.independent_registrations
|
|
925
|
+
== independent_registration_count + 1
|
|
926
|
+
)
|
|
837
927
|
|
|
838
928
|
teacher_email, teacher_password = signup_teacher_directly()
|
|
839
929
|
create_organisation_directly(teacher_email)
|
|
@@ -849,7 +939,10 @@ class TestViews(TestCase):
|
|
|
849
939
|
|
|
850
940
|
total_activity = TotalActivity.objects.get(id=1)
|
|
851
941
|
|
|
852
|
-
assert
|
|
942
|
+
assert (
|
|
943
|
+
total_activity.student_registrations
|
|
944
|
+
== student_registration_count + 3
|
|
945
|
+
)
|
|
853
946
|
|
|
854
947
|
|
|
855
948
|
# CRON view tests
|
|
@@ -868,8 +961,12 @@ class CronTestClient(APIClient):
|
|
|
868
961
|
secure=False,
|
|
869
962
|
**extra,
|
|
870
963
|
):
|
|
871
|
-
wsgi_response = super().generic(
|
|
872
|
-
|
|
964
|
+
wsgi_response = super().generic(
|
|
965
|
+
method, path, data, content_type, secure, **extra
|
|
966
|
+
)
|
|
967
|
+
assert (
|
|
968
|
+
200 <= wsgi_response.status_code < 300
|
|
969
|
+
), f"Response has error status code: {wsgi_response.status_code}"
|
|
873
970
|
|
|
874
971
|
return wsgi_response
|
|
875
972
|
|
|
@@ -888,7 +985,9 @@ class TestUser(CronTestCase):
|
|
|
888
985
|
indy_email, _, _ = create_independent_student_directly()
|
|
889
986
|
|
|
890
987
|
self.teacher_user = User.objects.get(email=teacher_email)
|
|
891
|
-
self.teacher_user_profile = UserProfile.objects.get(
|
|
988
|
+
self.teacher_user_profile = UserProfile.objects.get(
|
|
989
|
+
user=self.teacher_user
|
|
990
|
+
)
|
|
892
991
|
|
|
893
992
|
self.indy_user = User.objects.get(email=indy_email)
|
|
894
993
|
self.indy_user_profile = UserProfile.objects.get(user=self.indy_user)
|
|
@@ -904,11 +1003,17 @@ class TestUser(CronTestCase):
|
|
|
904
1003
|
assert_called: bool,
|
|
905
1004
|
mock_send_dotdigital_email: Mock,
|
|
906
1005
|
):
|
|
907
|
-
self.teacher_user.date_joined = timezone.now() - timedelta(
|
|
1006
|
+
self.teacher_user.date_joined = timezone.now() - timedelta(
|
|
1007
|
+
days=days, hours=12
|
|
1008
|
+
)
|
|
908
1009
|
self.teacher_user.save()
|
|
909
|
-
self.student_user.date_joined = timezone.now() - timedelta(
|
|
1010
|
+
self.student_user.date_joined = timezone.now() - timedelta(
|
|
1011
|
+
days=days, hours=12
|
|
1012
|
+
)
|
|
910
1013
|
self.student_user.save()
|
|
911
|
-
self.indy_user.date_joined = timezone.now() - timedelta(
|
|
1014
|
+
self.indy_user.date_joined = timezone.now() - timedelta(
|
|
1015
|
+
days=days, hours=12
|
|
1016
|
+
)
|
|
912
1017
|
self.indy_user.save()
|
|
913
1018
|
|
|
914
1019
|
self.teacher_user_profile.is_verified = is_verified
|
|
@@ -919,9 +1024,13 @@ class TestUser(CronTestCase):
|
|
|
919
1024
|
self.client.get(reverse(view_name))
|
|
920
1025
|
|
|
921
1026
|
if assert_called:
|
|
922
|
-
mock_send_dotdigital_email.assert_any_call(
|
|
1027
|
+
mock_send_dotdigital_email.assert_any_call(
|
|
1028
|
+
ANY, [self.teacher_user.email], personalization_values=ANY
|
|
1029
|
+
)
|
|
923
1030
|
|
|
924
|
-
mock_send_dotdigital_email.assert_any_call(
|
|
1031
|
+
mock_send_dotdigital_email.assert_any_call(
|
|
1032
|
+
ANY, [self.indy_user.email], personalization_values=ANY
|
|
1033
|
+
)
|
|
925
1034
|
|
|
926
1035
|
# Check only two emails are sent - the student should never be included.
|
|
927
1036
|
assert mock_send_dotdigital_email.call_count == 2
|
|
@@ -931,22 +1040,40 @@ class TestUser(CronTestCase):
|
|
|
931
1040
|
mock_send_dotdigital_email.reset_mock()
|
|
932
1041
|
|
|
933
1042
|
def test_first_verify_email_reminder_view(self):
|
|
934
|
-
self.send_verify_email_reminder(
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
self.send_verify_email_reminder(
|
|
1043
|
+
self.send_verify_email_reminder(
|
|
1044
|
+
6, False, "first-verify-email-reminder", False
|
|
1045
|
+
)
|
|
1046
|
+
self.send_verify_email_reminder(
|
|
1047
|
+
7, False, "first-verify-email-reminder", True
|
|
1048
|
+
)
|
|
1049
|
+
self.send_verify_email_reminder(
|
|
1050
|
+
7, True, "first-verify-email-reminder", False
|
|
1051
|
+
)
|
|
1052
|
+
self.send_verify_email_reminder(
|
|
1053
|
+
8, False, "first-verify-email-reminder", False
|
|
1054
|
+
)
|
|
938
1055
|
|
|
939
1056
|
def test_second_verify_email_reminder_view(self):
|
|
940
|
-
self.send_verify_email_reminder(
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
self.send_verify_email_reminder(
|
|
1057
|
+
self.send_verify_email_reminder(
|
|
1058
|
+
13, False, "second-verify-email-reminder", False
|
|
1059
|
+
)
|
|
1060
|
+
self.send_verify_email_reminder(
|
|
1061
|
+
14, False, "second-verify-email-reminder", True
|
|
1062
|
+
)
|
|
1063
|
+
self.send_verify_email_reminder(
|
|
1064
|
+
14, True, "second-verify-email-reminder", False
|
|
1065
|
+
)
|
|
1066
|
+
self.send_verify_email_reminder(
|
|
1067
|
+
15, False, "second-verify-email-reminder", False
|
|
1068
|
+
)
|
|
944
1069
|
|
|
945
1070
|
def test_anonymise_unverified_accounts_view(self):
|
|
946
1071
|
now = timezone.now()
|
|
947
1072
|
|
|
948
1073
|
for user in [self.teacher_user, self.indy_user, self.student_user]:
|
|
949
|
-
user.date_joined = now - timedelta(
|
|
1074
|
+
user.date_joined = now - timedelta(
|
|
1075
|
+
days=USER_DELETE_UNVERIFIED_ACCOUNT_DAYS + 1
|
|
1076
|
+
)
|
|
950
1077
|
user.save()
|
|
951
1078
|
|
|
952
1079
|
for user_profile in [self.teacher_user_profile, self.indy_user_profile]:
|
|
@@ -1011,7 +1138,9 @@ class TestUser(CronTestCase):
|
|
|
1011
1138
|
new_user=indy_user,
|
|
1012
1139
|
)
|
|
1013
1140
|
|
|
1014
|
-
activity_today = DailyActivity.objects.get_or_create(
|
|
1141
|
+
activity_today = DailyActivity.objects.get_or_create(
|
|
1142
|
+
date=datetime.now().date()
|
|
1143
|
+
)[0]
|
|
1015
1144
|
daily_teacher_count = activity_today.anonymised_unverified_teachers
|
|
1016
1145
|
daily_indy_count = activity_today.anonymised_unverified_independents
|
|
1017
1146
|
|
|
@@ -1034,16 +1163,30 @@ class TestUser(CronTestCase):
|
|
|
1034
1163
|
assert indy_user_active == assert_active
|
|
1035
1164
|
assert student_user_active
|
|
1036
1165
|
|
|
1037
|
-
activity_today = DailyActivity.objects.get_or_create(
|
|
1166
|
+
activity_today = DailyActivity.objects.get_or_create(
|
|
1167
|
+
date=datetime.now().date()
|
|
1168
|
+
)[0]
|
|
1038
1169
|
total_activity = TotalActivity.objects.get(id=1)
|
|
1039
1170
|
|
|
1040
1171
|
if not teacher_user_active:
|
|
1041
|
-
assert
|
|
1042
|
-
|
|
1172
|
+
assert (
|
|
1173
|
+
activity_today.anonymised_unverified_teachers
|
|
1174
|
+
== daily_teacher_count + 1
|
|
1175
|
+
)
|
|
1176
|
+
assert (
|
|
1177
|
+
total_activity.anonymised_unverified_teachers
|
|
1178
|
+
== total_teacher_count + 1
|
|
1179
|
+
)
|
|
1043
1180
|
|
|
1044
1181
|
if not indy_user_active:
|
|
1045
|
-
assert
|
|
1046
|
-
|
|
1182
|
+
assert (
|
|
1183
|
+
activity_today.anonymised_unverified_independents
|
|
1184
|
+
== daily_indy_count + 1
|
|
1185
|
+
)
|
|
1186
|
+
assert (
|
|
1187
|
+
total_activity.anonymised_unverified_independents
|
|
1188
|
+
== total_indy_count + 1
|
|
1189
|
+
)
|
|
1047
1190
|
|
|
1048
1191
|
teacher_user.delete()
|
|
1049
1192
|
indy_user.delete()
|
|
@@ -552,15 +552,16 @@ def process_dismiss_student_form(request, formset, klass, access_code):
|
|
|
552
552
|
student.new_user.first_name = data["name"]
|
|
553
553
|
student.new_user.username = data["email"]
|
|
554
554
|
student.new_user.email = data["email"]
|
|
555
|
+
student.user.is_verified = False
|
|
555
556
|
student.save()
|
|
556
557
|
student.new_user.save()
|
|
557
|
-
student.
|
|
558
|
+
student.user.save()
|
|
558
559
|
|
|
559
560
|
# log the data
|
|
560
561
|
joinrelease = JoinReleaseStudent.objects.create(student=student, action_type=JoinReleaseStudent.RELEASE)
|
|
561
562
|
joinrelease.save()
|
|
562
563
|
|
|
563
|
-
send_verification_email(request, student.new_user, data)
|
|
564
|
+
send_verification_email(request, student.new_user, data, school=klass.teacher.school)
|
|
564
565
|
|
|
565
566
|
if not failed_users:
|
|
566
567
|
messages.success(request, "The students have been released successfully from the class.")
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "6.44.9"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/codeforlife_portal.egg-info/SOURCES.txt
RENAMED
|
File without changes
|
|
File without changes
|
{codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/codeforlife_portal.egg-info/not-zip-safe
RENAMED
|
File without changes
|
{codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/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.44.9 → codeforlife-portal-6.45.0}/deploy/middleware/exceptionlogging.py
RENAMED
|
File without changes
|
{codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/deploy/middleware/screentime_warning.py
RENAMED
|
File without changes
|
|
File without changes
|
{codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/deploy/middleware/session_timeout.py
RENAMED
|
File without changes
|
{codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/deploy/static/apple-touch-icon-120x120.png
RENAMED
|
File without changes
|
{codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/deploy/static/apple-touch-icon-152x152.png
RENAMED
|
File without changes
|
{codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/deploy/static/apple-touch-icon-180x180.png
RENAMED
|
File without changes
|
{codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/deploy/static/apple-touch-icon-76x76.png
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codeforlife-portal-6.44.9 → codeforlife-portal-6.45.0}/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
|