rapid-router 5.18.0__py2.py3-none-any.whl → 7.6.8__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.
Files changed (170) hide show
  1. example_project/rapid_router_test_settings.py +19 -7
  2. example_project/settings.py +21 -8
  3. example_project/urls.py +5 -6
  4. game/__init__.py +1 -1
  5. game/admin.py +7 -2
  6. game/character.py +8 -0
  7. game/decor.py +40 -0
  8. game/end_to_end_tests/base_game_test.py +34 -27
  9. game/end_to_end_tests/editor_page.py +15 -0
  10. game/end_to_end_tests/game_page.py +88 -20
  11. game/end_to_end_tests/selenium_test_case.py +1 -20
  12. game/end_to_end_tests/test_cow_crashes.py +3 -5
  13. game/end_to_end_tests/test_level_editor.py +273 -10
  14. game/end_to_end_tests/test_level_selection.py +25 -3
  15. game/end_to_end_tests/test_play_through.py +222 -127
  16. game/end_to_end_tests/test_python_levels.py +41 -7
  17. game/end_to_end_tests/test_saving_workspace.py +2 -1
  18. game/forms.py +7 -1
  19. game/level_management.py +26 -11
  20. game/messages.py +899 -337
  21. game/migrations/0001_squashed_0025_levels_ordering_pt1.py +19 -1
  22. game/migrations/0026_levels_pt2.py +13 -2
  23. game/migrations/0032_cannot_turn_left_level.py +13 -2
  24. game/migrations/0033_recursion_level.py +13 -2
  25. game/migrations/0034_joes_level.py +13 -2
  26. game/migrations/0035_disable_route_score_level_70.py +0 -2
  27. game/migrations/0036_level_score_73.py +0 -2
  28. game/migrations/0037_level_score_79.py +0 -2
  29. game/migrations/0038_level_score_40.py +0 -1
  30. game/migrations/0042_level_score_73.py +0 -2
  31. game/migrations/0048_add_cow_field_and_blocks.py +0 -2
  32. game/migrations/0049_level_score_34.py +0 -2
  33. game/migrations/0050_level_score_40.py +0 -2
  34. game/migrations/0051_level_score_49.py +0 -1
  35. game/migrations/0086_loop_levels.py +13 -2
  36. game/migrations/0092_disable_algo_score_in_custom_levels.py +28 -0
  37. game/migrations/0093_alter_level_character_name.py +18 -0
  38. game/migrations/0094_add_hint_lesson_subtitle_to_levels.py +28 -0
  39. game/migrations/0095_level_commands.py +18 -0
  40. game/migrations/0096_alter_level_commands.py +18 -0
  41. game/migrations/0097_add_python_den_levels.py +1515 -0
  42. game/migrations/0098_add_episode_link_fields.py +44 -0
  43. game/migrations/0099_python_episodes_links.py +103 -0
  44. game/migrations/0100_reorder_python_levels.py +179 -0
  45. game/migrations/0101_rename_episodes.py +45 -0
  46. game/migrations/0102_reoder_episodes_13_14.py +136 -0
  47. game/migrations/0103_level_1015_solution.py +26 -0
  48. game/migrations/0104_remove_level_direct_drive.py +17 -0
  49. game/migrations/0105_delete_invalid_attempts.py +18 -0
  50. game/migrations/0106_fields_to_snake_case.py +48 -0
  51. game/migrations/0107_rename_worksheet_link_episode_student_worksheet_link.py +18 -0
  52. game/migrations/0108_episode_indy_worksheet_link.py +18 -0
  53. game/migrations/0109_create_episodes_23_and_24.py +99 -0
  54. game/migrations/0110_remove_episode_indy_worksheet_link_and_more.py +100 -0
  55. game/migrations/0111_create_worksheets.py +149 -0
  56. game/migrations/0112_worksheet_locked_classes.py +21 -0
  57. game/migrations/0113_level_needs_approval.py +18 -0
  58. game/migrations/0114_default_and_non_student_levels_no_approval.py +31 -0
  59. game/migrations/0115_level_level__default_does_not_need_approval.py +22 -0
  60. game/migrations/0116_update_worksheet_video_links.py +68 -0
  61. game/migrations/0117_update_solutions_to_if_else.py +61 -0
  62. game/models.py +127 -17
  63. game/permissions.py +51 -19
  64. game/python_den_urls.py +26 -0
  65. game/random_road.py +9 -9
  66. game/serializers.py +12 -17
  67. game/static/django_reverse_js/js/reverse.js +171 -0
  68. game/static/game/css/LilitaOne-Regular.ttf +0 -0
  69. game/static/game/css/backgrounds.css +8 -12
  70. game/static/game/css/dataTables.custom.css +3 -2
  71. game/static/game/css/editor.css +47 -0
  72. game/static/game/css/game.css +37 -43
  73. game/static/game/css/game_screen.css +16 -0
  74. game/static/game/css/level_editor.css +5 -0
  75. game/static/game/css/level_selection.css +17 -2
  76. game/static/game/image/Python_Den_hero_student.png +0 -0
  77. game/static/game/image/Python_levels_page.svg +1954 -0
  78. game/static/game/image/characters/front_view/Electric_van.svg +448 -0
  79. game/static/game/image/characters/top_view/Electric_van.svg +448 -0
  80. game/static/game/image/decor/city/solar_panel.svg +1200 -0
  81. game/static/game/image/decor/farm/solar_panel.svg +86 -0
  82. game/static/game/image/decor/grass/solar_panel.svg +86 -0
  83. game/static/game/image/decor/snow/solar_panel.svg +173 -0
  84. game/static/game/image/electric_van.svg +448 -0
  85. game/static/game/image/icons/description.svg +1 -0
  86. game/static/game/image/icons/hint.svg +1 -0
  87. game/static/game/image/icons/python.svg +1 -1
  88. game/static/game/image/pigeon.svg +684 -0
  89. game/static/game/image/python_den_header.svg +19 -0
  90. game/static/game/js/animation.js +65 -24
  91. game/static/game/js/blockly/msg/js/bg.js +52 -1
  92. game/static/game/js/blockly/msg/js/ca.js +52 -1
  93. game/static/game/js/blockly/msg/js/en-gb.js +2 -0
  94. game/static/game/js/blockly/msg/js/en.js +2 -0
  95. game/static/game/js/blockly/msg/js/es.js +52 -1
  96. game/static/game/js/blockly/msg/js/fr.js +2 -0
  97. game/static/game/js/blockly/msg/js/hi.js +2 -0
  98. game/static/game/js/blockly/msg/js/it.js +52 -1
  99. game/static/game/js/blockly/msg/js/pl.js +52 -1
  100. game/static/game/js/blockly/msg/js/pt-br.js +52 -1
  101. game/static/game/js/blockly/msg/js/ru.js +52 -1
  102. game/static/game/js/blockly/msg/js/ur.js +52 -1
  103. game/static/game/js/blocklyCustomBlocks.js +93 -52
  104. game/static/game/js/button.js +12 -0
  105. game/static/game/js/cow.js +11 -7
  106. game/static/game/js/drawing.js +68 -29
  107. game/static/game/js/editor.js +23 -0
  108. game/static/game/js/game.js +74 -110
  109. game/static/game/js/level_editor.js +646 -274
  110. game/static/game/js/level_moderation.js +33 -2
  111. game/static/game/js/level_selection.js +1 -1
  112. game/static/game/js/loadLanguages.js +2 -2
  113. game/static/game/js/model.js +32 -2
  114. game/static/game/js/pythonControl.js +14 -1
  115. game/static/game/js/scoreboard.js +0 -37
  116. game/static/game/js/scoreboardSharedLevels.js +48 -0
  117. game/static/game/js/skulpt/skulpt-stdlib.js +1 -1
  118. game/static/game/js/sound.js +52 -5
  119. game/static/game/raphael_image/characters/top_view/Electric_van.svg +448 -0
  120. game/static/game/raphael_image/decor/city/solar_panel.svg +1200 -0
  121. game/static/game/raphael_image/decor/farm/solar_panel.svg +86 -0
  122. game/static/game/raphael_image/decor/grass/solar_panel.svg +86 -0
  123. game/static/game/raphael_image/decor/snow/solar_panel.svg +173 -0
  124. game/static/game/raphael_image/pigeon.svg +685 -0
  125. game/static/game/sass/game.scss +2 -2
  126. game/static/game/sound/clown_horn.mp3 +0 -0
  127. game/static/game/sound/clown_horn.ogg +0 -0
  128. game/static/game/sound/electric_van_starting.mp3 +0 -0
  129. game/static/game/sound/electric_van_starting.ogg +0 -0
  130. game/static/game/sound/pigeon.mp3 +0 -0
  131. game/static/game/sound/pigeon.ogg +0 -0
  132. game/static/game/sound/sleigh_bells.mp3 +0 -0
  133. game/static/game/sound/sleigh_bells.ogg +0 -0
  134. game/static/game/sound/sleigh_crash.mp3 +0 -0
  135. game/static/game/sound/sleigh_crash.ogg +0 -0
  136. game/templates/game/base.html +34 -14
  137. game/templates/game/basenonav.html +11 -5
  138. game/templates/game/game.html +142 -38
  139. game/templates/game/level_editor.html +340 -236
  140. game/templates/game/level_moderation.html +19 -6
  141. game/templates/game/level_selection.html +18 -110
  142. game/templates/game/python_den_level_selection.html +291 -0
  143. game/templates/game/python_den_worksheet.html +101 -0
  144. game/templates/game/scoreboard.html +83 -64
  145. game/tests/test_level_editor.py +94 -26
  146. game/tests/test_level_selection.py +149 -46
  147. game/tests/test_python_den_worksheet.py +85 -0
  148. game/tests/test_scoreboard.py +34 -7
  149. game/tests/utils/level.py +32 -26
  150. game/theme.py +5 -5
  151. game/urls.py +199 -61
  152. game/views/language_code_conversions.py +86 -86
  153. game/views/level.py +155 -63
  154. game/views/level_editor.py +88 -55
  155. game/views/level_moderation.py +23 -0
  156. game/views/level_selection.py +116 -47
  157. game/views/level_solutions.py +491 -106
  158. game/views/scoreboard.py +76 -51
  159. game/views/worksheet.py +25 -0
  160. rapid_router-7.6.8.dist-info/METADATA +174 -0
  161. {rapid_router-5.18.0.dist-info → rapid_router-7.6.8.dist-info}/RECORD +164 -104
  162. {rapid_router-5.18.0.dist-info → rapid_router-7.6.8.dist-info}/WHEEL +1 -1
  163. example_project/manage.py +0 -10
  164. game/static/game/image/actions/go.svg +0 -18
  165. game/static/game/js/js-reverse.js +0 -14
  166. game/static/game/js/pqselect.min.js +0 -9
  167. game/static/game/js/widget-scroller.js +0 -906
  168. rapid_router-5.18.0.dist-info/METADATA +0 -17
  169. {rapid_router-5.18.0.dist-info → rapid_router-7.6.8.dist-info/licenses}/LICENSE.md +0 -0
  170. {rapid_router-5.18.0.dist-info → rapid_router-7.6.8.dist-info}/top_level.txt +0 -0
@@ -4,7 +4,7 @@ from builtins import range
4
4
  from django.db import models, migrations
5
5
  from django.conf import settings
6
6
  import json
7
- from game.level_management import set_decor_inner, set_blocks_inner
7
+ from game.level_management import set_blocks_inner
8
8
 
9
9
 
10
10
  # Functions from the following migrations need manual copying.
@@ -2527,6 +2527,21 @@ def delete_old_limit_level(apps, schema_editor):
2527
2527
  old_limit_level.delete()
2528
2528
 
2529
2529
 
2530
+ def set_decor_inner(level, decor, LevelDecor):
2531
+ """Helper method creating LevelDecor objects given a list of decor in dictionary form."""
2532
+ LevelDecor.objects.filter(level=level).delete()
2533
+
2534
+ level_decors = []
2535
+ for data in decor:
2536
+ level_decors.append(
2537
+ LevelDecor(
2538
+ level_id=level.id, x=data["x"], y=data["y"], decorName=data[
2539
+ "decorName"]
2540
+ )
2541
+ )
2542
+ LevelDecor.objects.bulk_create(level_decors)
2543
+
2544
+
2530
2545
  # Add episode 7 to 9
2531
2546
  # Add levels 62, 51, 59, 57, 60, 61, 70
2532
2547
  def add_episode_7_to_9(apps, schema_editor):
@@ -2874,6 +2889,7 @@ def add_episode_7_to_9(apps, schema_editor):
2874
2889
  level59.save()
2875
2890
 
2876
2891
  episode9 = Episode(
2892
+ pk=9,
2877
2893
  name="Blockly Brain Teasers",
2878
2894
  first_level=level68,
2879
2895
  r_branchiness=0.5,
@@ -3555,6 +3571,7 @@ def add_levels_80_to_107(apps, schema_editor):
3555
3571
  count += 1
3556
3572
 
3557
3573
  blocklyAndPythonEpisode = Episode(
3574
+ pk=10,
3558
3575
  name="Introduction to Python",
3559
3576
  first_level=level80,
3560
3577
  r_branchiness=0.5,
@@ -3569,6 +3586,7 @@ def add_levels_80_to_107(apps, schema_editor):
3569
3586
  blocklyAndPythonEpisode.save()
3570
3587
 
3571
3588
  pythonOnlyEpisode = Episode(
3589
+ pk=11,
3572
3590
  name="Python",
3573
3591
  first_level=level100,
3574
3592
  r_branchiness=0.5,
@@ -1,7 +1,7 @@
1
1
  from __future__ import unicode_literals
2
2
 
3
3
  from django.db import migrations
4
- from game.level_management import set_decor_inner, set_blocks_inner
4
+ from game.level_management import set_blocks_inner
5
5
  import json
6
6
 
7
7
 
@@ -13,7 +13,18 @@ def change_levels(apps, schema_editor):
13
13
  Block = apps.get_model("game", "Block")
14
14
 
15
15
  def set_decor(level, decor):
16
- set_decor_inner(level, decor, LevelDecor)
16
+ """Helper method creating LevelDecor objects given a list of decor in dictionary form."""
17
+ LevelDecor.objects.filter(level=level).delete()
18
+
19
+ level_decors = []
20
+ for data in decor:
21
+ level_decors.append(
22
+ LevelDecor(
23
+ level_id=level.id, x=data["x"], y=data["y"], decorName=data[
24
+ "decorName"]
25
+ )
26
+ )
27
+ LevelDecor.objects.bulk_create(level_decors)
17
28
 
18
29
  def set_blocks(level, blocks):
19
30
  set_blocks_inner(level, blocks, LevelBlock, Block)
@@ -1,5 +1,5 @@
1
1
  from django.db import migrations
2
- from game.level_management import set_decor_inner, set_blocks_inner
2
+ from game.level_management import set_blocks_inner
3
3
  import json
4
4
 
5
5
 
@@ -12,7 +12,18 @@ def new_level(apps, schema_editor):
12
12
  Block = apps.get_model("game", "Block")
13
13
 
14
14
  def set_decor(level, decor):
15
- set_decor_inner(level, decor, LevelDecor)
15
+ """Helper method creating LevelDecor objects given a list of decor in dictionary form."""
16
+ LevelDecor.objects.filter(level=level).delete()
17
+
18
+ level_decors = []
19
+ for data in decor:
20
+ level_decors.append(
21
+ LevelDecor(
22
+ level_id=level.id, x=data["x"], y=data["y"], decorName=data[
23
+ "decorName"]
24
+ )
25
+ )
26
+ LevelDecor.objects.bulk_create(level_decors)
16
27
 
17
28
  def set_blocks(level, blocks):
18
29
  set_blocks_inner(level, blocks, LevelBlock, Block)
@@ -1,5 +1,5 @@
1
1
  from django.db import migrations
2
- from game.level_management import set_decor_inner, set_blocks_inner
2
+ from game.level_management import set_blocks_inner
3
3
  import json
4
4
 
5
5
 
@@ -15,7 +15,18 @@ def new_level(apps, schema_editor):
15
15
  Block = apps.get_model("game", "Block")
16
16
 
17
17
  def set_decor(level, decor):
18
- set_decor_inner(level, decor, LevelDecor)
18
+ """Helper method creating LevelDecor objects given a list of decor in dictionary form."""
19
+ LevelDecor.objects.filter(level=level).delete()
20
+
21
+ level_decors = []
22
+ for data in decor:
23
+ level_decors.append(
24
+ LevelDecor(
25
+ level_id=level.id, x=data["x"], y=data["y"], decorName=data[
26
+ "decorName"]
27
+ )
28
+ )
29
+ LevelDecor.objects.bulk_create(level_decors)
19
30
 
20
31
  def set_blocks(level, blocks):
21
32
  set_blocks_inner(level, blocks, LevelBlock, Block)
@@ -1,5 +1,5 @@
1
1
  from django.db import migrations
2
- from game.level_management import set_decor_inner, set_blocks_inner
2
+ from game.level_management import set_blocks_inner
3
3
  import json
4
4
 
5
5
 
@@ -12,7 +12,18 @@ def new_level(apps, schema_editor):
12
12
  Block = apps.get_model("game", "Block")
13
13
 
14
14
  def set_decor(level, decor):
15
- set_decor_inner(level, decor, LevelDecor)
15
+ """Helper method creating LevelDecor objects given a list of decor in dictionary form."""
16
+ LevelDecor.objects.filter(level=level).delete()
17
+
18
+ level_decors = []
19
+ for data in decor:
20
+ level_decors.append(
21
+ LevelDecor(
22
+ level_id=level.id, x=data["x"], y=data["y"], decorName=data[
23
+ "decorName"]
24
+ )
25
+ )
26
+ LevelDecor.objects.bulk_create(level_decors)
16
27
 
17
28
  def set_blocks(level, blocks):
18
29
  set_blocks_inner(level, blocks, LevelBlock, Block)
@@ -1,6 +1,4 @@
1
1
  from django.db import migrations
2
- from game.level_management import set_decor_inner, set_blocks_inner
3
- import json
4
2
 
5
3
 
6
4
  def disable_route_score(apps, schema_editor):
@@ -1,6 +1,4 @@
1
1
  from django.db import migrations
2
- from game.level_management import set_decor_inner, set_blocks_inner
3
- import json
4
2
 
5
3
 
6
4
  def update_level(apps, schema_editor):
@@ -1,6 +1,4 @@
1
1
  from django.db import migrations
2
- from game.level_management import set_decor_inner, set_blocks_inner
3
- import json
4
2
 
5
3
 
6
4
  def update_level(apps, schema_editor):
@@ -1,5 +1,4 @@
1
1
  from django.db import migrations
2
- from game.level_management import set_decor_inner, set_blocks_inner
3
2
  import json
4
3
 
5
4
 
@@ -1,6 +1,4 @@
1
1
  from django.db import migrations
2
- from game.level_management import set_decor_inner, set_blocks_inner
3
- import json
4
2
 
5
3
 
6
4
  def update_level(apps, schema_editor):
@@ -1,9 +1,7 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  from __future__ import unicode_literals
3
- import json
4
3
 
5
4
  from django.db import models, migrations
6
- from game.level_management import set_blocks_inner, set_decor_inner
7
5
 
8
6
 
9
7
  def add_cows_block(apps, schema_editor):
@@ -1,6 +1,4 @@
1
1
  from django.db import migrations
2
- from game.level_management import set_decor_inner, set_blocks_inner
3
- import json
4
2
 
5
3
 
6
4
  def update_level(apps, schema_editor):
@@ -1,6 +1,4 @@
1
1
  from django.db import migrations
2
- from game.level_management import set_decor_inner, set_blocks_inner
3
- import json
4
2
 
5
3
 
6
4
  def update_level(apps, schema_editor):
@@ -1,5 +1,4 @@
1
1
  from django.db import migrations
2
- from game.level_management import set_decor_inner, set_blocks_inner
3
2
  import json
4
3
 
5
4
 
@@ -3,7 +3,7 @@ import json
3
3
  from django.apps.registry import Apps
4
4
  from django.db import migrations
5
5
 
6
- from game.level_management import set_decor_inner, set_blocks_inner
6
+ from game.level_management import set_blocks_inner
7
7
 
8
8
 
9
9
  def add_loop_levels(apps: Apps, *args):
@@ -365,7 +365,18 @@ def add_loop_levels(apps: Apps, *args):
365
365
  )
366
366
 
367
367
  def set_decor(level, decor):
368
- set_decor_inner(level, decor, LevelDecor)
368
+ """Helper method creating LevelDecor objects given a list of decor in dictionary form."""
369
+ LevelDecor.objects.filter(level=level).delete()
370
+
371
+ level_decors = []
372
+ for data in decor:
373
+ level_decors.append(
374
+ LevelDecor(
375
+ level_id=level.id, x=data["x"], y=data["y"], decorName=data[
376
+ "decorName"]
377
+ )
378
+ )
379
+ LevelDecor.objects.bulk_create(level_decors)
369
380
 
370
381
  set_decor(
371
382
  level_110,
@@ -0,0 +1,28 @@
1
+ from django.apps.registry import Apps
2
+ from django.db import migrations
3
+
4
+ def disable_algo_score_for_existing_custom_levels(apps: Apps, *args):
5
+ Level = apps.get_model("game", "Level")
6
+
7
+ Level.objects.filter(
8
+ default=False
9
+ ).update(disable_algorithm_score=True)
10
+
11
+ def enable_algo_score_for_existing_custom_levels(apps: Apps, *args):
12
+ Level = apps.get_model("game", "Level")
13
+
14
+ Level.objects.filter(
15
+ default=False
16
+ ).update(disable_algorithm_score=False)
17
+
18
+ class Migration(migrations.Migration):
19
+ dependencies = [
20
+ ("game", "0091_disable_algo_score_if_no_model_solution")
21
+ ]
22
+
23
+ operations = [
24
+ migrations.RunPython(
25
+ disable_algo_score_for_existing_custom_levels,
26
+ reverse_code=enable_algo_score_for_existing_custom_levels
27
+ )
28
+ ]
@@ -0,0 +1,18 @@
1
+ # Generated by Django 3.2.25 on 2024-06-11 14:34
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('game', '0092_disable_algo_score_in_custom_levels'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name='level',
15
+ name='character_name',
16
+ field=models.CharField(blank=True, choices=[('Van', 'Van'), ('Dee', 'Dee'), ('Nigel', 'Nigel'), ('Kirsty', 'Kirsty'), ('Wes', 'Wes'), ('Phil', 'Phil'), ('Electric van', 'Electric van')], default=None, max_length=20, null=True),
17
+ ),
18
+ ]
@@ -0,0 +1,28 @@
1
+ # Generated by Django 3.2.25 on 2024-06-24 12:50
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('game', '0093_alter_level_character_name'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name='level',
15
+ name='hint',
16
+ field=models.TextField(default='Think back to earlier levels. What did you learn?', max_length=10000),
17
+ ),
18
+ migrations.AddField(
19
+ model_name='level',
20
+ name='lesson',
21
+ field=models.TextField(default='Can you find the shortest route?', max_length=10000),
22
+ ),
23
+ migrations.AddField(
24
+ model_name='level',
25
+ name='subtitle',
26
+ field=models.TextField(blank=True, max_length=100, null=True),
27
+ ),
28
+ ]
@@ -0,0 +1,18 @@
1
+ # Generated by Django 3.2.25 on 2024-07-29 13:37
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('game', '0094_add_hint_lesson_subtitle_to_levels'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name='level',
15
+ name='commands',
16
+ field=models.TextField(default='<div class="row"><div class="large-4 columns"><p><b>Movement</b><br>my_van.move_forwards()<br>my_van.turn_around()<br>my_van.turn_left()<br>my_van.turn_right()<br>my_van.wait()<p></div><div class="large-4 columns"><p><b>Position</b><br>my_van.at_dead_end()<br>my_van.at_destination()<br>my_van.at_red_traffic_light()<br>my_van.at_green_traffic_light()<br>my_van.at_traffic_light(c)<br><i>where c is \'RED\' or \'GREEN\'</i></p></div><div class="large-4 columns"><p><br>my_van.is_road_right()<br>my_van.is_road_left()<br>my_van.is_road_forward()<br>my_van.is_road(d)<br><i>where d is \'FORWARD\', \'LEFT\', or \'RIGHT\'</i></p></div></div>', max_length=10000),
17
+ ),
18
+ ]
@@ -0,0 +1,18 @@
1
+ # Generated by Django 3.2.25 on 2024-07-30 10:49
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('game', '0095_level_commands'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name='level',
15
+ name='commands',
16
+ field=models.TextField(default='<div class="row"><div class="large-4 columns"><p><b>Movement</b><br>my_van.move_forwards()<br>my_van.turn_around()<br>my_van.turn_left()<br>my_van.turn_right()<br>my_van.wait()<p></div><div class="large-4 columns"><p><b>Position</b><br>my_van.at_dead_end()<br>my_van.at_destination()<br>my_van.at_red_traffic_light()<br>my_van.at_green_traffic_light()<br>my_van.at_traffic_light(c)<br><i>where c is \'RED\' or \'GREEN\'</i></p></div><div class="large-4 columns"><p><br>my_van.is_road_right()<br>my_van.is_road_left()<br>my_van.is_road_forward()<br>my_van.is_road(d)<br><i>where d is \'FORWARD\', \'LEFT\', or \'RIGHT\'</i></p></div></div><div class="row"><div class="large-4 columns"><p><b>Animals</b><br>my_van.is_animal_crossing()<br>my_van.sound_horn()</div></div>', max_length=10000),
17
+ ),
18
+ ]