codeforlife-portal 6.41.4__tar.gz → 6.41.6__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.41.4/codeforlife_portal.egg-info → codeforlife-portal-6.41.6}/PKG-INFO +1 -1
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6/codeforlife_portal.egg-info}/PKG-INFO +1 -1
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/codeforlife_portal.egg-info/requires.txt +1 -1
- codeforlife-portal-6.41.6/portal/__init__.py +1 -0
- codeforlife-portal-6.41.6/portal/static/portal/img/logo_cfl.png +0 -0
- codeforlife-portal-6.41.6/portal/static/portal/img/logo_cfl_reminder_cards.jpg +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/test_independent_student.py +30 -17
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/test_ratelimit.py +15 -12
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/test_teacher.py +35 -21
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/test_teacher_student.py +13 -3
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/test_views.py +55 -194
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/views/cron/user.py +12 -49
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/views/teacher/teach.py +6 -3
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/pyproject.toml +6 -0
- codeforlife-portal-6.41.4/portal/__init__.py +0 -1
- codeforlife-portal-6.41.4/portal/static/portal/img/logo_cfl.png +0 -0
- codeforlife-portal-6.41.4/portal/static/portal/img/logo_cfl_reminder_cards.jpg +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/LICENSE.md +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/MANIFEST.in +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/README.md +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/codeforlife_portal.egg-info/SOURCES.txt +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/codeforlife_portal.egg-info/dependency_links.txt +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/codeforlife_portal.egg-info/not-zip-safe +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/codeforlife_portal.egg-info/top_level.txt +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/deploy/__init__.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/deploy/captcha.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/deploy/middleware/__init__.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/deploy/middleware/admin_access.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/deploy/middleware/basicauth.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/deploy/middleware/exceptionlogging.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/deploy/middleware/screentime_warning.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/deploy/middleware/security.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/deploy/middleware/session_timeout.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/deploy/static/apple-touch-icon-120x120.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/deploy/static/apple-touch-icon-152x152.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/deploy/static/apple-touch-icon-180x180.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/deploy/static/apple-touch-icon-76x76.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/deploy/static/apple-touch-icon.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/deploy/static/robots.txt +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/deploy/templates/deploy/csrf_failure.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/deploy/views.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/admin.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/app_settings.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/backends.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/beta.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/context_processors.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/forms/__init__.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/forms/add_game.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/forms/admin.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/forms/dotmailer.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/forms/error_messages.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/forms/invite_teacher.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/forms/organisation.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/forms/play.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/forms/registration.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/forms/teach.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/handlers.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/helpers/__init__.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/helpers/captcha.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/helpers/decorators.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/helpers/password.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/helpers/ratelimit.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/helpers/regexes.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/helpers/request_handlers.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/migrations/0001_squashed_0041_new_news.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/migrations/0042_school_country.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/migrations/0043_auto_20150430_0952.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/migrations/0044_auto_20150430_0959.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/migrations/0045_auto_20150430_1446.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/migrations/0046_auto_20150723_1101.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/migrations/0047_remove_userprofile_avatar.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/migrations/0048_plural_management_frontnews.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/migrations/0049_refactor_emailverifications.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/migrations/0050_refactor_emailverifications_2.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/migrations/0051_add_missing_ev_records.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/migrations/0052_refactor_emailverifications_3.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/migrations/0053_refactor_teacher_student_1.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/migrations/0054_pending_join_request_can_be_blank.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/migrations/0055_add_preview_user.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/migrations/0056_remove_preview_user.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/migrations/0057_delete_frontpagenews.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/migrations/0058_move_to_common_models.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/migrations/0059_move_email_verifications_to_common.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/migrations/0060_delete_guardian.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/migrations/0061_make_portaladmin_teacher.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/migrations/0062_verify_portaladmin.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/migrations/__init__.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/mixins/__init__.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/mixins/cron_mixin.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/models.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/permissions/__init__.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/permissions/is_cron_request_from_google.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/pipeline_compilers/__init__.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/pipeline_compilers/libsass_compiler.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/fonts/bootstrap/glyphicons-halflings-regular.eot +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/fonts/bootstrap/glyphicons-halflings-regular.svg +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/fonts/bootstrap/glyphicons-halflings-regular.ttf +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/fonts/bootstrap/glyphicons-halflings-regular.woff +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/fonts/bootstrap/glyphicons-halflings-regular.woff2 +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/10_years_anniversary.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/10x_logo.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/RR_logo_grass_background.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/RR_logo_green.svg +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/RR_logo_simple.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/about_us_cfl.jpg +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/about_us_hero.jpg +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/about_us_ocado.jpg +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/barefoot_logo.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/bcs_logo.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/clubs.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/coding_club_hero.jpg +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/coding_club_python_pack.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/colorboxImages/border.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/colorboxImages/controls.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/colorboxImages/loading.gif +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/colorboxImages/loading_background.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/colorboxImages/overlay.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/confirmation_tick.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/cross.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/dee.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/facebook.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/favicon.ico +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/get_involved_hero.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/gitbook.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/gitbook_space.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/github.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/github_hero.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/gla_logo.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/hamburger.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/help_and_support_hero.jpg +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/home_educate.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/home_educate_hero.jpg +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/home_learning_hero.jpg +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/home_play.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/home_play_hero.jpg +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/hope_logo.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/icl_logo.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/icon_controller.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/icon_free.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/icon_globe.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/icon_piechart.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/icon_step_by_step.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/icon_tracking.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/icon_uk_flag.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/kirsty.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/kurono_hero.jpg +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/kurono_landing_hero.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/kurono_logo.svg +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/kurono_logo_grey_background.svg +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/kurono_logo_mark.svg +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/kurono_resources_hero.jpg +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/kurono_story.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/logo_cfl_white_landscape.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/logo_ocado.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/logo_ocado_group.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/logo_ocado_group.svg +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/logo_ocado_group_white.svg +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/mc_saatchi_logo.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/nigel.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/ocado-swirl.svg +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/oval_blue.svg +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/oval_pink.svg +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/oval_yellow.svg +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/paper_plane.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/phil.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/polygon_blue.svg +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/polygon_pink.svg +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/polygon_yellow.svg +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/pressure_cooker_logo.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/rapid_router.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/rapid_router_landing_hero.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/rapidrouter.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/resources_hero.jpg +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/resources_montage.jpg +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/reuben.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/rob.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/rr_advanced.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/rr_beginner.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/rr_intermediate.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/sadface.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/sharon_harrison.jpg +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/sian.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/teaching_resources_hero.jpg +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/thumbnail_educate_kurono.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/thumbnail_educate_rapid_router.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/thumbnail_educate_resources.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/thumbnail_intro_c4l.jpg +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/thumbnail_kurono_resources.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/thumbnail_play_kurono.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/thumbnail_play_rapid_router.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/twitter.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/universities.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/wes.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/img/x_close_video.png +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/js/aimmoGame.js +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/js/bootstrap.min.js +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/js/carouselCards.js +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/js/common.js +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/js/independentLogin.js +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/js/independentRegistration.js +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/js/join_create_game_toggle.js +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/js/jquery.placeholder.js +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/js/levelControl.js +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/js/lib/jquery-video-lightning.js +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/js/lib/jquery.colorbox.js +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/js/lib/jquery.easy-ticker.js +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/js/lib/jquery.min.js +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/js/lib/modernizr-build.js +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/js/lib/papaparse.min.js +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/js/organisation_manage.js +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/js/passwordStrength.js +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/js/play.js +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/js/resetPassword.js +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/js/riveted.min.js +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/js/school.js +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/js/sticky_subnav.js +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/js/studentLogin.js +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/js/teach_browser.js +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/js/teach_class.js +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/js/teacherEditStudent.js +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/js/teacherLogin.js +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/_alerts.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/_badges.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/_breadcrumbs.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/_button-groups.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/_buttons.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/_carousel.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/_close.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/_code.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/_component-animations.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/_dropdowns.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/_forms.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/_glyphicons.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/_grid.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/_input-groups.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/_jumbotron.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/_labels.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/_list-group.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/_media.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/_mixins.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/_modals.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/_navbar.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/_navs.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/_normalize.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/_pager.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/_pagination.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/_panels.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/_popovers.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/_print.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/_progress-bars.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/_responsive-embed.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/_responsive-utilities.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/_scaffolding.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/_tables.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/_theme.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/_thumbnails.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/_tooltip.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/_type.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/_utilities.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/_variables.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/_wells.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/mixins/_alerts.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/mixins/_background-variant.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/mixins/_border-radius.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/mixins/_breakpoints.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/mixins/_buttons.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/mixins/_center-block.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/mixins/_clearfix.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/mixins/_forms.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/mixins/_gradients.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/mixins/_grid-framework.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/mixins/_grid.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/mixins/_hide-text.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/mixins/_image.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/mixins/_labels.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/mixins/_list-group.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/mixins/_nav-divider.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/mixins/_nav-vertical-align.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/mixins/_opacity.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/mixins/_pagination.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/mixins/_panels.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/mixins/_progress-bar.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/mixins/_reset-filter.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/mixins/_reset-text.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/mixins/_resize.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/mixins/_responsive-visibility.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/mixins/_size.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/mixins/_tab-focus.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/mixins/_table-row.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/mixins/_text-emphasis.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/mixins/_text-overflow.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/mixins/_text-truncate.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap/mixins/_vendor-prefixes.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap_mixins/_all.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap_mixins/_border-radius.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap_mixins/_box-shadow.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap_mixins/_hover.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap_mixins/_nav-divider.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap_partials/_dropdown.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap_partials/_glyphicons.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap_partials/_grid.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap_partials/_variables.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap_utilities/_align.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap_utilities/_background.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap_utilities/_borders.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap_utilities/_clearfix.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap_utilities/_cursor.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap_utilities/_display.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap_utilities/_flex.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap_utilities/_float.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap_utilities/_position.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap_utilities/_screenreaders.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap_utilities/_sizing.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap_utilities/_spacing.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap_utilities/_text.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/bootstrap_utilities/_visibility.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/colorbox.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/modules/_all.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/modules/_animation.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/modules/_breakpoints.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/modules/_card_constants.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/modules/_colours.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/modules/_homepage_constants.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/modules/_levels.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/modules/_mixins.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/modules/_spacing.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/partials/_banners.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/partials/_base.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/partials/_buttons.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/partials/_carousel.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/partials/_footer.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/partials/_forms.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/partials/_grids.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/partials/_header.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/partials/_images.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/partials/_popup.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/partials/_progress-bars.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/partials/_subnavs.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/partials/_tables.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/partials/_text.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/partials/_ui-dialog.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/partials/_utils.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/partials/_videos.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/sass/styles.scss +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/video/aimmo_play_now_background_video.mp4 +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/static/portal/video/code for life .pdf +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/strings/__init__.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/strings/about.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/strings/coding_club.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/strings/help_and_support.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/strings/home_learning.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/strings/materials.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/strings/play.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/strings/student_aimmo_dashboard.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/strings/teach.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/strings/teacher_resources.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/403.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/404.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/500.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/captcha/includes/js_v2_invisible.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/captcha/widget_v2_invisible.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/email.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/email.txt +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/about.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/base.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/base_no_userprofile.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/coding_club.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/contribute.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/dotmailer_consent_form.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/email_invitation_sent.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/email_style_template.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/email_verification_failed.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/email_verification_needed.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/form_shapes.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/getinvolved.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/home.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/home_learning.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/locked_out.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/locked_out_school_student.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/login/independent_student.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/login/student.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/login/student_class_code.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/login/teacher.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/mouseflow.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/partials/aimmo_games_table.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/partials/banner.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/partials/benefits.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/partials/card_list.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/partials/character_list.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/partials/delete_popup.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/partials/footer.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/partials/header.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/partials/headline.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/partials/hero_card.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/partials/info_popup.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/partials/invite_admin_teacher.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/partials/popup.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/partials/register_newsletter_tickbox.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/partials/screentime_popup.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/partials/service_unavailable_popup.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/partials/session_popup.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/partials/teacher_non_dashboard_subnav.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/partials/teacher_non_dashboard_subnav_account.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/play/independent_student_dashboard.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/play/student_aimmo_dashboard.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/play/student_dashboard.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/play/student_edit_account.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/play/student_join_organisation.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/play.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/privacy_notice.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/register.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/reset_password.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/reset_password_confirm.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/reset_password_done.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/reset_password_email_sent.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/tag_manager/tag_manager_body.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/tag_manager/tag_manager_head.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/teach/base_registering.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/teach/class.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/teach/dashboard.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/teach/invited.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/teach/onboarding_classes.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/teach/onboarding_print.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/teach/onboarding_school.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/teach/onboarding_students.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/teach/teacher_add_external_student.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/teach/teacher_added_external_student.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/teach/teacher_aimmo_dashboard.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/teach/teacher_dismiss_students.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/teach/teacher_edit_class.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/teach/teacher_edit_student.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/teach/teacher_move_all_classes.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/teach/teacher_move_students.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/teach/teacher_move_students_to_class.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/teach.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/portal/terms.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/two_factor/_base.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/two_factor/_wizard_actions.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/two_factor/_wizard_actions_enable_2fa.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/two_factor/_wizard_actions_submit.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/two_factor/_wizard_forms.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/two_factor/_wizard_forms_token.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/two_factor/backup_token.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/two_factor/core/backup_tokens.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/two_factor/core/login.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/two_factor/core/setup.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/two_factor/core/setup_complete.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/two_factor/profile/disable.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/two_factor/profile/profile.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templates/two_factor/setup_wizard_token.html +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templatetags/__init__.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templatetags/app_tags.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templatetags/banner_tags.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templatetags/benefits_tags.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templatetags/card_list_tags.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templatetags/character_list_tags.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templatetags/future.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templatetags/headline_tags.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templatetags/hero_card_tags.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/templatetags/table_tags.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/__init__.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/base_test.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/conftest.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/migrations/__init__.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/migrations/test_migration_make_portaladmin_teacher.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/migrations/test_migration_preview_user_remove.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/migrations/test_migration_preview_users.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/migrations/test_migration_remove_front_page_news.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/migrations/test_migration_remove_guardian.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/migrations/test_migration_use_common_models.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/migrations/test_migration_verify_portaladmin.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/__init__.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/portal/__init__.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/portal/admin/__init__.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/portal/admin/admin_base_page.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/portal/admin/admin_data_page.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/portal/admin/admin_map_page.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/portal/base_page.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/portal/email_verification_needed_page.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/portal/forbidden_page.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/portal/game_page.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/portal/home_page.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/portal/independent_login_page.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/portal/kurono_teacher_dashboard_page.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/portal/password_reset_form_page.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/portal/password_reset_page.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/portal/play/__init__.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/portal/play/account_page.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/portal/play/dashboard_page.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/portal/play/join_school_or_club_page.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/portal/play/play_base_page.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/portal/play_page.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/portal/resources_page.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/portal/signup_page.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/portal/student_login_class_code.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/portal/student_login_page.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/portal/teach/__init__.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/portal/teach/add_independent_student_to_class_page.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/portal/teach/added_independent_student_to_class_page.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/portal/teach/class_page.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/portal/teach/dashboard_page.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/portal/teach/dismiss_students_page.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/portal/teach/edit_student_page.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/portal/teach/move_class_page.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/portal/teach/move_classes_page.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/portal/teach/move_students_disambiguate_page.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/portal/teach/move_students_page.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/portal/teach/onboarding_classes_page.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/portal/teach/onboarding_organisation_page.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/portal/teach/onboarding_student_list_page.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/portal/teach/onboarding_students_page.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/portal/teach/teach_base_page.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/pageObjects/portal/teacher_login_page.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/selenium_test_case.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/snapshots/__init__.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/snapshots/snap_test_partials.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/test_2FA.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/test_admin.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/test_aimmo_dashboards.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/test_api.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/test_captcha_forms.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/test_class.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/test_daily_activities.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/test_emails.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/test_helper_methods.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/test_invite_teacher.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/test_middleware.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/test_newsletter_footer.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/test_organisation.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/test_partials.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/test_school_student.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/test_security.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/utils/__init__.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/utils/aimmo_games.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/utils/classes.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/utils/messages.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/urls.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/views/__init__.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/views/about.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/views/admin.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/views/aimmo/__init__.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/views/aimmo/dashboard.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/views/api.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/views/cron/__init__.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/views/dotmailer.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/views/email.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/views/home.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/views/legal.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/views/login/__init__.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/views/login/independent_student.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/views/login/student.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/views/login/teacher.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/views/organisation.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/views/play_landing_page.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/views/registration.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/views/student/__init__.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/views/student/edit_account_details.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/views/student/play.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/views/teach.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/views/teacher/__init__.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/views/teacher/dashboard.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/views/two_factor/__init__.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/views/two_factor/core.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/views/two_factor/form.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/views/two_factor/profile.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/wsgi.py +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/setup.cfg +0 -0
- {codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/setup.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "6.41.6"
|
|
Binary file
|
{codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/test_independent_student.py
RENAMED
|
@@ -2,11 +2,16 @@ from __future__ import absolute_import
|
|
|
2
2
|
|
|
3
3
|
import datetime
|
|
4
4
|
import time
|
|
5
|
+
from unittest.mock import ANY, Mock, patch
|
|
5
6
|
|
|
7
|
+
from common.mail import campaign_ids
|
|
6
8
|
from common.models import JoinReleaseStudent
|
|
7
9
|
from common.tests.utils import email as email_utils
|
|
8
10
|
from common.tests.utils.classes import create_class_directly
|
|
9
|
-
from common.tests.utils.organisation import
|
|
11
|
+
from common.tests.utils.organisation import (
|
|
12
|
+
create_organisation_directly,
|
|
13
|
+
join_teacher_to_organisation,
|
|
14
|
+
)
|
|
10
15
|
from common.tests.utils.student import (
|
|
11
16
|
create_independent_student,
|
|
12
17
|
create_independent_student_directly,
|
|
@@ -137,7 +142,8 @@ class TestIndependentStudent(TestCase):
|
|
|
137
142
|
# Assert response isn't a redirect (submit failure)
|
|
138
143
|
assert response.status_code == 200
|
|
139
144
|
|
|
140
|
-
|
|
145
|
+
@patch("common.helpers.emails.send_dotdigital_email")
|
|
146
|
+
def test_signup_under_13_sends_parent_email(self, mock_send_dotdigital_email: Mock):
|
|
141
147
|
c = Client()
|
|
142
148
|
|
|
143
149
|
response = c.post(
|
|
@@ -156,8 +162,9 @@ class TestIndependentStudent(TestCase):
|
|
|
156
162
|
)
|
|
157
163
|
|
|
158
164
|
assert response.status_code == 302
|
|
159
|
-
|
|
160
|
-
|
|
165
|
+
mock_send_dotdigital_email.assert_called_once_with(
|
|
166
|
+
campaign_ids["verify_new_user_via_parent"], ANY, personalization_values=ANY
|
|
167
|
+
)
|
|
161
168
|
|
|
162
169
|
|
|
163
170
|
# Class for Selenium tests. We plan to replace these and turn them into Cypress tests
|
|
@@ -256,16 +263,20 @@ class TestIndependentStudentFrontend(BaseTest):
|
|
|
256
263
|
page = page.independent_student_login(username, password)
|
|
257
264
|
assert self.is_dashboard(page)
|
|
258
265
|
|
|
259
|
-
|
|
266
|
+
@patch("common.helpers.emails.send_dotdigital_email")
|
|
267
|
+
def test_login_not_verified(self, mock_send_dotdigital_email):
|
|
260
268
|
username, password, _ = create_independent_student_directly(preverified=False)
|
|
261
269
|
self.selenium.get(self.live_server_url)
|
|
262
270
|
page = HomePage(self.selenium)
|
|
263
271
|
page = page.go_to_independent_student_login_page()
|
|
264
272
|
page = page.independent_student_login_failure(username, password)
|
|
265
273
|
|
|
274
|
+
errors = page.has_login_failed("independent_student_login_form", INVALID_LOGIN_MESSAGE)
|
|
266
275
|
assert page.has_login_failed("independent_student_login_form", INVALID_LOGIN_MESSAGE)
|
|
267
276
|
|
|
268
|
-
|
|
277
|
+
verification_url = mock_send_dotdigital_email.call_args.kwargs["personalization_values"]["VERIFICATION_LINK"]
|
|
278
|
+
|
|
279
|
+
verify_email(page, verification_url)
|
|
269
280
|
|
|
270
281
|
assert is_email_verified_message_showing(self.selenium)
|
|
271
282
|
|
|
@@ -340,7 +351,8 @@ class TestIndependentStudentFrontend(BaseTest):
|
|
|
340
351
|
"student_account_form", "Names may only contain letters, numbers, dashes, underscores, and spaces."
|
|
341
352
|
)
|
|
342
353
|
|
|
343
|
-
|
|
354
|
+
@patch("common.helpers.emails.send_dotdigital_email")
|
|
355
|
+
def test_change_email(self, mock_send_dotdigital_email):
|
|
344
356
|
homepage = self.go_to_homepage()
|
|
345
357
|
|
|
346
358
|
_, _, _, student_email, password = create_independent_student(homepage)
|
|
@@ -354,9 +366,9 @@ class TestIndependentStudentFrontend(BaseTest):
|
|
|
354
366
|
assert is_student_details_updated_message_showing(self.selenium)
|
|
355
367
|
assert is_email_updated_message_showing(self.selenium)
|
|
356
368
|
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
369
|
+
mock_send_dotdigital_email.assert_called_with(
|
|
370
|
+
campaign_ids["email_change_notification"], ANY, personalization_values=ANY
|
|
371
|
+
)
|
|
360
372
|
|
|
361
373
|
# Try changing email to an existing teacher's email
|
|
362
374
|
teacher_email, _ = signup_teacher_directly()
|
|
@@ -372,9 +384,9 @@ class TestIndependentStudentFrontend(BaseTest):
|
|
|
372
384
|
assert is_student_details_updated_message_showing(self.selenium)
|
|
373
385
|
assert is_email_updated_message_showing(self.selenium)
|
|
374
386
|
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
387
|
+
mock_send_dotdigital_email.assert_called_with(
|
|
388
|
+
campaign_ids["email_change_notification"], ANY, personalization_values=ANY
|
|
389
|
+
)
|
|
378
390
|
|
|
379
391
|
page = (
|
|
380
392
|
self.go_to_homepage()
|
|
@@ -402,11 +414,12 @@ class TestIndependentStudentFrontend(BaseTest):
|
|
|
402
414
|
|
|
403
415
|
page = page.logout()
|
|
404
416
|
|
|
405
|
-
|
|
406
|
-
|
|
417
|
+
mock_send_dotdigital_email.assert_called_with(
|
|
418
|
+
campaign_ids["email_change_verification"], ANY, personalization_values=ANY
|
|
419
|
+
)
|
|
420
|
+
verification_url = mock_send_dotdigital_email.call_args.kwargs["personalization_values"]["VERIFICATION_LINK"]
|
|
407
421
|
|
|
408
|
-
page = email_utils.follow_change_email_link_to_independent_dashboard(page,
|
|
409
|
-
mail.outbox = []
|
|
422
|
+
page = email_utils.follow_change_email_link_to_independent_dashboard(page, verification_url)
|
|
410
423
|
|
|
411
424
|
page = page.independent_student_login(new_email, password)
|
|
412
425
|
|
|
@@ -2,10 +2,12 @@ from __future__ import absolute_import
|
|
|
2
2
|
|
|
3
3
|
import re
|
|
4
4
|
from datetime import datetime, timedelta
|
|
5
|
+
from unittest.mock import ANY, Mock, patch
|
|
5
6
|
|
|
6
7
|
import pytest
|
|
7
8
|
import pytz
|
|
8
|
-
from common.
|
|
9
|
+
from common.mail import campaign_ids
|
|
10
|
+
from common.models import DailyActivity, Student, Teacher
|
|
9
11
|
from common.tests.utils.classes import create_class_directly
|
|
10
12
|
from common.tests.utils.organisation import create_organisation_directly
|
|
11
13
|
from common.tests.utils.student import (
|
|
@@ -13,11 +15,10 @@ from common.tests.utils.student import (
|
|
|
13
15
|
create_school_student_directly,
|
|
14
16
|
generate_independent_student_details,
|
|
15
17
|
)
|
|
16
|
-
from common.tests.utils.teacher import
|
|
18
|
+
from common.tests.utils.teacher import generate_details, signup_teacher_directly
|
|
17
19
|
from django.core import mail
|
|
18
20
|
from django.test import Client, TestCase
|
|
19
|
-
from django.urls import reverse
|
|
20
|
-
from django.urls import reverse_lazy
|
|
21
|
+
from django.urls import reverse, reverse_lazy
|
|
21
22
|
|
|
22
23
|
from portal.helpers.ratelimit import get_ratelimit_count_for_user
|
|
23
24
|
from portal.views.login import has_user_lockout_expired
|
|
@@ -432,8 +433,9 @@ class TestRatelimit(TestCase):
|
|
|
432
433
|
assert current_daily_activity.school_student_lockout_resets == 2
|
|
433
434
|
|
|
434
435
|
|
|
436
|
+
@patch("common.helpers.emails.send_dotdigital_email")
|
|
435
437
|
@pytest.mark.django_db
|
|
436
|
-
def test_teacher_already_registered_email(client):
|
|
438
|
+
def test_teacher_already_registered_email(mock_send_dotdigital_email: Mock, client):
|
|
437
439
|
first_name, last_name, email, password = generate_details()
|
|
438
440
|
register_url = reverse("register")
|
|
439
441
|
data = {
|
|
@@ -448,19 +450,20 @@ def test_teacher_already_registered_email(client):
|
|
|
448
450
|
|
|
449
451
|
# Register the teacher first time, there should be a registration email
|
|
450
452
|
client.post(register_url, data)
|
|
451
|
-
|
|
453
|
+
mock_send_dotdigital_email.assert_called_once_with(campaign_ids["verify_new_user"], ANY, personalization_values=ANY)
|
|
452
454
|
|
|
453
455
|
# Register with the same email again, there should also be an already registered email
|
|
454
456
|
client.post(register_url, data)
|
|
455
|
-
assert len(mail.outbox) ==
|
|
457
|
+
assert len(mail.outbox) == 1
|
|
456
458
|
|
|
457
459
|
# Register with the same email one more time, there shouldn't be any new emails
|
|
458
460
|
client.post(register_url, data)
|
|
459
|
-
assert len(mail.outbox) ==
|
|
461
|
+
assert len(mail.outbox) == 1
|
|
460
462
|
|
|
461
463
|
|
|
464
|
+
@patch("common.helpers.emails.send_dotdigital_email")
|
|
462
465
|
@pytest.mark.django_db
|
|
463
|
-
def test_independent_student_already_registered_email(client):
|
|
466
|
+
def test_independent_student_already_registered_email(mock_send_dotdigital_email: Mock, client):
|
|
464
467
|
name, username, email_address, password = generate_independent_student_details()
|
|
465
468
|
register_url = reverse("register")
|
|
466
469
|
data = {
|
|
@@ -477,12 +480,12 @@ def test_independent_student_already_registered_email(client):
|
|
|
477
480
|
|
|
478
481
|
# Register the independent student first time, there should be a registration email
|
|
479
482
|
client.post(register_url, data)
|
|
480
|
-
|
|
483
|
+
mock_send_dotdigital_email.assert_called_once_with(campaign_ids["verify_new_user"], ANY, personalization_values=ANY)
|
|
481
484
|
|
|
482
485
|
# Register with the same email again, there should also be an already registered email
|
|
483
486
|
client.post(register_url, data)
|
|
484
|
-
assert len(mail.outbox) ==
|
|
487
|
+
assert len(mail.outbox) == 1
|
|
485
488
|
|
|
486
489
|
# Reset mock and register with the same email one more time, there shouldn't be any new emails
|
|
487
490
|
client.post(register_url, data)
|
|
488
|
-
assert len(mail.outbox) ==
|
|
491
|
+
assert len(mail.outbox) == 1
|
|
@@ -1,17 +1,24 @@
|
|
|
1
1
|
from __future__ import absolute_import
|
|
2
2
|
|
|
3
|
-
import re
|
|
4
3
|
import time
|
|
5
4
|
from datetime import timedelta
|
|
5
|
+
from unittest.mock import ANY, Mock, patch
|
|
6
6
|
from uuid import uuid4
|
|
7
7
|
|
|
8
8
|
import jwt
|
|
9
9
|
from aimmo.models import Game
|
|
10
|
+
from common.mail import campaign_ids
|
|
10
11
|
from common.models import Class, Student, Teacher
|
|
11
12
|
from common.tests.utils import email as email_utils
|
|
12
13
|
from common.tests.utils.classes import create_class_directly
|
|
13
|
-
from common.tests.utils.organisation import
|
|
14
|
-
|
|
14
|
+
from common.tests.utils.organisation import (
|
|
15
|
+
create_organisation_directly,
|
|
16
|
+
join_teacher_to_organisation,
|
|
17
|
+
)
|
|
18
|
+
from common.tests.utils.student import (
|
|
19
|
+
create_independent_student_directly,
|
|
20
|
+
create_school_student_directly,
|
|
21
|
+
)
|
|
15
22
|
from common.tests.utils.teacher import (
|
|
16
23
|
signup_duplicate_teacher_fail,
|
|
17
24
|
signup_teacher,
|
|
@@ -357,7 +364,8 @@ class TestTeacher(TestCase):
|
|
|
357
364
|
# Assert response isn't a redirect (submit failure)
|
|
358
365
|
assert response.status_code == 200
|
|
359
366
|
|
|
360
|
-
|
|
367
|
+
@patch("common.helpers.emails.send_dotdigital_email")
|
|
368
|
+
def test_signup_email_verification(self, mock_send_dotdigital_email: Mock):
|
|
361
369
|
c = Client()
|
|
362
370
|
|
|
363
371
|
response = c.post(
|
|
@@ -374,7 +382,9 @@ class TestTeacher(TestCase):
|
|
|
374
382
|
)
|
|
375
383
|
|
|
376
384
|
assert response.status_code == 302
|
|
377
|
-
|
|
385
|
+
mock_send_dotdigital_email.assert_called_once_with(
|
|
386
|
+
campaign_ids["verify_new_user"], ANY, personalization_values=ANY
|
|
387
|
+
)
|
|
378
388
|
|
|
379
389
|
# Try verification URL with a fake token
|
|
380
390
|
fake_token = jwt.encode(
|
|
@@ -393,9 +403,8 @@ class TestTeacher(TestCase):
|
|
|
393
403
|
# Assert response isn't a redirect (get failure)
|
|
394
404
|
assert bad_verification_response.status_code == 200
|
|
395
405
|
|
|
396
|
-
# Get verification link from
|
|
397
|
-
|
|
398
|
-
verification_url = re.search("http.+/", message).group(0)
|
|
406
|
+
# Get verification link from function call
|
|
407
|
+
verification_url = mock_send_dotdigital_email.call_args.kwargs["personalization_values"]["VERIFICATION_LINK"]
|
|
399
408
|
|
|
400
409
|
# Verify the email properly
|
|
401
410
|
verification_response = c.get(verification_url)
|
|
@@ -472,7 +481,8 @@ class TestTeacherFrontend(BaseTest):
|
|
|
472
481
|
page = page.login(email, password)
|
|
473
482
|
assert self.is_dashboard_page(page)
|
|
474
483
|
|
|
475
|
-
|
|
484
|
+
@patch("common.helpers.emails.send_dotdigital_email")
|
|
485
|
+
def test_login_not_verified(self, mock_send_dotdigital_email):
|
|
476
486
|
email, password = signup_teacher_directly(preverified=False)
|
|
477
487
|
create_organisation_directly(email)
|
|
478
488
|
_, _, access_code = create_class_directly(email)
|
|
@@ -484,7 +494,9 @@ class TestTeacherFrontend(BaseTest):
|
|
|
484
494
|
|
|
485
495
|
assert page.has_login_failed("form-login-teacher", INVALID_LOGIN_MESSAGE)
|
|
486
496
|
|
|
487
|
-
|
|
497
|
+
verification_url = mock_send_dotdigital_email.call_args.kwargs["personalization_values"]["VERIFICATION_LINK"]
|
|
498
|
+
|
|
499
|
+
verify_email(page, verification_url)
|
|
488
500
|
|
|
489
501
|
assert is_email_verified_message_showing(self.selenium)
|
|
490
502
|
|
|
@@ -537,7 +549,8 @@ class TestTeacherFrontend(BaseTest):
|
|
|
537
549
|
|
|
538
550
|
assert page.check_account_details({"first_name": "Florian", "last_name": "Aucomte"})
|
|
539
551
|
|
|
540
|
-
|
|
552
|
+
@patch("common.helpers.emails.send_dotdigital_email")
|
|
553
|
+
def test_change_email(self, mock_send_dotdigital_email):
|
|
541
554
|
email, password = signup_teacher_directly()
|
|
542
555
|
create_organisation_directly(email)
|
|
543
556
|
_, _, access_code = create_class_directly(email)
|
|
@@ -553,9 +566,9 @@ class TestTeacherFrontend(BaseTest):
|
|
|
553
566
|
assert self.is_email_verification_page(page)
|
|
554
567
|
assert is_email_updated_message_showing(self.selenium)
|
|
555
568
|
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
569
|
+
mock_send_dotdigital_email.assert_called_with(
|
|
570
|
+
campaign_ids["email_change_notification"], ANY, personalization_values=ANY
|
|
571
|
+
)
|
|
559
572
|
|
|
560
573
|
# Try changing email to an existing indy student's email, should fail
|
|
561
574
|
indy_email, _, _ = create_independent_student_directly()
|
|
@@ -566,9 +579,9 @@ class TestTeacherFrontend(BaseTest):
|
|
|
566
579
|
assert self.is_email_verification_page(page)
|
|
567
580
|
assert is_email_updated_message_showing(self.selenium)
|
|
568
581
|
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
582
|
+
mock_send_dotdigital_email.assert_called_with(
|
|
583
|
+
campaign_ids["email_change_notification"], ANY, personalization_values=ANY
|
|
584
|
+
)
|
|
572
585
|
|
|
573
586
|
page = self.go_to_homepage()
|
|
574
587
|
page = page.go_to_teacher_login_page().login(email, password).open_account_tab()
|
|
@@ -586,11 +599,12 @@ class TestTeacherFrontend(BaseTest):
|
|
|
586
599
|
|
|
587
600
|
page = page.logout()
|
|
588
601
|
|
|
589
|
-
|
|
590
|
-
|
|
602
|
+
mock_send_dotdigital_email.assert_called_with(
|
|
603
|
+
campaign_ids["email_change_verification"], ANY, personalization_values=ANY
|
|
604
|
+
)
|
|
605
|
+
verification_url = mock_send_dotdigital_email.call_args.kwargs["personalization_values"]["VERIFICATION_LINK"]
|
|
591
606
|
|
|
592
|
-
page = email_utils.follow_change_email_link_to_dashboard(page,
|
|
593
|
-
mail.outbox = []
|
|
607
|
+
page = email_utils.follow_change_email_link_to_dashboard(page, verification_url)
|
|
594
608
|
|
|
595
609
|
page = page.login(new_email, password).open_account_tab()
|
|
596
610
|
|
{codeforlife-portal-6.41.4 → codeforlife-portal-6.41.6}/portal/tests/test_teacher_student.py
RENAMED
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
from __future__ import absolute_import
|
|
2
2
|
|
|
3
3
|
import json
|
|
4
|
+
from unittest.mock import Mock, patch
|
|
4
5
|
|
|
5
6
|
import pytest
|
|
6
7
|
from common.models import JoinReleaseStudent
|
|
7
8
|
from common.tests.utils.classes import create_class_directly
|
|
8
|
-
from common.tests.utils.organisation import
|
|
9
|
+
from common.tests.utils.organisation import (
|
|
10
|
+
create_organisation_directly,
|
|
11
|
+
join_teacher_to_organisation,
|
|
12
|
+
)
|
|
9
13
|
from common.tests.utils.student import (
|
|
10
14
|
create_many_school_students,
|
|
11
15
|
create_school_student,
|
|
@@ -528,7 +532,8 @@ class TestTeacherStudentFrontend(BaseTest):
|
|
|
528
532
|
page = page.logout().go_to_teacher_login_page().login(email_2, password_2).open_classes_tab().go_to_class_page()
|
|
529
533
|
assert page.student_exists(student_name_1)
|
|
530
534
|
|
|
531
|
-
|
|
535
|
+
@patch("common.helpers.emails.send_dotdigital_email")
|
|
536
|
+
def test_dismiss(self, mock_send_dotdigital_email: Mock):
|
|
532
537
|
email, password = signup_teacher_directly()
|
|
533
538
|
create_organisation_directly(email)
|
|
534
539
|
_, _, access_code = create_class_directly(email)
|
|
@@ -557,7 +562,10 @@ class TestTeacherStudentFrontend(BaseTest):
|
|
|
557
562
|
assert len(logs) == 1
|
|
558
563
|
assert logs[0].action_type == JoinReleaseStudent.RELEASE
|
|
559
564
|
|
|
560
|
-
|
|
565
|
+
mock_send_dotdigital_email.assert_called()
|
|
566
|
+
|
|
567
|
+
@patch("common.helpers.emails.send_dotdigital_email")
|
|
568
|
+
def test_multiple_dismiss(self, mock_send_dotdigital_email: Mock):
|
|
561
569
|
email, password = signup_teacher_directly()
|
|
562
570
|
create_organisation_directly(email)
|
|
563
571
|
_, _, access_code = create_class_directly(email)
|
|
@@ -597,3 +605,5 @@ class TestTeacherStudentFrontend(BaseTest):
|
|
|
597
605
|
|
|
598
606
|
# student should still exist
|
|
599
607
|
assert page.student_exists(student_name_2)
|
|
608
|
+
|
|
609
|
+
mock_send_dotdigital_email.assert_called()
|