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

@@ -0,0 +1,68 @@
1
+ # Generated by Django 3.2.25 on 2024-05-22 11:30
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('common', '0051_verify_returning_users'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name='schoolteacherinvitation',
15
+ name='_invited_teacher_email',
16
+ field=models.BinaryField(blank=True, null=True),
17
+ ),
18
+ migrations.AddField(
19
+ model_name='schoolteacherinvitation',
20
+ name='_invited_teacher_first_name',
21
+ field=models.BinaryField(blank=True, null=True),
22
+ ),
23
+ migrations.AddField(
24
+ model_name='schoolteacherinvitation',
25
+ name='_invited_teacher_last_name',
26
+ field=models.BinaryField(blank=True, null=True),
27
+ ),
28
+ migrations.AddField(
29
+ model_name='userprofile',
30
+ name='_email',
31
+ field=models.BinaryField(blank=True, null=True),
32
+ ),
33
+ migrations.AddField(
34
+ model_name='userprofile',
35
+ name='_first_name',
36
+ field=models.BinaryField(blank=True, null=True),
37
+ ),
38
+ migrations.AddField(
39
+ model_name='userprofile',
40
+ name='_last_name',
41
+ field=models.BinaryField(blank=True, null=True),
42
+ ),
43
+ migrations.AddField(
44
+ model_name='userprofile',
45
+ name='_username',
46
+ field=models.BinaryField(blank=True, null=True),
47
+ ),
48
+ migrations.AddField(
49
+ model_name='userprofile',
50
+ name='email',
51
+ field=models.CharField(blank=True, max_length=200, null=True),
52
+ ),
53
+ migrations.AddField(
54
+ model_name='userprofile',
55
+ name='first_name',
56
+ field=models.CharField(blank=True, max_length=200, null=True),
57
+ ),
58
+ migrations.AddField(
59
+ model_name='userprofile',
60
+ name='last_name',
61
+ field=models.CharField(blank=True, max_length=200, null=True),
62
+ ),
63
+ migrations.AddField(
64
+ model_name='userprofile',
65
+ name='username',
66
+ field=models.CharField(blank=True, max_length=200, null=True),
67
+ ),
68
+ ]
@@ -16,12 +16,25 @@ class UserProfile(models.Model):
16
16
  developer = models.BooleanField(default=False)
17
17
  is_verified = models.BooleanField(default=False)
18
18
 
19
- # Holds the user's earned kurono badges. This information has to be on the UserProfile as the Avatar objects are
20
- # deleted every time the Game gets deleted.
21
- # This is a string showing which badges in which worksheets have been earned. The format is "X:Y" where X is the
22
- # worksheet ID and Y is the badge ID. This repeats for all badges and each pair is comma-separated.
19
+ # Holds the user's earned kurono badges. This information has to be on the
20
+ # UserProfile as the Avatar objects are deleted every time the Game gets
21
+ # deleted.
22
+ # This is a string showing which badges in which worksheets have been
23
+ # earned. The format is "X:Y" where X is the worksheet ID and Y is the
24
+ # badge ID. This repeats for all badges and each pair is comma-separated.
23
25
  aimmo_badges = models.CharField(max_length=200, null=True, blank=True)
24
26
 
27
+ # TODO: Make not nullable once data has been transferred
28
+ first_name = models.CharField(max_length=200, null=True, blank=True)
29
+ _first_name = models.BinaryField(null=True, blank=True)
30
+ last_name = models.CharField(max_length=200, null=True, blank=True)
31
+ _last_name = models.BinaryField(null=True, blank=True)
32
+ email = models.CharField(max_length=200, null=True, blank=True)
33
+ _email = models.BinaryField(null=True, blank=True)
34
+ # TODO: Make not nullable once data has been transferred
35
+ username = models.CharField(max_length=200, null=True, blank=True)
36
+ _username = models.BinaryField(null=True, blank=True)
37
+
25
38
  def __str__(self):
26
39
  return f"{self.user.first_name} {self.user.last_name}"
27
40
 
@@ -38,7 +51,9 @@ class SchoolModelManager(models.Manager):
38
51
 
39
52
  class School(models.Model):
40
53
  name = models.CharField(max_length=200, unique=True)
41
- country = CountryField(blank_label="(select country)", null=True, blank=True)
54
+ country = CountryField(
55
+ blank_label="(select country)", null=True, blank=True
56
+ )
42
57
  # TODO: Create an Address model to house address details
43
58
  county = models.CharField(max_length=50, blank=True, null=True)
44
59
  creation_time = models.DateTimeField(default=timezone.now, null=True)
@@ -61,7 +76,11 @@ class School(models.Model):
61
76
 
62
77
  def admins(self):
63
78
  teachers = self.teacher_school.all()
64
- return [teacher for teacher in teachers if teacher.is_admin] if teachers else None
79
+ return (
80
+ [teacher for teacher in teachers if teacher.is_admin]
81
+ if teachers
82
+ else None
83
+ )
65
84
 
66
85
  def anonymise(self):
67
86
  self.name = uuid4().hex
@@ -72,7 +91,11 @@ class School(models.Model):
72
91
  class TeacherModelManager(models.Manager):
73
92
  def factory(self, first_name, last_name, email, password):
74
93
  user = User.objects.create_user(
75
- username=email, email=email, password=password, first_name=first_name, last_name=last_name
94
+ username=email,
95
+ email=email,
96
+ password=password,
97
+ first_name=first_name,
98
+ last_name=last_name,
76
99
  )
77
100
 
78
101
  user_profile = UserProfile.objects.create(user=user)
@@ -86,12 +109,28 @@ class TeacherModelManager(models.Manager):
86
109
 
87
110
  class Teacher(models.Model):
88
111
  user = models.OneToOneField(UserProfile, on_delete=models.CASCADE)
89
- new_user = models.OneToOneField(User, related_name="new_teacher", null=True, blank=True, on_delete=models.CASCADE)
90
- school = models.ForeignKey(School, related_name="teacher_school", null=True, blank=True, on_delete=models.SET_NULL)
112
+ new_user = models.OneToOneField(
113
+ User,
114
+ related_name="new_teacher",
115
+ null=True,
116
+ blank=True,
117
+ on_delete=models.CASCADE,
118
+ )
119
+ school = models.ForeignKey(
120
+ School,
121
+ related_name="teacher_school",
122
+ null=True,
123
+ blank=True,
124
+ on_delete=models.SET_NULL,
125
+ )
91
126
  is_admin = models.BooleanField(default=False)
92
127
  blocked_time = models.DateTimeField(null=True, blank=True)
93
128
  invited_by = models.ForeignKey(
94
- "self", related_name="invited_teachers", null=True, blank=True, on_delete=models.SET_NULL
129
+ "self",
130
+ related_name="invited_teachers",
131
+ null=True,
132
+ blank=True,
133
+ on_delete=models.SET_NULL,
95
134
  )
96
135
 
97
136
  objects = TeacherModelManager()
@@ -99,7 +138,10 @@ class Teacher(models.Model):
99
138
  def teaches(self, userprofile):
100
139
  if hasattr(userprofile, "student"):
101
140
  student = userprofile.student
102
- return not student.is_independent() and student.class_field.teacher == self
141
+ return (
142
+ not student.is_independent()
143
+ and student.class_field.teacher == self
144
+ )
103
145
 
104
146
  def has_school(self):
105
147
  return self.school is not (None or "")
@@ -119,11 +161,32 @@ class SchoolTeacherInvitationModelManager(models.Manager):
119
161
 
120
162
  class SchoolTeacherInvitation(models.Model):
121
163
  token = models.CharField(max_length=32)
122
- school = models.ForeignKey(School, related_name="teacher_invitations", null=True, on_delete=models.SET_NULL)
123
- from_teacher = models.ForeignKey(Teacher, related_name="school_invitations", null=True, on_delete=models.SET_NULL)
124
- invited_teacher_first_name = models.CharField(max_length=150) # Same as User model
125
- invited_teacher_last_name = models.CharField(max_length=150) # Same as User model
164
+ school = models.ForeignKey(
165
+ School,
166
+ related_name="teacher_invitations",
167
+ null=True,
168
+ on_delete=models.SET_NULL,
169
+ )
170
+ from_teacher = models.ForeignKey(
171
+ Teacher,
172
+ related_name="school_invitations",
173
+ null=True,
174
+ on_delete=models.SET_NULL,
175
+ )
176
+ invited_teacher_first_name = models.CharField(
177
+ max_length=150
178
+ ) # Same as User model
179
+ # TODO: Make not nullable once data has been transferred
180
+ _invited_teacher_first_name = models.BinaryField(null=True, blank=True)
181
+ invited_teacher_last_name = models.CharField(
182
+ max_length=150
183
+ ) # Same as User model
184
+ # TODO: Make not nullable once data has been transferred
185
+ _invited_teacher_last_name = models.BinaryField(null=True, blank=True)
186
+ # TODO: Switch to a CharField to be able to hold hashed value
126
187
  invited_teacher_email = models.EmailField() # Same as User model
188
+ # TODO: Make not nullable once data has been transferred
189
+ _invited_teacher_email = models.BinaryField(null=True, blank=True)
127
190
  invited_teacher_is_admin = models.BooleanField(default=False)
128
191
  expiry = models.DateTimeField()
129
192
  creation_time = models.DateTimeField(default=timezone.now, null=True)
@@ -168,7 +231,9 @@ class ClassModelManager(models.Manager):
168
231
 
169
232
  class Class(models.Model):
170
233
  name = models.CharField(max_length=200)
171
- teacher = models.ForeignKey(Teacher, related_name="class_teacher", on_delete=models.CASCADE)
234
+ teacher = models.ForeignKey(
235
+ Teacher, related_name="class_teacher", on_delete=models.CASCADE
236
+ )
172
237
  access_code = models.CharField(max_length=5, null=True)
173
238
  classmates_data_viewable = models.BooleanField(default=False)
174
239
  always_accept_requests = models.BooleanField(default=False)
@@ -176,7 +241,11 @@ class Class(models.Model):
176
241
  creation_time = models.DateTimeField(default=timezone.now, null=True)
177
242
  is_active = models.BooleanField(default=True)
178
243
  created_by = models.ForeignKey(
179
- Teacher, null=True, blank=True, related_name="created_classes", on_delete=models.SET_NULL
244
+ Teacher,
245
+ null=True,
246
+ blank=True,
247
+ related_name="created_classes",
248
+ on_delete=models.SET_NULL,
180
249
  )
181
250
 
182
251
  objects = ClassModelManager()
@@ -188,7 +257,9 @@ class Class(models.Model):
188
257
  def active_game(self):
189
258
  games = self.game_set.filter(game_class=self, is_archived=False)
190
259
  if len(games) >= 1:
191
- assert len(games) == 1 # there should NOT be more than one active game
260
+ assert (
261
+ len(games) == 1
262
+ ) # there should NOT be more than one active game
192
263
  return games[0]
193
264
  return None
194
265
 
@@ -198,8 +269,13 @@ class Class(models.Model):
198
269
 
199
270
  def get_requests_message(self):
200
271
  if self.always_accept_requests:
201
- external_requests_message = "This class is currently set to always accept requests."
202
- elif self.accept_requests_until is not None and (self.accept_requests_until - timezone.now()) >= timedelta():
272
+ external_requests_message = (
273
+ "This class is currently set to always accept requests."
274
+ )
275
+ elif (
276
+ self.accept_requests_until is not None
277
+ and (self.accept_requests_until - timezone.now()) >= timedelta()
278
+ ):
203
279
  external_requests_message = (
204
280
  "This class is accepting external requests until "
205
281
  + self.accept_requests_until.strftime("%d-%m-%Y %H:%M")
@@ -207,7 +283,9 @@ class Class(models.Model):
207
283
  + timezone.get_current_timezone_name()
208
284
  )
209
285
  else:
210
- external_requests_message = "This class is not currently accepting external requests."
286
+ external_requests_message = (
287
+ "This class is not currently accepting external requests."
288
+ )
211
289
 
212
290
  return external_requests_message
213
291
 
@@ -229,7 +307,9 @@ class UserSession(models.Model):
229
307
  login_time = models.DateTimeField(default=timezone.now)
230
308
  school = models.ForeignKey(School, null=True, on_delete=models.SET_NULL)
231
309
  class_field = models.ForeignKey(Class, null=True, on_delete=models.SET_NULL)
232
- login_type = models.CharField(max_length=100, null=True) # for student login
310
+ login_type = models.CharField(
311
+ max_length=100, null=True
312
+ ) # for student login
233
313
 
234
314
  def __str__(self):
235
315
  return f"{self.user} login: {self.login_time} type: {self.login_type}"
@@ -243,13 +323,24 @@ class StudentModelManager(models.Manager):
243
323
  return random_username
244
324
 
245
325
  def schoolFactory(self, klass, name, password, login_id=None):
246
- user = User.objects.create_user(username=self.get_random_username(), password=password, first_name=name)
326
+ user = User.objects.create_user(
327
+ username=self.get_random_username(),
328
+ password=password,
329
+ first_name=name,
330
+ )
247
331
  user_profile = UserProfile.objects.create(user=user)
248
332
 
249
- return Student.objects.create(class_field=klass, user=user_profile, new_user=user, login_id=login_id)
333
+ return Student.objects.create(
334
+ class_field=klass,
335
+ user=user_profile,
336
+ new_user=user,
337
+ login_id=login_id,
338
+ )
250
339
 
251
340
  def independentStudentFactory(self, name, email, password):
252
- user = User.objects.create_user(username=email, email=email, password=password, first_name=name)
341
+ user = User.objects.create_user(
342
+ username=email, email=email, password=password, first_name=name
343
+ )
253
344
 
254
345
  user_profile = UserProfile.objects.create(user=user)
255
346
 
@@ -257,13 +348,29 @@ class StudentModelManager(models.Manager):
257
348
 
258
349
 
259
350
  class Student(models.Model):
260
- class_field = models.ForeignKey(Class, related_name="students", null=True, blank=True, on_delete=models.CASCADE)
351
+ class_field = models.ForeignKey(
352
+ Class,
353
+ related_name="students",
354
+ null=True,
355
+ blank=True,
356
+ on_delete=models.CASCADE,
357
+ )
261
358
  # hashed uuid used for the unique direct login url
262
359
  login_id = models.CharField(max_length=64, null=True)
263
360
  user = models.OneToOneField(UserProfile, on_delete=models.CASCADE)
264
- new_user = models.OneToOneField(User, related_name="new_student", null=True, blank=True, on_delete=models.CASCADE)
361
+ new_user = models.OneToOneField(
362
+ User,
363
+ related_name="new_student",
364
+ null=True,
365
+ blank=True,
366
+ on_delete=models.CASCADE,
367
+ )
265
368
  pending_class_request = models.ForeignKey(
266
- Class, related_name="class_request", null=True, blank=True, on_delete=models.SET_NULL
369
+ Class,
370
+ related_name="class_request",
371
+ null=True,
372
+ blank=True,
373
+ on_delete=models.SET_NULL,
267
374
  )
268
375
  blocked_time = models.DateTimeField(null=True, blank=True)
269
376
 
@@ -309,7 +416,9 @@ class JoinReleaseStudent(models.Model):
309
416
  JOIN = "join"
310
417
  RELEASE = "release"
311
418
 
312
- student = models.ForeignKey(Student, related_name="student", on_delete=models.CASCADE)
419
+ student = models.ForeignKey(
420
+ Student, related_name="student", on_delete=models.CASCADE
421
+ )
313
422
  # either "release" or "join"
314
423
  action_type = models.CharField(max_length=64)
315
424
  action_time = models.DateTimeField(default=timezone.now)
@@ -317,8 +426,9 @@ class JoinReleaseStudent(models.Model):
317
426
 
318
427
  class DailyActivity(models.Model):
319
428
  """
320
- A model to record sets of daily activity. Currently used to record the amount of
321
- student details download clicks, through the CSV and login cards methods, per day.
429
+ A model to record sets of daily activity. Currently used to record the
430
+ amount of student details download clicks, through the CSV and login
431
+ cards methods, per day.
322
432
  """
323
433
 
324
434
  date = models.DateField(default=timezone.now)
@@ -342,8 +452,8 @@ class DailyActivity(models.Model):
342
452
 
343
453
  class TotalActivity(models.Model):
344
454
  """
345
- A model to record total activity. Meant to only have one entry which records all total activity.
346
- An example of this is total ever registrations.
455
+ A model to record total activity. Meant to only have one entry which
456
+ records all total activity. An example of this is total ever registrations.
347
457
  """
348
458
 
349
459
  teacher_registrations = models.PositiveIntegerField(default=0)
@@ -361,9 +471,11 @@ class TotalActivity(models.Model):
361
471
 
362
472
  class DynamicElement(models.Model):
363
473
  """
364
- This model is meant to allow us to quickly update some elements dynamically on the website without having to
365
- redeploy everytime. For example, if a maintenance banner needs to be added, we check the box in the Django admin
366
- panel, edit the text and it'll show immediately on the website.
474
+ This model is meant to allow us to quickly update some elements
475
+ dynamically on the website without having to redeploy everytime. For
476
+ example, if a maintenance banner needs to be added, we check the box in
477
+ the Django admin panel, edit the text and it'll show immediately on the
478
+ website.
367
479
  """
368
480
 
369
481
  name = models.CharField(max_length=64, unique=True, editable=False)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: codeforlife-portal
3
- Version: 6.44.9
3
+ Version: 6.44.10
4
4
  Classifier: Programming Language :: Python
5
5
  Classifier: Programming Language :: Python :: 3.8
6
6
  Classifier: Framework :: Django
@@ -25,7 +25,7 @@ Requires-Dist: django-classy-tags ==2.0.0
25
25
  Requires-Dist: libsass ==0.23.0
26
26
  Requires-Dist: phonenumbers ==8.12.12
27
27
  Requires-Dist: more-itertools ==8.7.0
28
- Requires-Dist: cfl-common ==6.44.9
28
+ Requires-Dist: cfl-common ==6.44.10
29
29
  Requires-Dist: django-ratelimit ==3.0.1
30
30
  Requires-Dist: django-preventconcurrentlogins ==0.8.2
31
31
  Requires-Dist: django-csp ==3.7
@@ -6,7 +6,7 @@ cfl_common/common/apps.py,sha256=49UXZ3bSkFKvIEOL4zM7y1sAhccQJyRtsoOg5XVd_8Y,129
6
6
  cfl_common/common/context_processors.py,sha256=X0iuX5qu9kMWa7q8osE9CJ2LgM7pPOYQFGdjm8X3rk0,236
7
7
  cfl_common/common/csp_config.py,sha256=sZT6s9zMT5FFIqNODsURT0ifxbDgXpDlki8UxaBq2iE,2940
8
8
  cfl_common/common/mail.py,sha256=XPImcfZKcW5mxov04_0jc3xkx_u1SJE6Hhn8K2kPgoA,6354
9
- cfl_common/common/models.py,sha256=EunFsc7sOWfWiFf4IQwuy56gu8pu3YpPoOgVtsMhbRM,14958
9
+ cfl_common/common/models.py,sha256=1e_3zHf8h_K812-2cQymRLZAKoA73_5-t4LQGPQlifE,16946
10
10
  cfl_common/common/permissions.py,sha256=gC6RQGZI2QDBbglx-xr_V4Hl2C2nf1V2_uPmEuoEcJo,2416
11
11
  cfl_common/common/utils.py,sha256=Nn2Npao9Uqad5Js_IdHwF-ow6wrPNpBLW4AO1LxoEBc,1727
12
12
  cfl_common/common/helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -65,6 +65,7 @@ cfl_common/common/migrations/0048_unique_school_names.py,sha256=pu5xiuesvFNGngD-
65
65
  cfl_common/common/migrations/0049_anonymise_orphan_users.py,sha256=tw9xMrDMRPDCO8HWjBVlnQF8r1YVCKZnVr2wZ3He6og,847
66
66
  cfl_common/common/migrations/0050_anonymise_orphan_schools.py,sha256=_KCkSkoObTpLplX6gXvlV3JXpddn7neyJEa8YKFWeW0,869
67
67
  cfl_common/common/migrations/0051_verify_returning_users.py,sha256=WMpoTA24WgimLEVmKXuPqZ3aZdClRhY5vuGtYseeJp0,758
68
+ cfl_common/common/migrations/0052_add_cse_fields.py,sha256=NhUkkcu2EBzJFhewCTccQ63AoANkGq1CXbFWIGJG9jk,2232
68
69
  cfl_common/common/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
69
70
  cfl_common/common/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
70
71
  cfl_common/common/tests/test_migration_aimmo_characters.py,sha256=pdCCsns90Qz05QqmaBUYK18jKe9aP-symtZjkKG4rag,1079
@@ -105,7 +106,7 @@ example_project/portal_test_settings.py,sha256=frp_XMpd-z1g3VFCRxB2w7AaFW2ivRVKn
105
106
  example_project/settings.py,sha256=XRZZvASoIl5a9xe3masTq_CUBleuJq9ByHx8f_e2UFc,5613
106
107
  example_project/urls.py,sha256=OVeRQ-TCpzHISBRuzqD0yd3ewF7H5U3c-f2p2alfUD0,430
107
108
  example_project/wsgi.py,sha256=U1W6WzZxZaIdYZ5tks7w9fqp5WS5qvn2iThsVcskrWw,829
108
- portal/__init__.py,sha256=JY9WjqnqvCSgGAQFOkgL-a5XXdNSPHLA2nGQUzKtRMo,23
109
+ portal/__init__.py,sha256=DAOvnlpkYOeLySc4ozoUqbAuehzkrm5oNyavRwvs7H4,24
109
110
  portal/admin.py,sha256=on1-zNRnZvf2cwBN6GVRVYRhkaksrCgfzX8XPWtkvz8,6062
110
111
  portal/app_settings.py,sha256=DhWLQOwM0zVOXE3O5TNKbMM9K6agfLuCsHOdr1J7xEI,651
111
112
  portal/backends.py,sha256=2Dss6_WoQwPuDzJUF1yEaTQTNG4eUrD12ujJQ5cp5Tc,812
@@ -642,8 +643,8 @@ portal/views/two_factor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG
642
643
  portal/views/two_factor/core.py,sha256=O_wcBeFqdPYSGNGv-pT_vbs5-Dj1Z-Jfkd6f9-E5yZI,760
643
644
  portal/views/two_factor/form.py,sha256=lnHNKI-BMlpncTuW3zUzjPaJJNuEra2I_nOam0eOKFY,257
644
645
  portal/views/two_factor/profile.py,sha256=tkl_ludo8arMtd5LKNmohM66vpC_YQiP-0nspTSJiJ4,383
645
- codeforlife_portal-6.44.9.dist-info/LICENSE.md,sha256=9AbRlCDqD2D1tPibimysFv3zg3AIc49-eyv9aEsyq9w,115
646
- codeforlife_portal-6.44.9.dist-info/METADATA,sha256=g8gbiNBuQ78vTv6D3utFHHXsuEGTOIOvckD-SNGb3ag,3474
647
- codeforlife_portal-6.44.9.dist-info/WHEEL,sha256=DZajD4pwLWue70CAfc7YaxT1wLUciNBvN_TTcvXpltE,110
648
- codeforlife_portal-6.44.9.dist-info/top_level.txt,sha256=8e5pdsuIoTqEAMqpelHBjGjLbffcBtgOoggmd2q7nMw,41
649
- codeforlife_portal-6.44.9.dist-info/RECORD,,
646
+ codeforlife_portal-6.44.10.dist-info/LICENSE.md,sha256=9AbRlCDqD2D1tPibimysFv3zg3AIc49-eyv9aEsyq9w,115
647
+ codeforlife_portal-6.44.10.dist-info/METADATA,sha256=Sfk3uOefLkZtSMygjh3kRTpcYdv5Kh-PgalkF64N6rQ,3476
648
+ codeforlife_portal-6.44.10.dist-info/WHEEL,sha256=DZajD4pwLWue70CAfc7YaxT1wLUciNBvN_TTcvXpltE,110
649
+ codeforlife_portal-6.44.10.dist-info/top_level.txt,sha256=8e5pdsuIoTqEAMqpelHBjGjLbffcBtgOoggmd2q7nMw,41
650
+ codeforlife_portal-6.44.10.dist-info/RECORD,,
portal/__init__.py CHANGED
@@ -1 +1 @@
1
- __version__ = "6.44.9"
1
+ __version__ = "6.44.10"