rapid-router 7.3.6__py2.py3-none-any.whl → 7.4.1__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.
- example_project/rapid_router_test_settings.py +2 -2
- example_project/settings.py +2 -2
- game/__init__.py +1 -1
- game/end_to_end_tests/test_level_selection.py +3 -9
- game/end_to_end_tests/test_python_levels.py +1 -1
- game/templates/game/level_selection.html +9 -1
- game/templates/game/python_den_level_selection.html +9 -0
- game/views/level.py +31 -36
- rapid_router-7.4.1.dist-info/METADATA +137 -0
- {rapid_router-7.3.6.dist-info → rapid_router-7.4.1.dist-info}/RECORD +13 -14
- {rapid_router-7.3.6.dist-info → rapid_router-7.4.1.dist-info}/WHEEL +1 -1
- example_project/manage.py +0 -10
- rapid_router-7.3.6.dist-info/METADATA +0 -10
- {rapid_router-7.3.6.dist-info → rapid_router-7.4.1.dist-info}/LICENSE.md +0 -0
- {rapid_router-7.3.6.dist-info → rapid_router-7.4.1.dist-info}/top_level.txt +0 -0
|
@@ -67,9 +67,9 @@ STATIC_URL = "/static/"
|
|
|
67
67
|
STATICFILES_DIRS = [os.path.join(BASE_DIR, "game/static")]
|
|
68
68
|
|
|
69
69
|
SECRET_KEY = "bad_test_secret"
|
|
70
|
-
ROOT_URLCONF = "urls"
|
|
70
|
+
ROOT_URLCONF = "example_project.urls"
|
|
71
71
|
|
|
72
|
-
WSGI_APPLICATION = "wsgi.application"
|
|
72
|
+
WSGI_APPLICATION = "example_project.wsgi.application"
|
|
73
73
|
|
|
74
74
|
INSTALLED_APPS = (
|
|
75
75
|
"game",
|
example_project/settings.py
CHANGED
|
@@ -54,9 +54,9 @@ STATIC_URL = "/static/"
|
|
|
54
54
|
STATICFILES_DIRS = [os.path.join(BASE_DIR, "game/static")]
|
|
55
55
|
|
|
56
56
|
SECRET_KEY = "not-a-secret"
|
|
57
|
-
ROOT_URLCONF = "urls"
|
|
57
|
+
ROOT_URLCONF = "example_project.urls"
|
|
58
58
|
|
|
59
|
-
WSGI_APPLICATION = "wsgi.application"
|
|
59
|
+
WSGI_APPLICATION = "example_project.wsgi.application"
|
|
60
60
|
|
|
61
61
|
INSTALLED_APPS = (
|
|
62
62
|
"game",
|
game/__init__.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "7.
|
|
1
|
+
__version__ = "7.4.1"
|
|
@@ -5,8 +5,6 @@ from common.tests.utils.teacher import signup_teacher_directly
|
|
|
5
5
|
from hamcrest import assert_that, ends_with, equal_to
|
|
6
6
|
from selenium.common.exceptions import NoSuchElementException
|
|
7
7
|
from selenium.webdriver.common.by import By
|
|
8
|
-
from selenium.webdriver.support import expected_conditions as EC
|
|
9
|
-
from selenium.webdriver.support.ui import Select, WebDriverWait
|
|
10
8
|
|
|
11
9
|
from game.end_to_end_tests.base_game_test import BaseGameTest
|
|
12
10
|
from game.models import Attempt, Episode
|
|
@@ -68,16 +66,12 @@ class TestLevelSelection(BaseGameTest):
|
|
|
68
66
|
levels_page = self.go_to_reverse("python_levels")
|
|
69
67
|
expected_url = levels_page.browser.current_url
|
|
70
68
|
|
|
71
|
-
page = self.go_to_level_without_dismissing_dialog(
|
|
72
|
-
|
|
73
|
-
assert WebDriverWait(self.selenium, 10).until(
|
|
74
|
-
EC.element_to_be_clickable(next_button)
|
|
75
|
-
)
|
|
76
|
-
next_button.click()
|
|
69
|
+
page = self.go_to_level_without_dismissing_dialog(26, True)
|
|
70
|
+
self.selenium.find_element(By.ID, "next_button").click()
|
|
77
71
|
|
|
78
72
|
current_url = page.browser.current_url
|
|
79
73
|
assert current_url == expected_url
|
|
80
74
|
|
|
81
75
|
episode_20_header = self.selenium.find_element(By.ID, "collapse-20")
|
|
82
76
|
episode_20_expanded = episode_20_header.get_attribute("class")
|
|
83
|
-
assert episode_20_expanded == "collapse
|
|
77
|
+
assert episode_20_expanded == "collapse"
|
|
@@ -27,7 +27,7 @@ class TestPythonLevels(BaseGameTest):
|
|
|
27
27
|
self.go_to_level(4, from_python_den=True).run_print_program()
|
|
28
28
|
|
|
29
29
|
def test_invalid_import(self):
|
|
30
|
-
self.go_to_level(
|
|
30
|
+
self.go_to_level(5, from_python_den=True).run_invalid_import_program()
|
|
31
31
|
|
|
32
32
|
def test_run_code(self):
|
|
33
33
|
self.go_to_level(4, from_python_den=True)
|
|
@@ -89,6 +89,9 @@
|
|
|
89
89
|
|
|
90
90
|
<div id="collapse-{{episode.id}}" aria-labelledby="episode-{{episode.id}}" class="collapse">
|
|
91
91
|
<div class="panel-body">
|
|
92
|
+
{% if not user.is_authenticated and episode.id > 2 %}
|
|
93
|
+
<p class="text--warning">In order to access the full content for this course, please log in.</p>
|
|
94
|
+
{% endif %}
|
|
92
95
|
{% for level in episode.levels %}
|
|
93
96
|
{% if user|is_logged_in_as_student and user.new_student.class_field in level.locked_for_class.all %}
|
|
94
97
|
<!-- Mark level as locked -->
|
|
@@ -99,6 +102,11 @@
|
|
|
99
102
|
<img class="level_image coin_image" value="{{level.name}}">
|
|
100
103
|
{% endif %}
|
|
101
104
|
</p>
|
|
105
|
+
{% elif not user.is_authenticated and level.name > 19 and level.name != 29 and level.name != 33 and level.name != 44 and level.name != 51 and level.name != 61 and level.name != 68 %}
|
|
106
|
+
<!-- Mark level as locked -->
|
|
107
|
+
<p>
|
|
108
|
+
<a class="disabled">{{level.name}}: {{level.title.strip | safe}}</a>
|
|
109
|
+
</p>
|
|
102
110
|
{% else %}
|
|
103
111
|
<!-- Marking titles as safe to enable bold, not to be used for user-created levels -->
|
|
104
112
|
<p>
|
|
@@ -111,7 +119,7 @@
|
|
|
111
119
|
{% endif %}
|
|
112
120
|
{% endfor %}
|
|
113
121
|
|
|
114
|
-
{% if episode.random_levels_enabled %}
|
|
122
|
+
{% if not user.is_authenticated and episode.id <= 2 or user.is_authenticated and episode.random_levels_enabled %}
|
|
115
123
|
<p>
|
|
116
124
|
<a href="{% url 'random_level_for_episode' episode.id %}">
|
|
117
125
|
Random: Try your hand at a random level
|
|
@@ -212,6 +212,15 @@
|
|
|
212
212
|
<img class="level_image coin_image" value="{{level.name}}">
|
|
213
213
|
{% endif %}
|
|
214
214
|
</p>
|
|
215
|
+
{% elif not user.is_authenticated and level.name > 1026 and level.name != 1041 %}
|
|
216
|
+
<!-- Mark level as locked -->
|
|
217
|
+
<p>
|
|
218
|
+
{% if level.name > 1009 %}
|
|
219
|
+
<a class="disabled">{{level.name|stringformat:"i"|slice:"2:4"}}: {{level.title.strip | safe}}</a>
|
|
220
|
+
{% else %}
|
|
221
|
+
<a class="disabled">{{level.name|stringformat:"i"|slice:"3:4"}}: {{level.title.strip | safe}}</a>
|
|
222
|
+
{% endif %}
|
|
223
|
+
</p>
|
|
215
224
|
{% else %}
|
|
216
225
|
<!-- Marking titles as safe to enable bold, not to be used for user-created levels -->
|
|
217
226
|
<p>
|
game/views/level.py
CHANGED
|
@@ -5,7 +5,7 @@ from builtins import object, str
|
|
|
5
5
|
from datetime import datetime
|
|
6
6
|
|
|
7
7
|
from django.http import Http404, HttpResponse
|
|
8
|
-
from django.shortcuts import
|
|
8
|
+
from django.shortcuts import get_object_or_404, redirect, render
|
|
9
9
|
from django.urls import reverse
|
|
10
10
|
from django.utils import timezone
|
|
11
11
|
from django.views.decorators.http import require_POST
|
|
@@ -16,18 +16,19 @@ import game.messages as messages
|
|
|
16
16
|
import game.permissions as permissions
|
|
17
17
|
from game import app_settings
|
|
18
18
|
from game.cache import (
|
|
19
|
+
cached_custom_level,
|
|
19
20
|
cached_default_level,
|
|
20
21
|
cached_episode,
|
|
21
|
-
cached_custom_level,
|
|
22
|
-
cached_level_decor,
|
|
23
22
|
cached_level_blocks,
|
|
23
|
+
cached_level_decor,
|
|
24
24
|
)
|
|
25
25
|
from game.character import get_character
|
|
26
26
|
from game.decor import get_decor_element
|
|
27
|
-
from game.models import
|
|
27
|
+
from game.models import Attempt, Level, Workspace
|
|
28
28
|
from game.theme import get_theme
|
|
29
29
|
from game.views.language_code_conversions import language_code_dict
|
|
30
30
|
from game.views.level_solutions import solutions
|
|
31
|
+
|
|
31
32
|
from .helper import renderError
|
|
32
33
|
|
|
33
34
|
|
|
@@ -44,16 +45,30 @@ def play_custom_level(request, levelId, from_editor=False):
|
|
|
44
45
|
|
|
45
46
|
|
|
46
47
|
def play_default_level(request, level_name):
|
|
47
|
-
|
|
48
|
+
level_index = int(level_name)
|
|
49
|
+
if level_index > 79:
|
|
48
50
|
raise Http404
|
|
51
|
+
if (
|
|
52
|
+
level_index > 19
|
|
53
|
+
and not level_index in [29, 33, 44, 51, 61, 68]
|
|
54
|
+
and not request.user.is_authenticated
|
|
55
|
+
):
|
|
56
|
+
return redirect(reverse("levels"))
|
|
49
57
|
|
|
50
58
|
level = cached_default_level(level_name)
|
|
51
59
|
return play_level(request, level)
|
|
52
60
|
|
|
53
61
|
|
|
54
62
|
def play_default_python_level(request, level_name):
|
|
55
|
-
|
|
63
|
+
level_index = int(level_name)
|
|
64
|
+
if level_index > 49:
|
|
56
65
|
raise Http404
|
|
66
|
+
if (
|
|
67
|
+
level_index > 26
|
|
68
|
+
and not level_index in [41]
|
|
69
|
+
and not request.user.is_authenticated
|
|
70
|
+
):
|
|
71
|
+
return redirect(reverse("python_levels"))
|
|
57
72
|
|
|
58
73
|
levelId = int(level_name) + 1000
|
|
59
74
|
|
|
@@ -79,9 +94,7 @@ def _prev_level_url(level, user, night_mode, from_python_den):
|
|
|
79
94
|
if is_prev_level_locked:
|
|
80
95
|
while is_prev_level_locked and int(prev_level.name) > 1:
|
|
81
96
|
prev_level = prev_level.prev_level.all()[0]
|
|
82
|
-
is_prev_level_locked = (
|
|
83
|
-
klass in prev_level.locked_for_class.all()
|
|
84
|
-
)
|
|
97
|
+
is_prev_level_locked = klass in prev_level.locked_for_class.all()
|
|
85
98
|
|
|
86
99
|
return _level_url(prev_level, night_mode, from_python_den)
|
|
87
100
|
|
|
@@ -116,9 +129,7 @@ def _next_level_url(level, user, night_mode, from_python_den):
|
|
|
116
129
|
int(next_level.name) < 1050 if from_python_den else 80
|
|
117
130
|
):
|
|
118
131
|
next_level = next_level.next_level
|
|
119
|
-
is_next_level_locked = (
|
|
120
|
-
klass in next_level.locked_for_class.all()
|
|
121
|
-
)
|
|
132
|
+
is_next_level_locked = klass in next_level.locked_for_class.all()
|
|
122
133
|
|
|
123
134
|
return _level_url(next_level, night_mode, from_python_den)
|
|
124
135
|
|
|
@@ -139,9 +150,7 @@ def _level_url(level, night_mode, from_python_den):
|
|
|
139
150
|
|
|
140
151
|
|
|
141
152
|
def _default_level_url(level, from_python_den):
|
|
142
|
-
viewname =
|
|
143
|
-
"play_python_default_level" if from_python_den else "play_default_level"
|
|
144
|
-
)
|
|
153
|
+
viewname = "play_python_default_level" if from_python_den else "play_default_level"
|
|
145
154
|
|
|
146
155
|
level_name = int(level.name) - 1000 if from_python_den else level.name
|
|
147
156
|
|
|
@@ -173,9 +182,7 @@ def play_level(request, level, from_editor=False, from_python_den=False):
|
|
|
173
182
|
"""
|
|
174
183
|
|
|
175
184
|
night_mode = (
|
|
176
|
-
False
|
|
177
|
-
if not app_settings.NIGHT_MODE_FEATURE_ENABLED
|
|
178
|
-
else "night" in request.GET
|
|
185
|
+
False if not app_settings.NIGHT_MODE_FEATURE_ENABLED else "night" in request.GET
|
|
179
186
|
)
|
|
180
187
|
|
|
181
188
|
if not permissions.can_play_level(
|
|
@@ -198,9 +205,7 @@ def play_level(request, level, from_editor=False, from_python_den=False):
|
|
|
198
205
|
)
|
|
199
206
|
commands_attr = "commands_level" + str(level.name)
|
|
200
207
|
commands = (
|
|
201
|
-
getattr(messages, commands_attr, None)
|
|
202
|
-
if level.default
|
|
203
|
-
else level.commands
|
|
208
|
+
getattr(messages, commands_attr, None) if level.default else level.commands
|
|
204
209
|
)
|
|
205
210
|
character = level.character
|
|
206
211
|
character_url = character.top_down
|
|
@@ -224,9 +229,7 @@ def play_level(request, level, from_editor=False, from_python_den=False):
|
|
|
224
229
|
|
|
225
230
|
workspace = None
|
|
226
231
|
python_workspace = None
|
|
227
|
-
if not request.user.is_anonymous and hasattr(
|
|
228
|
-
request.user.userprofile, "student"
|
|
229
|
-
):
|
|
232
|
+
if not request.user.is_anonymous and hasattr(request.user.userprofile, "student"):
|
|
230
233
|
student = request.user.userprofile.student
|
|
231
234
|
attempt = (
|
|
232
235
|
Attempt.objects.filter(
|
|
@@ -265,9 +268,7 @@ def play_level(request, level, from_editor=False, from_python_den=False):
|
|
|
265
268
|
return_view = (
|
|
266
269
|
"level_editor"
|
|
267
270
|
if from_editor
|
|
268
|
-
else "python_levels"
|
|
269
|
-
if from_python_den
|
|
270
|
-
else "levels"
|
|
271
|
+
else "python_levels" if from_python_den else "levels"
|
|
271
272
|
)
|
|
272
273
|
|
|
273
274
|
temp_block_data = []
|
|
@@ -312,9 +313,7 @@ def play_level(request, level, from_editor=False, from_python_den=False):
|
|
|
312
313
|
"next_level_url": _next_level_url(
|
|
313
314
|
level, request.user, night_mode, from_python_den
|
|
314
315
|
),
|
|
315
|
-
"flip_night_mode_url": _level_url(
|
|
316
|
-
level, not night_mode, from_python_den
|
|
317
|
-
),
|
|
316
|
+
"flip_night_mode_url": _level_url(level, not night_mode, from_python_den),
|
|
318
317
|
"available_language_dict": language_code_dict,
|
|
319
318
|
},
|
|
320
319
|
)
|
|
@@ -403,9 +402,7 @@ def close_and_reset(attempt):
|
|
|
403
402
|
def load_list_of_workspaces(request):
|
|
404
403
|
workspaces_owned = []
|
|
405
404
|
if permissions.can_create_workspace(request.user):
|
|
406
|
-
workspaces_owned = Workspace.objects.filter(
|
|
407
|
-
owner=request.user.userprofile
|
|
408
|
-
)
|
|
405
|
+
workspaces_owned = Workspace.objects.filter(owner=request.user.userprofile)
|
|
409
406
|
|
|
410
407
|
workspaces = [
|
|
411
408
|
{
|
|
@@ -445,9 +442,7 @@ def save_workspace(request, workspaceID=None):
|
|
|
445
442
|
"python_enabled",
|
|
446
443
|
"python_view_enabled",
|
|
447
444
|
]
|
|
448
|
-
missing_params = [
|
|
449
|
-
param for param in request_params if param not in request.POST
|
|
450
|
-
]
|
|
445
|
+
missing_params = [param for param in request_params if param not in request.POST]
|
|
451
446
|
if missing_params != []:
|
|
452
447
|
raise Exception(
|
|
453
448
|
"Request missing the following required parameters", missing_params
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
Metadata-Version: 2.2
|
|
2
|
+
Name: rapid-router
|
|
3
|
+
Version: 7.4.1
|
|
4
|
+
Classifier: Programming Language :: Python
|
|
5
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
6
|
+
Classifier: Framework :: Django
|
|
7
|
+
License-File: LICENSE.md
|
|
8
|
+
Requires-Dist: asgiref==3.8.1; python_version >= "3.8"
|
|
9
|
+
Requires-Dist: asttokens==3.0.0; python_version >= "3.8"
|
|
10
|
+
Requires-Dist: certifi==2025.1.31; python_version >= "3.6"
|
|
11
|
+
Requires-Dist: cfl-common==8.4.5
|
|
12
|
+
Requires-Dist: charset-normalizer==3.4.1; python_version >= "3.7"
|
|
13
|
+
Requires-Dist: decorator==5.2.1; python_version >= "3.8"
|
|
14
|
+
Requires-Dist: diff-match-patch==20241021; python_version >= "3.7"
|
|
15
|
+
Requires-Dist: django==4.2.20; python_version >= "3.8"
|
|
16
|
+
Requires-Dist: django-countries==7.6.1
|
|
17
|
+
Requires-Dist: django-csp==3.8
|
|
18
|
+
Requires-Dist: django-formtools==2.5.1; python_version >= "3.8"
|
|
19
|
+
Requires-Dist: django-import-export==4.2.0; python_version >= "3.9"
|
|
20
|
+
Requires-Dist: django-otp==1.5.4; python_version >= "3.7"
|
|
21
|
+
Requires-Dist: django-phonenumber-field==8.0.0; python_version >= "3.8"
|
|
22
|
+
Requires-Dist: django-pipeline==3.1.0
|
|
23
|
+
Requires-Dist: django-reverse-js==0.1.7; python_version >= "3.10"
|
|
24
|
+
Requires-Dist: django-two-factor-auth==1.17.0; python_version >= "3.8"
|
|
25
|
+
Requires-Dist: djangorestframework==3.15.2; python_version >= "3.8"
|
|
26
|
+
Requires-Dist: executing==2.2.0; python_version >= "3.8"
|
|
27
|
+
Requires-Dist: idna==3.10; python_version >= "3.6"
|
|
28
|
+
Requires-Dist: ipython==9.0.2; python_version >= "3.11"
|
|
29
|
+
Requires-Dist: ipython-pygments-lexers==1.1.1; python_version >= "3.8"
|
|
30
|
+
Requires-Dist: jedi==0.19.2; python_version >= "3.6"
|
|
31
|
+
Requires-Dist: libsass==0.23.0; python_version >= "3.8"
|
|
32
|
+
Requires-Dist: matplotlib-inline==0.1.7; python_version >= "3.8"
|
|
33
|
+
Requires-Dist: more-itertools==8.7.0; python_version >= "3.5"
|
|
34
|
+
Requires-Dist: numpy==2.2.3; python_version >= "3.10"
|
|
35
|
+
Requires-Dist: pandas==2.2.3; python_version >= "3.9"
|
|
36
|
+
Requires-Dist: parso==0.8.4; python_version >= "3.6"
|
|
37
|
+
Requires-Dist: pexpect==4.9.0; sys_platform != "win32" and sys_platform != "emscripten"
|
|
38
|
+
Requires-Dist: pgeocode==0.4.0; python_version >= "3.8"
|
|
39
|
+
Requires-Dist: prompt-toolkit==3.0.50; python_full_version >= "3.8.0"
|
|
40
|
+
Requires-Dist: ptyprocess==0.7.0
|
|
41
|
+
Requires-Dist: pure-eval==0.2.3
|
|
42
|
+
Requires-Dist: pygments==2.19.1; python_version >= "3.8"
|
|
43
|
+
Requires-Dist: pyhamcrest==2.0.2; python_version >= "3.5"
|
|
44
|
+
Requires-Dist: pyjwt==2.6.0; python_version >= "3.7"
|
|
45
|
+
Requires-Dist: pypng==0.20220715.0
|
|
46
|
+
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"
|
|
47
|
+
Requires-Dist: pytz==2025.1
|
|
48
|
+
Requires-Dist: qrcode==7.4.2; python_version >= "3.7"
|
|
49
|
+
Requires-Dist: requests==2.32.3; python_version >= "3.8"
|
|
50
|
+
Requires-Dist: six==1.17.0; python_version >= "2.7" and python_version not in "3.0, 3.1, 3.2, 3.3"
|
|
51
|
+
Requires-Dist: sqlparse==0.5.3; python_version >= "3.8"
|
|
52
|
+
Requires-Dist: stack-data==0.6.3
|
|
53
|
+
Requires-Dist: tablib==3.7.0; python_version >= "3.9"
|
|
54
|
+
Requires-Dist: traitlets==5.14.3; python_version >= "3.8"
|
|
55
|
+
Requires-Dist: typing-extensions==4.12.2; python_version >= "3.8"
|
|
56
|
+
Requires-Dist: tzdata==2025.1; python_version >= "2"
|
|
57
|
+
Requires-Dist: urllib3==2.3.0; python_version >= "3.9"
|
|
58
|
+
Requires-Dist: wcwidth==0.2.13
|
|
59
|
+
Provides-Extra: dev
|
|
60
|
+
Requires-Dist: asgiref==3.8.1; python_version >= "3.8" and extra == "dev"
|
|
61
|
+
Requires-Dist: attrs==25.3.0; python_version >= "3.8" and extra == "dev"
|
|
62
|
+
Requires-Dist: black==25.1.0; python_version >= "3.9" and extra == "dev"
|
|
63
|
+
Requires-Dist: certifi==2025.1.31; python_version >= "3.6" and extra == "dev"
|
|
64
|
+
Requires-Dist: cfl-common==8.4.5; extra == "dev"
|
|
65
|
+
Requires-Dist: chardet==5.2.0; python_version >= "3.7" and extra == "dev"
|
|
66
|
+
Requires-Dist: charset-normalizer==3.4.1; python_version >= "3.7" and extra == "dev"
|
|
67
|
+
Requires-Dist: click==8.1.8; python_version >= "3.7" and extra == "dev"
|
|
68
|
+
Requires-Dist: codeforlife-portal==8.4.5; extra == "dev"
|
|
69
|
+
Requires-Dist: diff-match-patch==20241021; python_version >= "3.7" and extra == "dev"
|
|
70
|
+
Requires-Dist: django==4.2.20; python_version >= "3.8" and extra == "dev"
|
|
71
|
+
Requires-Dist: django-classy-tags==4.1.0; python_version >= "3.8" and extra == "dev"
|
|
72
|
+
Requires-Dist: django-countries==7.6.1; extra == "dev"
|
|
73
|
+
Requires-Dist: django-csp==3.8; extra == "dev"
|
|
74
|
+
Requires-Dist: django-formtools==2.5.1; python_version >= "3.8" and extra == "dev"
|
|
75
|
+
Requires-Dist: django-import-export==4.2.0; python_version >= "3.9" and extra == "dev"
|
|
76
|
+
Requires-Dist: django-otp==1.5.4; python_version >= "3.7" and extra == "dev"
|
|
77
|
+
Requires-Dist: django-phonenumber-field==8.0.0; python_version >= "3.8" and extra == "dev"
|
|
78
|
+
Requires-Dist: django-pipeline==3.1.0; extra == "dev"
|
|
79
|
+
Requires-Dist: django-preventconcurrentlogins==0.8.2; extra == "dev"
|
|
80
|
+
Requires-Dist: django-ratelimit==3.0.1; python_version >= "3.4" and extra == "dev"
|
|
81
|
+
Requires-Dist: django-recaptcha==4.0.0; extra == "dev"
|
|
82
|
+
Requires-Dist: django-sekizai==4.1.0; python_version >= "3.8" and extra == "dev"
|
|
83
|
+
Requires-Dist: django-selenium-clean==1.0.1; extra == "dev"
|
|
84
|
+
Requires-Dist: django-test-migrations==1.4.0; (python_version >= "3.9" and python_version < "4.0") and extra == "dev"
|
|
85
|
+
Requires-Dist: django-treebeard==4.7.1; python_version >= "3.8" and extra == "dev"
|
|
86
|
+
Requires-Dist: django-two-factor-auth==1.17.0; python_version >= "3.8" and extra == "dev"
|
|
87
|
+
Requires-Dist: djangorestframework==3.15.2; python_version >= "3.8" and extra == "dev"
|
|
88
|
+
Requires-Dist: execnet==2.1.1; python_version >= "3.8" and extra == "dev"
|
|
89
|
+
Requires-Dist: h11==0.14.0; python_version >= "3.7" and extra == "dev"
|
|
90
|
+
Requires-Dist: idna==3.10; python_version >= "3.6" and extra == "dev"
|
|
91
|
+
Requires-Dist: importlib-metadata==4.13.0; python_version >= "3.7" and extra == "dev"
|
|
92
|
+
Requires-Dist: iniconfig==2.0.0; python_version >= "3.7" and extra == "dev"
|
|
93
|
+
Requires-Dist: isort==6.0.1; python_full_version >= "3.9.0" and extra == "dev"
|
|
94
|
+
Requires-Dist: libsass==0.23.0; python_version >= "3.8" and extra == "dev"
|
|
95
|
+
Requires-Dist: more-itertools==8.7.0; python_version >= "3.5" and extra == "dev"
|
|
96
|
+
Requires-Dist: mypy-extensions==1.0.0; python_version >= "3.5" and extra == "dev"
|
|
97
|
+
Requires-Dist: numpy==2.2.3; python_version >= "3.10" and extra == "dev"
|
|
98
|
+
Requires-Dist: outcome==1.3.0.post0; python_version >= "3.7" and extra == "dev"
|
|
99
|
+
Requires-Dist: packaging==24.2; python_version >= "3.8" and extra == "dev"
|
|
100
|
+
Requires-Dist: pandas==2.2.3; python_version >= "3.9" and extra == "dev"
|
|
101
|
+
Requires-Dist: pathspec==0.12.1; python_version >= "3.8" and extra == "dev"
|
|
102
|
+
Requires-Dist: pgeocode==0.4.0; python_version >= "3.8" and extra == "dev"
|
|
103
|
+
Requires-Dist: phonenumbers==8.12.12; extra == "dev"
|
|
104
|
+
Requires-Dist: pillow==11.1.0; python_version >= "3.9" and extra == "dev"
|
|
105
|
+
Requires-Dist: platformdirs==4.3.6; python_version >= "3.8" and extra == "dev"
|
|
106
|
+
Requires-Dist: pluggy==1.5.0; python_version >= "3.8" and extra == "dev"
|
|
107
|
+
Requires-Dist: pyjwt==2.6.0; python_version >= "3.7" and extra == "dev"
|
|
108
|
+
Requires-Dist: pypng==0.20220715.0; extra == "dev"
|
|
109
|
+
Requires-Dist: pysocks==1.7.1; extra == "dev"
|
|
110
|
+
Requires-Dist: pytest==8.3.5; python_version >= "3.8" and extra == "dev"
|
|
111
|
+
Requires-Dist: pytest-django==4.8.0; python_version >= "3.8" and extra == "dev"
|
|
112
|
+
Requires-Dist: pytest-order==1.3.0; python_version >= "3.7" and extra == "dev"
|
|
113
|
+
Requires-Dist: pytest-xdist==3.6.1; python_version >= "3.8" and extra == "dev"
|
|
114
|
+
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"
|
|
115
|
+
Requires-Dist: pytz==2025.1; extra == "dev"
|
|
116
|
+
Requires-Dist: pyyaml==6.0.2; python_version >= "3.8" and extra == "dev"
|
|
117
|
+
Requires-Dist: qrcode==7.4.2; python_version >= "3.7" and extra == "dev"
|
|
118
|
+
Requires-Dist: reportlab==4.2.5; (python_version >= "3.7" and python_version < "4") and extra == "dev"
|
|
119
|
+
Requires-Dist: requests==2.32.3; python_version >= "3.8" and extra == "dev"
|
|
120
|
+
Requires-Dist: selenium==4.29.0; python_version >= "3.9" and extra == "dev"
|
|
121
|
+
Requires-Dist: setuptools==74.0.0; python_version >= "3.8" and extra == "dev"
|
|
122
|
+
Requires-Dist: six==1.17.0; (python_version >= "2.7" and python_version not in "3.0, 3.1, 3.2, 3.3") and extra == "dev"
|
|
123
|
+
Requires-Dist: sniffio==1.3.1; python_version >= "3.7" and extra == "dev"
|
|
124
|
+
Requires-Dist: sortedcontainers==2.4.0; extra == "dev"
|
|
125
|
+
Requires-Dist: sqlparse==0.5.3; python_version >= "3.8" and extra == "dev"
|
|
126
|
+
Requires-Dist: tablib==3.7.0; python_version >= "3.9" and extra == "dev"
|
|
127
|
+
Requires-Dist: trio==0.29.0; python_version >= "3.9" and extra == "dev"
|
|
128
|
+
Requires-Dist: trio-websocket==0.12.2; python_version >= "3.8" and extra == "dev"
|
|
129
|
+
Requires-Dist: typing-extensions==4.12.2; python_version >= "3.8" and extra == "dev"
|
|
130
|
+
Requires-Dist: tzdata==2025.1; python_version >= "2" and extra == "dev"
|
|
131
|
+
Requires-Dist: urllib3==2.3.0; python_version >= "3.9" and extra == "dev"
|
|
132
|
+
Requires-Dist: websocket-client==1.8.0; python_version >= "3.8" and extra == "dev"
|
|
133
|
+
Requires-Dist: wsproto==1.2.0; python_full_version >= "3.7.0" and extra == "dev"
|
|
134
|
+
Requires-Dist: zipp==3.21.0; python_version >= "3.9" and extra == "dev"
|
|
135
|
+
Dynamic: classifier
|
|
136
|
+
Dynamic: provides-extra
|
|
137
|
+
Dynamic: requires-dist
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
example_project/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
-
example_project/
|
|
3
|
-
example_project/
|
|
4
|
-
example_project/settings.py,sha256=C2zbYTDuH02cTOR3SK036oFJjba_EdJfDJ4kyOLWhHE,4140
|
|
2
|
+
example_project/rapid_router_test_settings.py,sha256=zeun7ZbgaIko7lKoBFyY0JBSNLfVA7xEZeNAgThT8GU,4628
|
|
3
|
+
example_project/settings.py,sha256=LlpNO365iqVvWz7PlFOXDwqrE1OEnLSSnSaXd7x5caE,4172
|
|
5
4
|
example_project/urls.py,sha256=XHug_cpNy21yOef3E1-wWT5VkTuxpl6ZXIlCj6jDjWA,422
|
|
6
5
|
example_project/wsgi.py,sha256=U1W6WzZxZaIdYZ5tks7w9fqp5WS5qvn2iThsVcskrWw,829
|
|
7
|
-
game/__init__.py,sha256=
|
|
6
|
+
game/__init__.py,sha256=p8eq7jnQadKhC-wWoeEv-nRdPB1JN2Jan_o-R14Xz9w,22
|
|
8
7
|
game/admin.py,sha256=BLwwaqQYuqmMdwqnvhdan19iGxdcoBX4CXFk_ROG5-M,1431
|
|
9
8
|
game/app_settings.py,sha256=mlg-1AiP7AR5JNOHAXXLuCrYWaZMmSihvSYk9c2c8YY,857
|
|
10
9
|
game/cache.py,sha256=dtOiFl6Z4I2Q9-8Hz24ZI-5C0asXYSQhF2Be5q74N8g,2227
|
|
@@ -30,10 +29,10 @@ game/end_to_end_tests/test_cow_crashes.py,sha256=Jlcc1Pp5wdAOZNeC3Umndk7XqVklfGr
|
|
|
30
29
|
game/end_to_end_tests/test_language_dropdown.py,sha256=bolZ8CdJh7upYnErumn7ZewgWIiNXsyaItA5j5QHxY8,576
|
|
31
30
|
game/end_to_end_tests/test_level_editor.py,sha256=NKvNCYReli7B5YSlJ9rdeoqqN81wNyY9DS-0tvHhWoU,11932
|
|
32
31
|
game/end_to_end_tests/test_level_failures.py,sha256=kTNX6IgZ_QQBViA123TxfUlvOQbARPh_zRzeWQCXwCg,2670
|
|
33
|
-
game/end_to_end_tests/test_level_selection.py,sha256
|
|
32
|
+
game/end_to_end_tests/test_level_selection.py,sha256=-xSwbECw2cpQ9m7XvelAKm1GvGWECuMVWbg6WX4P7Ms,3068
|
|
34
33
|
game/end_to_end_tests/test_level_win.py,sha256=E0o2UABNKyI8n8Zg8JWuQZ9YaY0MS4dDos_Qdelj_-w,419
|
|
35
34
|
game/end_to_end_tests/test_play_through.py,sha256=lIOkuYfJSiYSe9UegAICkvHBCG8OXE3-NhvwRLOe7qo,13744
|
|
36
|
-
game/end_to_end_tests/test_python_levels.py,sha256=
|
|
35
|
+
game/end_to_end_tests/test_python_levels.py,sha256=BBlgWFhKjhyDUTyZDUComNt9SCuxJkvdVh4WRA2w0vg,2490
|
|
37
36
|
game/end_to_end_tests/test_regressions.py,sha256=kQwK3EVSvAxalEI-e3rYFegmyAqc4bU7PWGjces3SeM,352
|
|
38
37
|
game/end_to_end_tests/test_saving_workspace.py,sha256=tmNfZH74TyrSGxnUJYwOdlxZu_7nHa1UwNtJYsI4sPg,600
|
|
39
38
|
game/end_to_end_tests/test_turning_around.py,sha256=Q0jG-aur5bK_qAfNDePMDaObSsK-VzSYCLb_UKWgHO4,613
|
|
@@ -766,9 +765,9 @@ game/templates/game/error.html,sha256=pu_WX5DtctmhD2enf5rC--Uys_7NOPtndsYKSOF08M
|
|
|
766
765
|
game/templates/game/game.html,sha256=3Bdh7SKDTcSP6CXW1Et2q9Igb3Ml6Ld8TDRcOAKc0-U,30479
|
|
767
766
|
game/templates/game/level_editor.html,sha256=k8ogNMI8CUuwcTWfZvoURsTkjDwicC-oZyYb7u9Nvs0,29216
|
|
768
767
|
game/templates/game/level_moderation.html,sha256=6JOutcJd9ZkkBppF4pKXdH5Q8dZpC2n1SUMHp7vVrEE,7299
|
|
769
|
-
game/templates/game/level_selection.html,sha256=
|
|
768
|
+
game/templates/game/level_selection.html,sha256=zDh59c8nE_T_tE3bvTwlxn96psYu0rROWdihMtcdNJI,11156
|
|
770
769
|
game/templates/game/logged_students.html,sha256=WBTwdNb5YGopLdog7-vNDc9WO5_u8pqi3ehG12g8VOM,1471
|
|
771
|
-
game/templates/game/python_den_level_selection.html,sha256=
|
|
770
|
+
game/templates/game/python_den_level_selection.html,sha256=Tzqxk6qfxjS5NnwUEeVvQ36TAKS818tQPhFT8J5DhHs,21549
|
|
772
771
|
game/templates/game/scoreboard.html,sha256=Tveheh6bC9VxuMH6o1EmmBHX6Ic_lChtU38f7EurkPc,16113
|
|
773
772
|
game/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
774
773
|
game/templatetags/game/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -794,15 +793,15 @@ game/views/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
|
794
793
|
game/views/api.py,sha256=j5Qwabpj0x9oJJ5iHhgGKeJ1RcHZgR5-eg3VGHPCyjE,8994
|
|
795
794
|
game/views/helper.py,sha256=SR11w5rpshwSvC7v5dDFazTrH-Vpn9gOe93OLpwrVlE,548
|
|
796
795
|
game/views/language_code_conversions.py,sha256=oaBqaPd5n1a4XmD1UWacpKrFYZ8Gk6CDII9sTrLDQDM,2590
|
|
797
|
-
game/views/level.py,sha256=
|
|
796
|
+
game/views/level.py,sha256=8Z5ZXnspK5Bnhy8-BeVt_Evf2JSSrRklGO7Fw3W78BA,16887
|
|
798
797
|
game/views/level_editor.py,sha256=uvR-cYxb6zWUEN2kH6ZfmcaFEb6XilgARFKyRMsyIq4,18130
|
|
799
798
|
game/views/level_moderation.py,sha256=GwnvXlHRxGNjgjr3pcCCmnxCHEX4UCJlsGw2VA6rncA,5303
|
|
800
799
|
game/views/level_selection.py,sha256=UI345nDv5iTRQ7VttiLKLzezJlaSlaKOnhlALZgMU9Q,9896
|
|
801
800
|
game/views/level_solutions.py,sha256=lfwLFvw4gFuptTkL2J_ibhnuiysl3Yao15sn2qoQlcE,97194
|
|
802
801
|
game/views/scoreboard.py,sha256=Lxy7XtoG7VwWpTb-c22BGC6eN8uCmmOnQ2qjY-oXA3k,16914
|
|
803
802
|
game/views/scoreboard_csv.py,sha256=yx4tOwx5QsHyU1S1BUPUqRBWIh5idq8QVtBID-NqZto,1768
|
|
804
|
-
rapid_router-7.
|
|
805
|
-
rapid_router-7.
|
|
806
|
-
rapid_router-7.
|
|
807
|
-
rapid_router-7.
|
|
808
|
-
rapid_router-7.
|
|
803
|
+
rapid_router-7.4.1.dist-info/LICENSE.md,sha256=9AbRlCDqD2D1tPibimysFv3zg3AIc49-eyv9aEsyq9w,115
|
|
804
|
+
rapid_router-7.4.1.dist-info/METADATA,sha256=jWhYqNT69zBY9_mqCQ4ci8ybYw9bWuh3GadI-fAXBbQ,8875
|
|
805
|
+
rapid_router-7.4.1.dist-info/WHEEL,sha256=SrDKpSbFN1G94qcmBqS9nyHcDMp9cUS9OC06hC0G3G0,109
|
|
806
|
+
rapid_router-7.4.1.dist-info/top_level.txt,sha256=rKP4ryr1t8Wcnx8grJHDViM3T5cMYH_0vygDjC04ArA,21
|
|
807
|
+
rapid_router-7.4.1.dist-info/RECORD,,
|
example_project/manage.py
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.1
|
|
2
|
-
Name: rapid-router
|
|
3
|
-
Version: 7.3.6
|
|
4
|
-
Classifier: Programming Language :: Python
|
|
5
|
-
Classifier: Programming Language :: Python :: 3.12
|
|
6
|
-
Classifier: Framework :: Django
|
|
7
|
-
License-File: LICENSE.md
|
|
8
|
-
Requires-Dist: django-reverse-js==0.1.7
|
|
9
|
-
Requires-Dist: pyhamcrest==2.0.2
|
|
10
|
-
|
|
File without changes
|
|
File without changes
|