codeforlife-portal 1.0.0.post.dev99__tar.gz → 1.0.0.post.dev101__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (300) hide show
  1. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/PKG-INFO +1 -1
  2. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/codeforlife_portal.egg-info/PKG-INFO +1 -1
  3. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/codeforlife_portal.egg-info/SOURCES.txt +1 -1
  4. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/_version.py +2 -2
  5. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/helpers/email.py +44 -17
  6. codeforlife-portal-1.0.0.post.dev101/portal/migrations/0049_refactor_emailverifications.py +58 -0
  7. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/models.py +6 -3
  8. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/test_independent_student.py +2 -5
  9. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/test_teacher.py +5 -4
  10. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/utils/teacher.py +6 -3
  11. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/views/admin.py +161 -56
  12. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/views/email.py +13 -12
  13. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/views/home.py +14 -14
  14. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/views/teacher/teach.py +103 -73
  15. codeforlife-portal-1.0.0.post.dev99/portal/tests/test_migration_country.py +0 -130
  16. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/MANIFEST.in +0 -0
  17. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/README.md +0 -0
  18. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/codeforlife_portal.egg-info/dependency_links.txt +0 -0
  19. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/codeforlife_portal.egg-info/not-zip-safe +0 -0
  20. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/codeforlife_portal.egg-info/requires.txt +0 -0
  21. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/codeforlife_portal.egg-info/top_level.txt +0 -0
  22. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/deploy/__init__.py +0 -0
  23. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/deploy/captcha.py +0 -0
  24. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/deploy/mail.py +0 -0
  25. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/deploy/middleware/__init__.py +0 -0
  26. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/deploy/middleware/basicauth.py +0 -0
  27. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/deploy/middleware/exceptionlogging.py +0 -0
  28. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/deploy/permissions.py +0 -0
  29. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/deploy/static/apple-touch-icon-120x120.png +0 -0
  30. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/deploy/static/apple-touch-icon-152x152.png +0 -0
  31. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/deploy/static/apple-touch-icon-180x180.png +0 -0
  32. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/deploy/static/apple-touch-icon-76x76.png +0 -0
  33. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/deploy/static/apple-touch-icon.png +0 -0
  34. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/deploy/static/robots.txt +0 -0
  35. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/deploy/templates/deploy/csrf_failure.html +0 -0
  36. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/deploy/views.py +0 -0
  37. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/__init__.py +0 -0
  38. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/admin.py +0 -0
  39. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/app_settings.py +0 -0
  40. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/autoconfig.py +0 -0
  41. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/beta.py +0 -0
  42. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/emailMessages.py +0 -0
  43. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/forms/__init__.py +0 -0
  44. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/forms/admin_login.py +0 -0
  45. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/forms/auth_forms.py +0 -0
  46. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/forms/home.py +0 -0
  47. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/forms/organisation.py +0 -0
  48. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/forms/play.py +0 -0
  49. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/forms/registration.py +0 -0
  50. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/forms/teach.py +0 -0
  51. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/handlers.py +0 -0
  52. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/helpers/__init__.py +0 -0
  53. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/helpers/generators.py +0 -0
  54. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/helpers/location.py +0 -0
  55. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/helpers/password.py +0 -0
  56. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/middleware/__init__.py +0 -0
  57. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/middleware/ratelimit_login_attempts.py +0 -0
  58. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/migrations/0001_squashed_0041_new_news.py +0 -0
  59. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/migrations/0042_school_country.py +0 -0
  60. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/migrations/0043_auto_20150430_0952.py +0 -0
  61. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/migrations/0044_auto_20150430_0959.py +0 -0
  62. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/migrations/0045_auto_20150430_1446.py +0 -0
  63. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/migrations/0046_auto_20150723_1101.py +0 -0
  64. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/migrations/0047_remove_userprofile_avatar.py +0 -0
  65. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/migrations/0048_plural_management_frontnews.py +0 -0
  66. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/migrations/__init__.py +0 -0
  67. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/permissions.py +0 -0
  68. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/email_media/cfl_logo_blue_rounded.png +0 -0
  69. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/email_media/cfllogo.png +0 -0
  70. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/colorbox.css +0 -0
  71. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/common.css +0 -0
  72. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/images/animated-overlay.gif +0 -0
  73. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  74. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  75. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/images/ui-bg_flat_10_000000_40x100.png +0 -0
  76. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  77. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  78. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  79. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  80. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  81. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  82. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/images/ui-icons_222222_256x240.png +0 -0
  83. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/images/ui-icons_228ef1_256x240.png +0 -0
  84. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/images/ui-icons_ef8c08_256x240.png +0 -0
  85. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/images/ui-icons_ffd27a_256x240.png +0 -0
  86. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/images/ui-icons_ffffff_256x240.png +0 -0
  87. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/jquery-ui.css +0 -0
  88. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/jquery-ui.structure.css +0 -0
  89. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/jquery-ui.theme.css +0 -0
  90. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/list.css +0 -0
  91. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/noJS.css +0 -0
  92. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/reset.css +0 -0
  93. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/styles.css +0 -0
  94. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/css/tables.css +0 -0
  95. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/2fa_authenticator_link.png +0 -0
  96. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/RR_logo_blank.png +0 -0
  97. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/RRlogo_on_green.png +0 -0
  98. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/RRlogo_on_green_small.png +0 -0
  99. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/RRlogo_on_less_green.png +0 -0
  100. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/RRlogo_on_less_green_small.png +0 -0
  101. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/cfl_logo_blue.png +0 -0
  102. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/cfl_logo_blue_rounded.png +0 -0
  103. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/codeForLife_logo.svg +0 -0
  104. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/colorboxImages/border.png +0 -0
  105. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/colorboxImages/controls.png +0 -0
  106. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/colorboxImages/loading.gif +0 -0
  107. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/colorboxImages/loading_background.png +0 -0
  108. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/colorboxImages/overlay.png +0 -0
  109. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/dee_hi_res.png +0 -0
  110. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/dee_large.png +0 -0
  111. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/dee_red_box.png +0 -0
  112. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/favicon.ico +0 -0
  113. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/kirsty.png +0 -0
  114. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/kirsty_hi_res.png +0 -0
  115. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/kirsty_large.png +0 -0
  116. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/logged_in_blob.png +0 -0
  117. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/logged_out_blob.png +0 -0
  118. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/logo_white.png +0 -0
  119. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/movie_file.png +0 -0
  120. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/nigel.png +0 -0
  121. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/nigel_hi_res.png +0 -0
  122. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/nigel_large.png +0 -0
  123. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/padlock.png +0 -0
  124. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/pdfsmall.png +0 -0
  125. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/phil.png +0 -0
  126. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/phil_hi_res.png +0 -0
  127. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/phil_large.png +0 -0
  128. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/qr_code_scan.png +0 -0
  129. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/rrBG.jpg +0 -0
  130. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/rrBGIE.jpg +0 -0
  131. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/rrBGsmall.jpg +0 -0
  132. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/video_still.png +0 -0
  133. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/wes.png +0 -0
  134. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/wes_hi_res.png +0 -0
  135. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/wes_large.png +0 -0
  136. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/img/zip.png +0 -0
  137. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/js/common.js +0 -0
  138. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/js/deleteWorkspaces.js +0 -0
  139. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/js/fuzzySchoolLookup.js +0 -0
  140. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/js/jquery.placeholder.js +0 -0
  141. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/js/lib/jquery-ui.js +0 -0
  142. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/js/lib/jquery-video-lightning.js +0 -0
  143. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/js/lib/jquery.colorbox.js +0 -0
  144. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/js/lib/jquery.easy-ticker.js +0 -0
  145. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/js/lib/jquery.js +0 -0
  146. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/js/lib/magnific.js +0 -0
  147. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/js/lib/modernizr.custom.79639.js +0 -0
  148. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/js/organisation_manage.js +0 -0
  149. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/js/passwordStrength.js +0 -0
  150. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/js/play.js +0 -0
  151. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/static/portal/js/teach_class.js +0 -0
  152. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/403.html +0 -0
  153. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/404.html +0 -0
  154. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/500.html +0 -0
  155. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/email.html +0 -0
  156. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/email.txt +0 -0
  157. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/2FA_redirect.html +0 -0
  158. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/about.html +0 -0
  159. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/admin/aggregated_data.html +0 -0
  160. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/admin/map.html +0 -0
  161. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/base.html +0 -0
  162. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/base_no_userprofile.html +0 -0
  163. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/contact.html +0 -0
  164. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/email_verification_failed.html +0 -0
  165. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/email_verification_needed.html +0 -0
  166. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/help-and-support.html +0 -0
  167. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/home.html +0 -0
  168. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/locked_out.html +0 -0
  169. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/mouseflow.html +0 -0
  170. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/play/base.html +0 -0
  171. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/play/student_details.html +0 -0
  172. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/play/student_edit_account.html +0 -0
  173. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/play/student_join_organisation.html +0 -0
  174. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/play.html +0 -0
  175. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/base.html +0 -0
  176. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/organisation_create.html +0 -0
  177. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/organisation_manage.html +0 -0
  178. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/teacher_add_external_student.html +0 -0
  179. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/teacher_added_external_student.html +0 -0
  180. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/teacher_class.html +0 -0
  181. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/teacher_classes.html +0 -0
  182. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/teacher_dismiss_students.html +0 -0
  183. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/teacher_edit_account.html +0 -0
  184. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/teacher_edit_class.html +0 -0
  185. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/teacher_edit_student.html +0 -0
  186. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/teacher_home.html +0 -0
  187. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/teacher_lesson_plans.html +0 -0
  188. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/teacher_lesson_plans_python.html +0 -0
  189. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/teacher_move_all_classes.html +0 -0
  190. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/teacher_move_class.html +0 -0
  191. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/teacher_move_students.html +0 -0
  192. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/teacher_move_students_to_class.html +0 -0
  193. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/teacher_new_students.html +0 -0
  194. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/teacher_student_reset.html +0 -0
  195. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach/teacher_students_reset.html +0 -0
  196. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/teach.html +0 -0
  197. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/portal/terms.html +0 -0
  198. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/registration/login.html +0 -0
  199. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/registration/password_reset_complete.html +0 -0
  200. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/registration/password_reset_confirm.html +0 -0
  201. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/registration/password_reset_done.html +0 -0
  202. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/registration/password_reset_email.html +0 -0
  203. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/registration/student_password_reset_form.html +0 -0
  204. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/registration/teacher_password_reset_form.html +0 -0
  205. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/two_factor/_base.html +0 -0
  206. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/two_factor/core/setup_complete.html +0 -0
  207. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templates/two_factor/profile/profile.html +0 -0
  208. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templatetags/__init__.py +0 -0
  209. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templatetags/app_tags.py +0 -0
  210. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/templatetags/table_tags.py +0 -0
  211. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/__init__.py +0 -0
  212. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/base_test.py +0 -0
  213. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/base_test_migration.py +0 -0
  214. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/__init__.py +0 -0
  215. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/__init__.py +0 -0
  216. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/about_page.py +0 -0
  217. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/admin/__init__.py +0 -0
  218. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/admin/admin_base_page.py +0 -0
  219. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/admin/admin_data_page.py +0 -0
  220. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/admin/admin_login_page.py +0 -0
  221. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/admin/admin_map_page.py +0 -0
  222. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/base_page.py +0 -0
  223. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/contact_page.py +0 -0
  224. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/email_verification_needed_page.py +0 -0
  225. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/forbidden_page.py +0 -0
  226. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/game_page.py +0 -0
  227. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/help_and_support_page.py +0 -0
  228. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/home_page.py +0 -0
  229. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/play/__init__.py +0 -0
  230. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/play/account_page.py +0 -0
  231. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/play/dashboard_page.py +0 -0
  232. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/play/join_school_or_club_page.py +0 -0
  233. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/play/play_base_page.py +0 -0
  234. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/play_page.py +0 -0
  235. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/teach/__init__.py +0 -0
  236. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/teach/account_page.py +0 -0
  237. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/teach/add_independent_student_to_class_page.py +0 -0
  238. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/teach/added_independent_student_to_class_page.py +0 -0
  239. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/teach/class_page.py +0 -0
  240. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/teach/class_settings_page.py +0 -0
  241. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/teach/classes_page.py +0 -0
  242. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/teach/dashboard_page.py +0 -0
  243. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/teach/dismiss_students_page.py +0 -0
  244. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/teach/move_class_page.py +0 -0
  245. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/teach/move_students_disambiguate_page.py +0 -0
  246. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/teach/move_students_page.py +0 -0
  247. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/teach/new_students_page.py +0 -0
  248. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/teach/organisation_create_page.py +0 -0
  249. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/teach/organisation_manage_page.py +0 -0
  250. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/teach/organisation_revoke_page.py +0 -0
  251. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/teach/teach_base_page.py +0 -0
  252. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/teach/thanks_for_reset_page.py +0 -0
  253. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/teach_page.py +0 -0
  254. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/portal/terms_page.py +0 -0
  255. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/registration/__init__.py +0 -0
  256. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/registration/independent_student_login_form_page.py +0 -0
  257. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/registration/password_reset_form_page.py +0 -0
  258. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/registration/student_password_reset_form_page.py +0 -0
  259. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/pageObjects/registration/teacher_password_reset_form_page.py +0 -0
  260. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/test_admin.py +0 -0
  261. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/test_class.py +0 -0
  262. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/test_emails.py +0 -0
  263. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/test_independent_student_joins_a_class.py +0 -0
  264. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/test_location.py +0 -0
  265. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/test_navigation.py +0 -0
  266. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/test_organisation.py +0 -0
  267. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/test_school_student.py +0 -0
  268. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/test_security.py +0 -0
  269. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/test_teacher_student.py +0 -0
  270. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/utils/__init__.py +0 -0
  271. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/utils/classes.py +0 -0
  272. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/utils/email.py +0 -0
  273. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/utils/messages.py +0 -0
  274. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/utils/organisation.py +0 -0
  275. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/tests/utils/student.py +0 -0
  276. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/urls.py +0 -0
  277. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/utils.py +0 -0
  278. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/views/__init__.py +0 -0
  279. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/views/organisation.py +0 -0
  280. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/views/play.py +0 -0
  281. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/views/registration.py +0 -0
  282. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/views/teacher/__init__.py +0 -0
  283. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/views/teacher/home.py +0 -0
  284. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/portal/wsgi.py +0 -0
  285. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/ratelimit/__init__.py +0 -0
  286. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/ratelimit/backends/__init__.py +0 -0
  287. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/ratelimit/backends/cache.py +0 -0
  288. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/ratelimit/decorators.py +0 -0
  289. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/reports/__init__.py +0 -0
  290. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/reports/admin.py +0 -0
  291. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/reports/migrations/0001_initial.py +0 -0
  292. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/reports/migrations/0002_hitsperlevelperday.py +0 -0
  293. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/reports/migrations/__init__.py +0 -0
  294. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/reports/models.py +0 -0
  295. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/reports/tests.py +0 -0
  296. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/reports/urls.py +0 -0
  297. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/reports/views.py +0 -0
  298. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/setup.cfg +0 -0
  299. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/setup.py +0 -0
  300. {codeforlife-portal-1.0.0.post.dev99 → codeforlife-portal-1.0.0.post.dev101}/versioneer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 1.0
2
2
  Name: codeforlife-portal
3
- Version: 1.0.0.post.dev99
3
+ Version: 1.0.0.post.dev101
4
4
  Summary: UNKNOWN
5
5
  Home-page: UNKNOWN
6
6
  Author: UNKNOWN
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 1.0
2
2
  Name: codeforlife-portal
3
- Version: 1.0.0.post0.dev99
3
+ Version: 1.0.0.post0.dev101
4
4
  Summary: UNKNOWN
5
5
  Home-page: UNKNOWN
6
6
  Author: UNKNOWN
@@ -60,6 +60,7 @@ portal/migrations/0045_auto_20150430_1446.py
60
60
  portal/migrations/0046_auto_20150723_1101.py
61
61
  portal/migrations/0047_remove_userprofile_avatar.py
62
62
  portal/migrations/0048_plural_management_frontnews.py
63
+ portal/migrations/0049_refactor_emailverifications.py
63
64
  portal/migrations/__init__.py
64
65
  portal/static/email_media/cfl_logo_blue_rounded.png
65
66
  portal/static/email_media/cfllogo.png
@@ -213,7 +214,6 @@ portal/tests/test_emails.py
213
214
  portal/tests/test_independent_student.py
214
215
  portal/tests/test_independent_student_joins_a_class.py
215
216
  portal/tests/test_location.py
216
- portal/tests/test_migration_country.py
217
217
  portal/tests/test_navigation.py
218
218
  portal/tests/test_organisation.py
219
219
  portal/tests/test_school_student.py
@@ -11,8 +11,8 @@ version_json = '''
11
11
  {
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "0e0e11a4fb459e32dff0fa6b14e8c9a2a2374a5a",
15
- "version": "1.0.0.post.dev99"
14
+ "full-revisionid": "3cbd62f08b1654d196c2bde3e2b7025696047ce7",
15
+ "version": "1.0.0.post.dev101"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -43,7 +43,10 @@ from django.core.mail import EmailMultiAlternatives
43
43
  from django.template import Context, loader
44
44
 
45
45
  from portal.models import EmailVerification
46
- from portal import app_settings, emailMessages
46
+ from portal import app_settings
47
+ from portal.emailMessages import emailVerificationNeededEmail
48
+ from portal.emailMessages import emailChangeNotificationEmail
49
+ from portal.emailMessages import emailChangeVerificationEmail
47
50
 
48
51
  NOTIFICATION_EMAIL = 'Code For Life Notification <' + app_settings.EMAIL_ADDRESS + '>'
49
52
  VERIFICATION_EMAIL = 'Code For Life Verification <' + app_settings.EMAIL_ADDRESS + '>'
@@ -86,24 +89,48 @@ def send_email(sender, recipients, subject, text_content, html_content=None,
86
89
  message.send()
87
90
 
88
91
 
89
- def send_verification_email(request, userProfile, new_email=None):
90
- verification = EmailVerification.objects.create(
91
- user=userProfile,
92
- email=new_email,
92
+ def generate_token(user, email="", preverified=False):
93
+ return EmailVerification.objects.create(
94
+ user=user.userprofile,
95
+ new_user=user,
96
+ email=email,
93
97
  token=uuid4().hex[:30],
94
- expiry=timezone.now() + timedelta(hours=1))
98
+ expiry=timezone.now() + timedelta(hours=1),
99
+ verified=preverified
100
+ )
95
101
 
96
- if new_email:
97
- emailMessage = emailMessages.emailChangeVerificationEmail(request, verification.token)
98
- send_email(VERIFICATION_EMAIL, [new_email], emailMessage['subject'],
99
- emailMessage['message'])
100
102
 
101
- emailMessage = emailMessages.emailChangeNotificationEmail(request, new_email)
102
- send_email(VERIFICATION_EMAIL, [userProfile.user.email], emailMessage['subject'],
103
- emailMessage['message'])
103
+ def send_verification_email(request, user, new_email=None):
104
+ """Send an email prompting the user to verify their email address."""
104
105
 
105
- else:
106
- emailMessage = emailMessages.emailVerificationNeededEmail(request, verification.token)
106
+ if not new_email: # verifying first email address
107
+ user.email_verifications_old.all().delete()
107
108
 
108
- send_email(VERIFICATION_EMAIL, [userProfile.user.email], emailMessage['subject'],
109
- emailMessage['message'])
109
+ verification = generate_token(user)
110
+
111
+ message = emailVerificationNeededEmail(request, verification.token)
112
+ send_email(VERIFICATION_EMAIL,
113
+ [user.email],
114
+ message['subject'],
115
+ message['message'])
116
+
117
+ else: # verifying change of email address.
118
+ verification = generate_token(user, new_email)
119
+
120
+ message = emailChangeVerificationEmail(request, verification.token)
121
+ send_email(VERIFICATION_EMAIL,
122
+ [new_email],
123
+ message['subject'],
124
+ message['message'])
125
+
126
+ message = emailChangeNotificationEmail(request, new_email)
127
+ send_email(VERIFICATION_EMAIL,
128
+ [user.email],
129
+ message['subject'],
130
+ message['message'])
131
+
132
+
133
+ def is_verified(user):
134
+ """Check that a user has verified their email address."""
135
+ verifications = user.email_verifications_old.filter(verified=True)
136
+ return len(verifications) != 0
@@ -0,0 +1,58 @@
1
+ # -*- coding: utf-8 -*-
2
+ from __future__ import unicode_literals
3
+
4
+ from django.db import models, migrations
5
+ from django.conf import settings
6
+
7
+
8
+ def copy_users(apps, schema_editor):
9
+ model = apps.get_model('portal', 'EmailVerification')
10
+ for ev in model.objects.all():
11
+ if ev.user is not None:
12
+ ev.new_user = ev.user.user
13
+ ev.save()
14
+ if ev.used is not None:
15
+ ev.verified = ev.used
16
+ ev.save()
17
+
18
+
19
+ def restore_users(apps, schema_editor):
20
+ model = apps.get_model('portal', 'EmailVerification')
21
+ for ev in model.objects.all():
22
+ if ev.new_user is not None:
23
+ ev.user = ev.new_user.userprofile
24
+ ev.save()
25
+ if ev.verified is not None:
26
+ ev.used = ev.verified
27
+ ev.save()
28
+
29
+
30
+ class Migration(migrations.Migration):
31
+
32
+ dependencies = [
33
+ ('portal', '0048_plural_management_frontnews'),
34
+ ]
35
+
36
+ operations = [
37
+ migrations.AddField(
38
+ model_name='emailverification',
39
+ name='new_user',
40
+ field=models.ForeignKey(
41
+ to=settings.AUTH_USER_MODEL,
42
+ related_name='email_verifications_old',
43
+ null=True,
44
+ blank=True
45
+ )
46
+ ),
47
+ migrations.AddField(
48
+ model_name='emailverification',
49
+ name='verified',
50
+ field=models.BooleanField(
51
+ default=False
52
+ )
53
+ ),
54
+ migrations.RunPython(
55
+ code=copy_users,
56
+ reverse_code=restore_users
57
+ ),
58
+ ]
@@ -50,10 +50,11 @@ from online_status.status import CACHE_USERS
50
50
 
51
51
  class UserProfile(models.Model):
52
52
  user = models.OneToOneField(User)
53
- awaiting_email_verification = models.BooleanField(default=False)
54
53
  can_view_aggregated_data = models.BooleanField(default=False)
55
54
  developer = models.BooleanField(default=False)
56
55
 
56
+ awaiting_email_verification = models.BooleanField(default=False)
57
+
57
58
  def __unicode__(self):
58
59
  return self.user.username
59
60
 
@@ -91,7 +92,7 @@ class TeacherModelManager(models.Manager):
91
92
  first_name=first_name,
92
93
  last_name=last_name)
93
94
 
94
- userProfile = UserProfile.objects.create(user=user, awaiting_email_verification=True)
95
+ userProfile = UserProfile.objects.create(user=user)
95
96
 
96
97
  return Teacher.objects.create(user=userProfile, title=title)
97
98
 
@@ -159,7 +160,7 @@ class StudentModelManager(models.Manager):
159
160
  password=password,
160
161
  first_name=name)
161
162
 
162
- userProfile = UserProfile.objects.create(user=user, awaiting_email_verification=True)
163
+ userProfile = UserProfile.objects.create(user=user)
163
164
 
164
165
  return Student.objects.create(user=userProfile)
165
166
 
@@ -193,10 +194,12 @@ class Guardian(models.Model):
193
194
 
194
195
  class EmailVerification(models.Model):
195
196
  user = models.ForeignKey(UserProfile, related_name='email_verifications')
197
+ new_user = models.ForeignKey(User, related_name='email_verifications_old', null=True, blank=True)
196
198
  token = models.CharField(max_length=30)
197
199
  email = models.CharField(max_length=200, null=True, default=None, blank=True)
198
200
  expiry = models.DateTimeField()
199
201
  used = models.BooleanField(default=False)
202
+ verified = models.BooleanField(default=False)
200
203
 
201
204
 
202
205
  class FrontPageNews(models.Model):
@@ -37,16 +37,14 @@
37
37
  import re
38
38
 
39
39
  from django.core import mail
40
-
40
+ from django_selenium_clean import selenium
41
41
  from selenium.webdriver.support.wait import WebDriverWait
42
42
 
43
43
  from base_test import BaseTest
44
- from utils.student import create_independent_student
45
- from utils.student import submit_independent_student_signup_form
44
+ from utils.student import create_independent_student, submit_independent_student_signup_form
46
45
  from utils.messages import is_email_verified_message_showing
47
46
  from utils import email as email_utils
48
47
 
49
- from django_selenium_clean import selenium
50
48
 
51
49
  class TestIndependentStudent(BaseTest):
52
50
  def test_signup(self):
@@ -79,7 +77,6 @@ class TestIndependentStudent(BaseTest):
79
77
  })
80
78
 
81
79
  def test_reset_password(self):
82
-
83
80
  homepage = self.go_to_homepage()
84
81
 
85
82
  username = create_independent_student(homepage)[2]
@@ -34,17 +34,18 @@
34
34
  # copyright notice and these terms. You must not misrepresent the origins of this
35
35
  # program; modified versions of the program must be marked as such and not
36
36
  # identified as the original program.
37
- from django.core import mail
38
37
  import re
39
38
 
40
- from base_test import BaseTest
41
- from portal.tests.pageObjects.portal.home_page import HomePage
39
+ from django.core import mail
40
+ from django_selenium_clean import selenium
42
41
  from selenium.webdriver.support.wait import WebDriverWait
42
+
43
+ from base_test import BaseTest
44
+ from pageObjects.portal.home_page import HomePage
43
45
  from utils.teacher import signup_teacher, signup_teacher_directly
44
46
  from utils.messages import is_email_verified_message_showing, is_teacher_details_updated_message_showing, is_teacher_email_updated_message_showing
45
47
  from utils import email as email_utils
46
48
 
47
- from django_selenium_clean import selenium
48
49
 
49
50
  class TestTeacher(BaseTest):
50
51
  def test_signup(self):
@@ -39,6 +39,8 @@ from django.core import mail
39
39
  import sys
40
40
 
41
41
  from portal.models import Teacher
42
+ from portal.helpers.email import generate_token
43
+
42
44
 
43
45
  def generate_details(**kwargs):
44
46
  title = kwargs.get('title','Mr')
@@ -53,16 +55,17 @@ def generate_details(**kwargs):
53
55
  def signup_teacher_directly(**kwargs):
54
56
  title, first_name, last_name, email_address, password = generate_details(**kwargs)
55
57
  teacher = Teacher.objects.factory(title, first_name, last_name, email_address, password)
56
- teacher.user.awaiting_email_verification = False
58
+ generate_token(teacher.user.user, preverified=True)
57
59
  teacher.user.save()
58
60
  return email_address, password
59
61
 
62
+
60
63
  def signup_teacher(page):
61
64
  page = page.go_to_teach_page()
62
65
 
63
66
  title, first_name, last_name, email_address, password = generate_details()
64
67
  page = page.signup(title, first_name, last_name, email_address, password, password)
65
-
68
+
66
69
  page = page.return_to_home_page()
67
70
 
68
71
  page = email.follow_verify_email_link_to_teach(page, mail.outbox[0])
@@ -70,4 +73,4 @@ def signup_teacher(page):
70
73
 
71
74
  return page, email_address, password
72
75
 
73
- import email
76
+ import email