rapid-router 7.6.7__py2.py3-none-any.whl → 7.6.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.
game/__init__.py CHANGED
@@ -1 +1 @@
1
- __version__ = "7.6.7"
1
+ __version__ = "7.6.9"
game/messages.py CHANGED
@@ -47,11 +47,22 @@ def no_permission_title():
47
47
 
48
48
  def no_permission_scoreboard():
49
49
  return (
50
- "Scoreboard is only visible to school students and teachers. Log in if you "
50
+ "The scoreboard is only visible to school students and teachers. Log in if you "
51
51
  "think you should be able to see it."
52
52
  )
53
53
 
54
54
 
55
+ def no_classes_title():
56
+ return "No classes"
57
+
58
+
59
+ def no_classes_scoreboard():
60
+ return (
61
+ "The scoreboard can only be used by teachers who have classes assigned to them. "
62
+ "It seems you don't have any classes, please create one so you can use this feature."
63
+ )
64
+
65
+
55
66
  """ Strings used on the level moderation page. """
56
67
 
57
68
 
@@ -5,7 +5,10 @@ from datetime import datetime, timedelta
5
5
 
6
6
  from common.models import Class, Teacher, Student
7
7
  from common.tests.utils.classes import create_class_directly
8
- from common.tests.utils.organisation import create_organisation_directly, join_teacher_to_organisation
8
+ from common.tests.utils.organisation import (
9
+ create_organisation_directly,
10
+ join_teacher_to_organisation,
11
+ )
9
12
  from common.tests.utils.student import (
10
13
  create_school_student_directly,
11
14
  create_independent_student_directly,
@@ -39,8 +42,7 @@ class ScoreboardTestCase(TestCase):
39
42
  episode1 = Episode.objects.get(id=1)
40
43
  episode2 = Episode.objects.get(id=2)
41
44
  level_ids = [
42
- f"{x}"
43
- for x in range(1, len(episode1.levels) + len(episode2.levels) + 1)
45
+ f"{x}" for x in range(1, len(episode1.levels) + len(episode2.levels) + 1)
44
46
  ]
45
47
  level1 = Level.objects.get(name="1")
46
48
  level13 = Level.objects.get(name="13")
@@ -119,9 +121,7 @@ class ScoreboardTestCase(TestCase):
119
121
 
120
122
  # Check data for custom levels matches
121
123
  assert shared_headers == SharedHeaders
122
- assert shared_level_headers == [
123
- f"{shared_level.name} ({shared_level.owner})"
124
- ]
124
+ assert shared_level_headers == [f"{shared_level.name} ({shared_level.owner})"]
125
125
 
126
126
  assert len(shared_student_data) == 1
127
127
 
@@ -234,9 +234,7 @@ class ScoreboardTestCase(TestCase):
234
234
  )
235
235
 
236
236
  c = Client()
237
- c.login(
238
- username=admin_teacher.user.user.email, password="secretpa$sword2"
239
- )
237
+ c.login(username=admin_teacher.user.user.email, password="secretpa$sword2")
240
238
 
241
239
  url = reverse("scoreboard")
242
240
  response = c.get(url)
@@ -306,8 +304,22 @@ class ScoreboardTestCase(TestCase):
306
304
  url = reverse("scoreboard")
307
305
  response = c.get(url)
308
306
 
307
+ assert "The scoreboard is only visible to school students and teachers" in str(
308
+ response.content
309
+ )
310
+
311
+ def test_teacher_without_classes_cannot_see_scoreboard(self):
312
+ email, password = signup_teacher_directly()
313
+ create_organisation_directly(email)
314
+
315
+ c = Client()
316
+ c.login(username=email, password=password)
317
+
318
+ url = reverse("scoreboard")
319
+ response = c.get(url)
320
+
309
321
  assert (
310
- "Scoreboard is only visible to school students and teachers"
322
+ "The scoreboard can only be used by teachers who have classes assigned to them."
311
323
  in str(response.content)
312
324
  )
313
325
 
@@ -332,18 +344,11 @@ class ScoreboardCsvTestCase(TestCase):
332
344
  shared_levels = [shared_level1, shared_level2]
333
345
 
334
346
  shared_levels_headers = list(
335
- [
336
- shared_level_to_name(level, level.owner)
337
- for level in shared_levels
338
- ]
347
+ [shared_level_to_name(level, level.owner) for level in shared_levels]
339
348
  )
340
349
 
341
- shared_level_rows[0] = self.shared_student_row(
342
- students[0], shared_levels
343
- )
344
- shared_level_rows[1] = self.shared_student_row(
345
- students[1], shared_levels
346
- )
350
+ shared_level_rows[0] = self.shared_student_row(students[0], shared_levels)
351
+ shared_level_rows[1] = self.shared_student_row(students[1], shared_levels)
347
352
 
348
353
  # Create students' improvement table data
349
354
  improvement_data = []
@@ -369,13 +374,10 @@ class ScoreboardCsvTestCase(TestCase):
369
374
  ) = self.actual_data(response.content.decode("utf-8"), len(students))
370
375
 
371
376
  # Check the headers and the number or rows match expectations
372
- assert actual_scoreboard_header == self.expected_scoreboard_header(
373
- levels
374
- )
377
+ assert actual_scoreboard_header == self.expected_scoreboard_header(levels)
375
378
  assert len(actual_scoreboard_rows) == len(student_rows)
376
- assert (
377
- actual_shared_levels_header
378
- == self.expected_shared_levels_header(shared_levels)
379
+ assert actual_shared_levels_header == self.expected_shared_levels_header(
380
+ shared_levels
379
381
  )
380
382
  assert len(actual_shared_levels_rows) == len(shared_level_rows)
381
383
 
@@ -491,18 +493,13 @@ class ScoreboardCsvTestCase(TestCase):
491
493
 
492
494
  def expected_scoreboard_header(self, levels):
493
495
  level_strings = list(map(str, levels))
494
- all_header_strings = (
495
- CSVHeaders + level_strings + ["Areas for improvement"]
496
- )
496
+ all_header_strings = CSVHeaders + level_strings + ["Areas for improvement"]
497
497
  joined = ",".join(all_header_strings)
498
498
  return joined
499
499
 
500
500
  def expected_shared_levels_header(self, shared_levels):
501
501
  level_strings = list(
502
- [
503
- shared_level_to_name(level, level.owner)
504
- for level in shared_levels
505
- ]
502
+ [shared_level_to_name(level, level.owner) for level in shared_levels]
506
503
  )
507
504
  all_header_strings = CSVSharedHeaders + level_strings
508
505
  joined = ",".join(all_header_strings)
@@ -524,9 +521,7 @@ class ScoreboardCsvTestCase(TestCase):
524
521
  scoreboard_header = split[scoreboard_header_row]
525
522
  scoreboard_rows = split[scoreboard_rows_start:scoreboard_rows_end]
526
523
  shared_levels_header = split[shared_levels_header_row]
527
- shared_levels_rows = split[
528
- shared_levels_rows_start:shared_levels_rows_end
529
- ]
524
+ shared_levels_rows = split[shared_levels_rows_start:shared_levels_rows_end]
530
525
 
531
526
  return (
532
527
  scoreboard_header,
game/views/scoreboard.py CHANGED
@@ -313,7 +313,7 @@ def scoreboard(request, language):
313
313
  episode_ids = set(all_episode_ids)
314
314
 
315
315
  if is_teacher_with_no_classes_assigned(user, users_classes):
316
- return render_no_permission_error(request)
316
+ return render_no_classes_error(request)
317
317
 
318
318
  if not is_valid_request(user, class_ids):
319
319
  raise Http404
@@ -430,6 +430,14 @@ def render_no_permission_error(request):
430
430
  )
431
431
 
432
432
 
433
+ def render_no_classes_error(request):
434
+ return renderError(
435
+ request,
436
+ messages.no_classes_title(),
437
+ messages.no_classes_scoreboard(),
438
+ )
439
+
440
+
433
441
  def is_teacher_with_no_classes_assigned(user, users_classes):
434
442
  return user.is_teacher() and len(users_classes) == 0
435
443
 
@@ -1,47 +1,47 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rapid-router
3
- Version: 7.6.7
3
+ Version: 7.6.9
4
4
  Classifier: Programming Language :: Python
5
5
  Classifier: Programming Language :: Python :: 3.12
6
6
  Classifier: Framework :: Django
7
7
  License-File: LICENSE.md
8
- Requires-Dist: asgiref==3.9.2; python_version >= "3.9"
8
+ Requires-Dist: asgiref==3.10.0; python_version >= "3.9"
9
9
  Requires-Dist: asttokens==3.0.0; python_version >= "3.8"
10
- Requires-Dist: certifi==2025.8.3; python_version >= "3.7"
11
- Requires-Dist: cffi==1.17.1; platform_python_implementation != "PyPy"
12
- Requires-Dist: cfl-common==8.9.7
13
- Requires-Dist: charset-normalizer==3.4.3; python_version >= "3.7"
10
+ Requires-Dist: certifi==2025.10.5; python_version >= "3.7"
11
+ Requires-Dist: cffi==2.0.0; platform_python_implementation != "PyPy"
12
+ Requires-Dist: cfl-common==8.9.8
13
+ Requires-Dist: charset-normalizer==3.4.4; python_version >= "3.7"
14
14
  Requires-Dist: cryptography==44.0.1; python_version >= "3.7" and python_full_version not in "3.9.0, 3.9.1"
15
15
  Requires-Dist: decorator==5.2.1; python_version >= "3.8"
16
16
  Requires-Dist: diff-match-patch==20241021; python_version >= "3.7"
17
- Requires-Dist: django==5.1.13; python_version >= "3.10"
17
+ Requires-Dist: django==5.1.14; python_version >= "3.10"
18
18
  Requires-Dist: django-countries==7.6.1
19
19
  Requires-Dist: django-csp==3.8
20
20
  Requires-Dist: django-formtools==2.5.1; python_version >= "3.8"
21
21
  Requires-Dist: django-import-export==4.2.0; python_version >= "3.9"
22
- Requires-Dist: django-otp==1.6.1; python_version >= "3.7"
23
- Requires-Dist: django-phonenumber-field==8.1.0; python_version >= "3.9"
22
+ Requires-Dist: django-otp==1.6.3; python_version >= "3.7"
23
+ Requires-Dist: django-phonenumber-field==8.3.0; python_version >= "3.9"
24
24
  Requires-Dist: django-pipeline==4.0.0; python_version >= "3.9"
25
25
  Requires-Dist: django-reverse-js==0.1.8; python_version >= "3.10"
26
26
  Requires-Dist: django-two-factor-auth==1.17.0; python_version >= "3.8"
27
27
  Requires-Dist: djangorestframework==3.16.0; python_version >= "3.9"
28
28
  Requires-Dist: executing==2.2.1; python_version >= "3.8"
29
- Requires-Dist: idna==3.10; python_version >= "3.6"
30
- Requires-Dist: ipython==9.6.0; python_version >= "3.11"
29
+ Requires-Dist: idna==3.11; python_version >= "3.8"
30
+ Requires-Dist: ipython==9.7.0; python_version >= "3.11"
31
31
  Requires-Dist: ipython-pygments-lexers==1.1.1; python_version >= "3.8"
32
32
  Requires-Dist: jedi==0.19.2; python_version >= "3.6"
33
33
  Requires-Dist: libsass==0.23.0; python_version >= "3.8"
34
34
  Requires-Dist: matplotlib-inline==0.2.1; python_version >= "3.9"
35
35
  Requires-Dist: more-itertools==8.7.0; python_version >= "3.5"
36
- Requires-Dist: numpy==2.3.2; python_version >= "3.11"
37
- Requires-Dist: pandas==2.3.2; python_version >= "3.9"
36
+ Requires-Dist: numpy==2.3.4; python_version >= "3.11"
37
+ Requires-Dist: pandas==2.3.3; python_version >= "3.9"
38
38
  Requires-Dist: parso==0.8.5; python_version >= "3.6"
39
39
  Requires-Dist: pexpect==4.9.0; sys_platform != "win32" and sys_platform != "emscripten"
40
40
  Requires-Dist: pgeocode==0.4.0; python_version >= "3.8"
41
41
  Requires-Dist: prompt-toolkit==3.0.52; python_version >= "3.8"
42
42
  Requires-Dist: ptyprocess==0.7.0
43
43
  Requires-Dist: pure-eval==0.2.3
44
- Requires-Dist: pycparser==2.22; python_version >= "3.8"
44
+ Requires-Dist: pycparser==2.23; implementation_name != "PyPy"
45
45
  Requires-Dist: pygments==2.19.2; python_version >= "3.8"
46
46
  Requires-Dist: pyhamcrest==2.0.2; python_version >= "3.5"
47
47
  Requires-Dist: pyjwt==2.6.0; python_version >= "3.7"
@@ -63,33 +63,33 @@ Requires-Dist: wcwidth==0.2.14; python_version >= "3.6"
63
63
  Requires-Dist: wheel==0.45.1; python_version >= "3.8"
64
64
  Provides-Extra: dev
65
65
  Requires-Dist: amqp==5.3.1; python_version >= "3.6" and extra == "dev"
66
- Requires-Dist: asgiref==3.9.2; python_version >= "3.9" and extra == "dev"
66
+ Requires-Dist: asgiref==3.10.0; python_version >= "3.9" and extra == "dev"
67
67
  Requires-Dist: attrs==25.4.0; python_version >= "3.9" and extra == "dev"
68
68
  Requires-Dist: billiard==4.2.2; python_version >= "3.7" and extra == "dev"
69
- Requires-Dist: black==25.9.0; python_version >= "3.9" and extra == "dev"
69
+ Requires-Dist: black==25.11.0; python_version >= "3.9" and extra == "dev"
70
70
  Requires-Dist: boto3==1.36.14; python_version >= "3.8" and extra == "dev"
71
71
  Requires-Dist: botocore==1.36.26; python_version >= "3.8" and extra == "dev"
72
72
  Requires-Dist: celery[sqs]==5.4.0; python_version >= "3.8" and extra == "dev"
73
- Requires-Dist: certifi==2025.8.3; python_version >= "3.7" and extra == "dev"
74
- Requires-Dist: cffi==1.17.1; platform_python_implementation != "PyPy" and extra == "dev"
75
- Requires-Dist: cfl-common==8.9.7; extra == "dev"
76
- Requires-Dist: charset-normalizer==3.4.3; python_version >= "3.7" and extra == "dev"
73
+ Requires-Dist: certifi==2025.10.5; python_version >= "3.7" and extra == "dev"
74
+ Requires-Dist: cffi==2.0.0; platform_python_implementation != "PyPy" and extra == "dev"
75
+ Requires-Dist: cfl-common==8.9.8; extra == "dev"
76
+ Requires-Dist: charset-normalizer==3.4.4; python_version >= "3.7" and extra == "dev"
77
77
  Requires-Dist: click==8.3.0; python_version >= "3.10" and extra == "dev"
78
78
  Requires-Dist: click-didyoumean==0.3.1; python_full_version >= "3.6.2" and extra == "dev"
79
79
  Requires-Dist: click-plugins==1.1.1.2; extra == "dev"
80
80
  Requires-Dist: click-repl==0.3.0; python_version >= "3.6" and extra == "dev"
81
- Requires-Dist: codeforlife-portal==8.9.7; extra == "dev"
81
+ Requires-Dist: codeforlife-portal==8.9.8; extra == "dev"
82
82
  Requires-Dist: cryptography==44.0.1; (python_version >= "3.7" and python_full_version not in "3.9.0, 3.9.1") and extra == "dev"
83
83
  Requires-Dist: diff-match-patch==20241021; python_version >= "3.7" and extra == "dev"
84
- Requires-Dist: django==5.1.13; python_version >= "3.10" and extra == "dev"
84
+ Requires-Dist: django==5.1.14; python_version >= "3.10" and extra == "dev"
85
85
  Requires-Dist: django-classy-tags==4.1.0; python_version >= "3.8" and extra == "dev"
86
86
  Requires-Dist: django-countries==7.6.1; extra == "dev"
87
87
  Requires-Dist: django-csp==3.8; extra == "dev"
88
88
  Requires-Dist: django-extensions==4.1; python_version >= "3.9" and extra == "dev"
89
89
  Requires-Dist: django-formtools==2.5.1; python_version >= "3.8" and extra == "dev"
90
90
  Requires-Dist: django-import-export==4.2.0; python_version >= "3.9" and extra == "dev"
91
- Requires-Dist: django-otp==1.6.1; python_version >= "3.7" and extra == "dev"
92
- Requires-Dist: django-phonenumber-field==8.1.0; python_version >= "3.9" and extra == "dev"
91
+ Requires-Dist: django-otp==1.6.3; python_version >= "3.7" and extra == "dev"
92
+ Requires-Dist: django-phonenumber-field==8.3.0; python_version >= "3.9" and extra == "dev"
93
93
  Requires-Dist: django-pipeline==4.0.0; python_version >= "3.9" and extra == "dev"
94
94
  Requires-Dist: django-preventconcurrentlogins==0.8.2; extra == "dev"
95
95
  Requires-Dist: django-ratelimit==3.0.1; python_version >= "3.4" and extra == "dev"
@@ -103,29 +103,29 @@ Requires-Dist: djangorestframework==3.16.0; python_version >= "3.9" and extra ==
103
103
  Requires-Dist: execnet==2.1.1; python_version >= "3.8" and extra == "dev"
104
104
  Requires-Dist: gunicorn==23.0.0; python_version >= "3.7" and extra == "dev"
105
105
  Requires-Dist: h11==0.16.0; python_version >= "3.8" and extra == "dev"
106
- Requires-Dist: idna==3.10; python_version >= "3.6" and extra == "dev"
106
+ Requires-Dist: idna==3.11; python_version >= "3.8" and extra == "dev"
107
107
  Requires-Dist: importlib-metadata==4.13.0; python_version >= "3.7" and extra == "dev"
108
108
  Requires-Dist: iniconfig==2.3.0; python_version >= "3.10" and extra == "dev"
109
109
  Requires-Dist: isort==7.0.0; python_full_version >= "3.10.0" and extra == "dev"
110
110
  Requires-Dist: jmespath==1.0.1; python_version >= "3.7" and extra == "dev"
111
- Requires-Dist: kombu[sqs]==5.5.4; python_version >= "3.8" and extra == "dev"
111
+ Requires-Dist: kombu[sqs]==5.6.0; python_version >= "3.9" and extra == "dev"
112
112
  Requires-Dist: libsass==0.23.0; python_version >= "3.8" and extra == "dev"
113
113
  Requires-Dist: markupsafe==3.0.3; python_version >= "3.9" and extra == "dev"
114
114
  Requires-Dist: more-itertools==8.7.0; python_version >= "3.5" and extra == "dev"
115
115
  Requires-Dist: mypy-extensions==1.1.0; python_version >= "3.8" and extra == "dev"
116
- Requires-Dist: numpy==2.3.2; python_version >= "3.11" and extra == "dev"
116
+ Requires-Dist: numpy==2.3.4; python_version >= "3.11" and extra == "dev"
117
117
  Requires-Dist: outcome==1.3.0.post0; python_version >= "3.7" and extra == "dev"
118
118
  Requires-Dist: packaging==25.0; python_version >= "3.8" and extra == "dev"
119
- Requires-Dist: pandas==2.3.2; python_version >= "3.9" and extra == "dev"
119
+ Requires-Dist: pandas==2.3.3; python_version >= "3.9" and extra == "dev"
120
120
  Requires-Dist: pathspec==0.12.1; python_version >= "3.8" and extra == "dev"
121
121
  Requires-Dist: pgeocode==0.4.0; python_version >= "3.8" and extra == "dev"
122
122
  Requires-Dist: phonenumbers==8.12.12; extra == "dev"
123
- Requires-Dist: pillow==11.3.0; python_version >= "3.9" and extra == "dev"
123
+ Requires-Dist: pillow==12.0.0; python_version >= "3.10" and extra == "dev"
124
124
  Requires-Dist: platformdirs==4.5.0; python_version >= "3.10" and extra == "dev"
125
125
  Requires-Dist: pluggy==1.6.0; python_version >= "3.9" and extra == "dev"
126
126
  Requires-Dist: prompt-toolkit==3.0.52; python_version >= "3.8" and extra == "dev"
127
127
  Requires-Dist: psycopg2-binary==2.9.9; python_version >= "3.7" and extra == "dev"
128
- Requires-Dist: pycparser==2.22; python_version >= "3.8" and extra == "dev"
128
+ Requires-Dist: pycparser==2.23; implementation_name != "PyPy" and extra == "dev"
129
129
  Requires-Dist: pycurl==7.45.7; python_version >= "3.5" and extra == "dev"
130
130
  Requires-Dist: pygments==2.19.2; python_version >= "3.8" and extra == "dev"
131
131
  Requires-Dist: pyjwt==2.6.0; python_version >= "3.7" and extra == "dev"
@@ -138,7 +138,7 @@ Requires-Dist: pytest-order==1.3.0; python_version >= "3.7" and extra == "dev"
138
138
  Requires-Dist: pytest-xdist==3.8.0; python_version >= "3.9" and extra == "dev"
139
139
  Requires-Dist: python-dateutil==2.9.0.post0; (python_version >= "2.7" and python_version not in "3.0, 3.1, 3.2, 3.3") and extra == "dev"
140
140
  Requires-Dist: python-dotenv==1.0.1; python_version >= "3.8" and extra == "dev"
141
- Requires-Dist: pytokens==0.2.0; python_version >= "3.8" and extra == "dev"
141
+ Requires-Dist: pytokens==0.3.0; python_version >= "3.8" and extra == "dev"
142
142
  Requires-Dist: pytz==2025.2; extra == "dev"
143
143
  Requires-Dist: pyyaml==6.0.2; python_version >= "3.8" and extra == "dev"
144
144
  Requires-Dist: qrcode==7.4.2; python_version >= "3.7" and extra == "dev"
@@ -153,12 +153,12 @@ Requires-Dist: sniffio==1.3.1; python_version >= "3.7" and extra == "dev"
153
153
  Requires-Dist: sortedcontainers==2.4.0; extra == "dev"
154
154
  Requires-Dist: sqlparse==0.5.3; python_version >= "3.8" and extra == "dev"
155
155
  Requires-Dist: tablib==3.7.0; python_version >= "3.9" and extra == "dev"
156
- Requires-Dist: trio==0.31.0; python_version >= "3.9" and extra == "dev"
156
+ Requires-Dist: trio==0.32.0; python_version >= "3.10" and extra == "dev"
157
157
  Requires-Dist: trio-websocket==0.12.2; python_version >= "3.8" and extra == "dev"
158
158
  Requires-Dist: typing-extensions==4.15.0; python_version >= "3.9" and extra == "dev"
159
159
  Requires-Dist: tzdata==2025.2; python_version >= "2" and extra == "dev"
160
160
  Requires-Dist: urllib3==2.5.0; python_version >= "3.9" and extra == "dev"
161
- Requires-Dist: uvicorn==0.37.0; python_version >= "3.9" and extra == "dev"
161
+ Requires-Dist: uvicorn==0.38.0; python_version >= "3.9" and extra == "dev"
162
162
  Requires-Dist: uvicorn-worker==0.2.0; python_version >= "3.8" and extra == "dev"
163
163
  Requires-Dist: vine==5.1.0; python_version >= "3.6" and extra == "dev"
164
164
  Requires-Dist: wcwidth==0.2.14; python_version >= "3.6" and extra == "dev"
@@ -3,7 +3,7 @@ example_project/rapid_router_test_settings.py,sha256=-8pBDGeDSM0ziu5BLUXVqB9J97A
3
3
  example_project/settings.py,sha256=I_upxXh1PBbeX0aKttLeqjGbjPCDTfgMVJgBv7vcc0g,4599
4
4
  example_project/urls.py,sha256=XHug_cpNy21yOef3E1-wWT5VkTuxpl6ZXIlCj6jDjWA,422
5
5
  example_project/wsgi.py,sha256=U1W6WzZxZaIdYZ5tks7w9fqp5WS5qvn2iThsVcskrWw,829
6
- game/__init__.py,sha256=3atqbhGAZzBMT7RghnLj0p6adoJASd39XJG0rTmSaFU,22
6
+ game/__init__.py,sha256=Z3P2ZGpGR-5lolBtaNOKA5Qk6p37X25re0WlAHgvu8Q,22
7
7
  game/admin.py,sha256=BLwwaqQYuqmMdwqnvhdan19iGxdcoBX4CXFk_ROG5-M,1431
8
8
  game/app_settings.py,sha256=mlg-1AiP7AR5JNOHAXXLuCrYWaZMmSihvSYk9c2c8YY,857
9
9
  game/cache.py,sha256=dtOiFl6Z4I2Q9-8Hz24ZI-5C0asXYSQhF2Be5q74N8g,2227
@@ -11,7 +11,7 @@ game/character.py,sha256=bdJ74jDN9zZnj-XaNYbCWmM8XiZY5q4zpqmHLcvE-ts,2397
11
11
  game/decor.py,sha256=VDY-kadOd0TSDo5znI5P3YzB3BFADCotIlp1g_eDOwQ,10096
12
12
  game/forms.py,sha256=7J9Ivn97qw4FC5B7WonDzi4Q5WHhF1I62eQWorUDv_o,2143
13
13
  game/level_management.py,sha256=wAKbu8JAVTHoM6YD6L3c7tPityKtWLGRNG32OX5SYRw,6289
14
- game/messages.py,sha256=irfMKVnnB526e--GH0vPeUAat2We7WtWR0ifl5-0n_E,102565
14
+ game/messages.py,sha256=x2YCLgQ9vnDQ5AA8hvf-ImxMuKsJcryfW5a-vPMQ2R4,102853
15
15
  game/models.py,sha256=h_NS_6LL8uFoKVjg2CCZ53sE-FBv9QWM_dhCh4fIr5E,11446
16
16
  game/permissions.py,sha256=3dWQ_YYMNVm6OhI9gyZe36EiqsoyU5RzyxdIlfbZ2pM,7624
17
17
  game/python_den_urls.py,sha256=SgAoCwKeck-c8gGZadjKNhtq_-6PVc3m_he4NDSDw0Q,794
@@ -782,7 +782,7 @@ game/tests/test_level_selection.py,sha256=IbrIPKDozvQ-05JAmLxHw9DsTfTwTBF2VJQPU8
782
782
  game/tests/test_models.py,sha256=L1F5yHtVdDmVuhw7uGDBiOOTYi9rgZVIjzd248-eqLc,2592
783
783
  game/tests/test_python_den_worksheet.py,sha256=YSKMESqX4OJMNpwFCOp03pp-UV1rseVBKmGDcCy5QJ4,2691
784
784
  game/tests/test_random_road.py,sha256=vehN177IFKGwW2RvVOtR0X9N86cEyMmIpdhBg1mrJwo,7340
785
- game/tests/test_scoreboard.py,sha256=xvPkJbO8QWvc4pbou2AfE2WjPG1AsvpJt3y4isnd_z8,20101
785
+ game/tests/test_scoreboard.py,sha256=mlcst9uD5e4T2UbEv8zUBZqR3612-npOOGCvt2K7aRY,20291
786
786
  game/tests/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
787
787
  game/tests/migrations/test_migration_fix_episodes_order.py,sha256=JdZpcjxggMbCnTG_kNxFsavHtOjY3CA031s2T5WDuXA,1135
788
788
  game/tests/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -801,11 +801,11 @@ game/views/level_editor.py,sha256=qJlHPs85hFCJoXrkwql37UduGs0MKxpAtwm5EpzEwi0,18
801
801
  game/views/level_moderation.py,sha256=GwnvXlHRxGNjgjr3pcCCmnxCHEX4UCJlsGw2VA6rncA,5303
802
802
  game/views/level_selection.py,sha256=UI345nDv5iTRQ7VttiLKLzezJlaSlaKOnhlALZgMU9Q,9896
803
803
  game/views/level_solutions.py,sha256=oYwx0p1LuY7609H2lid7lAq3QvcD6_K9cy5U_i6CwWg,96714
804
- game/views/scoreboard.py,sha256=Lxy7XtoG7VwWpTb-c22BGC6eN8uCmmOnQ2qjY-oXA3k,16914
804
+ game/views/scoreboard.py,sha256=h-IPKNKTpFH2Ryr1huyh765BgE0nYtPrqIf9hpU1dmc,17077
805
805
  game/views/scoreboard_csv.py,sha256=yx4tOwx5QsHyU1S1BUPUqRBWIh5idq8QVtBID-NqZto,1768
806
806
  game/views/worksheet.py,sha256=R7DgR3OhgITkmPHzkv0WLu_bkHvt3RGkcD7ySx3ippg,705
807
- rapid_router-7.6.7.dist-info/licenses/LICENSE.md,sha256=9AbRlCDqD2D1tPibimysFv3zg3AIc49-eyv9aEsyq9w,115
808
- rapid_router-7.6.7.dist-info/METADATA,sha256=zU5x6ehJ7yrbXABg4EkalKOwQh1u2IP7XmVTTwVF0g4,11803
809
- rapid_router-7.6.7.dist-info/WHEEL,sha256=JNWh1Fm1UdwIQV075glCn4MVuCRs0sotJIq-J6rbxCU,109
810
- rapid_router-7.6.7.dist-info/top_level.txt,sha256=rKP4ryr1t8Wcnx8grJHDViM3T5cMYH_0vygDjC04ArA,21
811
- rapid_router-7.6.7.dist-info/RECORD,,
807
+ rapid_router-7.6.9.dist-info/licenses/LICENSE.md,sha256=9AbRlCDqD2D1tPibimysFv3zg3AIc49-eyv9aEsyq9w,115
808
+ rapid_router-7.6.9.dist-info/METADATA,sha256=w6n9qKLd1SVY2V2Vo1Fhc11nzsEcH-q988qIAxUNJh8,11820
809
+ rapid_router-7.6.9.dist-info/WHEEL,sha256=JNWh1Fm1UdwIQV075glCn4MVuCRs0sotJIq-J6rbxCU,109
810
+ rapid_router-7.6.9.dist-info/top_level.txt,sha256=rKP4ryr1t8Wcnx8grJHDViM3T5cMYH_0vygDjC04ArA,21
811
+ rapid_router-7.6.9.dist-info/RECORD,,