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.
Files changed (391) hide show
  1. cfl_common/common/__init__.py +1 -0
  2. cfl_common/common/app_settings.py +66 -0
  3. cfl_common/common/apps.py +6 -0
  4. cfl_common/common/context_processors.py +9 -0
  5. cfl_common/common/csp_config.py +85 -0
  6. cfl_common/common/helpers/__init__.py +0 -0
  7. cfl_common/common/helpers/data_migration_loader.py +42 -0
  8. cfl_common/common/helpers/emails.py +393 -0
  9. cfl_common/common/helpers/generators.py +52 -0
  10. cfl_common/common/helpers/organisation.py +10 -0
  11. cfl_common/common/mail.py +201 -0
  12. cfl_common/common/migrations/0001_initial.py +240 -0
  13. cfl_common/common/migrations/0002_emailverification.py +55 -0
  14. cfl_common/common/migrations/0003_aimmocharacter.py +31 -0
  15. cfl_common/common/migrations/0004_add_aimmocharacters.py +17 -0
  16. cfl_common/common/migrations/0005_add_worksheets.py +8 -0
  17. cfl_common/common/migrations/0006_update_aimmo_character_image_path.py +17 -0
  18. cfl_common/common/migrations/0007_add_pdf_names_to_first_two_worksheets.py +8 -0
  19. cfl_common/common/migrations/0008_unlock_worksheet_3.py +11 -0
  20. cfl_common/common/migrations/0009_add_blocked_time_to_teacher_and_student.py +24 -0
  21. cfl_common/common/migrations/0010_remove_teacher_title.py +18 -0
  22. cfl_common/common/migrations/0011_student_login_id.py +18 -0
  23. cfl_common/common/migrations/0012_usersession.py +39 -0
  24. cfl_common/common/migrations/0013_class_school.py +42 -0
  25. cfl_common/common/migrations/0014_login_type.py +29 -0
  26. cfl_common/common/migrations/0015_dailyactivity.py +31 -0
  27. cfl_common/common/migrations/0016_joinreleasestudent.py +42 -0
  28. cfl_common/common/migrations/0017_copy_email_to_username.py +18 -0
  29. cfl_common/common/migrations/0018_update_aimmo_character_image_path.py +15 -0
  30. cfl_common/common/migrations/0019_aimmocharacter_alt.py +16 -0
  31. cfl_common/common/migrations/0020_class_is_active_and_null_access_code.py +23 -0
  32. cfl_common/common/migrations/0021_school_is_active.py +28 -0
  33. cfl_common/common/migrations/0022_school_cleanup.py +29 -0
  34. cfl_common/common/migrations/0023_userprofile_aimmo_badges.py +22 -0
  35. cfl_common/common/migrations/0024_teacher_invited_by.py +25 -0
  36. cfl_common/common/migrations/0025_schoolteacherinvitation.py +47 -0
  37. cfl_common/common/migrations/0026_teacher_remove_join_request.py +22 -0
  38. cfl_common/common/migrations/0027_class_created_by.py +25 -0
  39. cfl_common/common/migrations/0028_coding_club_downloads.py +23 -0
  40. cfl_common/common/migrations/0029_dynamicelement.py +22 -0
  41. cfl_common/common/migrations/0030_add_maintenance_banner.py +25 -0
  42. cfl_common/common/migrations/0031_improve_admin_panel.py +56 -0
  43. cfl_common/common/migrations/0032_dailyactivity_level_control_submits.py +18 -0
  44. cfl_common/common/migrations/0033_password_reset_tracking_fields.py +23 -0
  45. cfl_common/common/migrations/0034_dailyactivity_daily_school_student_lockout_reset.py +18 -0
  46. cfl_common/common/migrations/0035_rename_lockout_fields.py +27 -0
  47. cfl_common/common/migrations/0036_rename_awaiting_email_verification_userprofile_is_verified.py +17 -0
  48. cfl_common/common/migrations/0037_migrate_email_verification.py +21 -0
  49. cfl_common/common/migrations/0038_delete_emailverification.py +16 -0
  50. cfl_common/common/migrations/0039_copy_email_to_username.py +18 -0
  51. cfl_common/common/migrations/0040_school_county.py +18 -0
  52. cfl_common/common/migrations/0041_populate_gb_counties.py +27 -0
  53. cfl_common/common/migrations/0042_totalactivity.py +25 -0
  54. cfl_common/common/migrations/0043_add_total_activity.py +30 -0
  55. cfl_common/common/migrations/0044_update_activity_models.py +33 -0
  56. cfl_common/common/migrations/0045_otp.py +23 -0
  57. cfl_common/common/migrations/0046_alter_school_country.py +19 -0
  58. cfl_common/common/migrations/0047_delete_school_postcode.py +16 -0
  59. cfl_common/common/migrations/0048_unique_school_names.py +42 -0
  60. cfl_common/common/migrations/0049_anonymise_orphan_users.py +29 -0
  61. cfl_common/common/migrations/0050_anonymise_orphan_schools.py +30 -0
  62. cfl_common/common/migrations/0051_verify_returning_users.py +26 -0
  63. cfl_common/common/migrations/0052_add_cse_fields.py +68 -0
  64. cfl_common/common/migrations/0053_clean_class_data.py +24 -0
  65. cfl_common/common/migrations/0054_delete_aimmo_models.py +20 -0
  66. cfl_common/common/migrations/0055_alter_schoolteacherinvitation_token.py +18 -0
  67. cfl_common/common/migrations/0056_set_non_school_teachers_as_non_admins.py +25 -0
  68. cfl_common/common/migrations/0057_teacher_teacher__is_admin.py +19 -0
  69. cfl_common/common/migrations/0058_userprofile_google_refresh_token_and_more.py +24 -0
  70. cfl_common/common/migrations/__init__.py +0 -0
  71. cfl_common/common/models.py +557 -0
  72. cfl_common/common/permissions.py +84 -0
  73. cfl_common/common/tests/__init__.py +0 -0
  74. cfl_common/common/tests/test_migration_anonymise_orphan_schools.py +30 -0
  75. cfl_common/common/tests/test_migration_anonymise_orphan_users.py +30 -0
  76. cfl_common/common/tests/test_migration_blocked_time.py +15 -0
  77. cfl_common/common/tests/test_migration_remove_teacher_title.py +13 -0
  78. cfl_common/common/tests/test_migration_unique_school_names.py +33 -0
  79. cfl_common/common/tests/test_migration_verify_returning_users.py +59 -0
  80. cfl_common/common/tests/test_models.py +87 -0
  81. cfl_common/common/tests/utils/__init__.py +0 -0
  82. cfl_common/common/tests/utils/classes.py +38 -0
  83. cfl_common/common/tests/utils/email.py +67 -0
  84. cfl_common/common/tests/utils/organisation.py +41 -0
  85. cfl_common/common/tests/utils/student.py +123 -0
  86. cfl_common/common/tests/utils/teacher.py +73 -0
  87. cfl_common/common/tests/utils/user.py +27 -0
  88. cfl_common/common/utils.py +56 -0
  89. cfl_common/setup.py +61 -0
  90. codeforlife_portal-8.9.9.dist-info/METADATA +226 -0
  91. {codeforlife_portal-5.33.5.dist-info → codeforlife_portal-8.9.9.dist-info}/RECORD +339 -241
  92. {codeforlife_portal-5.33.5.dist-info → codeforlife_portal-8.9.9.dist-info}/WHEEL +1 -1
  93. codeforlife_portal-8.9.9.dist-info/licenses/LICENSE.md +3 -0
  94. {codeforlife_portal-5.33.5.dist-info → codeforlife_portal-8.9.9.dist-info}/top_level.txt +1 -0
  95. deploy/middleware/maintenance.py +25 -0
  96. deploy/middleware/screentime_warning.py +29 -0
  97. deploy/middleware/security.py +5 -6
  98. deploy/middleware/session_timeout.py +4 -2
  99. deploy/middleware/tmp_basic_auth.py +41 -0
  100. example_project/portal_test_settings.py +239 -0
  101. example_project/settings.py +156 -17
  102. example_project/urls.py +5 -6
  103. portal/__init__.py +1 -1
  104. portal/admin.py +142 -29
  105. portal/app_settings.py +8 -7
  106. portal/forms/dotmailer.py +6 -4
  107. portal/forms/invite_teacher.py +19 -10
  108. portal/forms/organisation.py +137 -68
  109. portal/forms/play.py +53 -98
  110. portal/forms/registration.py +70 -164
  111. portal/forms/teach.py +147 -121
  112. portal/handlers.py +1 -2
  113. portal/helpers/decorators.py +30 -10
  114. portal/helpers/password.py +86 -47
  115. portal/helpers/ratelimit.py +32 -15
  116. portal/helpers/regexes.py +5 -0
  117. portal/helpers/request_handlers.py +10 -0
  118. portal/migrations/0044_auto_20150430_0959.py +6 -2
  119. portal/mixins/__init__.py +1 -0
  120. portal/mixins/cron_mixin.py +12 -0
  121. portal/permissions/__init__.py +1 -0
  122. portal/permissions/is_cron_request_from_google.py +14 -0
  123. portal/static/portal/img/10_years_anniversary.png +0 -0
  124. portal/static/portal/img/RR_logo_grass_background.png +0 -0
  125. portal/static/portal/img/coding_club_hero.jpg +0 -0
  126. portal/static/portal/img/coding_club_python_pack.png +0 -0
  127. portal/static/portal/img/facebook.png +0 -0
  128. portal/static/portal/img/gitbook.png +0 -0
  129. portal/static/portal/img/howe_dell_1.png +0 -0
  130. portal/static/portal/img/howe_dell_2.png +0 -0
  131. portal/static/portal/img/howe_dell_3.png +0 -0
  132. portal/static/portal/img/logo_cfl.png +0 -0
  133. portal/static/portal/img/logo_cfl_powered.svg +35 -0
  134. portal/static/portal/img/logo_cfl_reminder_cards.jpg +0 -0
  135. portal/static/portal/img/logo_ocado_group.png +0 -0
  136. portal/static/portal/img/logo_python_den.svg +21 -0
  137. portal/static/portal/img/long_europe_map.png +0 -0
  138. portal/static/portal/img/python_den.png +0 -0
  139. portal/static/portal/img/python_den_banner.svg +26 -0
  140. portal/static/portal/img/rapid_router_landing_hero.png +0 -0
  141. portal/static/portal/img/rr_advanced.png +0 -0
  142. portal/static/portal/img/ten_year_map_pin.svg +1 -0
  143. portal/static/portal/img/thumbnail_educate_rapid_router.png +0 -0
  144. portal/static/portal/img/thumbnail_educate_resources.png +0 -0
  145. portal/static/portal/img/thumbnail_play_rapid_router.png +0 -0
  146. portal/static/portal/img/thumbnail_python_den.png +0 -0
  147. portal/static/portal/img/twitter.png +0 -0
  148. portal/static/portal/js/carouselCards.js +25 -0
  149. portal/static/portal/js/common.js +96 -1
  150. portal/static/portal/js/independentLogin.js +16 -0
  151. portal/static/portal/js/independentRegistration.js +86 -0
  152. portal/static/portal/js/levelControl.js +77 -0
  153. portal/static/portal/js/lib/jquery.min.js +2 -0
  154. portal/static/portal/js/organisation_manage.js +142 -14
  155. portal/static/portal/js/passwordStrength.js +154 -64
  156. portal/static/portal/js/resetPassword.js +23 -0
  157. portal/static/portal/js/riveted.min.js +238 -239
  158. portal/static/portal/js/school.js +13 -0
  159. portal/static/portal/js/studentLogin.js +16 -0
  160. portal/static/portal/js/teacherEditStudent.js +23 -0
  161. portal/static/portal/js/teacherLogin.js +16 -0
  162. portal/static/portal/js/tenYearMap.js +14 -0
  163. portal/static/portal/sass/colorbox.scss +0 -1
  164. portal/static/portal/sass/modules/_colours.scss +1 -0
  165. portal/static/portal/sass/modules/_levels.scss +1 -1
  166. portal/static/portal/sass/modules/_mixins.scss +21 -0
  167. portal/static/portal/sass/partials/_banners.scss +4 -177
  168. portal/static/portal/sass/partials/_buttons.scss +12 -15
  169. portal/static/portal/sass/partials/_carousel.scss +129 -0
  170. portal/static/portal/sass/partials/_footer.scss +21 -22
  171. portal/static/portal/sass/partials/_forms.scss +60 -5
  172. portal/static/portal/sass/partials/_grids.scss +34 -61
  173. portal/static/portal/sass/partials/_header.scss +28 -20
  174. portal/static/portal/sass/partials/_images.scss +292 -39
  175. portal/static/portal/sass/partials/_popup.scss +18 -15
  176. portal/static/portal/sass/partials/_tables.scss +12 -20
  177. portal/static/portal/sass/partials/_text.scss +6 -10
  178. portal/static/portal/sass/styles.scss +0 -1
  179. portal/static/portal/video/code for life .pdf +0 -0
  180. portal/strings/about.py +5 -0
  181. portal/strings/coding_club.py +9 -0
  182. portal/strings/play.py +6 -5
  183. portal/strings/teach.py +1 -1
  184. portal/strings/teacher_resources.py +2 -8
  185. portal/strings/ten_year_map.py +13 -0
  186. portal/templates/403.html +2 -2
  187. portal/templates/404.html +1 -1
  188. portal/templates/500.html +2 -2
  189. portal/templates/{captcha → django_recaptcha}/includes/js_v2_invisible.html +3 -3
  190. portal/templates/{captcha → django_recaptcha}/widget_v2_invisible.html +2 -2
  191. portal/templates/email.html +4 -2
  192. portal/templates/maintenance.html +34 -0
  193. portal/templates/portal/about.html +94 -62
  194. portal/templates/portal/base.html +176 -152
  195. portal/templates/portal/coding_club.html +100 -0
  196. portal/templates/portal/contribute.html +56 -52
  197. portal/templates/portal/email_invitation_sent.html +1 -1
  198. portal/templates/portal/email_style_template.html +374 -0
  199. portal/templates/portal/email_verification_failed.html +1 -1
  200. portal/templates/portal/email_verification_needed.html +9 -9
  201. portal/templates/portal/form_shapes.html +20 -8
  202. portal/templates/portal/getinvolved.html +6 -6
  203. portal/templates/portal/home.html +35 -10
  204. portal/templates/portal/home_learning.html +19 -19
  205. portal/templates/portal/locked_out.html +0 -1
  206. portal/templates/portal/locked_out_school_student.html +16 -0
  207. portal/templates/portal/login/independent_student.html +31 -15
  208. portal/templates/portal/login/student.html +10 -7
  209. portal/templates/portal/login/student_class_code.html +7 -4
  210. portal/templates/portal/login/teacher.html +34 -17
  211. portal/templates/portal/partials/banner.html +18 -4
  212. portal/templates/portal/partials/benefits.html +1 -1
  213. portal/templates/portal/partials/card_list.html +34 -24
  214. portal/templates/portal/partials/character_list.html +5 -5
  215. portal/templates/portal/partials/cookie_list.html +161 -0
  216. portal/templates/portal/partials/delete_popup.html +18 -0
  217. portal/templates/portal/partials/footer.html +57 -26
  218. portal/templates/portal/partials/header.html +118 -117
  219. portal/templates/portal/partials/hero_card.html +4 -3
  220. portal/templates/portal/partials/info_popup.html +3 -3
  221. portal/templates/portal/partials/invite_admin_teacher.html +23 -0
  222. portal/templates/portal/partials/popup.html +7 -2
  223. portal/templates/portal/partials/register_newsletter_tickbox.html +2 -5
  224. portal/templates/portal/partials/screentime_popup.html +14 -0
  225. portal/templates/portal/partials/service_unavailable_popup.html +17 -0
  226. portal/templates/portal/partials/session_popup.html +19 -0
  227. portal/templates/portal/play/student_dashboard.html +42 -29
  228. portal/templates/portal/play/student_edit_account.html +64 -9
  229. portal/templates/portal/play.html +61 -41
  230. portal/templates/portal/privacy_notice.html +697 -0
  231. portal/templates/portal/register.html +122 -92
  232. portal/templates/portal/reset_password.html +20 -40
  233. portal/templates/portal/reset_password_confirm.html +9 -4
  234. portal/templates/portal/reset_password_email_sent.html +15 -13
  235. portal/templates/portal/teach/base_registering.html +1 -1
  236. portal/templates/portal/teach/class.html +4 -6
  237. portal/templates/portal/teach/dashboard.html +212 -117
  238. portal/templates/portal/teach/invited.html +90 -0
  239. portal/templates/portal/teach/onboarding_classes.html +5 -3
  240. portal/templates/portal/teach/onboarding_print.html +1 -1
  241. portal/templates/portal/teach/onboarding_school.html +26 -139
  242. portal/templates/portal/teach/onboarding_students.html +1 -1
  243. portal/templates/portal/teach/teacher_dismiss_students.html +73 -55
  244. portal/templates/portal/teach/teacher_edit_class.html +168 -11
  245. portal/templates/portal/teach/teacher_edit_student.html +12 -5
  246. portal/templates/portal/teach/teacher_move_all_classes.html +25 -38
  247. portal/templates/portal/teach/teacher_move_students_to_class.html +1 -1
  248. portal/templates/portal/teach.html +61 -42
  249. portal/templates/portal/ten_year_map.html +147 -0
  250. portal/templates/portal/terms.html +191 -42
  251. portal/templates/two_factor/core/login.html +71 -59
  252. portal/templates/two_factor/core/setup.html +58 -49
  253. portal/templates/two_factor/profile/disable.html +1 -1
  254. portal/templates/two_factor/profile/profile.html +35 -17
  255. portal/templatetags/app_tags.py +59 -84
  256. portal/templatetags/card_list_tags.py +0 -4
  257. portal/tests/base_test.py +14 -3
  258. portal/tests/conftest.py +0 -15
  259. portal/tests/migrations/test_migration_make_portaladmin_teacher.py +2 -6
  260. portal/tests/migrations/test_migration_preview_users.py +3 -9
  261. portal/tests/migrations/test_migration_remove_guardian.py +1 -3
  262. portal/tests/migrations/test_migration_use_common_models.py +2 -6
  263. portal/tests/migrations/test_migration_verify_portaladmin.py +1 -3
  264. portal/tests/pageObjects/portal/admin/admin_base_page.py +0 -21
  265. portal/tests/pageObjects/portal/base_page.py +16 -26
  266. portal/tests/pageObjects/portal/email_verification_needed_page.py +3 -2
  267. portal/tests/pageObjects/portal/game_page.py +12 -19
  268. portal/tests/pageObjects/portal/home_page.py +13 -15
  269. portal/tests/pageObjects/portal/independent_login_page.py +13 -17
  270. portal/tests/pageObjects/portal/password_reset_form_page.py +20 -4
  271. portal/tests/pageObjects/portal/password_reset_page.py +25 -0
  272. portal/tests/pageObjects/portal/play/account_page.py +18 -27
  273. portal/tests/pageObjects/portal/play/dashboard_page.py +4 -4
  274. portal/tests/pageObjects/portal/play/join_school_or_club_page.py +8 -10
  275. portal/tests/pageObjects/portal/play/play_base_page.py +5 -3
  276. portal/tests/pageObjects/portal/signup_page.py +28 -59
  277. portal/tests/pageObjects/portal/student_login_class_code.py +6 -9
  278. portal/tests/pageObjects/portal/student_login_page.py +6 -8
  279. portal/tests/pageObjects/portal/teach/add_independent_student_to_class_page.py +3 -3
  280. portal/tests/pageObjects/portal/teach/added_independent_student_to_class_page.py +3 -1
  281. portal/tests/pageObjects/portal/teach/class_page.py +36 -13
  282. portal/tests/pageObjects/portal/teach/dashboard_page.py +43 -84
  283. portal/tests/pageObjects/portal/teach/dismiss_students_page.py +7 -5
  284. portal/tests/pageObjects/portal/teach/edit_student_page.py +10 -8
  285. portal/tests/pageObjects/portal/teach/move_class_page.py +5 -10
  286. portal/tests/pageObjects/portal/teach/move_classes_page.py +4 -2
  287. portal/tests/pageObjects/portal/teach/move_students_disambiguate_page.py +4 -2
  288. portal/tests/pageObjects/portal/teach/move_students_page.py +6 -13
  289. portal/tests/pageObjects/portal/teach/onboarding_classes_page.py +5 -3
  290. portal/tests/pageObjects/portal/teach/onboarding_organisation_page.py +11 -49
  291. portal/tests/pageObjects/portal/teach/onboarding_student_list_page.py +7 -12
  292. portal/tests/pageObjects/portal/teach/onboarding_students_page.py +4 -27
  293. portal/tests/pageObjects/portal/teach/teach_base_page.py +6 -4
  294. portal/tests/pageObjects/portal/teacher_login_page.py +10 -16
  295. portal/tests/selenium_test_case.py +3 -43
  296. portal/tests/snapshots/snap_test_partials.py +11 -165
  297. portal/tests/test_2FA.py +15 -33
  298. portal/tests/test_admin.py +15 -97
  299. portal/tests/test_api.py +212 -91
  300. portal/tests/test_captcha_forms.py +2 -2
  301. portal/tests/test_class.py +374 -24
  302. portal/tests/test_emails.py +83 -20
  303. portal/tests/{test_newsletter_footer.py → test_global_forms.py} +5 -5
  304. portal/tests/test_helper_methods.py +30 -0
  305. portal/tests/test_independent_student.py +255 -144
  306. portal/tests/test_invite_teacher.py +318 -10
  307. portal/tests/test_middleware.py +96 -9
  308. portal/tests/test_organisation.py +78 -262
  309. portal/tests/test_partials.py +0 -88
  310. portal/tests/test_ratelimit.py +218 -36
  311. portal/tests/test_school_student.py +35 -40
  312. portal/tests/test_security.py +12 -31
  313. portal/tests/test_teacher.py +425 -325
  314. portal/tests/test_teacher_student.py +103 -91
  315. portal/tests/test_views.py +900 -76
  316. portal/tests/utils/classes.py +2 -2
  317. portal/tests/utils/messages.py +13 -28
  318. portal/urls.py +235 -166
  319. portal/views/admin.py +0 -332
  320. portal/views/api.py +82 -48
  321. portal/views/cron/__init__.py +1 -0
  322. portal/views/cron/user.py +322 -0
  323. portal/views/dotmailer.py +9 -1
  324. portal/views/email.py +33 -77
  325. portal/views/google_analytics.py +28 -0
  326. portal/views/home.py +126 -97
  327. portal/views/legal.py +13 -0
  328. portal/views/login/independent_student.py +5 -5
  329. portal/views/login/student.py +51 -14
  330. portal/views/login/teacher.py +2 -6
  331. portal/views/organisation.py +20 -189
  332. portal/views/registration.py +97 -17
  333. portal/views/student/edit_account_details.py +99 -72
  334. portal/views/student/play.py +81 -62
  335. portal/views/teacher/dashboard.py +421 -149
  336. portal/views/teacher/teach.py +226 -177
  337. portal/views/two_factor/core.py +22 -19
  338. portal/views/two_factor/profile.py +2 -2
  339. codeforlife_portal-5.33.5.dist-info/LICENSE.md +0 -577
  340. codeforlife_portal-5.33.5.dist-info/METADATA +0 -38
  341. deploy/permissions.py +0 -2
  342. example_project/manage.py +0 -10
  343. portal/autoconfig.py +0 -141
  344. portal/csp_config.py +0 -60
  345. portal/forms/add_game.py +0 -33
  346. portal/helpers/location.py +0 -121
  347. portal/static/portal/img/kurono_hero.jpg +0 -0
  348. portal/static/portal/img/kurono_landing_hero.png +0 -0
  349. portal/static/portal/img/kurono_logo.svg +0 -1
  350. portal/static/portal/img/kurono_logo_grey_background.svg +0 -1
  351. portal/static/portal/img/kurono_logo_mark.svg +0 -1
  352. portal/static/portal/img/kurono_resources_hero.jpg +0 -0
  353. portal/static/portal/img/kurono_story.png +0 -0
  354. portal/static/portal/img/ocado-swirl.svg +0 -22
  355. portal/static/portal/img/thumbnail_educate_kurono.png +0 -0
  356. portal/static/portal/img/thumbnail_educate_resources_and_progress_tracking.png +0 -0
  357. portal/static/portal/img/thumbnail_kurono_resources.png +0 -0
  358. portal/static/portal/img/thumbnail_play_kurono.png +0 -0
  359. portal/static/portal/img/x_close_video.png +0 -0
  360. portal/static/portal/js/aimmoGame.js +0 -106
  361. portal/static/portal/js/deleteWorkspaces.js +0 -14
  362. portal/static/portal/js/fuzzySchoolLookup.js +0 -46
  363. portal/static/portal/js/lib/jquery-3.5.1.min.js +0 -2
  364. portal/static/portal/js/lib/jquery-ui-1.12.1.min.js +0 -13
  365. portal/static/portal/sass/partials/_videos.scss +0 -10
  366. portal/static/portal/video/aimmo_play_now_background_video.mp4 +0 -0
  367. portal/strings/student_aimmo_dashboard.py +0 -6
  368. portal/templates/portal/admin/aggregated_data.html +0 -35
  369. portal/templates/portal/admin/map.html +0 -70
  370. portal/templates/portal/mouseflow.html +0 -9
  371. portal/templates/portal/partials/aimmo_games_table.html +0 -83
  372. portal/templates/portal/partials/register_over_required_age_tickbox.html +0 -9
  373. portal/templates/portal/play/independent_student_dashboard.html +0 -64
  374. portal/templates/portal/play/student_aimmo_dashboard.html +0 -63
  375. portal/templates/portal/privacy_policy.html +0 -483
  376. portal/templates/portal/reset_password_email.html +0 -9
  377. portal/templates/portal/teach/invite.html +0 -25
  378. portal/templates/portal/teach/teacher_aimmo_dashboard.html +0 -95
  379. portal/templates/portal/teach/teacher_resources.html +0 -68
  380. portal/templatetags/character_list_tags.py +0 -16
  381. portal/tests/pageObjects/portal/kurono_teacher_dashboard_page.py +0 -49
  382. portal/tests/pageObjects/portal/student_password_reset_form_page.py +0 -23
  383. portal/tests/pageObjects/portal/teach/onboarding_revoke_request_page.py +0 -20
  384. portal/tests/pageObjects/portal/teacher_password_reset_form_page.py +0 -23
  385. portal/tests/test_aimmo_dashboards.py +0 -172
  386. portal/tests/test_location.py +0 -217
  387. portal/tests/utils/aimmo_games.py +0 -30
  388. portal/views/aimmo/dashboard.py +0 -119
  389. portal/views/privacy_policy.py +0 -9
  390. portal/views/teacher/teacher_resources.py +0 -42
  391. {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.find_element_by_id(button_id).click()
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.find_element_by_id("load_tab").click()
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.find_element_by_css_selector(selector).click()
36
- self.browser.find_element_by_id("loadWorkspace").click()
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.find_element_by_id("clear_tab").click()
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.find_element_by_id("step_tab").click()
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.find_element_by_id(
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.find_element_by_id("fast_tab").click()
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.find_element_by_id("myModal-lead").text
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.find_element_by_id(element_id).text
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.find_element_by_id("login_dropdown").click()
13
- self.browser.find_element_by_id("teacher_login_button").click()
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.find_element_by_id("logout_menu").click()
21
- self.browser.find_element_by_id("logout_button").click()
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.find_element_by_id("login_dropdown").click()
26
- self.browser.find_element_by_id("independent_login_button").click()
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.find_element_by_id("login_dropdown").click()
36
- self.browser.find_element_by_id("student_login_button").click()
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.find_element_by_id("signup_button").click()
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 time
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, username, password):
15
- self._independent_student_login(username, password)
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, username, password):
20
- self._independent_student_login(username, password)
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, username, password):
24
- self.browser.find_element_by_id("id_username").send_keys(username)
25
- self.browser.find_element_by_id("id_password").send_keys(password)
26
- self.browser.find_element_by_name("independent_student_login").click()
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.find_element_by_id("student_forgotten_password_button").click()
30
- return StudentPasswordResetFormPage(self.browser)
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.find_element_by_id("teacher_update_button").click()
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.find_element_by_id("student_update_button").click()
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.find_element_by_id("id_" + field).clear()
34
- self.browser.find_element_by_id("id_" + field).send_keys(value)
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 portal.tests.pageObjects.portal.email_verification_needed_page import (
4
- EmailVerificationNeededPage,
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.find_element_by_id("id_" + field).clear()
36
- self.browser.find_element_by_id("id_" + field).send_keys(value)
37
- self.browser.find_element_by_id("update_button").click()
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.find_element_by_id("update_button").click()
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.find_element_by_id("id_password").send_keys(new_password)
68
- self.browser.find_element_by_id("id_confirm_password").send_keys(
69
- confirm_new_password
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.find_element_by_id("id_name").clear()
76
- self.browser.find_element_by_id("id_name").send_keys(new_name)
77
- self.browser.find_element_by_id("id_current_password").send_keys(password)
78
- self.browser.find_element_by_id("update_button").click()
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 portal.tests.pageObjects.portal.play.join_school_or_club_page import (
4
- JoinSchoolOrClubPage,
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.find_element_by_id("student_join_school_link").click()
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.find_element_by_id("id_access_code").send_keys(access_code)
12
- self.browser.find_element_by_id("request_join_a_school_or_club_button").click()
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.find_element_by_id("id_access_code").send_keys(access_code)
19
- self.browser.find_element_by_id("request_join_a_school_or_club_button").click()
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.find_element_by_name("revoke_join_request").click()
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.find_element_by_id("logout_button").click()
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.find_element_by_id("student_edit_account_button").click()
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.find_element_by_id("logout_menu").click()
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.find_element_by_id(
24
- "id_teacher_signup-teacher_first_name"
25
- ).send_keys(first_name)
26
- self.browser.find_element_by_id(
27
- "id_teacher_signup-teacher_last_name"
28
- ).send_keys(last_name)
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.find_element_by_id(
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.find_element_by_name("teacher_signup").click()
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
- name,
56
- username,
57
- email_address,
58
- password,
59
- confirm_password,
60
- success=True,
61
- newsletter=False,
62
- is_over_required_age=True,
63
- ):
64
- self.browser.find_element_by_id("id_independent_student_signup-name").send_keys(
65
- name
66
- )
67
- self.browser.find_element_by_id(
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.find_element_by_name("independent_student_signup").click()
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 .base_page import BasePage
1
+ from selenium.webdriver.common.by import By
2
+
2
3
  from . import student_login_page
3
- import time
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.find_element_by_id("id_access_code").send_keys(access_code)
23
- self.browser.find_element_by_name("school_login_class_code").click()
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.find_element_by_id("id_username").send_keys(name)
22
- self.browser.find_element_by_id("id_password").send_keys(password)
23
- self.browser.find_element_by_name("school_login").click()
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.find_element_by_id("id_name").clear()
17
- self.browser.find_element_by_id("id_name").send_keys(name)
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.find_element_by_id("save_student_name_button").click()
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.find_element_by_id("return_button").click()
14
+ self.browser.find_element(By.ID, "return_button").click()
13
15
 
14
16
  return TeachClassPage(self.browser)