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.
@@ -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",
@@ -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.3.6"
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(40, True)
72
- next_button = self.selenium.find_element(By.ID, "next_button")
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 in"
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(49, from_python_den=True).run_invalid_import_program()
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 render, get_object_or_404
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 Level, Attempt, Workspace
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
- if int(level_name) > 79:
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
- if int(level_name) > 49:
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/manage.py,sha256=EUgybZlZ7xk2Zf2KCwBbK_z7gf7Ifqs0_bl4Kijhdgo,242
3
- example_project/rapid_router_test_settings.py,sha256=4ua6hGNWuOyXByHl9pvtQLT80MINdC5HEBCaUszz-0c,4596
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=ZsMhJqnIOQKtmOKX41ubrMNGyCdjCp-Y35rdkDD09aE,22
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=lvvRyRnbrL-HyDLzy-YaU6P_hgzyEE5_uDhHmfnTkAU,3351
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=JiuYAW2N2bRhiTowK8ag6tTs__xW_MxdzkFgou8Ny8I,2491
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=vTOPRycje4WPAbgEgGevilaIFeumXqqWPWQUBmuBmO4,10423
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=ST4enRPjNNnemLAzYWDQUCZjxcbjz8oS0vuZhMerV30,20834
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=w36Vz1lGY7Q15SFRihsBxFJWjAvyuJ2S1v8oROCfnG4,16681
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.3.6.dist-info/LICENSE.md,sha256=9AbRlCDqD2D1tPibimysFv3zg3AIc49-eyv9aEsyq9w,115
805
- rapid_router-7.3.6.dist-info/METADATA,sha256=fAJ5xO44NaOld6IbEwulm3xVKJIgbZJlE-kbD0ldsfA,281
806
- rapid_router-7.3.6.dist-info/WHEEL,sha256=WDDPHYzpiOIm6GP1C2_8y8W6q16ICddAgOHlhTje9Qc,109
807
- rapid_router-7.3.6.dist-info/top_level.txt,sha256=rKP4ryr1t8Wcnx8grJHDViM3T5cMYH_0vygDjC04ArA,21
808
- rapid_router-7.3.6.dist-info/RECORD,,
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (74.0.0)
2
+ Generator: setuptools (76.0.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py2-none-any
5
5
  Tag: py3-none-any
example_project/manage.py DELETED
@@ -1,10 +0,0 @@
1
- #!/usr/bin/env python
2
- import os
3
- import sys
4
-
5
- if __name__ == "__main__":
6
- os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
7
-
8
- from django.core.management import execute_from_command_line
9
-
10
- execute_from_command_line(sys.argv)
@@ -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
-