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
@@ -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.find_element_by_id("id_names").send_keys(name + "\n")
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._click_create_students()
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 _click_create_students(self):
22
- self.browser.find_element_by_name("new_students").click()
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.find_element_by_id("student_table").text
44
+ return name in self.browser.find_element(By.ID, "student_table").text
26
45
 
27
46
  def delete_students(self):
28
- self.browser.find_element_by_id("deleteSelectedStudents").click()
47
+ self.browser.find_element(By.ID, "deleteSelectedStudents").click()
29
48
  return self
30
49
 
31
50
  def reset_passwords(self):
32
- self.browser.find_element_by_id("resetSelectedStudents").click()
51
+ self.browser.find_element(By.ID, "resetSelectedStudents").click()
33
52
  return self
34
53
 
35
54
  def move_students(self):
36
- self.browser.find_element_by_id("moveSelectedStudents").click()
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.find_element_by_id("moveSelectedStudents").click()
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.find_element_by_id("dismissSelectedStudents").click()
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.find_element_by_id("student_checkbox").click()
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.find_element_by_id("edit_student_button").click()
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.find_element_by_id("return_to_classes_button").click()
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 time
3
+ from selenium.webdriver.common.by import By
4
+ from selenium.webdriver.support.ui import Select
4
5
 
5
- from .add_independent_student_to_class_page import AddIndependentStudentToClassPage
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.find_element_by_id("class_button").click()
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.find_element_by_id("tab-school").click()
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.find_element_by_id("tab-classes").click()
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.find_element_by_id("tab-account").click()
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.find_element_by_id("id_" + field).clear()
51
- 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)
52
51
 
53
- self.browser.find_element_by_id("update_details_button").click()
52
+ self.browser.find_element(By.ID, "update_details_button").click()
54
53
  return self
55
54
 
56
- def has_edit_failed(self):
57
- self.wait_for_element_by_id("edit_form")
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.find_element_by_id("id_classmate_progress").click()
58
+ self.browser.find_element(By.ID, "id_classmate_progress").click()
72
59
 
73
- self.browser.find_element_by_id("create_class_button").click()
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.find_element_by_id("id_" + field).clear()
114
- self.browser.find_element_by_id("id_" + field).send_keys(value)
115
- self.browser.find_element_by_id("update_button").click()
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.find_element_by_id("allow_independent_button").click()
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.find_element_by_id("deny_independent_button").click()
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.find_element_by_id("independent_request_table").text
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.find_element_by_id("info-popup").text.startswith(
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.find_element_by_id("teachers_table").text
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.find_element_by_id("teachers_table").text
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.find_element_by_id("teachers_table").text
137
+ return "Revoke admin" in self.browser.find_element(By.ID, "teachers_table").text
179
138
 
180
- def have_classes(self):
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.have_classes()
189
- and (name in self.browser.find_element_by_id("classes-table").text)
190
- and (access_code in self.browser.find_element_by_id("classes-table").text)
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.find_element_by_id("teachers_table").text
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.find_element_by_id("kick_button").click()
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.find_element_by_id("make_admin_button").click()
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.find_element_by_id("make_non_admin_button").click()
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.find_element_by_id("leave_organisation_button").click()
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.find_element_by_id("id_form-0-email").send_keys(email)
15
- self.browser.find_element_by_id("id_form-0-confirm_email").send_keys(email)
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.find_element_by_id("cancel_button").click()
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.find_element_by_id("dismiss_button").click()
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.find_element_by_id("id_name").clear()
15
- 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)
16
18
  return self
17
19
 
18
20
  def type_student_password(self, password):
19
- self.browser.find_element_by_id("id_password").send_keys(password)
20
- self.browser.find_element_by_id("id_confirm_password").send_keys(password)
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.find_element_by_id("update_name_button").click()
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.find_element_by_id("update_name_button").click()
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.find_element_by_id("set_new_password_button").click()
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.find_element_by_id("student_details").text
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.find_element_by_id("id_new_teacher")).select_by_index(
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.find_element_by_id("cancel_button").click()
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.find_element_by_id("move_button").click()
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.find_element_by_id("move_classes_button").click()
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.find_element_by_id("move_classes_button").click()
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.find_element_by_id("cancel_button").click()
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.find_element_by_id("move_button").click()
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.find_element_by_id("id_new_class")).select_by_index(
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.find_element_by_id("cancel_button").click()
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.find_element_by_id("move_button").click()
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.find_element_by_id("id_class_name").send_keys(name)
16
+ self.browser.find_element(By.ID, "id_class_name").send_keys(name)
15
17
  if classmate_progress:
16
- self.browser.find_element_by_id("id_classmate_progress").click()
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.find_element_by_id("create_class_button").click()
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 time
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, password, postcode, country="GB"):
19
- self._create_organisation(name, password, postcode, country)
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, password, postcode, country="GB"):
24
- self._create_organisation(name, password, postcode, country)
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 join_empty_organisation(self):
34
- self.browser.find_element_by_id("join-button").click()
35
- self._click_join_school_button()
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.find_element_by_name("create_organisation").click()
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.find_element_by_id("form-create-organisation")
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 = "Please enter a valid postcode or ZIP code"
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