codeforlife-portal 8.6.3__py2.py3-none-any.whl → 8.6.5__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.

Potentially problematic release.


This version of codeforlife-portal might be problematic. Click here for more details.

@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codeforlife-portal
3
- Version: 8.6.3
3
+ Version: 8.6.5
4
4
  Classifier: Programming Language :: Python
5
5
  Classifier: Programming Language :: Python :: 3.12
6
6
  Classifier: Framework :: Django
@@ -8,7 +8,7 @@ Description-Content-Type: text/markdown
8
8
  License-File: LICENSE.md
9
9
  Requires-Dist: asgiref==3.8.1; python_version >= "3.8"
10
10
  Requires-Dist: certifi==2025.1.31; python_version >= "3.6"
11
- Requires-Dist: cfl-common==8.6.3
11
+ Requires-Dist: cfl-common==8.6.5
12
12
  Requires-Dist: chardet==5.2.0; python_version >= "3.7"
13
13
  Requires-Dist: charset-normalizer==3.4.1; python_version >= "3.7"
14
14
  Requires-Dist: diff-match-patch==20241021; python_version >= "3.7"
@@ -60,7 +60,7 @@ Requires-Dist: asttokens==3.0.0; python_version >= "3.8" and extra == "dev"
60
60
  Requires-Dist: attrs==25.3.0; python_version >= "3.8" and extra == "dev"
61
61
  Requires-Dist: black==25.1.0; python_version >= "3.9" and extra == "dev"
62
62
  Requires-Dist: certifi==2025.1.31; python_version >= "3.6" and extra == "dev"
63
- Requires-Dist: cfl-common==8.6.3; extra == "dev"
63
+ Requires-Dist: cfl-common==8.6.5; extra == "dev"
64
64
  Requires-Dist: charset-normalizer==3.4.1; python_version >= "3.7" and extra == "dev"
65
65
  Requires-Dist: click==8.1.8; python_version >= "3.7" and extra == "dev"
66
66
  Requires-Dist: coverage[toml]==7.8.0; python_version >= "3.9" and extra == "dev"
@@ -113,7 +113,7 @@ Requires-Dist: pypdf==5.1.0; python_version >= "3.8" and extra == "dev"
113
113
  Requires-Dist: pypng==0.20220715.0; extra == "dev"
114
114
  Requires-Dist: pysocks==1.7.1; extra == "dev"
115
115
  Requires-Dist: pytest==8.3.5; python_version >= "3.8" and extra == "dev"
116
- Requires-Dist: pytest-cov==6.1.0; python_version >= "3.9" and extra == "dev"
116
+ Requires-Dist: pytest-cov==6.1.1; python_version >= "3.9" and extra == "dev"
117
117
  Requires-Dist: pytest-django==4.8.0; python_version >= "3.8" and extra == "dev"
118
118
  Requires-Dist: pytest-mock==3.14.0; python_version >= "3.8" and extra == "dev"
119
119
  Requires-Dist: pytest-order==1.3.0; python_version >= "3.7" and extra == "dev"
@@ -122,7 +122,7 @@ Requires-Dist: python-dateutil==2.9.0.post0; (python_version >= "2.7" and python
122
122
  Requires-Dist: pytz==2025.2; extra == "dev"
123
123
  Requires-Dist: pyvirtualdisplay==3.0; extra == "dev"
124
124
  Requires-Dist: qrcode==7.4.2; python_version >= "3.7" and extra == "dev"
125
- Requires-Dist: rapid-router==7.5.0; extra == "dev"
125
+ Requires-Dist: rapid-router==7.5.2; extra == "dev"
126
126
  Requires-Dist: requests==2.32.3; python_version >= "3.8" and extra == "dev"
127
127
  Requires-Dist: responses==0.18.0; python_version >= "3.7" and extra == "dev"
128
128
  Requires-Dist: selenium==4.29.0; python_version >= "3.9" and extra == "dev"
@@ -87,7 +87,7 @@ cfl_common/common/tests/utils/organisation.py,sha256=vNgKFtU3VPcWRnZfh82yCS90PLA
87
87
  cfl_common/common/tests/utils/student.py,sha256=PLd980iSlxmMoB8J3C2pVjNC5xHdVxfAkJXzhv_dRhg,3814
88
88
  cfl_common/common/tests/utils/teacher.py,sha256=KQ_NAl4yQqiX_zwcULQjkovc29JPhnkLR5Nk3Ljzbpg,2661
89
89
  cfl_common/common/tests/utils/user.py,sha256=NvLzZLVP4jy5Hn1iztOYF_BTQ9WsbSmuWMEzGzhAsRU,919
90
- codeforlife_portal-8.6.3.dist-info/licenses/LICENSE.md,sha256=9AbRlCDqD2D1tPibimysFv3zg3AIc49-eyv9aEsyq9w,115
90
+ codeforlife_portal-8.6.5.dist-info/licenses/LICENSE.md,sha256=9AbRlCDqD2D1tPibimysFv3zg3AIc49-eyv9aEsyq9w,115
91
91
  deploy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
92
92
  deploy/captcha.py,sha256=MbOBuGnbT_SOIltSjP1XMOLrfo1DldCilaVAEim0vM4,23
93
93
  deploy/views.py,sha256=7mY2zNPkaBFrlWGByJHp2zFqHIHSMc0YArjE_sFWMMU,131
@@ -111,7 +111,7 @@ example_project/portal_test_settings.py,sha256=1eTweQoCt1okixE5eoEg-f9iX7idSLNdJ
111
111
  example_project/settings.py,sha256=YS-8YYtH8hZMUhZALA3eHJ1bdM2VJfpD1v3ItjBMGaQ,5936
112
112
  example_project/urls.py,sha256=FUTzHPlUS1O5kqMHjL5V4L552N2ln7uTDXcw9wjKUto,422
113
113
  example_project/wsgi.py,sha256=U1W6WzZxZaIdYZ5tks7w9fqp5WS5qvn2iThsVcskrWw,829
114
- portal/__init__.py,sha256=s9_fcsg-pm5UVMlpeSxXL1P0erPal9Usg7wno2WG5q4,22
114
+ portal/__init__.py,sha256=Hwt0_KnspQjRN_MrDldwtdXvtsUwNgjCvFcJFELW9mY,22
115
115
  portal/admin.py,sha256=RKJizTF6dPJKmGPZw7nZUM0X8jkiTjgyKhLQxtvHJ0I,6148
116
116
  portal/app_settings.py,sha256=DhWLQOwM0zVOXE3O5TNKbMM9K6agfLuCsHOdr1J7xEI,651
117
117
  portal/backends.py,sha256=2Dss6_WoQwPuDzJUF1yEaTQTNG4eUrD12ujJQ5cp5Tc,812
@@ -440,7 +440,7 @@ portal/templates/portal/about.html,sha256=_iD0GCP6q3-XuZ2LC-9O0KYY-mKL6c9qk3O-NR
440
440
  portal/templates/portal/base.html,sha256=lAY0DO-OpW-O81tqZxnEmGAnXiJomzj2xsi5L8hTEls,11644
441
441
  portal/templates/portal/base_no_userprofile.html,sha256=PlRufyYmUUGWBZ6CvbYhJWOMTqKqdcee4xnO5--AogA,447
442
442
  portal/templates/portal/coding_club.html,sha256=DhPSIhxxzo6w0v80jXKVo_fjZ_TKnv7_u5cQq0woW8Q,5324
443
- portal/templates/portal/contribute.html,sha256=UIC_N3Lun9wB_6jEra0wvlT9fDiiIeMby7_onXYo6k0,4176
443
+ portal/templates/portal/contribute.html,sha256=kJLQpha9uqJipiwJdEEZVk-VBOYzSBkNiuoXtIeo0Yc,4269
444
444
  portal/templates/portal/dotmailer_consent_form.html,sha256=UDdizPoKYZGybr6z9nzDV4WPhJPa-S3bIKywvVgFrxg,918
445
445
  portal/templates/portal/email_invitation_sent.html,sha256=hAMzQXE3NFGnOsQlCGuo3Aps-vazSJb5BhAN7bWT48M,641
446
446
  portal/templates/portal/email_style_template.html,sha256=lIlpiEC7-mO9tx3Ra9jtBjdXYxh5HKGZU8uqbvKdEbk,11893
@@ -454,7 +454,7 @@ portal/templates/portal/locked_out.html,sha256=JeiFHFyueFX03D54k82swjxvKY78cFG8V
454
454
  portal/templates/portal/locked_out_school_student.html,sha256=bcpLtu4mkHR-zILLuArtHH2OfUSjHiqntcdbTMlx5Kg,684
455
455
  portal/templates/portal/play.html,sha256=35dsR5jMavX5YvHZCwsoGdbCjEWJG-vPyqIeUAkgbLI,5724
456
456
  portal/templates/portal/privacy_notice.html,sha256=JexPB9Xgvlymv-TCzpWoViuZ2R-xalScCsueMW66-fA,49247
457
- portal/templates/portal/register.html,sha256=4RqUxRiQOvd-oHAM5x6U01zdlYRfy-h8NUGl8UIiBC0,12531
457
+ portal/templates/portal/register.html,sha256=Vf2L4VMPuNQWgK2CWYBgBEYDkfUJ5YjXMaDY0C-Fp-E,12465
458
458
  portal/templates/portal/reset_password.html,sha256=YzsREz5D2OwhicMLahVOVDXiNDxoHlPqU5iu96i36W0,1373
459
459
  portal/templates/portal/reset_password_confirm.html,sha256=jPHSDatezRXzCG4zH_5BQPWAxLblidqro0hzvsH54ho,3499
460
460
  portal/templates/portal/reset_password_done.html,sha256=rpzN3svZne5H2FS3TJaGnHypRj2KX-SRS6DbFQkgLf0,667
@@ -473,7 +473,7 @@ portal/templates/portal/partials/character_list.html,sha256=SnNFHzbIkOSaiRPIvSdp
473
473
  portal/templates/portal/partials/cookie_list.html,sha256=MrQ6lqae_X-LSxQjlLhZzKESt_cqJ2HJYsjKqTQ9W0A,6303
474
474
  portal/templates/portal/partials/delete_popup.html,sha256=nEhnwgnmKoFzb6LlCwdX973Em9bVOFh6MON36RPteYs,1275
475
475
  portal/templates/portal/partials/footer.html,sha256=IKEUmghaiiuQs5g9JfE97oNzjRTzBTu3SoFgJhRMyi8,5533
476
- portal/templates/portal/partials/header.html,sha256=xorEsPYzbmZGXHBOKm_6SHXQJxkCFKEWfMJbADG3k3I,20816
476
+ portal/templates/portal/partials/header.html,sha256=LJ8L_BV3DPAfpxAZlhH35MHNd5_bC3NhSVW2zAeonGU,20834
477
477
  portal/templates/portal/partials/headline.html,sha256=xKb-WtkT0FyQqT0smyNSKkXFvU7KQ5Czad8ca6YKQg4,89
478
478
  portal/templates/portal/partials/hero_card.html,sha256=UN5hyxrw-McuXFsDzPBIECB9yGrv9VjsFf8SEBowwXc,786
479
479
  portal/templates/portal/partials/info_popup.html,sha256=gzffd5MBVb7p2hGQuZMNDudThrRgs847hCu9ziT9uLE,566
@@ -609,11 +609,11 @@ portal/tests/utils/messages.py,sha256=tUGzJzhZwvzmO9H3CPxpWUfi2aXTpAWfkDQ2u2T3Lb
609
609
  portal/views/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
610
610
  portal/views/about.py,sha256=-muXy17UhxCSKkjnMAkSLXiCvT_pBPlf2ykTYr794dI,443
611
611
  portal/views/admin.py,sha256=4Xt3zEyQH7sUwQSrwuRtoCodWidjOzd7gJUwWU96pXY,957
612
- portal/views/api.py,sha256=mdWmFkV5mxmR-mvj6ttIe8uwW9tbcx9-5ykk5dpX0LI,7047
612
+ portal/views/api.py,sha256=ZCRApdZi2F6Pqo9p3V6cctzeeskxyrlFZn2AcHGpGdQ,6932
613
613
  portal/views/dotmailer.py,sha256=OH06IXuqqjhQbEie8g8y2ZY1oZvsCtNHhkQRLa-julg,2467
614
614
  portal/views/email.py,sha256=V3wXRxIjeZ4OJBVqGCQrPn-GQWKZK1PCXbR1f2Zpa_4,2174
615
615
  portal/views/google_analytics.py,sha256=cbNq9apCVpjoXCdovjrwo2jshWu5tUOItB-fTr-losw,769
616
- portal/views/home.py,sha256=8leK4ADxRg-gK-bm7D08CR44bhV3I8lt5pCV59HXMkk,9619
616
+ portal/views/home.py,sha256=puQesHCyV1jMXNjgflf_QhJl7hoV2Y4z9UlkGtEiqTo,9266
617
617
  portal/views/legal.py,sha256=USOEJy0Ry73cKReglKfMxgM3qWoKORUfVl_RkwPewQ4,342
618
618
  portal/views/organisation.py,sha256=sPDbiM7hdtpF8GKyh_4n4VPl2a-WnAgnF4q9aSvQCVI,3341
619
619
  portal/views/play_landing_page.py,sha256=FFmjUFub3ZdlbMqkB8yX3jAImCzqrUqgb8AZcpKywZ4,308
@@ -623,7 +623,7 @@ portal/views/cron/__init__.py,sha256=5rxXyhJmLOExRdrYZ1VJttTsyRIPRybzdftbUDwFByI
623
623
  portal/views/cron/user.py,sha256=iKM_FOcSQvrXtRSZUtxSiMFD3M869JP5jvEfRWHLpvM,10731
624
624
  portal/views/login/__init__.py,sha256=xSCtyFPSI87BRUybBgqa86ekFEolX5gUDbBSfBUMTyI,399
625
625
  portal/views/login/independent_student.py,sha256=3dFULhwMAlX4VDrJl-Znril6a9M5xKBSHO1eWvujfS0,2662
626
- portal/views/login/student.py,sha256=dt6cMfWepBJsVCRcADltfYSHVpyeP1WGLKSogMJ22E0,5539
626
+ portal/views/login/student.py,sha256=7UbJpjA4BsDY8bxGTFSdloNo50GbLiukaMr5rKvG6uo,5306
627
627
  portal/views/login/teacher.py,sha256=kRugP7TPbZIb_BmYMYxFeugxZy8UbCry_q0_jJDJ_Mw,1975
628
628
  portal/views/student/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
629
629
  portal/views/student/edit_account_details.py,sha256=Ba-3D_zzKbX5N01NG5qqBS0ud10B8D5SN8hOpLiGa9U,8468
@@ -635,7 +635,7 @@ portal/views/two_factor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG
635
635
  portal/views/two_factor/core.py,sha256=Lk32z2SN2Pg0rRkK-N-LXMvXC1kKKsH3l692kiSDQ4E,964
636
636
  portal/views/two_factor/form.py,sha256=lnHNKI-BMlpncTuW3zUzjPaJJNuEra2I_nOam0eOKFY,257
637
637
  portal/views/two_factor/profile.py,sha256=SHSg_xHccE5PtD-OfuOkYhREYz_er4bj5ro1RjJ88Yw,393
638
- codeforlife_portal-8.6.3.dist-info/METADATA,sha256=jooWCko0KcUo_u3IaV6KSZlvRUA_so9lAiEuO0u9kVA,12345
639
- codeforlife_portal-8.6.3.dist-info/WHEEL,sha256=MAQBAzGbXNI3bUmkDsiV_duv8i-gcdnLzw7cfUFwqhU,109
640
- codeforlife_portal-8.6.3.dist-info/top_level.txt,sha256=8e5pdsuIoTqEAMqpelHBjGjLbffcBtgOoggmd2q7nMw,41
641
- codeforlife_portal-8.6.3.dist-info/RECORD,,
638
+ codeforlife_portal-8.6.5.dist-info/METADATA,sha256=p-IAHP6zbem2GfuXxlfjVKJHSGPLlEegHasBuUwcLkk,12345
639
+ codeforlife_portal-8.6.5.dist-info/WHEEL,sha256=MAQBAzGbXNI3bUmkDsiV_duv8i-gcdnLzw7cfUFwqhU,109
640
+ codeforlife_portal-8.6.5.dist-info/top_level.txt,sha256=8e5pdsuIoTqEAMqpelHBjGjLbffcBtgOoggmd2q7nMw,41
641
+ codeforlife_portal-8.6.5.dist-info/RECORD,,
portal/__init__.py CHANGED
@@ -1 +1 @@
1
- __version__ = "8.6.3"
1
+ __version__ = "8.6.5"
@@ -38,9 +38,9 @@
38
38
  </div>
39
39
 
40
40
  <div class="background background--primary">
41
- <div class="row">
42
- <div class="container d-flex flex-row">
43
- <div class="col-sm-6">
41
+ <div class="container">
42
+ <div class="row d-flex flex-column-reverse flex-md-row">
43
+ <div class="col-12 col-md-6 order-1 order-md-0">
44
44
  <h4>Our products</h4>
45
45
 
46
46
  <p><b>The website</b></p>
@@ -61,9 +61,9 @@
61
61
  Python experience to a foundation in Python, helping
62
62
  prepare them for GCSE and beyond.</p>
63
63
  </div>
64
- <div class="col-sm-6">
64
+ <div class="col-12 col-md-6 order-0 order-md-1">
65
65
  <img title="Rapid Router" alt="Rapid Router"
66
- src="{% static 'portal/img/rapidrouter.png' %}">
66
+ src="{% static 'portal/img/rapidrouter.png' %}" class="img-fluid">
67
67
  </div>
68
68
  </div>
69
69
  </div>
@@ -147,7 +147,7 @@
147
147
  </div>
148
148
  {% else %}
149
149
  <div class="menu__right-side col-md-5">
150
- <a href="{% url 'register' %}" id="signup_button" class="button button--primary button--register register">Register</a>
150
+ <a href="{% url 'register' %}" id="signup_button" class="button button--primary button--register register">Register for FREE</a>
151
151
  <div class="dropdown">
152
152
  <button id="login_dropdown" class="button--regular button--secondary button--header--login button--dropdown"
153
153
  data-toggle="dropdown">
@@ -238,7 +238,7 @@
238
238
  {% endif %}
239
239
  {% else %}
240
240
  <a class="button button--menu__item button--register"
241
- href="{% url 'register' %}">Register now</a>
241
+ href="{% url 'register' %}">Register now for FREE</a>
242
242
  <button class="button--menu__item button--menu__item--sub-header login"
243
243
  data-toggle="collapse" data-target="#login-tabs">Log in</button>
244
244
  <div id="login-tabs" class="collapse">
@@ -9,11 +9,11 @@
9
9
  <div id="teacher-register-form" class="form-div form">
10
10
  <h4>Teacher/Tutor</h4>
11
11
  <div class="row form--row">
12
- <p class="semi-bold">Register below to create your school or club.</p>
12
+ <p class="semi-bold">Register below to create your free account.</p>
13
13
  <small class="semi-bold">You will have access to teaching resources, progress tracking and lesson plans
14
14
  for Rapid Router.</small>
15
15
  </div>
16
- <form class="d-flex flex-column"
16
+ <form class="d-flex flex-column"
17
17
  method="post"
18
18
  id="form-reg-teacher"
19
19
  autocomplete="off">
@@ -87,10 +87,7 @@
87
87
  <div id="independent-student-register-form" class="form-div">
88
88
  <h4>Independent learner</h4>
89
89
  <div class="row form--row">
90
- <p class="semi-bold">
91
- Register below if you are not part of a school or club and wish to set up a home
92
- learning account.
93
- </p>
90
+ <p class="semi-bold">Register below if you are not part of a school or club and wish to set up a free home learning account.</p>
94
91
  <small class="semi-bold">You will have access to learning resources for Rapid Router.</small>
95
92
  </div>
96
93
  <form id="form-signup-independent-student"
portal/views/api.py CHANGED
@@ -1,5 +1,4 @@
1
1
  import datetime
2
- import logging
3
2
  import uuid
4
3
 
5
4
  from common.models import Class, School, Student, Teacher, UserProfile
@@ -15,7 +14,6 @@ from rest_framework.reverse import reverse_lazy
15
14
 
16
15
  from portal.app_settings import IS_CLOUD_SCHEDULER_FUNCTION
17
16
 
18
- LOGGER = logging.getLogger(__name__)
19
17
  THREE_YEARS_IN_DAYS = 1095
20
18
 
21
19
 
@@ -199,7 +197,6 @@ class AnonymiseOrphanSchoolsView(generics.ListAPIView):
199
197
  pk__gte=start_id, new_user__is_active=False
200
198
  ):
201
199
  anonymise(teacher.new_user)
202
- LOGGER.info(f"Anonymised teacher ID {teacher.pk}")
203
200
 
204
201
  # Anonymise schools without any teachers
205
202
  for school in School.objects.filter(teacher_school__isnull=True):
portal/views/home.py CHANGED
@@ -1,4 +1,3 @@
1
- import logging
2
1
  import math
3
2
 
4
3
  from common.helpers.emails import (
@@ -36,8 +35,6 @@ from portal.strings.ten_year_map import (
36
35
  TEN_YEAR_MAP_HEADLINE,
37
36
  )
38
37
 
39
- LOGGER = logging.getLogger(__name__)
40
-
41
38
 
42
39
  def register_view(request):
43
40
  if request.user.is_authenticated:
@@ -131,10 +128,6 @@ def process_signup_form(request, data):
131
128
  ),
132
129
  },
133
130
  )
134
- else:
135
- LOGGER.warn(
136
- f"Ratelimit teacher {RATELIMIT_USER_ALREADY_REGISTERED_EMAIL_GROUP}: {email}"
137
- )
138
131
  else:
139
132
  teacher = Teacher.objects.factory(
140
133
  first_name=data["teacher_first_name"],
@@ -180,10 +173,7 @@ def process_independent_student_signup_form(request, data):
180
173
  ),
181
174
  },
182
175
  )
183
- else:
184
- LOGGER.warning(
185
- f"Ratelimit independent {RATELIMIT_USER_ALREADY_REGISTERED_EMAIL_GROUP}: {email}"
186
- )
176
+
187
177
  return render(
188
178
  request,
189
179
  "portal/email_verification_needed.html",
@@ -1,5 +1,3 @@
1
- import logging
2
-
3
1
  from common.models import UserSession, Student, Class
4
2
  from django.contrib import messages
5
3
  from django.contrib.auth import authenticate, login
@@ -14,8 +12,6 @@ from portal.helpers.ratelimit import clear_ratelimit_cache_for_user
14
12
  from portal.helpers.request_handlers import get_access_code_from_request
15
13
  from portal.views.login import has_user_lockout_expired
16
14
 
17
- LOGGER = logging.getLogger(__name__)
18
-
19
15
 
20
16
  class StudentClassCodeView(FormView):
21
17
  template_name = "portal/login/student_class_code.html"
@@ -76,12 +72,7 @@ class StudentLoginView(LoginView):
76
72
  students = Student.objects.filter(
77
73
  new_user__first_name__iexact=name, class_field=klass
78
74
  )
79
- try:
80
- student = students[0]
81
- except IndexError:
82
- msg = f"Student {name} in class {class_code} is not found!"
83
- LOGGER.error(msg)
84
- raise Exception(msg)
75
+ student = students[0]
85
76
 
86
77
  # Log the login time, class, and login type
87
78
  session = UserSession(