codeforlife-portal 1.0.0.post.dev97__tar.gz → 1.0.0.post.dev101__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.
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/PKG-INFO +1 -1
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/codeforlife_portal.egg-info/PKG-INFO +1 -1
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/codeforlife_portal.egg-info/SOURCES.txt +1 -1
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/_version.py +2 -2
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/autoconfig.py +1 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/helpers/email.py +44 -17
- codeforlife-portal-1.0.0.post.dev101/portal/migrations/0049_refactor_emailverifications.py +58 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/models.py +6 -3
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/test_independent_student.py +2 -5
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/test_teacher.py +5 -4
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/utils/teacher.py +6 -3
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/views/admin.py +161 -56
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/views/email.py +13 -12
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/views/home.py +14 -14
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/views/teacher/teach.py +103 -73
- codeforlife-portal-1.0.0.post.dev97/portal/tests/test_migration_country.py +0 -130
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/MANIFEST.in +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/README.md +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/codeforlife_portal.egg-info/dependency_links.txt +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/codeforlife_portal.egg-info/not-zip-safe +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/codeforlife_portal.egg-info/requires.txt +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/codeforlife_portal.egg-info/top_level.txt +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/deploy/__init__.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/deploy/captcha.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/deploy/mail.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/deploy/middleware/__init__.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/deploy/middleware/basicauth.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/deploy/middleware/exceptionlogging.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/deploy/permissions.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/deploy/static/apple-touch-icon-120x120.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/deploy/static/apple-touch-icon-152x152.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/deploy/static/apple-touch-icon-180x180.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/deploy/static/apple-touch-icon-76x76.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/deploy/static/apple-touch-icon.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/deploy/static/robots.txt +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/deploy/templates/deploy/csrf_failure.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/deploy/views.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/__init__.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/admin.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/app_settings.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/beta.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/emailMessages.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/forms/__init__.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/forms/admin_login.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/forms/auth_forms.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/forms/home.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/forms/organisation.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/forms/play.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/forms/registration.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/forms/teach.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/handlers.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/helpers/__init__.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/helpers/generators.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/helpers/location.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/helpers/password.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/middleware/__init__.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/middleware/ratelimit_login_attempts.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/migrations/0001_squashed_0041_new_news.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/migrations/0042_school_country.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/migrations/0043_auto_20150430_0952.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/migrations/0044_auto_20150430_0959.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/migrations/0045_auto_20150430_1446.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/migrations/0046_auto_20150723_1101.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/migrations/0047_remove_userprofile_avatar.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/migrations/0048_plural_management_frontnews.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/migrations/__init__.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/permissions.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/email_media/cfl_logo_blue_rounded.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/email_media/cfllogo.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/colorbox.css +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/common.css +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/images/animated-overlay.gif +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/images/ui-bg_flat_10_000000_40x100.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/images/ui-icons_222222_256x240.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/images/ui-icons_228ef1_256x240.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/images/ui-icons_ef8c08_256x240.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/images/ui-icons_ffd27a_256x240.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/images/ui-icons_ffffff_256x240.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/jquery-ui.css +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/jquery-ui.structure.css +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/jquery-ui.theme.css +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/list.css +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/noJS.css +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/reset.css +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/styles.css +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/tables.css +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/2fa_authenticator_link.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/RR_logo_blank.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/RRlogo_on_green.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/RRlogo_on_green_small.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/RRlogo_on_less_green.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/RRlogo_on_less_green_small.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/cfl_logo_blue.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/cfl_logo_blue_rounded.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/codeForLife_logo.svg +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/colorboxImages/border.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/colorboxImages/controls.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/colorboxImages/loading.gif +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/colorboxImages/loading_background.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/colorboxImages/overlay.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/dee_hi_res.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/dee_large.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/dee_red_box.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/favicon.ico +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/kirsty.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/kirsty_hi_res.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/kirsty_large.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/logged_in_blob.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/logged_out_blob.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/logo_white.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/movie_file.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/nigel.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/nigel_hi_res.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/nigel_large.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/padlock.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/pdfsmall.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/phil.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/phil_hi_res.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/phil_large.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/qr_code_scan.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/rrBG.jpg +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/rrBGIE.jpg +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/rrBGsmall.jpg +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/video_still.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/wes.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/wes_hi_res.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/wes_large.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/zip.png +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/js/common.js +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/js/deleteWorkspaces.js +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/js/fuzzySchoolLookup.js +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/js/jquery.placeholder.js +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/js/lib/jquery-ui.js +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/js/lib/jquery-video-lightning.js +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/js/lib/jquery.colorbox.js +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/js/lib/jquery.easy-ticker.js +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/js/lib/jquery.js +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/js/lib/magnific.js +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/js/lib/modernizr.custom.79639.js +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/js/organisation_manage.js +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/js/passwordStrength.js +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/js/play.js +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/js/teach_class.js +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/403.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/404.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/500.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/email.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/email.txt +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/2FA_redirect.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/about.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/admin/aggregated_data.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/admin/map.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/base.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/base_no_userprofile.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/contact.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/email_verification_failed.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/email_verification_needed.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/help-and-support.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/home.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/locked_out.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/mouseflow.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/play/base.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/play/student_details.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/play/student_edit_account.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/play/student_join_organisation.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/play.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/base.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/organisation_create.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/organisation_manage.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/teacher_add_external_student.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/teacher_added_external_student.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/teacher_class.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/teacher_classes.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/teacher_dismiss_students.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/teacher_edit_account.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/teacher_edit_class.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/teacher_edit_student.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/teacher_home.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/teacher_lesson_plans.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/teacher_lesson_plans_python.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/teacher_move_all_classes.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/teacher_move_class.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/teacher_move_students.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/teacher_move_students_to_class.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/teacher_new_students.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/teacher_student_reset.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/teacher_students_reset.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/terms.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/registration/login.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/registration/password_reset_complete.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/registration/password_reset_confirm.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/registration/password_reset_done.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/registration/password_reset_email.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/registration/student_password_reset_form.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/registration/teacher_password_reset_form.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/two_factor/_base.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/two_factor/core/setup_complete.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/two_factor/profile/profile.html +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templatetags/__init__.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templatetags/app_tags.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/templatetags/table_tags.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/__init__.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/base_test.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/base_test_migration.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/__init__.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/__init__.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/about_page.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/admin/__init__.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/admin/admin_base_page.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/admin/admin_data_page.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/admin/admin_login_page.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/admin/admin_map_page.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/base_page.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/contact_page.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/email_verification_needed_page.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/forbidden_page.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/game_page.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/help_and_support_page.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/home_page.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/play/__init__.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/play/account_page.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/play/dashboard_page.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/play/join_school_or_club_page.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/play/play_base_page.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/play_page.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/teach/__init__.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/teach/account_page.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/teach/add_independent_student_to_class_page.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/teach/added_independent_student_to_class_page.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/teach/class_page.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/teach/class_settings_page.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/teach/classes_page.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/teach/dashboard_page.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/teach/dismiss_students_page.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/teach/move_class_page.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/teach/move_students_disambiguate_page.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/teach/move_students_page.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/teach/new_students_page.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/teach/organisation_create_page.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/teach/organisation_manage_page.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/teach/organisation_revoke_page.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/teach/teach_base_page.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/teach/thanks_for_reset_page.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/teach_page.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/terms_page.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/registration/__init__.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/registration/independent_student_login_form_page.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/registration/password_reset_form_page.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/registration/student_password_reset_form_page.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/registration/teacher_password_reset_form_page.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/test_admin.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/test_class.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/test_emails.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/test_independent_student_joins_a_class.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/test_location.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/test_navigation.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/test_organisation.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/test_school_student.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/test_security.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/test_teacher_student.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/utils/__init__.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/utils/classes.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/utils/email.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/utils/messages.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/utils/organisation.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/utils/student.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/urls.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/utils.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/views/__init__.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/views/organisation.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/views/play.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/views/registration.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/views/teacher/__init__.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/views/teacher/home.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/wsgi.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/ratelimit/__init__.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/ratelimit/backends/__init__.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/ratelimit/backends/cache.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/ratelimit/decorators.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/reports/__init__.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/reports/admin.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/reports/migrations/0001_initial.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/reports/migrations/0002_hitsperlevelperday.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/reports/migrations/__init__.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/reports/models.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/reports/tests.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/reports/urls.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/reports/views.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/setup.cfg +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/setup.py +0 -0
- {codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/versioneer.py +0 -0
|
@@ -60,6 +60,7 @@ portal/migrations/0045_auto_20150430_1446.py
|
|
|
60
60
|
portal/migrations/0046_auto_20150723_1101.py
|
|
61
61
|
portal/migrations/0047_remove_userprofile_avatar.py
|
|
62
62
|
portal/migrations/0048_plural_management_frontnews.py
|
|
63
|
+
portal/migrations/0049_refactor_emailverifications.py
|
|
63
64
|
portal/migrations/__init__.py
|
|
64
65
|
portal/static/email_media/cfl_logo_blue_rounded.png
|
|
65
66
|
portal/static/email_media/cfllogo.png
|
|
@@ -213,7 +214,6 @@ portal/tests/test_emails.py
|
|
|
213
214
|
portal/tests/test_independent_student.py
|
|
214
215
|
portal/tests/test_independent_student_joins_a_class.py
|
|
215
216
|
portal/tests/test_location.py
|
|
216
|
-
portal/tests/test_migration_country.py
|
|
217
217
|
portal/tests/test_navigation.py
|
|
218
218
|
portal/tests/test_organisation.py
|
|
219
219
|
portal/tests/test_school_student.py
|
{codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/_version.py
RENAMED
|
@@ -11,8 +11,8 @@ version_json = '''
|
|
|
11
11
|
{
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "1.0.0.post.
|
|
14
|
+
"full-revisionid": "3cbd62f08b1654d196c2bde3e2b7025696047ce7",
|
|
15
|
+
"version": "1.0.0.post.dev101"
|
|
16
16
|
}
|
|
17
17
|
''' # END VERSION_JSON
|
|
18
18
|
|
{codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/autoconfig.py
RENAMED
|
@@ -77,6 +77,7 @@ SETTINGS = {
|
|
|
77
77
|
'LANGUAGES': [
|
|
78
78
|
('en-gb', 'English'),
|
|
79
79
|
],
|
|
80
|
+
'MESSAGE_STORAGE': 'django.contrib.messages.storage.session.SessionStorage',
|
|
80
81
|
'MIDDLEWARE_CLASSES': [
|
|
81
82
|
'django.contrib.sessions.middleware.SessionMiddleware',
|
|
82
83
|
'django.middleware.locale.LocaleMiddleware',
|
{codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/helpers/email.py
RENAMED
|
@@ -43,7 +43,10 @@ from django.core.mail import EmailMultiAlternatives
|
|
|
43
43
|
from django.template import Context, loader
|
|
44
44
|
|
|
45
45
|
from portal.models import EmailVerification
|
|
46
|
-
from portal import app_settings
|
|
46
|
+
from portal import app_settings
|
|
47
|
+
from portal.emailMessages import emailVerificationNeededEmail
|
|
48
|
+
from portal.emailMessages import emailChangeNotificationEmail
|
|
49
|
+
from portal.emailMessages import emailChangeVerificationEmail
|
|
47
50
|
|
|
48
51
|
NOTIFICATION_EMAIL = 'Code For Life Notification <' + app_settings.EMAIL_ADDRESS + '>'
|
|
49
52
|
VERIFICATION_EMAIL = 'Code For Life Verification <' + app_settings.EMAIL_ADDRESS + '>'
|
|
@@ -86,24 +89,48 @@ def send_email(sender, recipients, subject, text_content, html_content=None,
|
|
|
86
89
|
message.send()
|
|
87
90
|
|
|
88
91
|
|
|
89
|
-
def
|
|
90
|
-
|
|
91
|
-
user=
|
|
92
|
-
|
|
92
|
+
def generate_token(user, email="", preverified=False):
|
|
93
|
+
return EmailVerification.objects.create(
|
|
94
|
+
user=user.userprofile,
|
|
95
|
+
new_user=user,
|
|
96
|
+
email=email,
|
|
93
97
|
token=uuid4().hex[:30],
|
|
94
|
-
expiry=timezone.now() + timedelta(hours=1)
|
|
98
|
+
expiry=timezone.now() + timedelta(hours=1),
|
|
99
|
+
verified=preverified
|
|
100
|
+
)
|
|
95
101
|
|
|
96
|
-
if new_email:
|
|
97
|
-
emailMessage = emailMessages.emailChangeVerificationEmail(request, verification.token)
|
|
98
|
-
send_email(VERIFICATION_EMAIL, [new_email], emailMessage['subject'],
|
|
99
|
-
emailMessage['message'])
|
|
100
102
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
emailMessage['message'])
|
|
103
|
+
def send_verification_email(request, user, new_email=None):
|
|
104
|
+
"""Send an email prompting the user to verify their email address."""
|
|
104
105
|
|
|
105
|
-
|
|
106
|
-
|
|
106
|
+
if not new_email: # verifying first email address
|
|
107
|
+
user.email_verifications_old.all().delete()
|
|
107
108
|
|
|
108
|
-
|
|
109
|
-
|
|
109
|
+
verification = generate_token(user)
|
|
110
|
+
|
|
111
|
+
message = emailVerificationNeededEmail(request, verification.token)
|
|
112
|
+
send_email(VERIFICATION_EMAIL,
|
|
113
|
+
[user.email],
|
|
114
|
+
message['subject'],
|
|
115
|
+
message['message'])
|
|
116
|
+
|
|
117
|
+
else: # verifying change of email address.
|
|
118
|
+
verification = generate_token(user, new_email)
|
|
119
|
+
|
|
120
|
+
message = emailChangeVerificationEmail(request, verification.token)
|
|
121
|
+
send_email(VERIFICATION_EMAIL,
|
|
122
|
+
[new_email],
|
|
123
|
+
message['subject'],
|
|
124
|
+
message['message'])
|
|
125
|
+
|
|
126
|
+
message = emailChangeNotificationEmail(request, new_email)
|
|
127
|
+
send_email(VERIFICATION_EMAIL,
|
|
128
|
+
[user.email],
|
|
129
|
+
message['subject'],
|
|
130
|
+
message['message'])
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def is_verified(user):
|
|
134
|
+
"""Check that a user has verified their email address."""
|
|
135
|
+
verifications = user.email_verifications_old.filter(verified=True)
|
|
136
|
+
return len(verifications) != 0
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
from __future__ import unicode_literals
|
|
3
|
+
|
|
4
|
+
from django.db import models, migrations
|
|
5
|
+
from django.conf import settings
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def copy_users(apps, schema_editor):
|
|
9
|
+
model = apps.get_model('portal', 'EmailVerification')
|
|
10
|
+
for ev in model.objects.all():
|
|
11
|
+
if ev.user is not None:
|
|
12
|
+
ev.new_user = ev.user.user
|
|
13
|
+
ev.save()
|
|
14
|
+
if ev.used is not None:
|
|
15
|
+
ev.verified = ev.used
|
|
16
|
+
ev.save()
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def restore_users(apps, schema_editor):
|
|
20
|
+
model = apps.get_model('portal', 'EmailVerification')
|
|
21
|
+
for ev in model.objects.all():
|
|
22
|
+
if ev.new_user is not None:
|
|
23
|
+
ev.user = ev.new_user.userprofile
|
|
24
|
+
ev.save()
|
|
25
|
+
if ev.verified is not None:
|
|
26
|
+
ev.used = ev.verified
|
|
27
|
+
ev.save()
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class Migration(migrations.Migration):
|
|
31
|
+
|
|
32
|
+
dependencies = [
|
|
33
|
+
('portal', '0048_plural_management_frontnews'),
|
|
34
|
+
]
|
|
35
|
+
|
|
36
|
+
operations = [
|
|
37
|
+
migrations.AddField(
|
|
38
|
+
model_name='emailverification',
|
|
39
|
+
name='new_user',
|
|
40
|
+
field=models.ForeignKey(
|
|
41
|
+
to=settings.AUTH_USER_MODEL,
|
|
42
|
+
related_name='email_verifications_old',
|
|
43
|
+
null=True,
|
|
44
|
+
blank=True
|
|
45
|
+
)
|
|
46
|
+
),
|
|
47
|
+
migrations.AddField(
|
|
48
|
+
model_name='emailverification',
|
|
49
|
+
name='verified',
|
|
50
|
+
field=models.BooleanField(
|
|
51
|
+
default=False
|
|
52
|
+
)
|
|
53
|
+
),
|
|
54
|
+
migrations.RunPython(
|
|
55
|
+
code=copy_users,
|
|
56
|
+
reverse_code=restore_users
|
|
57
|
+
),
|
|
58
|
+
]
|
{codeforlife-portal-1.0.0.post.dev97 → codeforlife-portal-1.0.0.post.dev101}/portal/models.py
RENAMED
|
@@ -50,10 +50,11 @@ from online_status.status import CACHE_USERS
|
|
|
50
50
|
|
|
51
51
|
class UserProfile(models.Model):
|
|
52
52
|
user = models.OneToOneField(User)
|
|
53
|
-
awaiting_email_verification = models.BooleanField(default=False)
|
|
54
53
|
can_view_aggregated_data = models.BooleanField(default=False)
|
|
55
54
|
developer = models.BooleanField(default=False)
|
|
56
55
|
|
|
56
|
+
awaiting_email_verification = models.BooleanField(default=False)
|
|
57
|
+
|
|
57
58
|
def __unicode__(self):
|
|
58
59
|
return self.user.username
|
|
59
60
|
|
|
@@ -91,7 +92,7 @@ class TeacherModelManager(models.Manager):
|
|
|
91
92
|
first_name=first_name,
|
|
92
93
|
last_name=last_name)
|
|
93
94
|
|
|
94
|
-
userProfile = UserProfile.objects.create(user=user
|
|
95
|
+
userProfile = UserProfile.objects.create(user=user)
|
|
95
96
|
|
|
96
97
|
return Teacher.objects.create(user=userProfile, title=title)
|
|
97
98
|
|
|
@@ -159,7 +160,7 @@ class StudentModelManager(models.Manager):
|
|
|
159
160
|
password=password,
|
|
160
161
|
first_name=name)
|
|
161
162
|
|
|
162
|
-
userProfile = UserProfile.objects.create(user=user
|
|
163
|
+
userProfile = UserProfile.objects.create(user=user)
|
|
163
164
|
|
|
164
165
|
return Student.objects.create(user=userProfile)
|
|
165
166
|
|
|
@@ -193,10 +194,12 @@ class Guardian(models.Model):
|
|
|
193
194
|
|
|
194
195
|
class EmailVerification(models.Model):
|
|
195
196
|
user = models.ForeignKey(UserProfile, related_name='email_verifications')
|
|
197
|
+
new_user = models.ForeignKey(User, related_name='email_verifications_old', null=True, blank=True)
|
|
196
198
|
token = models.CharField(max_length=30)
|
|
197
199
|
email = models.CharField(max_length=200, null=True, default=None, blank=True)
|
|
198
200
|
expiry = models.DateTimeField()
|
|
199
201
|
used = models.BooleanField(default=False)
|
|
202
|
+
verified = models.BooleanField(default=False)
|
|
200
203
|
|
|
201
204
|
|
|
202
205
|
class FrontPageNews(models.Model):
|
|
@@ -37,16 +37,14 @@
|
|
|
37
37
|
import re
|
|
38
38
|
|
|
39
39
|
from django.core import mail
|
|
40
|
-
|
|
40
|
+
from django_selenium_clean import selenium
|
|
41
41
|
from selenium.webdriver.support.wait import WebDriverWait
|
|
42
42
|
|
|
43
43
|
from base_test import BaseTest
|
|
44
|
-
from utils.student import create_independent_student
|
|
45
|
-
from utils.student import submit_independent_student_signup_form
|
|
44
|
+
from utils.student import create_independent_student, submit_independent_student_signup_form
|
|
46
45
|
from utils.messages import is_email_verified_message_showing
|
|
47
46
|
from utils import email as email_utils
|
|
48
47
|
|
|
49
|
-
from django_selenium_clean import selenium
|
|
50
48
|
|
|
51
49
|
class TestIndependentStudent(BaseTest):
|
|
52
50
|
def test_signup(self):
|
|
@@ -79,7 +77,6 @@ class TestIndependentStudent(BaseTest):
|
|
|
79
77
|
})
|
|
80
78
|
|
|
81
79
|
def test_reset_password(self):
|
|
82
|
-
|
|
83
80
|
homepage = self.go_to_homepage()
|
|
84
81
|
|
|
85
82
|
username = create_independent_student(homepage)[2]
|
|
@@ -34,17 +34,18 @@
|
|
|
34
34
|
# copyright notice and these terms. You must not misrepresent the origins of this
|
|
35
35
|
# program; modified versions of the program must be marked as such and not
|
|
36
36
|
# identified as the original program.
|
|
37
|
-
from django.core import mail
|
|
38
37
|
import re
|
|
39
38
|
|
|
40
|
-
from
|
|
41
|
-
from
|
|
39
|
+
from django.core import mail
|
|
40
|
+
from django_selenium_clean import selenium
|
|
42
41
|
from selenium.webdriver.support.wait import WebDriverWait
|
|
42
|
+
|
|
43
|
+
from base_test import BaseTest
|
|
44
|
+
from pageObjects.portal.home_page import HomePage
|
|
43
45
|
from utils.teacher import signup_teacher, signup_teacher_directly
|
|
44
46
|
from utils.messages import is_email_verified_message_showing, is_teacher_details_updated_message_showing, is_teacher_email_updated_message_showing
|
|
45
47
|
from utils import email as email_utils
|
|
46
48
|
|
|
47
|
-
from django_selenium_clean import selenium
|
|
48
49
|
|
|
49
50
|
class TestTeacher(BaseTest):
|
|
50
51
|
def test_signup(self):
|
|
@@ -39,6 +39,8 @@ from django.core import mail
|
|
|
39
39
|
import sys
|
|
40
40
|
|
|
41
41
|
from portal.models import Teacher
|
|
42
|
+
from portal.helpers.email import generate_token
|
|
43
|
+
|
|
42
44
|
|
|
43
45
|
def generate_details(**kwargs):
|
|
44
46
|
title = kwargs.get('title','Mr')
|
|
@@ -53,16 +55,17 @@ def generate_details(**kwargs):
|
|
|
53
55
|
def signup_teacher_directly(**kwargs):
|
|
54
56
|
title, first_name, last_name, email_address, password = generate_details(**kwargs)
|
|
55
57
|
teacher = Teacher.objects.factory(title, first_name, last_name, email_address, password)
|
|
56
|
-
teacher.user.
|
|
58
|
+
generate_token(teacher.user.user, preverified=True)
|
|
57
59
|
teacher.user.save()
|
|
58
60
|
return email_address, password
|
|
59
61
|
|
|
62
|
+
|
|
60
63
|
def signup_teacher(page):
|
|
61
64
|
page = page.go_to_teach_page()
|
|
62
65
|
|
|
63
66
|
title, first_name, last_name, email_address, password = generate_details()
|
|
64
67
|
page = page.signup(title, first_name, last_name, email_address, password, password)
|
|
65
|
-
|
|
68
|
+
|
|
66
69
|
page = page.return_to_home_page()
|
|
67
70
|
|
|
68
71
|
page = email.follow_verify_email_link_to_teach(page, mail.outbox[0])
|
|
@@ -70,4 +73,4 @@ def signup_teacher(page):
|
|
|
70
73
|
|
|
71
74
|
return page, email_address, password
|
|
72
75
|
|
|
73
|
-
import email
|
|
76
|
+
import email
|