codeforlife-portal 5.33.5__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.33.5.dist-info → codeforlife_portal-8.9.9.dist-info}/RECORD +339 -241
- {codeforlife_portal-5.33.5.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.33.5.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 +4 -2
- 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 +8 -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 -91
- 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 +96 -9
- 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 +235 -166
- portal/views/admin.py +0 -332
- portal/views/api.py +82 -48
- 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/core.py +22 -19
- portal/views/two_factor/profile.py +2 -2
- codeforlife_portal-5.33.5.dist-info/LICENSE.md +0 -577
- codeforlife_portal-5.33.5.dist-info/METADATA +0 -38
- deploy/permissions.py +0 -2
- example_project/manage.py +0 -10
- portal/autoconfig.py +0 -141
- 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
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
from selenium.webdriver.common.by import By
|
|
2
|
+
|
|
1
3
|
from .teach_base_page import TeachBasePage
|
|
2
4
|
|
|
3
5
|
|
|
@@ -8,44 +10,61 @@ class TeachClassPage(TeachBasePage):
|
|
|
8
10
|
assert self.on_correct_page("teach_class_page")
|
|
9
11
|
|
|
10
12
|
def type_student_name(self, name):
|
|
11
|
-
self.browser.
|
|
13
|
+
self.browser.find_element(By.ID, "id_names").send_keys(name + "\n")
|
|
12
14
|
return self
|
|
13
15
|
|
|
14
16
|
def create_students(self):
|
|
15
|
-
self.
|
|
17
|
+
self.click_create_students()
|
|
16
18
|
|
|
17
19
|
import portal.tests.pageObjects.portal.teach.onboarding_student_list_page as onboarding_student_list_page
|
|
18
20
|
|
|
19
21
|
return onboarding_student_list_page.OnboardingStudentListPage(self.browser)
|
|
20
22
|
|
|
21
|
-
def
|
|
22
|
-
self.browser.
|
|
23
|
+
def click_create_students(self):
|
|
24
|
+
self.browser.find_element(By.NAME, "new_students").click()
|
|
25
|
+
return self
|
|
26
|
+
|
|
27
|
+
def adding_students_failed(self):
|
|
28
|
+
if not self.element_exists_by_css(".errorlist"):
|
|
29
|
+
return False
|
|
30
|
+
|
|
31
|
+
error_list = self.browser.find_element(By.ID, "form-create-students").find_element(By.CLASS_NAME, "errorlist")
|
|
32
|
+
|
|
33
|
+
return error_list.text
|
|
34
|
+
|
|
35
|
+
def duplicate_students(self, name):
|
|
36
|
+
if not self.element_exists_by_css(".errorlist"):
|
|
37
|
+
return False
|
|
38
|
+
|
|
39
|
+
errors = self.browser.find_element(By.ID, "form-create-students").find_element(By.CLASS_NAME, "errorlist").text
|
|
40
|
+
error = "You cannot add more than one student called '{0}'".format(name)
|
|
41
|
+
return error in errors
|
|
23
42
|
|
|
24
43
|
def student_exists(self, name):
|
|
25
|
-
return name in self.browser.
|
|
44
|
+
return name in self.browser.find_element(By.ID, "student_table").text
|
|
26
45
|
|
|
27
46
|
def delete_students(self):
|
|
28
|
-
self.browser.
|
|
47
|
+
self.browser.find_element(By.ID, "deleteSelectedStudents").click()
|
|
29
48
|
return self
|
|
30
49
|
|
|
31
50
|
def reset_passwords(self):
|
|
32
|
-
self.browser.
|
|
51
|
+
self.browser.find_element(By.ID, "resetSelectedStudents").click()
|
|
33
52
|
return self
|
|
34
53
|
|
|
35
54
|
def move_students(self):
|
|
36
|
-
self.browser.
|
|
55
|
+
self.browser.find_element(By.ID, "moveSelectedStudents").click()
|
|
37
56
|
|
|
38
57
|
import portal.tests.pageObjects.portal.teach.move_students_page as move_students_page
|
|
39
58
|
|
|
40
59
|
return move_students_page.TeachMoveStudentsPage(self.browser)
|
|
41
60
|
|
|
42
61
|
def move_students_none_selected(self):
|
|
43
|
-
self.browser.
|
|
62
|
+
self.browser.find_element(By.ID, "moveSelectedStudents").click()
|
|
44
63
|
|
|
45
64
|
return self
|
|
46
65
|
|
|
47
66
|
def dismiss_students(self):
|
|
48
|
-
self.browser.
|
|
67
|
+
self.browser.find_element(By.ID, "dismissSelectedStudents").click()
|
|
49
68
|
|
|
50
69
|
import portal.tests.pageObjects.portal.teach.dismiss_students_page as dismiss_students_page
|
|
51
70
|
|
|
@@ -64,21 +83,25 @@ class TeachClassPage(TeachBasePage):
|
|
|
64
83
|
return onboarding_student_list_page.OnboardingStudentListPage(self.browser)
|
|
65
84
|
|
|
66
85
|
def toggle_select_student(self):
|
|
67
|
-
self.browser.
|
|
86
|
+
self.browser.find_element(By.ID, "student_checkbox").click()
|
|
87
|
+
return self
|
|
88
|
+
|
|
89
|
+
def toggle_all_students(self):
|
|
90
|
+
self.browser.find_element(By.ID, "selectedStudentsListToggle").click()
|
|
68
91
|
return self
|
|
69
92
|
|
|
70
93
|
def has_students(self):
|
|
71
94
|
return self.element_exists_by_id("student_table")
|
|
72
95
|
|
|
73
96
|
def go_to_edit_student_page(self):
|
|
74
|
-
self.browser.
|
|
97
|
+
self.browser.find_element(By.ID, "edit_student_button").click()
|
|
75
98
|
|
|
76
99
|
import portal.tests.pageObjects.portal.teach.edit_student_page as edit_student_page
|
|
77
100
|
|
|
78
101
|
return edit_student_page.EditStudentPage(self.browser)
|
|
79
102
|
|
|
80
103
|
def go_to_dashboard(self):
|
|
81
|
-
self.browser.
|
|
104
|
+
self.browser.find_element(By.ID, "return_to_classes_button").click()
|
|
82
105
|
# stop scrolling animation and scroll to top as the classes page will scroll to classes by default
|
|
83
106
|
self.browser.execute_script("$('html,body').stop();window.scrollTo(0, 0)")
|
|
84
107
|
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
from __future__ import absolute_import
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
from selenium.webdriver.common.by import By
|
|
4
|
+
from selenium.webdriver.support.ui import Select
|
|
4
5
|
|
|
5
|
-
from
|
|
6
|
+
from ..email_verification_needed_page import EmailVerificationNeededPage
|
|
7
|
+
from .add_independent_student_to_class_page import \
|
|
8
|
+
AddIndependentStudentToClassPage
|
|
6
9
|
from .class_page import TeachClassPage
|
|
7
10
|
from .move_classes_page import TeachMoveClassesPage
|
|
8
11
|
from .teach_base_page import TeachBasePage
|
|
9
|
-
from ..email_verification_needed_page import EmailVerificationNeededPage
|
|
10
12
|
|
|
11
13
|
|
|
12
14
|
class TeachDashboardPage(TeachBasePage):
|
|
@@ -16,19 +18,19 @@ class TeachDashboardPage(TeachBasePage):
|
|
|
16
18
|
assert self.on_correct_page("teach_dashboard_page")
|
|
17
19
|
|
|
18
20
|
def go_to_class_page(self):
|
|
19
|
-
self.browser.
|
|
21
|
+
self.browser.find_element(By.ID, "class_button").click()
|
|
20
22
|
return TeachClassPage(self.browser)
|
|
21
23
|
|
|
22
24
|
def open_school_tab(self):
|
|
23
|
-
self.browser.
|
|
25
|
+
self.browser.find_element(By.ID, "tab-school").click()
|
|
24
26
|
return self
|
|
25
27
|
|
|
26
28
|
def open_classes_tab(self):
|
|
27
|
-
self.browser.
|
|
29
|
+
self.browser.find_element(By.ID, "tab-classes").click()
|
|
28
30
|
return self
|
|
29
31
|
|
|
30
32
|
def open_account_tab(self):
|
|
31
|
-
self.browser.
|
|
33
|
+
self.browser.find_element(By.ID, "tab-account").click()
|
|
32
34
|
return self
|
|
33
35
|
|
|
34
36
|
def check_organisation_details(self, details):
|
|
@@ -38,39 +40,27 @@ class TeachDashboardPage(TeachBasePage):
|
|
|
38
40
|
self.wait_for_element_by_id("id_" + first_field)
|
|
39
41
|
|
|
40
42
|
for field, value in list(details.items()):
|
|
41
|
-
correct &= (
|
|
42
|
-
self.browser.find_element_by_id("id_" + field).get_attribute("value")
|
|
43
|
-
== value
|
|
44
|
-
)
|
|
43
|
+
correct &= self.browser.find_element(By.ID, "id_" + field).get_attribute("value") == value
|
|
45
44
|
|
|
46
45
|
return correct
|
|
47
46
|
|
|
48
47
|
def change_organisation_details(self, details):
|
|
49
48
|
for field, value in list(details.items()):
|
|
50
|
-
self.browser.
|
|
51
|
-
self.browser.
|
|
49
|
+
self.browser.find_element(By.ID, "id_" + field).clear()
|
|
50
|
+
self.browser.find_element(By.ID, "id_" + field).send_keys(value)
|
|
52
51
|
|
|
53
|
-
self.browser.
|
|
52
|
+
self.browser.find_element(By.ID, "update_details_button").click()
|
|
54
53
|
return self
|
|
55
54
|
|
|
56
|
-
def
|
|
57
|
-
self.
|
|
58
|
-
errorlist = (
|
|
59
|
-
self.browser.find_element_by_id("edit_form")
|
|
60
|
-
.find_element_by_class_name("errorlist")
|
|
61
|
-
.text
|
|
62
|
-
)
|
|
63
|
-
error = (
|
|
64
|
-
"There is already a school or club registered with that name and postcode"
|
|
65
|
-
)
|
|
66
|
-
return error in errorlist
|
|
67
|
-
|
|
68
|
-
def create_class(self, name, classmate_progress):
|
|
69
|
-
self.browser.find_element_by_id("id_class_name").send_keys(name)
|
|
55
|
+
def create_class(self, name, classmate_progress, teacher_id=None):
|
|
56
|
+
self.browser.find_element(By.ID, "id_class_name").send_keys(name)
|
|
70
57
|
if classmate_progress:
|
|
71
|
-
self.browser.
|
|
58
|
+
self.browser.find_element(By.ID, "id_classmate_progress").click()
|
|
72
59
|
|
|
73
|
-
|
|
60
|
+
if teacher_id is not None:
|
|
61
|
+
Select(self.browser.find_element(By.ID, "id_teacher")).select_by_value(str(teacher_id))
|
|
62
|
+
|
|
63
|
+
self.browser.find_element(By.ID, "create_class_button").click()
|
|
74
64
|
|
|
75
65
|
return self
|
|
76
66
|
|
|
@@ -81,12 +71,7 @@ class TeachDashboardPage(TeachBasePage):
|
|
|
81
71
|
|
|
82
72
|
def change_email(self, first_name, last_name, new_email, password):
|
|
83
73
|
self._change_details(
|
|
84
|
-
{
|
|
85
|
-
"first_name": first_name,
|
|
86
|
-
"last_name": last_name,
|
|
87
|
-
"email": new_email,
|
|
88
|
-
"current_password": password,
|
|
89
|
-
}
|
|
74
|
+
{"first_name": first_name, "last_name": last_name, "email": new_email, "current_password": password}
|
|
90
75
|
)
|
|
91
76
|
|
|
92
77
|
return EmailVerificationNeededPage(self.browser)
|
|
@@ -102,60 +87,36 @@ class TeachDashboardPage(TeachBasePage):
|
|
|
102
87
|
}
|
|
103
88
|
)
|
|
104
89
|
|
|
105
|
-
from portal.tests.pageObjects.portal.teacher_login_page import
|
|
106
|
-
TeacherLoginPage
|
|
107
|
-
)
|
|
90
|
+
from portal.tests.pageObjects.portal.teacher_login_page import \
|
|
91
|
+
TeacherLoginPage
|
|
108
92
|
|
|
109
93
|
return TeacherLoginPage(self.browser)
|
|
110
94
|
|
|
111
95
|
def _change_details(self, details):
|
|
112
96
|
for field, value in list(details.items()):
|
|
113
|
-
self.browser.
|
|
114
|
-
self.browser.
|
|
115
|
-
self.browser.
|
|
97
|
+
self.browser.find_element(By.ID, "id_" + field).clear()
|
|
98
|
+
self.browser.find_element(By.ID, "id_" + field).send_keys(value)
|
|
99
|
+
self.browser.find_element(By.ID, "update_button").click()
|
|
116
100
|
|
|
117
101
|
def check_account_details(self, details):
|
|
118
102
|
correct = True
|
|
119
103
|
|
|
120
104
|
for field, value in list(details.items()):
|
|
121
|
-
correct &= (
|
|
122
|
-
self.browser.find_element_by_id("id_" + field).get_attribute("value")
|
|
123
|
-
== value
|
|
124
|
-
)
|
|
105
|
+
correct &= self.browser.find_element(By.ID, "id_" + field).get_attribute("value") == value
|
|
125
106
|
|
|
126
107
|
return correct
|
|
127
108
|
|
|
128
|
-
def accept_join_request(self):
|
|
129
|
-
self.browser.find_element_by_id("requests_button").click()
|
|
130
|
-
time.sleep(3)
|
|
131
|
-
self.browser.find_element_by_id("allow_button").click()
|
|
132
|
-
return self
|
|
133
|
-
|
|
134
|
-
def deny_join_request(self):
|
|
135
|
-
self.browser.find_element_by_id("requests_button").click()
|
|
136
|
-
time.sleep(3)
|
|
137
|
-
self.browser.find_element_by_id("deny_button").click()
|
|
138
|
-
return self
|
|
139
|
-
|
|
140
109
|
def accept_independent_join_request(self):
|
|
141
|
-
self.browser.
|
|
110
|
+
self.browser.find_element(By.ID, "allow_independent_button").click()
|
|
142
111
|
return AddIndependentStudentToClassPage(self.browser)
|
|
143
112
|
|
|
144
113
|
def deny_independent_join_request(self):
|
|
145
|
-
self.browser.
|
|
114
|
+
self.browser.find_element(By.ID, "deny_independent_button").click()
|
|
146
115
|
return self
|
|
147
116
|
|
|
148
|
-
def has_join_request(self, email):
|
|
149
|
-
return self.element_exists_by_id("request_table") and (
|
|
150
|
-
email in self.browser.find_element_by_id("request_table").text
|
|
151
|
-
)
|
|
152
|
-
|
|
153
|
-
def has_no_join_requests(self):
|
|
154
|
-
return self.element_does_not_exist_by_id("request_table")
|
|
155
|
-
|
|
156
117
|
def has_independent_join_request(self, email):
|
|
157
118
|
return self.element_exists_by_id("independent_request_table") and (
|
|
158
|
-
email in self.browser.
|
|
119
|
+
email in self.browser.find_element(By.ID, "independent_request_table").text
|
|
159
120
|
)
|
|
160
121
|
|
|
161
122
|
def has_no_independent_join_requests(self):
|
|
@@ -163,21 +124,19 @@ class TeachDashboardPage(TeachBasePage):
|
|
|
163
124
|
|
|
164
125
|
def has_onboarding_complete_popup(self):
|
|
165
126
|
return self.element_exists_by_id("info-popup") and (
|
|
166
|
-
self.browser.
|
|
167
|
-
"Registration complete!"
|
|
168
|
-
)
|
|
127
|
+
self.browser.find_element(By.ID, "info-popup").text.startswith("Registration complete!")
|
|
169
128
|
)
|
|
170
129
|
|
|
171
130
|
def is_teacher_in_school(self, name):
|
|
172
|
-
return name in self.browser.
|
|
131
|
+
return name in self.browser.find_element(By.ID, "teachers_table").text
|
|
173
132
|
|
|
174
133
|
def is_not_teacher_in_school(self, name):
|
|
175
|
-
return name not in self.browser.
|
|
134
|
+
return name not in self.browser.find_element(By.ID, "teachers_table").text
|
|
176
135
|
|
|
177
136
|
def is_teacher_admin(self):
|
|
178
|
-
return "Revoke admin" in self.browser.
|
|
137
|
+
return "Revoke admin" in self.browser.find_element(By.ID, "teachers_table").text
|
|
179
138
|
|
|
180
|
-
def
|
|
139
|
+
def has_classes(self):
|
|
181
140
|
return self.element_exists_by_id("classes-table")
|
|
182
141
|
|
|
183
142
|
def does_not_have_classes(self):
|
|
@@ -185,26 +144,26 @@ class TeachDashboardPage(TeachBasePage):
|
|
|
185
144
|
|
|
186
145
|
def does_class_exist(self, name, access_code):
|
|
187
146
|
return (
|
|
188
|
-
self.
|
|
189
|
-
and (name in self.browser.
|
|
190
|
-
and (access_code in self.browser.
|
|
147
|
+
self.has_classes()
|
|
148
|
+
and (name in self.browser.find_element(By.ID, "classes-table").text)
|
|
149
|
+
and (access_code in self.browser.find_element(By.ID, "classes-table").text)
|
|
191
150
|
)
|
|
192
151
|
|
|
193
152
|
def is_teacher_non_admin(self):
|
|
194
|
-
return "Make admin" in self.browser.
|
|
153
|
+
return "Make admin" in self.browser.find_element(By.ID, "teachers_table").text
|
|
195
154
|
|
|
196
155
|
def click_kick_button(self):
|
|
197
|
-
self.browser.
|
|
156
|
+
self.browser.find_element(By.ID, "kick_button").click()
|
|
198
157
|
|
|
199
158
|
return self
|
|
200
159
|
|
|
201
160
|
def click_make_admin_button(self):
|
|
202
|
-
self.browser.
|
|
161
|
+
self.browser.find_element(By.ID, "make_admin_button").click()
|
|
203
162
|
|
|
204
163
|
return self
|
|
205
164
|
|
|
206
165
|
def click_make_non_admin_button(self):
|
|
207
|
-
self.browser.
|
|
166
|
+
self.browser.find_element(By.ID, "make_non_admin_button").click()
|
|
208
167
|
|
|
209
168
|
return self
|
|
210
169
|
|
|
@@ -214,7 +173,7 @@ class TeachDashboardPage(TeachBasePage):
|
|
|
214
173
|
return TeachMoveClassesPage(self.browser)
|
|
215
174
|
|
|
216
175
|
def _click_leave_button(self):
|
|
217
|
-
self.browser.
|
|
176
|
+
self.browser.find_element(By.ID, "leave_organisation_button").click()
|
|
218
177
|
|
|
219
178
|
def confirm_kick_with_students_dialog(self):
|
|
220
179
|
self.confirm_dialog()
|
|
@@ -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 . import class_page
|
|
4
6
|
from .teach_base_page import TeachBasePage
|
|
5
7
|
|
|
@@ -10,15 +12,15 @@ class TeachDismissStudentsPage(TeachBasePage):
|
|
|
10
12
|
|
|
11
13
|
assert self.on_correct_page("dismiss_students_page")
|
|
12
14
|
|
|
13
|
-
def enter_email(self, email):
|
|
14
|
-
self.browser.
|
|
15
|
-
self.browser.
|
|
15
|
+
def enter_email(self, email, id=0):
|
|
16
|
+
self.browser.find_element(By.ID, f"id_form-{id}-email").send_keys(email)
|
|
17
|
+
self.browser.find_element(By.ID, f"id_form-{id}-confirm_email").send_keys(email)
|
|
16
18
|
return self
|
|
17
19
|
|
|
18
20
|
def cancel(self):
|
|
19
|
-
self.browser.
|
|
21
|
+
self.browser.find_element(By.ID, "cancel_button").click()
|
|
20
22
|
return class_page.TeachClassPage(self.browser)
|
|
21
23
|
|
|
22
24
|
def dismiss(self):
|
|
23
|
-
self.browser.
|
|
25
|
+
self.browser.find_element(By.ID, "dismiss_button").click()
|
|
24
26
|
return class_page.TeachClassPage(self.browser)
|
|
@@ -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 . import class_page, onboarding_student_list_page
|
|
4
6
|
from .teach_base_page import TeachBasePage
|
|
5
7
|
|
|
@@ -11,26 +13,26 @@ class EditStudentPage(TeachBasePage):
|
|
|
11
13
|
assert self.on_correct_page("edit_student_page")
|
|
12
14
|
|
|
13
15
|
def type_student_name(self, name):
|
|
14
|
-
self.browser.
|
|
15
|
-
self.browser.
|
|
16
|
+
self.browser.find_element(By.ID, "id_name").clear()
|
|
17
|
+
self.browser.find_element(By.ID, "id_name").send_keys(name)
|
|
16
18
|
return self
|
|
17
19
|
|
|
18
20
|
def type_student_password(self, password):
|
|
19
|
-
self.browser.
|
|
20
|
-
self.browser.
|
|
21
|
+
self.browser.find_element(By.ID, "id_password").send_keys(password)
|
|
22
|
+
self.browser.find_element(By.ID, "id_confirm_password").send_keys(password)
|
|
21
23
|
return self
|
|
22
24
|
|
|
23
25
|
def click_update_button(self):
|
|
24
|
-
self.browser.
|
|
26
|
+
self.browser.find_element(By.ID, "update_name_button").click()
|
|
25
27
|
return class_page.TeachClassPage(self.browser)
|
|
26
28
|
|
|
27
29
|
def click_update_button_fail(self):
|
|
28
|
-
self.browser.
|
|
30
|
+
self.browser.find_element(By.ID, "update_name_button").click()
|
|
29
31
|
return self
|
|
30
32
|
|
|
31
33
|
def click_set_password_button(self):
|
|
32
|
-
self.browser.
|
|
34
|
+
self.browser.find_element(By.ID, "set_new_password_button").click()
|
|
33
35
|
return onboarding_student_list_page.OnboardingStudentListPage(self.browser)
|
|
34
36
|
|
|
35
37
|
def is_student_name(self, name):
|
|
36
|
-
return name in self.browser.
|
|
38
|
+
return name in self.browser.find_element(By.ID, "student_details").text
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
from __future__ import absolute_import
|
|
2
2
|
|
|
3
|
+
from selenium.webdriver.common.by import By
|
|
3
4
|
from selenium.webdriver.support.ui import Select
|
|
4
5
|
|
|
5
6
|
from . import class_page
|
|
@@ -14,22 +15,16 @@ class TeachMoveClassPage(TeachBasePage):
|
|
|
14
15
|
assert self.on_correct_page("teach_move_class_page")
|
|
15
16
|
|
|
16
17
|
def get_list_length(self):
|
|
17
|
-
return len(
|
|
18
|
-
self.browser.find_element_by_id("id_new_teacher").find_elements_by_tag_name(
|
|
19
|
-
"option"
|
|
20
|
-
)
|
|
21
|
-
)
|
|
18
|
+
return len(self.browser.find_element(By.ID, "id_new_teacher").find_elements(By.TAG_NAME, "option"))
|
|
22
19
|
|
|
23
20
|
def select_teacher_by_index(self, teacher_index):
|
|
24
|
-
Select(self.browser.
|
|
25
|
-
teacher_index
|
|
26
|
-
)
|
|
21
|
+
Select(self.browser.find_element(By.ID, "id_new_teacher")).select_by_index(teacher_index)
|
|
27
22
|
return self
|
|
28
23
|
|
|
29
24
|
def cancel(self):
|
|
30
|
-
self.browser.
|
|
25
|
+
self.browser.find_element(By.ID, "cancel_button").click()
|
|
31
26
|
return class_page.TeachClassPage(self.browser)
|
|
32
27
|
|
|
33
28
|
def move(self):
|
|
34
|
-
self.browser.
|
|
29
|
+
self.browser.find_element(By.ID, "move_button").click()
|
|
35
30
|
return dashboard_page.TeachDashboardPage(self.browser)
|
|
@@ -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 .teach_base_page import TeachBasePage
|
|
4
6
|
|
|
5
7
|
|
|
@@ -10,13 +12,13 @@ class TeachMoveClassesPage(TeachBasePage):
|
|
|
10
12
|
assert self.on_correct_page("move_all_classes_page")
|
|
11
13
|
|
|
12
14
|
def move_and_kick(self):
|
|
13
|
-
self.browser.
|
|
15
|
+
self.browser.find_element(By.ID, "move_classes_button").click()
|
|
14
16
|
import portal.tests.pageObjects.portal.teach.dashboard_page as dashboard_page
|
|
15
17
|
|
|
16
18
|
return dashboard_page.TeachDashboardPage(self.browser)
|
|
17
19
|
|
|
18
20
|
def move_and_leave(self):
|
|
19
|
-
self.browser.
|
|
21
|
+
self.browser.find_element(By.ID, "move_classes_button").click()
|
|
20
22
|
import portal.tests.pageObjects.portal.teach.onboarding_organisation_page as onboarding_organisation_page
|
|
21
23
|
|
|
22
24
|
return onboarding_organisation_page.OnboardingOrganisationPage(self.browser)
|
|
@@ -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 . import class_page
|
|
4
6
|
from .teach_base_page import TeachBasePage
|
|
5
7
|
|
|
@@ -11,9 +13,9 @@ class TeachMoveStudentsDisambiguatePage(TeachBasePage):
|
|
|
11
13
|
assert self.on_correct_page("move_students_disambiguate_page")
|
|
12
14
|
|
|
13
15
|
def cancel(self):
|
|
14
|
-
self.browser.
|
|
16
|
+
self.browser.find_element(By.ID, "cancel_button").click()
|
|
15
17
|
return class_page.TeachClassPage(self.browser)
|
|
16
18
|
|
|
17
19
|
def move(self):
|
|
18
|
-
self.browser.
|
|
20
|
+
self.browser.find_element(By.ID, "move_button").click()
|
|
19
21
|
return class_page.TeachClassPage(self.browser)
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
from __future__ import absolute_import
|
|
2
2
|
|
|
3
|
+
from selenium.webdriver.common.by import By
|
|
3
4
|
from selenium.webdriver.support.ui import Select
|
|
4
5
|
|
|
5
6
|
from . import class_page
|
|
@@ -14,24 +15,16 @@ class TeachMoveStudentsPage(TeachBasePage):
|
|
|
14
15
|
assert self.on_correct_page("move_students_page")
|
|
15
16
|
|
|
16
17
|
def get_list_length(self):
|
|
17
|
-
return len(
|
|
18
|
-
self.browser.find_element_by_id("id_new_class").find_elements_by_tag_name(
|
|
19
|
-
"option"
|
|
20
|
-
)
|
|
21
|
-
)
|
|
18
|
+
return len(self.browser.find_element(By.ID, "id_new_class").find_elements(By.TAG_NAME, "option"))
|
|
22
19
|
|
|
23
20
|
def select_class_by_index(self, teacher_index):
|
|
24
|
-
Select(self.browser.
|
|
25
|
-
teacher_index
|
|
26
|
-
)
|
|
21
|
+
Select(self.browser.find_element(By.ID, "id_new_class")).select_by_index(teacher_index)
|
|
27
22
|
return self
|
|
28
23
|
|
|
29
24
|
def cancel(self):
|
|
30
|
-
self.browser.
|
|
25
|
+
self.browser.find_element(By.ID, "cancel_button").click()
|
|
31
26
|
return class_page.TeachClassPage(self.browser)
|
|
32
27
|
|
|
33
28
|
def move(self):
|
|
34
|
-
self.browser.
|
|
35
|
-
return move_students_disambiguate_page.TeachMoveStudentsDisambiguatePage(
|
|
36
|
-
self.browser
|
|
37
|
-
)
|
|
29
|
+
self.browser.find_element(By.ID, "move_button").click()
|
|
30
|
+
return move_students_disambiguate_page.TeachMoveStudentsDisambiguatePage(self.browser)
|
|
@@ -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 . import onboarding_students_page
|
|
4
6
|
from .teach_base_page import TeachBasePage
|
|
5
7
|
|
|
@@ -11,9 +13,9 @@ class OnboardingClassesPage(TeachBasePage):
|
|
|
11
13
|
assert self.on_correct_page("onboarding_classes_page")
|
|
12
14
|
|
|
13
15
|
def create_class(self, name, classmate_progress):
|
|
14
|
-
self.browser.
|
|
16
|
+
self.browser.find_element(By.ID, "id_class_name").send_keys(name)
|
|
15
17
|
if classmate_progress:
|
|
16
|
-
self.browser.
|
|
18
|
+
self.browser.find_element(By.ID, "id_classmate_progress").click()
|
|
17
19
|
|
|
18
20
|
self._click_create_class_button()
|
|
19
21
|
|
|
@@ -25,7 +27,7 @@ class OnboardingClassesPage(TeachBasePage):
|
|
|
25
27
|
return self
|
|
26
28
|
|
|
27
29
|
def _click_create_class_button(self):
|
|
28
|
-
self.browser.
|
|
30
|
+
self.browser.find_element(By.ID, "create_class_button").click()
|
|
29
31
|
|
|
30
32
|
def does_not_have_classes(self):
|
|
31
33
|
return self.element_does_not_exist_by_id("add_students")
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
from __future__ import absolute_import
|
|
2
2
|
|
|
3
|
-
import
|
|
4
|
-
|
|
3
|
+
from selenium.webdriver.common.by import By
|
|
5
4
|
from selenium.webdriver.support.ui import Select
|
|
6
5
|
|
|
7
6
|
from . import onboarding_classes_page
|
|
8
|
-
from . import onboarding_revoke_request_page
|
|
9
7
|
from .teach_base_page import TeachBasePage
|
|
10
8
|
|
|
11
9
|
|
|
@@ -15,13 +13,13 @@ class OnboardingOrganisationPage(TeachBasePage):
|
|
|
15
13
|
|
|
16
14
|
assert self.on_correct_page("onboarding_organisation_page")
|
|
17
15
|
|
|
18
|
-
def create_organisation(self, name,
|
|
19
|
-
self._create_organisation(name,
|
|
16
|
+
def create_organisation(self, name, country="GB"):
|
|
17
|
+
self._create_organisation(name, country)
|
|
20
18
|
|
|
21
19
|
return onboarding_classes_page.OnboardingClassesPage(self.browser)
|
|
22
20
|
|
|
23
|
-
def create_organisation_failure(self, name,
|
|
24
|
-
self._create_organisation(name,
|
|
21
|
+
def create_organisation_failure(self, name, country="GB"):
|
|
22
|
+
self._create_organisation(name, country)
|
|
25
23
|
|
|
26
24
|
return self
|
|
27
25
|
|
|
@@ -30,58 +28,22 @@ class OnboardingOrganisationPage(TeachBasePage):
|
|
|
30
28
|
|
|
31
29
|
return self
|
|
32
30
|
|
|
33
|
-
def
|
|
34
|
-
self.browser.
|
|
35
|
-
self.
|
|
36
|
-
|
|
37
|
-
return self
|
|
38
|
-
|
|
39
|
-
def _create_organisation(self, name, password, postcode, country):
|
|
40
|
-
self.browser.find_element_by_id("id_name").send_keys(name)
|
|
41
|
-
self.browser.find_element_by_id("id_postcode").send_keys(postcode)
|
|
42
|
-
country_element = self.browser.find_element_by_id("id_country")
|
|
31
|
+
def _create_organisation(self, name, country):
|
|
32
|
+
self.browser.find_element(By.ID, "id_name").send_keys(name)
|
|
33
|
+
country_element = self.browser.find_element(By.ID, "id_country")
|
|
43
34
|
select = Select(country_element)
|
|
44
35
|
select.select_by_value(country)
|
|
45
36
|
self._click_create_school_button()
|
|
46
37
|
|
|
47
38
|
def _click_create_school_button(self):
|
|
48
|
-
self.browser.
|
|
49
|
-
|
|
50
|
-
def _click_join_school_button(self):
|
|
51
|
-
self.browser.find_element_by_name("join_organisation").click()
|
|
39
|
+
self.browser.find_element(By.NAME, "create_organisation").click()
|
|
52
40
|
|
|
53
41
|
def has_creation_failed(self):
|
|
54
42
|
if not self.element_exists_by_css(".errorlist"):
|
|
55
43
|
return False
|
|
56
44
|
|
|
57
45
|
errors = (
|
|
58
|
-
self.browser.
|
|
59
|
-
.find_element_by_class_name("errorlist")
|
|
60
|
-
.text
|
|
61
|
-
)
|
|
62
|
-
error = (
|
|
63
|
-
"There is already a school or club registered with that name and postcode"
|
|
64
|
-
)
|
|
65
|
-
return error in errors
|
|
66
|
-
|
|
67
|
-
def was_postcode_invalid(self):
|
|
68
|
-
errors = (
|
|
69
|
-
self.browser.find_element_by_id("form-create-organisation")
|
|
70
|
-
.find_element_by_class_name("errorlist")
|
|
71
|
-
.text
|
|
46
|
+
self.browser.find_element(By.ID, "form-create-organisation").find_element(By.CLASS_NAME, "errorlist").text
|
|
72
47
|
)
|
|
73
|
-
error = "
|
|
48
|
+
error = "There is already a school or club registered with that name and postcode"
|
|
74
49
|
return error in errors
|
|
75
|
-
|
|
76
|
-
def join_organisation(self, name):
|
|
77
|
-
self.browser.find_element_by_id("join-button").click()
|
|
78
|
-
self.browser.find_element_by_id("id_fuzzy_name").send_keys(name)
|
|
79
|
-
time.sleep(1)
|
|
80
|
-
self._click_join_school_button()
|
|
81
|
-
|
|
82
|
-
if self.on_correct_page("onboarding_revoke_request_page"):
|
|
83
|
-
return onboarding_revoke_request_page.OnboardingRevokeRequestPage(
|
|
84
|
-
self.browser
|
|
85
|
-
)
|
|
86
|
-
else:
|
|
87
|
-
return self
|