codeforlife-portal 5.32.2__py2.py3-none-any.whl → 8.9.9__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- cfl_common/common/__init__.py +1 -0
- cfl_common/common/app_settings.py +66 -0
- cfl_common/common/apps.py +6 -0
- cfl_common/common/context_processors.py +9 -0
- cfl_common/common/csp_config.py +85 -0
- cfl_common/common/helpers/__init__.py +0 -0
- cfl_common/common/helpers/data_migration_loader.py +42 -0
- cfl_common/common/helpers/emails.py +393 -0
- cfl_common/common/helpers/generators.py +52 -0
- cfl_common/common/helpers/organisation.py +10 -0
- cfl_common/common/mail.py +201 -0
- cfl_common/common/migrations/0001_initial.py +240 -0
- cfl_common/common/migrations/0002_emailverification.py +55 -0
- cfl_common/common/migrations/0003_aimmocharacter.py +31 -0
- cfl_common/common/migrations/0004_add_aimmocharacters.py +17 -0
- cfl_common/common/migrations/0005_add_worksheets.py +8 -0
- cfl_common/common/migrations/0006_update_aimmo_character_image_path.py +17 -0
- cfl_common/common/migrations/0007_add_pdf_names_to_first_two_worksheets.py +8 -0
- cfl_common/common/migrations/0008_unlock_worksheet_3.py +11 -0
- cfl_common/common/migrations/0009_add_blocked_time_to_teacher_and_student.py +24 -0
- cfl_common/common/migrations/0010_remove_teacher_title.py +18 -0
- cfl_common/common/migrations/0011_student_login_id.py +18 -0
- cfl_common/common/migrations/0012_usersession.py +39 -0
- cfl_common/common/migrations/0013_class_school.py +42 -0
- cfl_common/common/migrations/0014_login_type.py +29 -0
- cfl_common/common/migrations/0015_dailyactivity.py +31 -0
- cfl_common/common/migrations/0016_joinreleasestudent.py +42 -0
- cfl_common/common/migrations/0017_copy_email_to_username.py +18 -0
- cfl_common/common/migrations/0018_update_aimmo_character_image_path.py +15 -0
- cfl_common/common/migrations/0019_aimmocharacter_alt.py +16 -0
- cfl_common/common/migrations/0020_class_is_active_and_null_access_code.py +23 -0
- cfl_common/common/migrations/0021_school_is_active.py +28 -0
- cfl_common/common/migrations/0022_school_cleanup.py +29 -0
- cfl_common/common/migrations/0023_userprofile_aimmo_badges.py +22 -0
- cfl_common/common/migrations/0024_teacher_invited_by.py +25 -0
- cfl_common/common/migrations/0025_schoolteacherinvitation.py +47 -0
- cfl_common/common/migrations/0026_teacher_remove_join_request.py +22 -0
- cfl_common/common/migrations/0027_class_created_by.py +25 -0
- cfl_common/common/migrations/0028_coding_club_downloads.py +23 -0
- cfl_common/common/migrations/0029_dynamicelement.py +22 -0
- cfl_common/common/migrations/0030_add_maintenance_banner.py +25 -0
- cfl_common/common/migrations/0031_improve_admin_panel.py +56 -0
- cfl_common/common/migrations/0032_dailyactivity_level_control_submits.py +18 -0
- cfl_common/common/migrations/0033_password_reset_tracking_fields.py +23 -0
- cfl_common/common/migrations/0034_dailyactivity_daily_school_student_lockout_reset.py +18 -0
- cfl_common/common/migrations/0035_rename_lockout_fields.py +27 -0
- cfl_common/common/migrations/0036_rename_awaiting_email_verification_userprofile_is_verified.py +17 -0
- cfl_common/common/migrations/0037_migrate_email_verification.py +21 -0
- cfl_common/common/migrations/0038_delete_emailverification.py +16 -0
- cfl_common/common/migrations/0039_copy_email_to_username.py +18 -0
- cfl_common/common/migrations/0040_school_county.py +18 -0
- cfl_common/common/migrations/0041_populate_gb_counties.py +27 -0
- cfl_common/common/migrations/0042_totalactivity.py +25 -0
- cfl_common/common/migrations/0043_add_total_activity.py +30 -0
- cfl_common/common/migrations/0044_update_activity_models.py +33 -0
- cfl_common/common/migrations/0045_otp.py +23 -0
- cfl_common/common/migrations/0046_alter_school_country.py +19 -0
- cfl_common/common/migrations/0047_delete_school_postcode.py +16 -0
- cfl_common/common/migrations/0048_unique_school_names.py +42 -0
- cfl_common/common/migrations/0049_anonymise_orphan_users.py +29 -0
- cfl_common/common/migrations/0050_anonymise_orphan_schools.py +30 -0
- cfl_common/common/migrations/0051_verify_returning_users.py +26 -0
- cfl_common/common/migrations/0052_add_cse_fields.py +68 -0
- cfl_common/common/migrations/0053_clean_class_data.py +24 -0
- cfl_common/common/migrations/0054_delete_aimmo_models.py +20 -0
- cfl_common/common/migrations/0055_alter_schoolteacherinvitation_token.py +18 -0
- cfl_common/common/migrations/0056_set_non_school_teachers_as_non_admins.py +25 -0
- cfl_common/common/migrations/0057_teacher_teacher__is_admin.py +19 -0
- cfl_common/common/migrations/0058_userprofile_google_refresh_token_and_more.py +24 -0
- cfl_common/common/migrations/__init__.py +0 -0
- cfl_common/common/models.py +557 -0
- cfl_common/common/permissions.py +84 -0
- cfl_common/common/tests/__init__.py +0 -0
- cfl_common/common/tests/test_migration_anonymise_orphan_schools.py +30 -0
- cfl_common/common/tests/test_migration_anonymise_orphan_users.py +30 -0
- cfl_common/common/tests/test_migration_blocked_time.py +15 -0
- cfl_common/common/tests/test_migration_remove_teacher_title.py +13 -0
- cfl_common/common/tests/test_migration_unique_school_names.py +33 -0
- cfl_common/common/tests/test_migration_verify_returning_users.py +59 -0
- cfl_common/common/tests/test_models.py +87 -0
- cfl_common/common/tests/utils/__init__.py +0 -0
- cfl_common/common/tests/utils/classes.py +38 -0
- cfl_common/common/tests/utils/email.py +67 -0
- cfl_common/common/tests/utils/organisation.py +41 -0
- cfl_common/common/tests/utils/student.py +123 -0
- cfl_common/common/tests/utils/teacher.py +73 -0
- cfl_common/common/tests/utils/user.py +27 -0
- cfl_common/common/utils.py +56 -0
- cfl_common/setup.py +61 -0
- codeforlife_portal-8.9.9.dist-info/METADATA +226 -0
- {codeforlife_portal-5.32.2.dist-info → codeforlife_portal-8.9.9.dist-info}/RECORD +341 -238
- {codeforlife_portal-5.32.2.dist-info → codeforlife_portal-8.9.9.dist-info}/WHEEL +1 -1
- codeforlife_portal-8.9.9.dist-info/licenses/LICENSE.md +3 -0
- {codeforlife_portal-5.32.2.dist-info → codeforlife_portal-8.9.9.dist-info}/top_level.txt +1 -0
- deploy/middleware/maintenance.py +25 -0
- deploy/middleware/screentime_warning.py +29 -0
- deploy/middleware/security.py +5 -6
- deploy/middleware/session_timeout.py +31 -0
- deploy/middleware/tmp_basic_auth.py +41 -0
- example_project/portal_test_settings.py +239 -0
- example_project/settings.py +156 -17
- example_project/urls.py +5 -6
- portal/__init__.py +1 -1
- portal/admin.py +142 -29
- portal/app_settings.py +10 -7
- portal/forms/dotmailer.py +6 -4
- portal/forms/invite_teacher.py +19 -10
- portal/forms/organisation.py +137 -68
- portal/forms/play.py +53 -98
- portal/forms/registration.py +70 -164
- portal/forms/teach.py +147 -121
- portal/handlers.py +1 -2
- portal/helpers/decorators.py +30 -10
- portal/helpers/password.py +86 -47
- portal/helpers/ratelimit.py +32 -15
- portal/helpers/regexes.py +5 -0
- portal/helpers/request_handlers.py +10 -0
- portal/migrations/0044_auto_20150430_0959.py +6 -2
- portal/mixins/__init__.py +1 -0
- portal/mixins/cron_mixin.py +12 -0
- portal/permissions/__init__.py +1 -0
- portal/permissions/is_cron_request_from_google.py +14 -0
- portal/static/portal/img/10_years_anniversary.png +0 -0
- portal/static/portal/img/RR_logo_grass_background.png +0 -0
- portal/static/portal/img/coding_club_hero.jpg +0 -0
- portal/static/portal/img/coding_club_python_pack.png +0 -0
- portal/static/portal/img/facebook.png +0 -0
- portal/static/portal/img/gitbook.png +0 -0
- portal/static/portal/img/howe_dell_1.png +0 -0
- portal/static/portal/img/howe_dell_2.png +0 -0
- portal/static/portal/img/howe_dell_3.png +0 -0
- portal/static/portal/img/logo_cfl.png +0 -0
- portal/static/portal/img/logo_cfl_powered.svg +35 -0
- portal/static/portal/img/logo_cfl_reminder_cards.jpg +0 -0
- portal/static/portal/img/logo_ocado_group.png +0 -0
- portal/static/portal/img/logo_python_den.svg +21 -0
- portal/static/portal/img/long_europe_map.png +0 -0
- portal/static/portal/img/python_den.png +0 -0
- portal/static/portal/img/python_den_banner.svg +26 -0
- portal/static/portal/img/rapid_router_landing_hero.png +0 -0
- portal/static/portal/img/rr_advanced.png +0 -0
- portal/static/portal/img/ten_year_map_pin.svg +1 -0
- portal/static/portal/img/thumbnail_educate_rapid_router.png +0 -0
- portal/static/portal/img/thumbnail_educate_resources.png +0 -0
- portal/static/portal/img/thumbnail_play_rapid_router.png +0 -0
- portal/static/portal/img/thumbnail_python_den.png +0 -0
- portal/static/portal/img/twitter.png +0 -0
- portal/static/portal/js/carouselCards.js +25 -0
- portal/static/portal/js/common.js +96 -1
- portal/static/portal/js/independentLogin.js +16 -0
- portal/static/portal/js/independentRegistration.js +86 -0
- portal/static/portal/js/levelControl.js +77 -0
- portal/static/portal/js/lib/jquery.min.js +2 -0
- portal/static/portal/js/organisation_manage.js +142 -14
- portal/static/portal/js/passwordStrength.js +154 -64
- portal/static/portal/js/resetPassword.js +23 -0
- portal/static/portal/js/riveted.min.js +238 -239
- portal/static/portal/js/school.js +13 -0
- portal/static/portal/js/studentLogin.js +16 -0
- portal/static/portal/js/teacherEditStudent.js +23 -0
- portal/static/portal/js/teacherLogin.js +16 -0
- portal/static/portal/js/tenYearMap.js +14 -0
- portal/static/portal/sass/colorbox.scss +0 -1
- portal/static/portal/sass/modules/_colours.scss +1 -0
- portal/static/portal/sass/modules/_levels.scss +1 -1
- portal/static/portal/sass/modules/_mixins.scss +21 -0
- portal/static/portal/sass/partials/_banners.scss +4 -177
- portal/static/portal/sass/partials/_buttons.scss +12 -15
- portal/static/portal/sass/partials/_carousel.scss +129 -0
- portal/static/portal/sass/partials/_footer.scss +21 -22
- portal/static/portal/sass/partials/_forms.scss +60 -5
- portal/static/portal/sass/partials/_grids.scss +34 -61
- portal/static/portal/sass/partials/_header.scss +28 -20
- portal/static/portal/sass/partials/_images.scss +292 -39
- portal/static/portal/sass/partials/_popup.scss +18 -15
- portal/static/portal/sass/partials/_tables.scss +12 -20
- portal/static/portal/sass/partials/_text.scss +6 -10
- portal/static/portal/sass/styles.scss +0 -1
- portal/static/portal/video/code for life .pdf +0 -0
- portal/strings/about.py +5 -0
- portal/strings/coding_club.py +9 -0
- portal/strings/play.py +6 -5
- portal/strings/teach.py +1 -1
- portal/strings/teacher_resources.py +2 -8
- portal/strings/ten_year_map.py +13 -0
- portal/templates/403.html +2 -2
- portal/templates/404.html +1 -1
- portal/templates/500.html +2 -2
- portal/templates/{captcha → django_recaptcha}/includes/js_v2_invisible.html +3 -3
- portal/templates/{captcha → django_recaptcha}/widget_v2_invisible.html +2 -2
- portal/templates/email.html +4 -2
- portal/templates/maintenance.html +34 -0
- portal/templates/portal/about.html +94 -62
- portal/templates/portal/base.html +176 -152
- portal/templates/portal/coding_club.html +100 -0
- portal/templates/portal/contribute.html +56 -52
- portal/templates/portal/email_invitation_sent.html +1 -1
- portal/templates/portal/email_style_template.html +374 -0
- portal/templates/portal/email_verification_failed.html +1 -1
- portal/templates/portal/email_verification_needed.html +9 -9
- portal/templates/portal/form_shapes.html +20 -8
- portal/templates/portal/getinvolved.html +6 -6
- portal/templates/portal/home.html +35 -10
- portal/templates/portal/home_learning.html +19 -19
- portal/templates/portal/locked_out.html +0 -1
- portal/templates/portal/locked_out_school_student.html +16 -0
- portal/templates/portal/login/independent_student.html +31 -15
- portal/templates/portal/login/student.html +10 -7
- portal/templates/portal/login/student_class_code.html +7 -4
- portal/templates/portal/login/teacher.html +34 -17
- portal/templates/portal/partials/banner.html +18 -4
- portal/templates/portal/partials/benefits.html +1 -1
- portal/templates/portal/partials/card_list.html +34 -24
- portal/templates/portal/partials/character_list.html +5 -5
- portal/templates/portal/partials/cookie_list.html +161 -0
- portal/templates/portal/partials/delete_popup.html +18 -0
- portal/templates/portal/partials/footer.html +57 -26
- portal/templates/portal/partials/header.html +118 -117
- portal/templates/portal/partials/hero_card.html +4 -3
- portal/templates/portal/partials/info_popup.html +3 -3
- portal/templates/portal/partials/invite_admin_teacher.html +23 -0
- portal/templates/portal/partials/popup.html +7 -2
- portal/templates/portal/partials/register_newsletter_tickbox.html +2 -5
- portal/templates/portal/partials/screentime_popup.html +14 -0
- portal/templates/portal/partials/service_unavailable_popup.html +17 -0
- portal/templates/portal/partials/session_popup.html +19 -0
- portal/templates/portal/play/student_dashboard.html +42 -29
- portal/templates/portal/play/student_edit_account.html +64 -9
- portal/templates/portal/play.html +61 -41
- portal/templates/portal/privacy_notice.html +697 -0
- portal/templates/portal/register.html +122 -92
- portal/templates/portal/reset_password.html +20 -40
- portal/templates/portal/reset_password_confirm.html +9 -4
- portal/templates/portal/reset_password_email_sent.html +15 -13
- portal/templates/portal/teach/base_registering.html +1 -1
- portal/templates/portal/teach/class.html +4 -6
- portal/templates/portal/teach/dashboard.html +212 -117
- portal/templates/portal/teach/invited.html +90 -0
- portal/templates/portal/teach/onboarding_classes.html +5 -3
- portal/templates/portal/teach/onboarding_print.html +1 -1
- portal/templates/portal/teach/onboarding_school.html +26 -139
- portal/templates/portal/teach/onboarding_students.html +1 -1
- portal/templates/portal/teach/teacher_dismiss_students.html +73 -55
- portal/templates/portal/teach/teacher_edit_class.html +168 -11
- portal/templates/portal/teach/teacher_edit_student.html +12 -5
- portal/templates/portal/teach/teacher_move_all_classes.html +25 -38
- portal/templates/portal/teach/teacher_move_students_to_class.html +1 -1
- portal/templates/portal/teach.html +61 -42
- portal/templates/portal/ten_year_map.html +147 -0
- portal/templates/portal/terms.html +191 -42
- portal/templates/two_factor/core/login.html +71 -59
- portal/templates/two_factor/core/setup.html +58 -49
- portal/templates/two_factor/profile/disable.html +1 -1
- portal/templates/two_factor/profile/profile.html +35 -17
- portal/templatetags/app_tags.py +59 -84
- portal/templatetags/card_list_tags.py +0 -4
- portal/tests/base_test.py +14 -3
- portal/tests/conftest.py +0 -15
- portal/tests/migrations/test_migration_make_portaladmin_teacher.py +2 -6
- portal/tests/migrations/test_migration_preview_users.py +3 -9
- portal/tests/migrations/test_migration_remove_guardian.py +1 -3
- portal/tests/migrations/test_migration_use_common_models.py +2 -6
- portal/tests/migrations/test_migration_verify_portaladmin.py +1 -3
- portal/tests/pageObjects/portal/admin/admin_base_page.py +0 -21
- portal/tests/pageObjects/portal/base_page.py +16 -26
- portal/tests/pageObjects/portal/email_verification_needed_page.py +3 -2
- portal/tests/pageObjects/portal/game_page.py +12 -19
- portal/tests/pageObjects/portal/home_page.py +13 -15
- portal/tests/pageObjects/portal/independent_login_page.py +13 -17
- portal/tests/pageObjects/portal/password_reset_form_page.py +20 -4
- portal/tests/pageObjects/portal/password_reset_page.py +25 -0
- portal/tests/pageObjects/portal/play/account_page.py +18 -27
- portal/tests/pageObjects/portal/play/dashboard_page.py +4 -4
- portal/tests/pageObjects/portal/play/join_school_or_club_page.py +8 -10
- portal/tests/pageObjects/portal/play/play_base_page.py +5 -3
- portal/tests/pageObjects/portal/signup_page.py +28 -59
- portal/tests/pageObjects/portal/student_login_class_code.py +6 -9
- portal/tests/pageObjects/portal/student_login_page.py +6 -8
- portal/tests/pageObjects/portal/teach/add_independent_student_to_class_page.py +3 -3
- portal/tests/pageObjects/portal/teach/added_independent_student_to_class_page.py +3 -1
- portal/tests/pageObjects/portal/teach/class_page.py +36 -13
- portal/tests/pageObjects/portal/teach/dashboard_page.py +43 -84
- portal/tests/pageObjects/portal/teach/dismiss_students_page.py +7 -5
- portal/tests/pageObjects/portal/teach/edit_student_page.py +10 -8
- portal/tests/pageObjects/portal/teach/move_class_page.py +5 -10
- portal/tests/pageObjects/portal/teach/move_classes_page.py +4 -2
- portal/tests/pageObjects/portal/teach/move_students_disambiguate_page.py +4 -2
- portal/tests/pageObjects/portal/teach/move_students_page.py +6 -13
- portal/tests/pageObjects/portal/teach/onboarding_classes_page.py +5 -3
- portal/tests/pageObjects/portal/teach/onboarding_organisation_page.py +11 -49
- portal/tests/pageObjects/portal/teach/onboarding_student_list_page.py +7 -12
- portal/tests/pageObjects/portal/teach/onboarding_students_page.py +4 -27
- portal/tests/pageObjects/portal/teach/teach_base_page.py +6 -4
- portal/tests/pageObjects/portal/teacher_login_page.py +10 -16
- portal/tests/selenium_test_case.py +3 -43
- portal/tests/snapshots/snap_test_partials.py +11 -165
- portal/tests/test_2FA.py +15 -33
- portal/tests/test_admin.py +15 -97
- portal/tests/test_api.py +212 -73
- portal/tests/test_captcha_forms.py +2 -2
- portal/tests/test_class.py +374 -24
- portal/tests/test_emails.py +83 -20
- portal/tests/{test_newsletter_footer.py → test_global_forms.py} +5 -5
- portal/tests/test_helper_methods.py +30 -0
- portal/tests/test_independent_student.py +255 -144
- portal/tests/test_invite_teacher.py +318 -10
- portal/tests/test_middleware.py +138 -15
- portal/tests/test_organisation.py +78 -262
- portal/tests/test_partials.py +0 -88
- portal/tests/test_ratelimit.py +218 -36
- portal/tests/test_school_student.py +35 -40
- portal/tests/test_security.py +12 -31
- portal/tests/test_teacher.py +425 -325
- portal/tests/test_teacher_student.py +103 -91
- portal/tests/test_views.py +900 -76
- portal/tests/utils/classes.py +2 -2
- portal/tests/utils/messages.py +13 -28
- portal/urls.py +237 -164
- portal/views/admin.py +0 -332
- portal/views/api.py +82 -68
- portal/views/cron/__init__.py +1 -0
- portal/views/cron/user.py +322 -0
- portal/views/dotmailer.py +9 -1
- portal/views/email.py +33 -77
- portal/views/google_analytics.py +28 -0
- portal/views/home.py +126 -97
- portal/views/legal.py +13 -0
- portal/views/login/independent_student.py +5 -5
- portal/views/login/student.py +51 -14
- portal/views/login/teacher.py +2 -6
- portal/views/organisation.py +20 -189
- portal/views/registration.py +97 -17
- portal/views/student/edit_account_details.py +99 -72
- portal/views/student/play.py +81 -62
- portal/views/teacher/dashboard.py +421 -149
- portal/views/teacher/teach.py +226 -177
- portal/views/two_factor/__init__.py +0 -0
- portal/views/two_factor/core.py +28 -0
- portal/views/two_factor/form.py +7 -0
- portal/views/two_factor/profile.py +11 -0
- codeforlife_portal-5.32.2.dist-info/LICENSE.md +0 -577
- codeforlife_portal-5.32.2.dist-info/METADATA +0 -38
- deploy/permissions.py +0 -2
- example_project/manage.py +0 -10
- portal/autoconfig.py +0 -140
- portal/csp_config.py +0 -60
- portal/forms/add_game.py +0 -33
- portal/helpers/location.py +0 -121
- portal/static/portal/img/kurono_hero.jpg +0 -0
- portal/static/portal/img/kurono_landing_hero.png +0 -0
- portal/static/portal/img/kurono_logo.svg +0 -1
- portal/static/portal/img/kurono_logo_grey_background.svg +0 -1
- portal/static/portal/img/kurono_logo_mark.svg +0 -1
- portal/static/portal/img/kurono_resources_hero.jpg +0 -0
- portal/static/portal/img/kurono_story.png +0 -0
- portal/static/portal/img/ocado-swirl.svg +0 -22
- portal/static/portal/img/thumbnail_educate_kurono.png +0 -0
- portal/static/portal/img/thumbnail_educate_resources_and_progress_tracking.png +0 -0
- portal/static/portal/img/thumbnail_kurono_resources.png +0 -0
- portal/static/portal/img/thumbnail_play_kurono.png +0 -0
- portal/static/portal/img/x_close_video.png +0 -0
- portal/static/portal/js/aimmoGame.js +0 -106
- portal/static/portal/js/deleteWorkspaces.js +0 -14
- portal/static/portal/js/fuzzySchoolLookup.js +0 -46
- portal/static/portal/js/lib/jquery-3.5.1.min.js +0 -2
- portal/static/portal/js/lib/jquery-ui-1.12.1.min.js +0 -13
- portal/static/portal/sass/partials/_videos.scss +0 -10
- portal/static/portal/video/aimmo_play_now_background_video.mp4 +0 -0
- portal/strings/student_aimmo_dashboard.py +0 -6
- portal/templates/portal/admin/aggregated_data.html +0 -35
- portal/templates/portal/admin/map.html +0 -70
- portal/templates/portal/mouseflow.html +0 -9
- portal/templates/portal/partials/aimmo_games_table.html +0 -83
- portal/templates/portal/partials/register_over_required_age_tickbox.html +0 -9
- portal/templates/portal/play/independent_student_dashboard.html +0 -64
- portal/templates/portal/play/student_aimmo_dashboard.html +0 -63
- portal/templates/portal/privacy_policy.html +0 -483
- portal/templates/portal/reset_password_email.html +0 -9
- portal/templates/portal/teach/invite.html +0 -25
- portal/templates/portal/teach/teacher_aimmo_dashboard.html +0 -95
- portal/templates/portal/teach/teacher_resources.html +0 -68
- portal/templatetags/character_list_tags.py +0 -16
- portal/tests/pageObjects/portal/kurono_teacher_dashboard_page.py +0 -49
- portal/tests/pageObjects/portal/student_password_reset_form_page.py +0 -23
- portal/tests/pageObjects/portal/teach/onboarding_revoke_request_page.py +0 -20
- portal/tests/pageObjects/portal/teacher_password_reset_form_page.py +0 -23
- portal/tests/test_aimmo_dashboards.py +0 -172
- portal/tests/test_location.py +0 -217
- portal/tests/utils/aimmo_games.py +0 -30
- portal/views/aimmo/dashboard.py +0 -119
- portal/views/privacy_policy.py +0 -9
- portal/views/teacher/teacher_resources.py +0 -42
- {portal/views/aimmo → cfl_common}/__init__.py +0 -0
|
@@ -25,20 +25,20 @@ class GamePage(BasePage):
|
|
|
25
25
|
|
|
26
26
|
def dismiss_dialog(self, button_id):
|
|
27
27
|
self.wait_for_element_to_be_clickable((By.ID, button_id))
|
|
28
|
-
self.browser.
|
|
28
|
+
self.browser.find_element(By.ID, button_id).click()
|
|
29
29
|
self.wait_for_element_to_be_invisible((By.ID, button_id))
|
|
30
30
|
|
|
31
31
|
def load_solution(self, workspace_id):
|
|
32
|
-
self.browser.
|
|
32
|
+
self.browser.find_element(By.ID, "load_tab").click()
|
|
33
33
|
selector = "#loadWorkspaceTable tr[value='" + str(workspace_id) + "']"
|
|
34
34
|
self.wait_for_element_to_be_clickable((By.CSS_SELECTOR, selector))
|
|
35
|
-
self.browser.
|
|
36
|
-
self.browser.
|
|
35
|
+
self.browser.find_element(By.CSS_SELECTOR, selector).click()
|
|
36
|
+
self.browser.find_element(By.ID, "loadWorkspace").click()
|
|
37
37
|
time.sleep(1)
|
|
38
38
|
return self
|
|
39
39
|
|
|
40
40
|
def clear(self):
|
|
41
|
-
self.browser.
|
|
41
|
+
self.browser.find_element(By.ID, "clear_tab").click()
|
|
42
42
|
return self
|
|
43
43
|
|
|
44
44
|
def try_again(self):
|
|
@@ -46,7 +46,7 @@ class GamePage(BasePage):
|
|
|
46
46
|
return self
|
|
47
47
|
|
|
48
48
|
def step(self):
|
|
49
|
-
self.browser.
|
|
49
|
+
self.browser.find_element(By.ID, "step_tab").click()
|
|
50
50
|
return self
|
|
51
51
|
|
|
52
52
|
def assert_is_green_light(self, traffic_light_index):
|
|
@@ -56,14 +56,12 @@ class GamePage(BasePage):
|
|
|
56
56
|
self._assert_light_is_on(traffic_light_index, "red")
|
|
57
57
|
|
|
58
58
|
def _assert_light_is_on(self, traffic_light_index, colour):
|
|
59
|
-
image = self.browser.
|
|
60
|
-
"trafficLight_%s_%s" % (traffic_light_index, colour)
|
|
61
|
-
)
|
|
59
|
+
image = self.browser.find_element(By.ID, "trafficLight_%s_%s" % (traffic_light_index, colour))
|
|
62
60
|
|
|
63
61
|
assert_that(image.get_attribute("opacity"), equal_to("1"))
|
|
64
62
|
|
|
65
63
|
def run_program(self, wait_for_element_id="algorithmScore"):
|
|
66
|
-
self.browser.
|
|
64
|
+
self.browser.find_element(By.ID, "fast_tab").click()
|
|
67
65
|
|
|
68
66
|
try:
|
|
69
67
|
self.wait_for_element_to_be_clickable((By.ID, wait_for_element_id), 45)
|
|
@@ -71,10 +69,7 @@ class GamePage(BasePage):
|
|
|
71
69
|
import time
|
|
72
70
|
|
|
73
71
|
millis = int(round(time.time() * 1000))
|
|
74
|
-
screenshot_filename = "/tmp/game_tests_%s-%s.png" % (
|
|
75
|
-
os.getenv("BUILD_NUMBER", "nonumber"),
|
|
76
|
-
str(millis),
|
|
77
|
-
)
|
|
72
|
+
screenshot_filename = "/tmp/game_tests_%s-%s.png" % (os.getenv("BUILD_NUMBER", "nonumber"), str(millis))
|
|
78
73
|
print("Saved screenshot to " + screenshot_filename)
|
|
79
74
|
self.browser.get_screenshot_as_file(screenshot_filename)
|
|
80
75
|
raise e
|
|
@@ -85,18 +80,16 @@ class GamePage(BasePage):
|
|
|
85
80
|
return self._run_failing_program("What went wrong")
|
|
86
81
|
|
|
87
82
|
def run_program_that_runs_out_of_instructions(self):
|
|
88
|
-
return self._run_failing_program(
|
|
89
|
-
"The van ran out of instructions before it reached a destination."
|
|
90
|
-
)
|
|
83
|
+
return self._run_failing_program("The van ran out of instructions before it reached a destination.")
|
|
91
84
|
|
|
92
85
|
def _run_failing_program(self, text):
|
|
93
86
|
self.run_program("try_again_button")
|
|
94
|
-
error_message = self.browser.
|
|
87
|
+
error_message = self.browser.find_element(By.ID, "myModal-lead").text
|
|
95
88
|
assert_that(error_message, contains_string(text))
|
|
96
89
|
return self
|
|
97
90
|
|
|
98
91
|
def _assert_score(self, element_id, score):
|
|
99
|
-
route_score = self.browser.
|
|
92
|
+
route_score = self.browser.find_element(By.ID, element_id).text
|
|
100
93
|
assert_that(route_score, equal_to(score))
|
|
101
94
|
return self
|
|
102
95
|
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
from __future__ import absolute_import
|
|
2
2
|
|
|
3
|
+
from selenium.webdriver.common.by import By
|
|
4
|
+
|
|
3
5
|
from .base_page import BasePage
|
|
4
6
|
|
|
5
7
|
|
|
@@ -9,40 +11,36 @@ class HomePage(BasePage):
|
|
|
9
11
|
assert self.on_correct_page("home_page")
|
|
10
12
|
|
|
11
13
|
def go_to_teacher_login_page(self):
|
|
12
|
-
self.browser.
|
|
13
|
-
self.browser.
|
|
14
|
+
self.browser.find_element(By.ID, "login_dropdown").click()
|
|
15
|
+
self.browser.find_element(By.ID, "teacher_login_button").click()
|
|
14
16
|
|
|
15
17
|
from portal.tests.pageObjects.portal.teacher_login_page import TeacherLoginPage
|
|
16
18
|
|
|
17
19
|
return TeacherLoginPage(self.browser)
|
|
18
20
|
|
|
19
21
|
def teacher_logout(self):
|
|
20
|
-
self.browser.
|
|
21
|
-
self.browser.
|
|
22
|
+
self.browser.find_element(By.ID, "logout_menu").click()
|
|
23
|
+
self.browser.find_element(By.ID, "logout_button").click()
|
|
22
24
|
return HomePage(self.browser)
|
|
23
25
|
|
|
24
26
|
def go_to_independent_student_login_page(self):
|
|
25
|
-
self.browser.
|
|
26
|
-
self.browser.
|
|
27
|
+
self.browser.find_element(By.ID, "login_dropdown").click()
|
|
28
|
+
self.browser.find_element(By.ID, "independent_login_button").click()
|
|
27
29
|
|
|
28
|
-
from portal.tests.pageObjects.portal.independent_login_page import
|
|
29
|
-
IndependentStudentLoginPage,
|
|
30
|
-
)
|
|
30
|
+
from portal.tests.pageObjects.portal.independent_login_page import IndependentStudentLoginPage
|
|
31
31
|
|
|
32
32
|
return IndependentStudentLoginPage(self.browser)
|
|
33
33
|
|
|
34
34
|
def go_to_student_login_page(self):
|
|
35
|
-
self.browser.
|
|
36
|
-
self.browser.
|
|
35
|
+
self.browser.find_element(By.ID, "login_dropdown").click()
|
|
36
|
+
self.browser.find_element(By.ID, "student_login_button").click()
|
|
37
37
|
|
|
38
|
-
from portal.tests.pageObjects.portal.student_login_class_code import
|
|
39
|
-
StudentLoginClassCodePage,
|
|
40
|
-
)
|
|
38
|
+
from portal.tests.pageObjects.portal.student_login_class_code import StudentLoginClassCodePage
|
|
41
39
|
|
|
42
40
|
return StudentLoginClassCodePage(self.browser)
|
|
43
41
|
|
|
44
42
|
def go_to_signup_page(self):
|
|
45
|
-
self.browser.
|
|
43
|
+
self.browser.find_element(By.ID, "signup_button").click()
|
|
46
44
|
|
|
47
45
|
import portal.tests.pageObjects.portal.signup_page as signup_page
|
|
48
46
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import
|
|
1
|
+
from selenium.webdriver.common.by import By
|
|
2
2
|
|
|
3
3
|
from .base_page import BasePage
|
|
4
|
+
from .password_reset_page import PasswordResetPage
|
|
4
5
|
from .play import dashboard_page
|
|
5
|
-
from .student_password_reset_form_page import StudentPasswordResetFormPage
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
class IndependentStudentLoginPage(BasePage):
|
|
@@ -11,28 +11,24 @@ class IndependentStudentLoginPage(BasePage):
|
|
|
11
11
|
|
|
12
12
|
assert self.on_correct_page("independent_login_page")
|
|
13
13
|
|
|
14
|
-
def independent_student_login(self,
|
|
15
|
-
self._independent_student_login(
|
|
14
|
+
def independent_student_login(self, email, password):
|
|
15
|
+
self._independent_student_login(email, password)
|
|
16
16
|
|
|
17
17
|
return dashboard_page.PlayDashboardPage(self.browser)
|
|
18
18
|
|
|
19
|
-
def independent_student_login_failure(self,
|
|
20
|
-
self._independent_student_login(
|
|
19
|
+
def independent_student_login_failure(self, email, password):
|
|
20
|
+
self._independent_student_login(email, password)
|
|
21
21
|
return self
|
|
22
22
|
|
|
23
|
-
def _independent_student_login(self,
|
|
24
|
-
self.browser.
|
|
25
|
-
self.browser.
|
|
26
|
-
self.browser.
|
|
23
|
+
def _independent_student_login(self, email, password):
|
|
24
|
+
self.browser.find_element(By.ID, "id_username").send_keys(email)
|
|
25
|
+
self.browser.find_element(By.ID, "id_password").send_keys(password)
|
|
26
|
+
self.browser.find_element(By.NAME, "independent_student_login").click()
|
|
27
27
|
|
|
28
28
|
def go_to_indep_forgotten_password_page(self):
|
|
29
|
-
self.browser.
|
|
30
|
-
return
|
|
29
|
+
self.browser.find_element(By.ID, "student_forgotten_password_button").click()
|
|
30
|
+
return PasswordResetPage(self.browser)
|
|
31
31
|
|
|
32
32
|
def has_login_failed(self, form_id, error):
|
|
33
|
-
errors = (
|
|
34
|
-
self.browser.find_element_by_id(form_id)
|
|
35
|
-
.find_element_by_class_name("errorlist")
|
|
36
|
-
.text
|
|
37
|
-
)
|
|
33
|
+
errors = self.browser.find_element(By.ID, form_id).find_element(By.CLASS_NAME, "errorlist").text
|
|
38
34
|
return error in errors
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
from __future__ import absolute_import
|
|
2
2
|
|
|
3
|
+
from selenium.common.exceptions import NoSuchElementException
|
|
4
|
+
from selenium.webdriver.common.by import By
|
|
5
|
+
|
|
3
6
|
from .base_page import BasePage
|
|
4
7
|
|
|
5
8
|
|
|
@@ -13,7 +16,7 @@ class PasswordResetPage(BasePage):
|
|
|
13
16
|
self.clear_and_fill("new_password1", new_password)
|
|
14
17
|
self.clear_and_fill("new_password2", new_password)
|
|
15
18
|
|
|
16
|
-
self.browser.
|
|
19
|
+
self.browser.find_element(By.ID, "teacher_update_button").click()
|
|
17
20
|
|
|
18
21
|
self.wait_for_element_by_id("reset_password_done_page")
|
|
19
22
|
|
|
@@ -23,12 +26,25 @@ class PasswordResetPage(BasePage):
|
|
|
23
26
|
self.clear_and_fill("new_password1", new_password)
|
|
24
27
|
self.clear_and_fill("new_password2", new_password)
|
|
25
28
|
|
|
26
|
-
self.browser.
|
|
29
|
+
self.browser.find_element(By.ID, "student_update_button").click()
|
|
27
30
|
|
|
28
31
|
self.wait_for_element_by_id("reset_password_done_page")
|
|
29
32
|
|
|
30
33
|
return self
|
|
31
34
|
|
|
35
|
+
def reset_password_fail(self, new_password):
|
|
36
|
+
self.clear_and_fill("new_password1", new_password)
|
|
37
|
+
self.clear_and_fill("new_password2", new_password)
|
|
38
|
+
|
|
39
|
+
try:
|
|
40
|
+
update_button = self.browser.find_element(By.ID, "teacher_update_button")
|
|
41
|
+
except NoSuchElementException:
|
|
42
|
+
update_button = self.browser.find_element(By.ID, "student_update_button")
|
|
43
|
+
|
|
44
|
+
update_button.click()
|
|
45
|
+
|
|
46
|
+
return self
|
|
47
|
+
|
|
32
48
|
def clear_and_fill(self, field, value):
|
|
33
|
-
self.browser.
|
|
34
|
-
self.browser.
|
|
49
|
+
self.browser.find_element(By.ID, "id_" + field).clear()
|
|
50
|
+
self.browser.find_element(By.ID, "id_" + field).send_keys(value)
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
from __future__ import absolute_import
|
|
2
|
+
|
|
3
|
+
from selenium.webdriver.common.by import By
|
|
4
|
+
|
|
5
|
+
from .base_page import BasePage
|
|
6
|
+
from .home_page import HomePage
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class PasswordResetPage(BasePage):
|
|
10
|
+
def __init__(self, browser):
|
|
11
|
+
super(PasswordResetPage, self).__init__(browser)
|
|
12
|
+
|
|
13
|
+
assert self.on_correct_page("reset_password_page")
|
|
14
|
+
|
|
15
|
+
def cancel(self):
|
|
16
|
+
self.browser.find_element(By.ID, "cancel_button").click()
|
|
17
|
+
return HomePage(self.browser)
|
|
18
|
+
|
|
19
|
+
def reset_email_submit(self, email):
|
|
20
|
+
self.browser.find_element(By.ID, "id_email").send_keys(email)
|
|
21
|
+
|
|
22
|
+
self.wait_for_element_by_id("reset_button")
|
|
23
|
+
|
|
24
|
+
self.browser.find_element(By.ID, "reset_button").click()
|
|
25
|
+
return self
|
|
@@ -1,15 +1,11 @@
|
|
|
1
1
|
from __future__ import absolute_import
|
|
2
2
|
|
|
3
|
-
from
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
from portal.tests.pageObjects.portal.independent_login_page import
|
|
7
|
-
IndependentStudentLoginPage,
|
|
8
|
-
)
|
|
3
|
+
from selenium.webdriver.common.by import By
|
|
4
|
+
|
|
5
|
+
from portal.tests.pageObjects.portal.email_verification_needed_page import EmailVerificationNeededPage
|
|
6
|
+
from portal.tests.pageObjects.portal.independent_login_page import IndependentStudentLoginPage
|
|
9
7
|
from portal.tests.pageObjects.portal.play.dashboard_page import PlayDashboardPage
|
|
10
|
-
from portal.tests.pageObjects.portal.student_login_class_code import
|
|
11
|
-
StudentLoginClassCodePage,
|
|
12
|
-
)
|
|
8
|
+
from portal.tests.pageObjects.portal.student_login_class_code import StudentLoginClassCodePage
|
|
13
9
|
from .play_base_page import PlayBasePage
|
|
14
10
|
|
|
15
11
|
|
|
@@ -23,21 +19,18 @@ class PlayAccountPage(PlayBasePage):
|
|
|
23
19
|
correct = True
|
|
24
20
|
|
|
25
21
|
for field, value in list(details.items()):
|
|
26
|
-
correct &= (
|
|
27
|
-
self.browser.find_element_by_id("id_" + field).get_attribute("value")
|
|
28
|
-
== value
|
|
29
|
-
)
|
|
22
|
+
correct &= self.browser.find_element(By.ID, "id_" + field).get_attribute("value") == value
|
|
30
23
|
|
|
31
24
|
return correct
|
|
32
25
|
|
|
33
26
|
def _change_details(self, details):
|
|
34
27
|
for field, value in list(details.items()):
|
|
35
|
-
self.browser.
|
|
36
|
-
self.browser.
|
|
37
|
-
self.browser.
|
|
28
|
+
self.browser.find_element(By.ID, "id_" + field).clear()
|
|
29
|
+
self.browser.find_element(By.ID, "id_" + field).send_keys(value)
|
|
30
|
+
self.browser.find_element(By.ID, "update_button").click()
|
|
38
31
|
|
|
39
32
|
def submit_empty_form(self):
|
|
40
|
-
self.browser.
|
|
33
|
+
self.browser.find_element(By.ID, "update_button").click()
|
|
41
34
|
return self
|
|
42
35
|
|
|
43
36
|
def update_password_failure(self, new_password, confirm_new_password, old_password):
|
|
@@ -64,15 +57,13 @@ class PlayAccountPage(PlayBasePage):
|
|
|
64
57
|
return EmailVerificationNeededPage(self.browser)
|
|
65
58
|
|
|
66
59
|
def _update_password(self, new_password, confirm_new_password, old_password):
|
|
67
|
-
self.browser.
|
|
68
|
-
self.browser.
|
|
69
|
-
|
|
70
|
-
)
|
|
71
|
-
self.browser.find_element_by_id("id_current_password").send_keys(old_password)
|
|
72
|
-
self.browser.find_element_by_id("update_button").click()
|
|
60
|
+
self.browser.find_element(By.ID, "id_password").send_keys(new_password)
|
|
61
|
+
self.browser.find_element(By.ID, "id_confirm_password").send_keys(confirm_new_password)
|
|
62
|
+
self.browser.find_element(By.ID, "id_current_password").send_keys(old_password)
|
|
63
|
+
self.browser.find_element(By.ID, "update_button").click()
|
|
73
64
|
|
|
74
65
|
def _update_name(self, new_name, password):
|
|
75
|
-
self.browser.
|
|
76
|
-
self.browser.
|
|
77
|
-
self.browser.
|
|
78
|
-
self.browser.
|
|
66
|
+
self.browser.find_element(By.ID, "id_name").clear()
|
|
67
|
+
self.browser.find_element(By.ID, "id_name").send_keys(new_name)
|
|
68
|
+
self.browser.find_element(By.ID, "id_current_password").send_keys(password)
|
|
69
|
+
self.browser.find_element(By.ID, "update_button").click()
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
from __future__ import absolute_import
|
|
2
2
|
|
|
3
|
-
from
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
from selenium.webdriver.common.by import By
|
|
4
|
+
|
|
5
|
+
from portal.tests.pageObjects.portal.play.join_school_or_club_page import JoinSchoolOrClubPage
|
|
6
6
|
from .play_base_page import PlayBasePage
|
|
7
7
|
|
|
8
8
|
|
|
@@ -13,6 +13,6 @@ class PlayDashboardPage(PlayBasePage):
|
|
|
13
13
|
assert self.on_correct_page("play_dashboard_page")
|
|
14
14
|
|
|
15
15
|
def go_to_join_a_school_or_club_page(self):
|
|
16
|
-
self.browser.
|
|
16
|
+
self.browser.find_element(By.ID, "student_join_school_link").click()
|
|
17
17
|
|
|
18
18
|
return JoinSchoolOrClubPage(self.browser)
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
from selenium.webdriver.common.by import By
|
|
2
|
+
|
|
1
3
|
from portal.tests.pageObjects.portal.play.play_base_page import PlayBasePage
|
|
2
4
|
|
|
3
5
|
|
|
@@ -8,28 +10,24 @@ class JoinSchoolOrClubPage(PlayBasePage):
|
|
|
8
10
|
assert self.on_correct_page("play_join_organisation_page")
|
|
9
11
|
|
|
10
12
|
def join_a_school_or_club(self, access_code):
|
|
11
|
-
self.browser.
|
|
12
|
-
self.browser.
|
|
13
|
+
self.browser.find_element(By.ID, "id_access_code").send_keys(access_code)
|
|
14
|
+
self.browser.find_element(By.ID, "request_join_a_school_or_club_button").click()
|
|
13
15
|
assert self.element_exists_by_css(".success")
|
|
14
16
|
|
|
15
17
|
return self
|
|
16
18
|
|
|
17
19
|
def join_a_school_or_club_failure(self, access_code):
|
|
18
|
-
self.browser.
|
|
19
|
-
self.browser.
|
|
20
|
+
self.browser.find_element(By.ID, "id_access_code").send_keys(access_code)
|
|
21
|
+
self.browser.find_element(By.ID, "request_join_a_school_or_club_button").click()
|
|
20
22
|
assert not self.element_exists_by_css(".success")
|
|
21
23
|
|
|
22
24
|
return self
|
|
23
25
|
|
|
24
26
|
def has_join_request_failed(self, error):
|
|
25
|
-
errors = (
|
|
26
|
-
self.browser.find_element_by_id("join_class_form")
|
|
27
|
-
.find_element_by_class_name("errorlist")
|
|
28
|
-
.text
|
|
29
|
-
)
|
|
27
|
+
errors = self.browser.find_element(By.ID, "join_class_form").find_element(By.CLASS_NAME, "errorlist").text
|
|
30
28
|
return error in errors
|
|
31
29
|
|
|
32
30
|
def revoke_join_request(self):
|
|
33
|
-
self.browser.
|
|
31
|
+
self.browser.find_element(By.NAME, "revoke_join_request").click()
|
|
34
32
|
|
|
35
33
|
return self
|
|
@@ -2,6 +2,8 @@ from __future__ import absolute_import
|
|
|
2
2
|
|
|
3
3
|
import time
|
|
4
4
|
|
|
5
|
+
from selenium.webdriver.common.by import By
|
|
6
|
+
|
|
5
7
|
from portal.tests.pageObjects.portal.base_page import BasePage
|
|
6
8
|
|
|
7
9
|
|
|
@@ -11,7 +13,7 @@ class PlayBasePage(BasePage):
|
|
|
11
13
|
|
|
12
14
|
def logout(self):
|
|
13
15
|
self.open_user_options_box()
|
|
14
|
-
self.browser.
|
|
16
|
+
self.browser.find_element(By.ID, "logout_button").click()
|
|
15
17
|
|
|
16
18
|
from portal.tests.pageObjects.portal.home_page import HomePage
|
|
17
19
|
|
|
@@ -19,12 +21,12 @@ class PlayBasePage(BasePage):
|
|
|
19
21
|
|
|
20
22
|
def go_to_account_page(self):
|
|
21
23
|
self.open_user_options_box()
|
|
22
|
-
self.browser.
|
|
24
|
+
self.browser.find_element(By.ID, "student_edit_account_button").click()
|
|
23
25
|
|
|
24
26
|
from .account_page import PlayAccountPage
|
|
25
27
|
|
|
26
28
|
return PlayAccountPage(self.browser)
|
|
27
29
|
|
|
28
30
|
def open_user_options_box(self):
|
|
29
|
-
self.browser.
|
|
31
|
+
self.browser.find_element(By.ID, "logout_menu").click()
|
|
30
32
|
time.sleep(1)
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
from __future__ import absolute_import
|
|
2
2
|
|
|
3
|
+
from selenium.webdriver.common.by import By
|
|
4
|
+
from selenium.webdriver.support.ui import Select
|
|
5
|
+
|
|
3
6
|
from . import email_verification_needed_page
|
|
4
7
|
from .base_page import BasePage
|
|
5
8
|
|
|
@@ -20,74 +23,40 @@ class SignupPage(BasePage):
|
|
|
20
23
|
success=True,
|
|
21
24
|
newsletter=False,
|
|
22
25
|
):
|
|
23
|
-
self.browser.
|
|
24
|
-
|
|
25
|
-
).send_keys(
|
|
26
|
-
self.browser.
|
|
27
|
-
|
|
28
|
-
).
|
|
29
|
-
self.browser.find_element_by_id("id_teacher_signup-teacher_email").send_keys(
|
|
30
|
-
email
|
|
31
|
-
)
|
|
32
|
-
self.browser.find_element_by_id("id_teacher_signup-teacher_password").send_keys(
|
|
33
|
-
password
|
|
34
|
-
)
|
|
35
|
-
self.browser.find_element_by_id(
|
|
36
|
-
"id_teacher_signup-teacher_confirm_password"
|
|
37
|
-
).send_keys(confirm_password)
|
|
26
|
+
self.browser.find_element(By.ID, "id_teacher_signup-teacher_first_name").send_keys(first_name)
|
|
27
|
+
self.browser.find_element(By.ID, "id_teacher_signup-teacher_last_name").send_keys(last_name)
|
|
28
|
+
self.browser.find_element(By.ID, "id_teacher_signup-teacher_email").send_keys(email)
|
|
29
|
+
self.browser.find_element(By.ID, "id_teacher_signup-teacher_password").send_keys(password)
|
|
30
|
+
self.browser.find_element(By.ID, "id_teacher_signup-teacher_confirm_password").send_keys(confirm_password)
|
|
31
|
+
self.browser.find_element(By.ID, "id_teacher_signup-consent_ticked").click()
|
|
38
32
|
|
|
39
33
|
if newsletter:
|
|
40
|
-
self.browser.
|
|
41
|
-
"id_teacher_signup-newsletter_ticked"
|
|
42
|
-
).click()
|
|
34
|
+
self.browser.find_element(By.ID, "id_teacher_signup-newsletter_ticked").click()
|
|
43
35
|
|
|
44
|
-
self.browser.
|
|
36
|
+
self.browser.find_element(By.NAME, "teacher_signup").click()
|
|
45
37
|
|
|
46
38
|
if success:
|
|
47
|
-
return email_verification_needed_page.EmailVerificationNeededPage(
|
|
48
|
-
self.browser
|
|
49
|
-
)
|
|
39
|
+
return email_verification_needed_page.EmailVerificationNeededPage(self.browser)
|
|
50
40
|
else:
|
|
51
41
|
return self
|
|
52
42
|
|
|
53
|
-
def independent_student_signup(
|
|
54
|
-
self,
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
self.browser.
|
|
65
|
-
|
|
66
|
-
)
|
|
67
|
-
self.browser.
|
|
68
|
-
"id_independent_student_signup-username"
|
|
69
|
-
).send_keys(username)
|
|
70
|
-
self.browser.find_element_by_id(
|
|
71
|
-
"id_independent_student_signup-email"
|
|
72
|
-
).send_keys(email_address)
|
|
73
|
-
self.browser.find_element_by_id(
|
|
74
|
-
"id_independent_student_signup-password"
|
|
75
|
-
).send_keys(password)
|
|
76
|
-
self.browser.find_element_by_id(
|
|
77
|
-
"id_independent_student_signup-confirm_password"
|
|
78
|
-
).send_keys(confirm_password)
|
|
79
|
-
|
|
80
|
-
if newsletter:
|
|
81
|
-
self.browser.find_element_by_id(
|
|
82
|
-
"id_independent_student_signup-newsletter_ticked"
|
|
83
|
-
).click()
|
|
84
|
-
|
|
85
|
-
if is_over_required_age:
|
|
86
|
-
self.browser.find_element_by_id(
|
|
87
|
-
"id_independent_student_signup-is_over_required_age"
|
|
88
|
-
).click()
|
|
43
|
+
def independent_student_signup(self, name, email_address, password, confirm_password, success=True):
|
|
44
|
+
dob_day_element = self.browser.find_element(By.ID, "id_independent_student_signup-date_of_birth_day")
|
|
45
|
+
dob_month_element = self.browser.find_element(By.ID, "id_independent_student_signup-date_of_birth_month")
|
|
46
|
+
dob_year_element = self.browser.find_element(By.ID, "id_independent_student_signup-date_of_birth_year")
|
|
47
|
+
day_select = Select(dob_day_element)
|
|
48
|
+
month_select = Select(dob_month_element)
|
|
49
|
+
year_select = Select(dob_year_element)
|
|
50
|
+
day_select.select_by_value("7")
|
|
51
|
+
month_select.select_by_value("10")
|
|
52
|
+
year_select.select_by_value("1997")
|
|
53
|
+
self.browser.find_element(By.ID, "id_independent_student_signup-name").send_keys(name)
|
|
54
|
+
self.browser.find_element(By.ID, "id_independent_student_signup-email").send_keys(email_address)
|
|
55
|
+
self.browser.find_element(By.ID, "id_independent_student_signup-password").send_keys(password)
|
|
56
|
+
self.browser.find_element(By.ID, "id_independent_student_signup-confirm_password").send_keys(confirm_password)
|
|
57
|
+
self.browser.find_element(By.ID, "id_independent_student_signup-consent_ticked").click()
|
|
89
58
|
|
|
90
|
-
self.browser.
|
|
59
|
+
self.browser.find_element(By.NAME, "independent_student_signup").click()
|
|
91
60
|
if success:
|
|
92
61
|
from .email_verification_needed_page import EmailVerificationNeededPage
|
|
93
62
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
from .
|
|
1
|
+
from selenium.webdriver.common.by import By
|
|
2
|
+
|
|
2
3
|
from . import student_login_page
|
|
3
|
-
import
|
|
4
|
+
from .base_page import BasePage
|
|
4
5
|
|
|
5
6
|
|
|
6
7
|
class StudentLoginClassCodePage(BasePage):
|
|
@@ -19,13 +20,9 @@ class StudentLoginClassCodePage(BasePage):
|
|
|
19
20
|
return self
|
|
20
21
|
|
|
21
22
|
def _student_input_access_code(self, access_code):
|
|
22
|
-
self.browser.
|
|
23
|
-
self.browser.
|
|
23
|
+
self.browser.find_element(By.ID, "id_access_code").send_keys(access_code)
|
|
24
|
+
self.browser.find_element(By.NAME, "school_login_class_code").click()
|
|
24
25
|
|
|
25
26
|
def has_access_code_input_failed(self, form_id, error):
|
|
26
|
-
errors = (
|
|
27
|
-
self.browser.find_element_by_id(form_id)
|
|
28
|
-
.find_element_by_class_name("errorlist")
|
|
29
|
-
.text
|
|
30
|
-
)
|
|
27
|
+
errors = self.browser.find_element(By.ID, form_id).find_element(By.CLASS_NAME, "errorlist").text
|
|
31
28
|
return error in errors
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
from selenium.webdriver.common.by import By
|
|
2
|
+
|
|
1
3
|
from .base_page import BasePage
|
|
2
4
|
from .play import dashboard_page
|
|
3
5
|
|
|
@@ -18,14 +20,10 @@ class StudentLoginPage(BasePage):
|
|
|
18
20
|
return self
|
|
19
21
|
|
|
20
22
|
def _student_login(self, name, password):
|
|
21
|
-
self.browser.
|
|
22
|
-
self.browser.
|
|
23
|
-
self.browser.
|
|
23
|
+
self.browser.find_element(By.ID, "id_username").send_keys(name)
|
|
24
|
+
self.browser.find_element(By.ID, "id_password").send_keys(password)
|
|
25
|
+
self.browser.find_element(By.NAME, "school_login").click()
|
|
24
26
|
|
|
25
27
|
def has_login_failed(self, form_id, error):
|
|
26
|
-
errors = (
|
|
27
|
-
self.browser.find_element_by_id(form_id)
|
|
28
|
-
.find_element_by_class_name("errorlist")
|
|
29
|
-
.text
|
|
30
|
-
)
|
|
28
|
+
errors = self.browser.find_element(By.ID, form_id).find_element(By.CLASS_NAME, "errorlist").text
|
|
31
29
|
return error in errors
|
|
@@ -13,12 +13,12 @@ class AddIndependentStudentToClassPage(TeachBasePage):
|
|
|
13
13
|
assert self.on_correct_page("add_independent_student_to_class")
|
|
14
14
|
|
|
15
15
|
def _rename(self, name):
|
|
16
|
-
self.browser.
|
|
17
|
-
self.browser.
|
|
16
|
+
self.browser.find_element(By.ID, "id_name").clear()
|
|
17
|
+
self.browser.find_element(By.ID, "id_name").send_keys(name)
|
|
18
18
|
|
|
19
19
|
def save(self, name):
|
|
20
20
|
self._rename(name)
|
|
21
21
|
self.wait_for_element_to_be_clickable((By.ID, "save_student_name_button"))
|
|
22
|
-
self.browser.
|
|
22
|
+
self.browser.find_element(By.ID, "save_student_name_button").click()
|
|
23
23
|
|
|
24
24
|
return AddedIndependentStudentToClassPage(self.browser)
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
from selenium.webdriver.common.by import By
|
|
2
|
+
|
|
1
3
|
from portal.tests.pageObjects.portal.teach.class_page import TeachClassPage
|
|
2
4
|
from portal.tests.pageObjects.portal.teach.teach_base_page import TeachBasePage
|
|
3
5
|
|
|
@@ -9,6 +11,6 @@ class AddedIndependentStudentToClassPage(TeachBasePage):
|
|
|
9
11
|
assert self.on_correct_page("added_independent_student_to_class")
|
|
10
12
|
|
|
11
13
|
def return_to_class(self):
|
|
12
|
-
self.browser.
|
|
14
|
+
self.browser.find_element(By.ID, "return_button").click()
|
|
13
15
|
|
|
14
16
|
return TeachClassPage(self.browser)
|