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
@@ -0,0 +1,1515 @@
1
+ import json
2
+
3
+ from django.db import migrations
4
+
5
+ from game.level_management import set_blocks_inner
6
+
7
+
8
+ def add_python_den_levels(apps, schema_editor):
9
+ Level = apps.get_model("game", "Level")
10
+ Episode = apps.get_model("game", "Episode")
11
+
12
+ episode13 = Episode.objects.get(pk=13)
13
+ episode14 = Episode.objects.get(pk=14)
14
+ episode15 = Episode.objects.get(pk=15)
15
+ episode22 = Episode.objects.get(pk=22)
16
+
17
+ level1014 = Level(
18
+ name="1014",
19
+ episode=episode13,
20
+ character_name="Van",
21
+ default=True,
22
+ destinations="[[9,4]]",
23
+ model_solution="[10]",
24
+ origin='{"coordinate":[0,4],"direction":"E"}',
25
+ path='[{"coordinate":[0,4],"connectedNodes":[1]},{"coordinate":[1,4],"connectedNodes":[0,2]},{"coordinate":[2,4],"connectedNodes":[1,3]},{"coordinate":[3,4],"connectedNodes":[2,4]},{"coordinate":[4,4],"connectedNodes":[3,5]},{"coordinate":[5,4],"connectedNodes":[4,6]},{"coordinate":[6,4],"connectedNodes":[5,7]},{"coordinate":[7,4],"connectedNodes":[6,8]},{"coordinate":[8,4],"connectedNodes":[7,9]},{"coordinate":[9,4],"connectedNodes":[8]}]',
26
+ pythonEnabled=False,
27
+ pythonViewEnabled=True,
28
+ theme_name="farm",
29
+ cows='[{"minCows":1,"maxCows":1,"potentialCoordinates":[{"x":2,"y":4},{"x":5,"y":4},{"x":7,"y":4}],"type":"WHITE"}]',
30
+ lesson="This is a nice long straight road, but there are cows about!",
31
+ hint="Make sure you sound the horn to get the cows off the road.",
32
+ )
33
+
34
+ level1015 = Level(
35
+ name="1015",
36
+ episode=episode13,
37
+ path='[{"coordinate":[5,0],"connectedNodes":[1]},{"coordinate":[5,1],"connectedNodes":[2,0]},{"coordinate":[4,1],"connectedNodes":[3,1]},{"coordinate":[4,2],"connectedNodes":[4,2]},{"coordinate":[4,3],"connectedNodes":[5,3]},{"coordinate":[4,4],"connectedNodes":[6,4]},{"coordinate":[3,4],"connectedNodes":[7,5]},{"coordinate":[3,5],"connectedNodes":[8,6]},{"coordinate":[3,6],"connectedNodes":[9,7]},{"coordinate":[3,7],"connectedNodes":[8]}]',
38
+ origin='{"coordinate":[5,0],"direction":"N"}',
39
+ destinations="[[3,7]]",
40
+ default=True,
41
+ model_solution="[11]",
42
+ pythonEnabled=False,
43
+ pythonViewEnabled=True,
44
+ theme_name="farm",
45
+ character_name="Van",
46
+ lesson="There are some bends in this road. Be careful!",
47
+ hint="What do you need to count, how many times you move or how many times you move forwards?",
48
+ )
49
+
50
+ level1016 = Level(
51
+ name="1016",
52
+ episode=episode13,
53
+ path='[{"coordinate":[1,1],"connectedNodes":[1]},{"coordinate":[1,2],"connectedNodes":[2,0]},{"coordinate":[2,2],"connectedNodes":[1,3]},{"coordinate":[2,3],"connectedNodes":[4,2]},{"coordinate":[3,3],"connectedNodes":[3,5]},{"coordinate":[3,4],"connectedNodes":[6,4]},{"coordinate":[4,4],"connectedNodes":[5,7]},{"coordinate":[4,5],"connectedNodes":[8,6]},{"coordinate":[5,5],"connectedNodes":[7,9]},{"coordinate":[5,6],"connectedNodes":[10,8]},{"coordinate":[6,6],"connectedNodes":[9,11]},{"coordinate":[6,7],"connectedNodes":[12,10]},{"coordinate":[7,7],"connectedNodes":[11]}]',
54
+ cows='[{"minCows":1,"maxCows":1,"potentialCoordinates":[{"x":3,"y":3},{"x":5,"y":5},{"x":4,"y":4}],"type":"WHITE"}]',
55
+ origin='{"coordinate":[1,1],"direction":"N"}',
56
+ destinations="[[7,7]]",
57
+ default=True,
58
+ disable_algorithm_score=True,
59
+ blocklyEnabled=False,
60
+ theme_name="farm",
61
+ character_name="Van",
62
+ lesson="Oh no! The farmer seems to have let their cows out again. Be careful.",
63
+ hint="Look for a pattern here...",
64
+ )
65
+
66
+ level1017 = Level(
67
+ name="1017",
68
+ episode=episode13,
69
+ path='[{"coordinate":[7,0],"connectedNodes":[1]},{"coordinate":[7,1],"connectedNodes":[2,0]},{"coordinate":[6,1],"connectedNodes":[3,1]},{"coordinate":[6,2],"connectedNodes":[4,2]},{"coordinate":[6,3],"connectedNodes":[5,3]},{"coordinate":[6,4],"connectedNodes":[6,4]},{"coordinate":[5,4],"connectedNodes":[7,5]},{"coordinate":[5,5],"connectedNodes":[8,6]},{"coordinate":[5,6],"connectedNodes":[7]}]',
70
+ origin='{"coordinate":[7,0],"direction":"N"}',
71
+ destinations="[[5,6]]",
72
+ default=True,
73
+ disable_algorithm_score=True,
74
+ blocklyEnabled=False,
75
+ theme_name="grass",
76
+ character_name="Van",
77
+ lesson="Keep going, you're getting the hang of the Python code.",
78
+ hint="So you are going forward unless...?",
79
+ )
80
+
81
+ level1018 = Level(
82
+ name="1018",
83
+ episode=episode13,
84
+ path='[{"coordinate":[7,1],"connectedNodes":[1]},{"coordinate":[7,2],"connectedNodes":[2,0]},{"coordinate":[7,3],"connectedNodes":[3,1]},{"coordinate":[7,4],"connectedNodes":[4,2]},{"coordinate":[7,5],"connectedNodes":[5,3]},{"coordinate":[6,5],"connectedNodes":[6,4]},{"coordinate":[5,5],"connectedNodes":[7,5]},{"coordinate":[4,5],"connectedNodes":[8,6]},{"coordinate":[3,5],"connectedNodes":[9,7]},{"coordinate":[2,5],"connectedNodes":[8,10]},{"coordinate":[2,4],"connectedNodes":[9,11]},{"coordinate":[2,3],"connectedNodes":[10,12]},{"coordinate":[2,2],"connectedNodes":[11,13]},{"coordinate":[2,1],"connectedNodes":[12,14]},{"coordinate":[3,1],"connectedNodes":[13,15]},{"coordinate":[4,1],"connectedNodes":[14,16]},{"coordinate":[5,1],"connectedNodes":[15,17]},{"coordinate":[6,1],"connectedNodes":[16,18]},{"coordinate":[6,2],"connectedNodes":[19,17]},{"coordinate":[6,3],"connectedNodes":[20,18]},{"coordinate":[6,4],"connectedNodes":[21,19]},{"coordinate":[5,4],"connectedNodes":[22,20]},{"coordinate":[4,4],"connectedNodes":[23,21]},{"coordinate":[3,4],"connectedNodes":[22,24]},{"coordinate":[3,3],"connectedNodes":[23,25]},{"coordinate":[3,2],"connectedNodes":[24,26]},{"coordinate":[4,2],"connectedNodes":[25,27]},{"coordinate":[5,2],"connectedNodes":[26]}]',
85
+ origin='{"coordinate":[7,1],"direction":"N"}',
86
+ destinations="[[5,2]]",
87
+ default=True,
88
+ disable_algorithm_score=True,
89
+ blocklyEnabled=False,
90
+ theme_name="snow",
91
+ character_name="Van",
92
+ lesson="Oh dear, you might get a bit dizzy!",
93
+ hint="What are you counting here, straight roads or bends?",
94
+ )
95
+
96
+ level1019 = Level(
97
+ name="1019",
98
+ episode=episode13,
99
+ path='[{"coordinate":[9,3],"connectedNodes":[1]},{"coordinate":[8,3],"connectedNodes":[2,0]},{"coordinate":[7,3],"connectedNodes":[3,1,15]},{"coordinate":[7,4],"connectedNodes":[4,2]},{"coordinate":[6,4],"connectedNodes":[5,3]},{"coordinate":[5,4],"connectedNodes":[6,4,12]},{"coordinate":[4,4],"connectedNodes":[7,5]},{"coordinate":[3,4],"connectedNodes":[8,6]},{"coordinate":[3,5],"connectedNodes":[9,7]},{"coordinate":[2,5],"connectedNodes":[10,8,17]},{"coordinate":[1,5],"connectedNodes":[11,9]},{"coordinate":[0,5],"connectedNodes":[10]},{"coordinate":[5,3],"connectedNodes":[5,13]},{"coordinate":[5,2],"connectedNodes":[21,12,14]},{"coordinate":[6,2],"connectedNodes":[13,15]},{"coordinate":[7,2],"connectedNodes":[14,2,16]},{"coordinate":[7,1],"connectedNodes":[15]},{"coordinate":[2,4],"connectedNodes":[9,18]},{"coordinate":[2,3],"connectedNodes":[17,19]},{"coordinate":[2,2],"connectedNodes":[18,20]},{"coordinate":[3,2],"connectedNodes":[19,21]},{"coordinate":[4,2],"connectedNodes":[20,13]}]',
100
+ origin='{"coordinate":[9,3],"direction":"W"}',
101
+ destinations="[[0,5]]",
102
+ default=True,
103
+ model_solution="[11]",
104
+ pythonEnabled=False,
105
+ pythonViewEnabled=True,
106
+ theme_name="grass",
107
+ character_name="Van",
108
+ lesson="Have you noticed that there are more roads ahead than turns? Try checking if there is a road ahead and then otherwise making the turns you need...",
109
+ hint="Remember to use if..else",
110
+ )
111
+
112
+ level1020 = Level(
113
+ name="1020",
114
+ episode=episode13,
115
+ path='[{"coordinate":[2,2],"connectedNodes":[1]},{"coordinate":[3,2],"connectedNodes":[0,2,19]},{"coordinate":[3,3],"connectedNodes":[10,3,1]},{"coordinate":[4,3],"connectedNodes":[2,4]},{"coordinate":[4,4],"connectedNodes":[5,3]},{"coordinate":[5,4],"connectedNodes":[4,6,17]},{"coordinate":[5,5],"connectedNodes":[7,5]},{"coordinate":[6,5],"connectedNodes":[6,8]},{"coordinate":[6,6],"connectedNodes":[9,7]},{"coordinate":[7,6],"connectedNodes":[8]},{"coordinate":[3,4],"connectedNodes":[11,2]},{"coordinate":[3,5],"connectedNodes":[12,10]},{"coordinate":[3,6],"connectedNodes":[13,11]},{"coordinate":[3,7],"connectedNodes":[14,12]},{"coordinate":[4,7],"connectedNodes":[13,15]},{"coordinate":[5,7],"connectedNodes":[14,16]},{"coordinate":[6,7],"connectedNodes":[15]},{"coordinate":[5,3],"connectedNodes":[5,18]},{"coordinate":[5,2],"connectedNodes":[19,17]},{"coordinate":[4,2],"connectedNodes":[1,18]}]',
116
+ origin='{"coordinate":[2,2],"direction":"E"}',
117
+ destinations="[[7,6]]",
118
+ default=True,
119
+ disable_algorithm_score=True,
120
+ blocklyEnabled=False,
121
+ theme_name="snow",
122
+ character_name="Van",
123
+ lesson="Use if..else in Python for this level",
124
+ hint="Don't get distracted by the other roads. Look for a pattern you can repeat.",
125
+ )
126
+
127
+ level1021 = Level(
128
+ name="1021",
129
+ episode=episode13,
130
+ path='[{"coordinate":[4,0],"connectedNodes":[1]},{"coordinate":[4,1],"connectedNodes":[2,0]},{"coordinate":[3,1],"connectedNodes":[3,1]},{"coordinate":[3,2],"connectedNodes":[4,2]},{"coordinate":[3,3],"connectedNodes":[5,3]},{"coordinate":[3,4],"connectedNodes":[6,4]},{"coordinate":[2,4],"connectedNodes":[7,5]},{"coordinate":[2,5],"connectedNodes":[8,6]},{"coordinate":[2,6],"connectedNodes":[9,7]},{"coordinate":[1,6],"connectedNodes":[10,8]},{"coordinate":[1,7],"connectedNodes":[9]}]',
131
+ origin='{"coordinate":[4,0],"direction":"N"}',
132
+ destinations="[[3,1],[2,4],[1,6],[1,7]]",
133
+ default=True,
134
+ disable_algorithm_score=True,
135
+ blocklyEnabled=False,
136
+ theme_name="grass",
137
+ character_name="Van",
138
+ lesson="This is a really busy road. Make sure that you don't miss any of the houses.",
139
+ hint="Did you get the last house? Think about what value the loop counter will have at that point in your code...",
140
+ )
141
+
142
+ level1022 = Level(
143
+ name="1022",
144
+ episode=episode13,
145
+ path='[{"coordinate":[2,3],"connectedNodes":[1]},{"coordinate":[2,2],"connectedNodes":[0,2,16]},{"coordinate":[3,2],"connectedNodes":[1,3]},{"coordinate":[3,1],"connectedNodes":[2,4,14]},{"coordinate":[4,1],"connectedNodes":[3,5]},{"coordinate":[5,1],"connectedNodes":[4,6,22]},{"coordinate":[5,2],"connectedNodes":[7,5]},{"coordinate":[6,2],"connectedNodes":[6,8]},{"coordinate":[6,3],"connectedNodes":[9,17,7]},{"coordinate":[6,4],"connectedNodes":[10,8]},{"coordinate":[5,4],"connectedNodes":[11,9]},{"coordinate":[5,5],"connectedNodes":[12,10]},{"coordinate":[4,5],"connectedNodes":[13,11]},{"coordinate":[3,5],"connectedNodes":[12]},{"coordinate":[3,0],"connectedNodes":[15,3]},{"coordinate":[2,0],"connectedNodes":[16,14]},{"coordinate":[2,1],"connectedNodes":[1,15]},{"coordinate":[7,3],"connectedNodes":[8,18]},{"coordinate":[8,3],"connectedNodes":[17,19]},{"coordinate":[8,2],"connectedNodes":[18,20]},{"coordinate":[8,1],"connectedNodes":[21,19]},{"coordinate":[7,1],"connectedNodes":[22,20]},{"coordinate":[6,1],"connectedNodes":[5,21]}]',
146
+ origin='{"coordinate":[2,3],"direction":"S"}',
147
+ destinations="[[3,5]]",
148
+ default=True,
149
+ model_solution="[12]",
150
+ pythonEnabled=False,
151
+ pythonViewEnabled=True,
152
+ theme_name="grass",
153
+ character_name="Van",
154
+ lesson="There are lots of turns here, don't get distracted.",
155
+ hint="Think about the order of the questions you ask using your if and elif statements.",
156
+ )
157
+
158
+ level1023 = Level(
159
+ name="1023",
160
+ episode=episode13,
161
+ path='[{"coordinate":[2,7],"connectedNodes":[1]},{"coordinate":[2,6],"connectedNodes":[0,2]},{"coordinate":[2,5],"connectedNodes":[1,28,3]},{"coordinate":[2,4],"connectedNodes":[2,4]},{"coordinate":[2,3],"connectedNodes":[3,5]},{"coordinate":[2,2],"connectedNodes":[4,6]},{"coordinate":[2,1],"connectedNodes":[5,7]},{"coordinate":[3,1],"connectedNodes":[6,8]},{"coordinate":[4,1],"connectedNodes":[7,9]},{"coordinate":[5,1],"connectedNodes":[8,10]},{"coordinate":[6,1],"connectedNodes":[9,11]},{"coordinate":[7,1],"connectedNodes":[10,12]},{"coordinate":[8,1],"connectedNodes":[11,13]},{"coordinate":[9,1],"connectedNodes":[12,14]},{"coordinate":[9,2],"connectedNodes":[15,13]},{"coordinate":[9,3],"connectedNodes":[16,14]},{"coordinate":[9,4],"connectedNodes":[17,15]},{"coordinate":[9,5],"connectedNodes":[18,16]},{"coordinate":[9,6],"connectedNodes":[19,17]},{"coordinate":[8,6],"connectedNodes":[20,18]},{"coordinate":[7,6],"connectedNodes":[21,19]},{"coordinate":[6,6],"connectedNodes":[22,20]},{"coordinate":[5,6],"connectedNodes":[23,21]},{"coordinate":[4,6],"connectedNodes":[22,24]},{"coordinate":[4,5],"connectedNodes":[28,23,25]},{"coordinate":[4,4],"connectedNodes":[24,26]},{"coordinate":[4,3],"connectedNodes":[25,27]},{"coordinate":[4,2],"connectedNodes":[26]},{"coordinate":[3,5],"connectedNodes":[2,24]}]',
162
+ origin='{"coordinate":[2,7],"direction":"S"}',
163
+ destinations="[[4,2]]",
164
+ default=True,
165
+ model_solution="[12]",
166
+ pythonEnabled=False,
167
+ pythonViewEnabled=True,
168
+ theme_name="farm",
169
+ character_name="Van",
170
+ lesson="Don't go the long way around!",
171
+ hint="Think carefully about the order in which you ask questions in your if..else if block",
172
+ )
173
+
174
+ level1024 = Level(
175
+ name="1024",
176
+ episode=episode13,
177
+ path='[{"coordinate":[7,0],"connectedNodes":[1]},{"coordinate":[7,1],"connectedNodes":[10,2,0]},{"coordinate":[7,2],"connectedNodes":[3,24,1]},{"coordinate":[7,3],"connectedNodes":[4,2]},{"coordinate":[6,3],"connectedNodes":[5,3]},{"coordinate":[6,4],"connectedNodes":[23,6,33,4]},{"coordinate":[6,5],"connectedNodes":[7,5]},{"coordinate":[6,6],"connectedNodes":[8,6]},{"coordinate":[5,6],"connectedNodes":[9,7]},{"coordinate":[5,7],"connectedNodes":[8]},{"coordinate":[6,1],"connectedNodes":[11,1]},{"coordinate":[5,1],"connectedNodes":[12,10]},{"coordinate":[4,1],"connectedNodes":[13,11]},{"coordinate":[3,1],"connectedNodes":[14,12]},{"coordinate":[2,1],"connectedNodes":[15,13]},{"coordinate":[1,1],"connectedNodes":[16,17,14]},{"coordinate":[0,1],"connectedNodes":[15]},{"coordinate":[1,2],"connectedNodes":[18,15]},{"coordinate":[1,3],"connectedNodes":[19,17]},{"coordinate":[1,4],"connectedNodes":[20,18]},{"coordinate":[2,4],"connectedNodes":[19,21]},{"coordinate":[3,4],"connectedNodes":[20,22]},{"coordinate":[4,4],"connectedNodes":[21,23]},{"coordinate":[5,4],"connectedNodes":[22,5]},{"coordinate":[8,2],"connectedNodes":[2,25]},{"coordinate":[9,2],"connectedNodes":[24,26]},{"coordinate":[9,3],"connectedNodes":[27,25]},{"coordinate":[9,4],"connectedNodes":[28,26]},{"coordinate":[9,5],"connectedNodes":[29,27]},{"coordinate":[9,6],"connectedNodes":[30,28]},{"coordinate":[8,6],"connectedNodes":[29,31]},{"coordinate":[8,5],"connectedNodes":[30,32]},{"coordinate":[8,4],"connectedNodes":[33,31]},{"coordinate":[7,4],"connectedNodes":[5,32]}]',
178
+ origin='{"coordinate":[7,0],"direction":"N"}',
179
+ destinations="[[5,7]]",
180
+ default=True,
181
+ disable_algorithm_score=True,
182
+ blocklyEnabled=False,
183
+ theme_name="farm",
184
+ character_name="Van",
185
+ lesson="Look carefully for the shortest route.",
186
+ hint="Think carefully about the order in which you ask questions in your if..elif statements.",
187
+ )
188
+
189
+ level1025 = Level(
190
+ name="1025",
191
+ episode=episode13,
192
+ path='[{"coordinate":[8,0],"connectedNodes":[1]},{"coordinate":[8,1],"connectedNodes":[2,0]},{"coordinate":[8,2],"connectedNodes":[3,1]},{"coordinate":[7,2],"connectedNodes":[4,2]},{"coordinate":[6,2],"connectedNodes":[12,5,3]},{"coordinate":[6,3],"connectedNodes":[25,4]},{"coordinate":[4,5],"connectedNodes":[7,19]},{"coordinate":[3,5],"connectedNodes":[8,6]},{"coordinate":[2,5],"connectedNodes":[9,7]},{"coordinate":[1,5],"connectedNodes":[10,8,18]},{"coordinate":[1,6],"connectedNodes":[11,9]},{"coordinate":[1,7],"connectedNodes":[10]},{"coordinate":[5,2],"connectedNodes":[13,4]},{"coordinate":[4,2],"connectedNodes":[14,12]},{"coordinate":[3,2],"connectedNodes":[15,13]},{"coordinate":[2,2],"connectedNodes":[16,14]},{"coordinate":[1,2],"connectedNodes":[17,15]},{"coordinate":[1,3],"connectedNodes":[18,16]},{"coordinate":[1,4],"connectedNodes":[9,17]},{"coordinate":[5,5],"connectedNodes":[6,20]},{"coordinate":[6,5],"connectedNodes":[19,21]},{"coordinate":[7,5],"connectedNodes":[20,22]},{"coordinate":[8,5],"connectedNodes":[21,23]},{"coordinate":[8,4],"connectedNodes":[24,22]},{"coordinate":[7,4],"connectedNodes":[25,23]},{"coordinate":[6,4],"connectedNodes":[24,5]}]',
193
+ traffic_lights='[{"redDuration":3,"greenDuration":3,"sourceCoordinate":{"x":4,"y":5},"direction":"W","startTime":0,"startingState":"RED"},{"redDuration":3,"greenDuration":3,"sourceCoordinate":{"x":1,"y":5},"direction":"N","startTime":0,"startingState":"RED"}]',
194
+ origin='{"coordinate":[8,0],"direction":"N"}',
195
+ destinations="[[1,7]]",
196
+ default=True,
197
+ disable_algorithm_score=True,
198
+ blocklyEnabled=False,
199
+ theme_name="grass",
200
+ character_name="Van",
201
+ lesson="Look carefully for the shortest route.",
202
+ hint="Think carefully about the order in which you ask questions in your if..elif statements. Don't forget the traffic lights.",
203
+ )
204
+
205
+ level1026 = Level.objects.get(name="85", default=True)
206
+ level1026.pk = None
207
+ level1026._state.adding = True
208
+ level1026.name = "1026"
209
+ level1026.model_solution = "[4]"
210
+ level1026.disable_algorithm_score = False
211
+ level1026.episode = episode14
212
+
213
+ level1027 = Level(
214
+ name="1027",
215
+ episode=episode14,
216
+ path='[{"coordinate":[0,3],"connectedNodes":[1]},{"coordinate":[1,3],"connectedNodes":[0,2]},{"coordinate":[2,3],"connectedNodes":[1,3]},{"coordinate":[3,3],"connectedNodes":[2,4]},{"coordinate":[4,3],"connectedNodes":[3,5]},{"coordinate":[5,3],"connectedNodes":[4,6]},{"coordinate":[6,3],"connectedNodes":[5,7]},{"coordinate":[7,3],"connectedNodes":[6,8]},{"coordinate":[8,3],"connectedNodes":[7]}]',
217
+ origin='{"coordinate":[0,3],"direction":"E"}',
218
+ destinations="[[8,3]]",
219
+ default=True,
220
+ model_solution="[4]",
221
+ pythonEnabled=False,
222
+ pythonViewEnabled=True,
223
+ theme_name="grass",
224
+ character_name="Van",
225
+ lesson="Just keep going until you get there...",
226
+ hint="You might find that the solution to this level is quite familiar...",
227
+ )
228
+
229
+ level1028 = Level(
230
+ name="1028",
231
+ episode=episode14,
232
+ path='[{"coordinate":[2,2],"connectedNodes":[1]},{"coordinate":[3,2],"connectedNodes":[0,2]},{"coordinate":[3,3],"connectedNodes":[3,1]},{"coordinate":[4,3],"connectedNodes":[2,4]},{"coordinate":[4,4],"connectedNodes":[5,3]},{"coordinate":[5,4],"connectedNodes":[4,6]},{"coordinate":[5,5],"connectedNodes":[7,5]},{"coordinate":[6,5],"connectedNodes":[6,8]},{"coordinate":[6,6],"connectedNodes":[9,7]},{"coordinate":[7,6],"connectedNodes":[8]}]',
233
+ origin='{"coordinate":[2,2],"direction":"E"}',
234
+ destinations="[[7,6]]",
235
+ default=True,
236
+ model_solution="[5]",
237
+ pythonEnabled=False,
238
+ pythonViewEnabled=True,
239
+ theme_name="grass",
240
+ character_name="Van",
241
+ lesson="Well done, you did it! Now have a go at using the <b>Repeat until</b> block on a road with lots of turns.",
242
+ hint="This is another route you have seen before. Last time you counted how many times your instructions were repeated. This time, your program is going to repeat your commands until you reach the destination. What do you need to repeat?",
243
+ )
244
+
245
+ level1029 = Level.objects.get(name="119", default=True)
246
+ level1029.pk = None
247
+ level1029._state.adding = True
248
+ level1029.name = "1029"
249
+ level1029.blocklyEnabled = True
250
+ level1029.pythonEnabled = False
251
+ level1029.pythonViewEnabled = True
252
+ level1029.model_solution = "[7]"
253
+ level1029.disable_algorithm_score = False
254
+ level1029.episode = episode14
255
+
256
+ level1030 = Level.objects.get(name="84", default=True)
257
+ level1030.pk = None
258
+ level1030._state.adding = True
259
+ level1030.name = "1030"
260
+ level1030.blocklyEnabled = False
261
+ level1030.pythonEnabled = True
262
+ level1030.pythonViewEnabled = False
263
+ level1030.model_solution = "[]"
264
+ level1030.disable_algorithm_score = True
265
+ level1030.episode = episode14
266
+
267
+ level1031 = Level.objects.get(name="34", default=True)
268
+ level1031.pk = None
269
+ level1031._state.adding = True
270
+ level1031.name = "1031"
271
+ level1031.blocklyEnabled = True
272
+ level1031.pythonEnabled = False
273
+ level1031.pythonViewEnabled = True
274
+ level1031.model_solution = "[7]"
275
+ level1031.disable_algorithm_score = False
276
+ level1031.episode = episode14
277
+
278
+ level1032 = Level(
279
+ name="1032",
280
+ episode=episode14,
281
+ path='[{"coordinate":[5,0],"connectedNodes":[1]},{"coordinate":[5,1],"connectedNodes":[2,0]},{"coordinate":[5,2],"connectedNodes":[3,23,1]},{"coordinate":[5,3],"connectedNodes":[4,2]},{"coordinate":[5,4],"connectedNodes":[17,3]},{"coordinate":[4,5],"connectedNodes":[6,17]},{"coordinate":[3,5],"connectedNodes":[7,5]},{"coordinate":[2,5],"connectedNodes":[24,6,8]},{"coordinate":[2,4],"connectedNodes":[7,9]},{"coordinate":[2,3],"connectedNodes":[8,10]},{"coordinate":[2,2],"connectedNodes":[9,11]},{"coordinate":[2,1],"connectedNodes":[10,12]},{"coordinate":[3,1],"connectedNodes":[11,13]},{"coordinate":[4,1],"connectedNodes":[12,14]},{"coordinate":[4,2],"connectedNodes":[15,13]},{"coordinate":[4,3],"connectedNodes":[16,14]},{"coordinate":[4,4],"connectedNodes":[15]},{"coordinate":[5,5],"connectedNodes":[5,29,18,4]},{"coordinate":[6,5],"connectedNodes":[17,19]},{"coordinate":[7,5],"connectedNodes":[18,20]},{"coordinate":[7,4],"connectedNodes":[19,21]},{"coordinate":[7,3],"connectedNodes":[20,22]},{"coordinate":[7,2],"connectedNodes":[23,21,36]},{"coordinate":[6,2],"connectedNodes":[2,22]},{"coordinate":[1,5],"connectedNodes":[25,7]},{"coordinate":[1,6],"connectedNodes":[26,24]},{"coordinate":[2,6],"connectedNodes":[25,27]},{"coordinate":[3,6],"connectedNodes":[26,28]},{"coordinate":[4,6],"connectedNodes":[27,29]},{"coordinate":[5,6],"connectedNodes":[28,30,17]},{"coordinate":[6,6],"connectedNodes":[29,31]},{"coordinate":[7,6],"connectedNodes":[30,32]},{"coordinate":[8,6],"connectedNodes":[31,33]},{"coordinate":[8,5],"connectedNodes":[32,34]},{"coordinate":[8,4],"connectedNodes":[33,35]},{"coordinate":[8,3],"connectedNodes":[34,36]},{"coordinate":[8,2],"connectedNodes":[22,35]}]',
282
+ origin='{"coordinate":[5,0],"direction":"N"}',
283
+ destinations="[[4,4]]",
284
+ default=True,
285
+ model_solution="[7]",
286
+ pythonEnabled=False,
287
+ pythonViewEnabled=True,
288
+ theme_name="grass",
289
+ character_name="Van",
290
+ lesson="You don't have a right turn block here, so plan your route carefully.",
291
+ hint="Think carefully about the order in which you ask questions in your if-statement here...",
292
+ )
293
+
294
+ level1033 = Level(
295
+ name="1033",
296
+ episode=episode14,
297
+ path='[{"coordinate":[7,1],"connectedNodes":[1]},{"coordinate":[7,2],"connectedNodes":[2,0]},{"coordinate":[6,2],"connectedNodes":[3,1]},{"coordinate":[6,3],"connectedNodes":[4,13,2]},{"coordinate":[5,3],"connectedNodes":[5,3]},{"coordinate":[5,4],"connectedNodes":[6,16,15,4]},{"coordinate":[4,4],"connectedNodes":[7,5]},{"coordinate":[4,5],"connectedNodes":[8,16,6]},{"coordinate":[3,5],"connectedNodes":[9,7]},{"coordinate":[3,6],"connectedNodes":[10,8]},{"coordinate":[2,6],"connectedNodes":[11,9]},{"coordinate":[2,7],"connectedNodes":[12,17,10]},{"coordinate":[1,7],"connectedNodes":[11]},{"coordinate":[7,3],"connectedNodes":[3,14]},{"coordinate":[7,4],"connectedNodes":[15,13]},{"coordinate":[6,4],"connectedNodes":[5,22,14]},{"coordinate":[5,5],"connectedNodes":[7,5]},{"coordinate":[3,7],"connectedNodes":[11,18]},{"coordinate":[4,7],"connectedNodes":[17,19]},{"coordinate":[5,7],"connectedNodes":[18,20]},{"coordinate":[6,7],"connectedNodes":[19,21]},{"coordinate":[6,6],"connectedNodes":[20,22]},{"coordinate":[6,5],"connectedNodes":[21,15]}]',
298
+ origin='{"coordinate":[7,1],"direction":"N"}',
299
+ destinations="[[1,7]]",
300
+ default=True,
301
+ disable_algorithm_score=True,
302
+ blocklyEnabled=False,
303
+ theme_name="snow",
304
+ character_name="Van",
305
+ lesson="Can you find the shortest route?",
306
+ hint="In this level, you want to check for a left turn first. If there is no left turn, turn right. Keep in mind what that looks like in Python.",
307
+ )
308
+
309
+ level1034 = Level(
310
+ name="1034",
311
+ episode=episode14,
312
+ path='[{"coordinate":[0,6],"connectedNodes":[1]},{"coordinate":[1,6],"connectedNodes":[0,2]},{"coordinate":[2,6],"connectedNodes":[1,3]},{"coordinate":[3,6],"connectedNodes":[2,4]},{"coordinate":[4,6],"connectedNodes":[3,5]},{"coordinate":[5,6],"connectedNodes":[4,6]},{"coordinate":[5,5],"connectedNodes":[5,23,7]},{"coordinate":[5,4],"connectedNodes":[6,8]},{"coordinate":[5,3],"connectedNodes":[7,29,9]},{"coordinate":[5,2],"connectedNodes":[8,10]},{"coordinate":[5,1],"connectedNodes":[11,9]},{"coordinate":[4,1],"connectedNodes":[12,10]},{"coordinate":[3,1],"connectedNodes":[13,11]},{"coordinate":[2,1],"connectedNodes":[14,12]},{"coordinate":[1,1],"connectedNodes":[15,13]},{"coordinate":[1,2],"connectedNodes":[34,16,14]},{"coordinate":[1,3],"connectedNodes":[17,15]},{"coordinate":[1,4],"connectedNodes":[30,16]},{"coordinate":[2,5],"connectedNodes":[30,19]},{"coordinate":[3,5],"connectedNodes":[18,20]},{"coordinate":[3,4],"connectedNodes":[19,21]},{"coordinate":[3,3],"connectedNodes":[20,22]},{"coordinate":[3,2],"connectedNodes":[21]},{"coordinate":[6,5],"connectedNodes":[6,24]},{"coordinate":[7,5],"connectedNodes":[23,25]},{"coordinate":[8,5],"connectedNodes":[24,26]},{"coordinate":[8,4],"connectedNodes":[25,27]},{"coordinate":[8,3],"connectedNodes":[28,26]},{"coordinate":[7,3],"connectedNodes":[29,27]},{"coordinate":[6,3],"connectedNodes":[8,28]},{"coordinate":[1,5],"connectedNodes":[31,18,17]},{"coordinate":[0,5],"connectedNodes":[30,32]},{"coordinate":[0,4],"connectedNodes":[31,33]},{"coordinate":[0,3],"connectedNodes":[32,34]},{"coordinate":[0,2],"connectedNodes":[33,15]}]',
313
+ origin='{"coordinate":[0,6],"direction":"E"}',
314
+ destinations="[[3,2]]",
315
+ default=True,
316
+ disable_algorithm_score=True,
317
+ blocklyEnabled=False,
318
+ theme_name="grass",
319
+ character_name="Van",
320
+ lesson="Can you find the shortest route? Don't take the scenic route.",
321
+ hint="Just look for the simplest route to the house.",
322
+ )
323
+
324
+ level1035 = Level.objects.get(name="99", default=True)
325
+ level1035.pk = None
326
+ level1035._state.adding = True
327
+ level1035.name = "1035"
328
+ level1035.blocklyEnabled = True
329
+ level1035.pythonEnabled = False
330
+ level1035.pythonViewEnabled = True
331
+ level1035.model_solution = "[9]"
332
+ level1035.disable_algorithm_score = False
333
+ level1035.episode = episode14
334
+
335
+ level1036 = Level.objects.get(name="38", default=True)
336
+ level1036.pk = None
337
+ level1036._state.adding = True
338
+ level1036.name = "1036"
339
+ level1036.pythonViewEnabled = True
340
+ level1036.model_solution = "[11]"
341
+ level1036.disable_algorithm_score = False
342
+ level1036.episode = episode14
343
+
344
+ level1037 = Level.objects.get(name="100", default=True)
345
+ level1037.pk = None
346
+ level1037._state.adding = True
347
+ level1037.name = "1037"
348
+ level1037.episode = episode14
349
+
350
+ level1038 = Level.objects.get(name="39", default=True)
351
+ level1038.pk = None
352
+ level1038._state.adding = True
353
+ level1038.name = "1038"
354
+ level1038.blocklyEnabled = False
355
+ level1038.pythonEnabled = True
356
+ level1038.model_solution = "[]"
357
+ level1038.disable_route_score = False
358
+ level1038.disable_algorithm_score = True
359
+ level1038.episode = episode14
360
+
361
+ level1039 = Level.objects.get(name="47", default=True)
362
+ level1039.pk = None
363
+ level1039._state.adding = True
364
+ level1039.name = "1039"
365
+ level1039.blocklyEnabled = False
366
+ level1039.pythonEnabled = True
367
+ level1039.model_solution = "[]"
368
+ level1039.disable_algorithm_score = True
369
+ level1039.episode = episode14
370
+
371
+ level1040 = Level.objects.get(name="48", default=True)
372
+ level1040.pk = None
373
+ level1040._state.adding = True
374
+ level1040.name = "1040"
375
+ level1040.blocklyEnabled = False
376
+ level1040.pythonEnabled = True
377
+ level1040.model_solution = "[]"
378
+ level1040.disable_algorithm_score = True
379
+ level1040.episode = episode14
380
+
381
+ level1041 = Level.objects.get(name="83", default=True)
382
+ level1041.pk = None
383
+ level1041._state.adding = True
384
+ level1041.name = "1041"
385
+ level1041.disable_algorithm_score = False
386
+ level1041.episode = episode15
387
+
388
+ level1042 = Level.objects.get(name="95", default=True)
389
+ level1042.pk = None
390
+ level1042._state.adding = True
391
+ level1042.name = "1042"
392
+ level1042.episode = episode15
393
+
394
+ level1043 = Level.objects.get(name="96", default=True)
395
+ level1043.pk = None
396
+ level1043._state.adding = True
397
+ level1043.name = "1043"
398
+ level1043.episode = episode15
399
+
400
+ level1044 = Level.objects.get(name="84", default=True)
401
+ level1044.pk = None
402
+ level1044._state.adding = True
403
+ level1044.name = "1044"
404
+ level1044.disable_algorithm_score = False
405
+ level1044.episode = episode15
406
+
407
+ level1045 = Level.objects.get(name="97", default=True)
408
+ level1045.pk = None
409
+ level1045._state.adding = True
410
+ level1045.name = "1045"
411
+ level1045.episode = episode15
412
+
413
+ level1046 = Level.objects.get(name="106", default=True)
414
+ level1046.pk = None
415
+ level1046._state.adding = True
416
+ level1046.name = "1046"
417
+ level1046.episode = episode15
418
+
419
+ level1047 = Level.objects.get(name="107", default=True)
420
+ level1047.pk = None
421
+ level1047._state.adding = True
422
+ level1047.name = "1047"
423
+ level1047.episode = episode15
424
+
425
+ level1048 = Level.objects.get(name="108", default=True)
426
+ level1048.pk = None
427
+ level1048._state.adding = True
428
+ level1048.name = "1048"
429
+ level1048.episode = episode15
430
+
431
+ level1049 = Level.objects.get(name="109", default=True)
432
+ level1049.pk = None
433
+ level1049._state.adding = True
434
+ level1049.name = "1049"
435
+ level1049.next_level = None
436
+ level1049.episode = episode15
437
+
438
+ level1050 = Level.objects.get(name="61", default=True)
439
+ level1050.pk = None
440
+ level1050._state.adding = True
441
+ level1050.name = "1050"
442
+ level1050.pythonViewEnabled = True
443
+ level1050.disable_algorithm_score = False
444
+ level1050.episode = episode22
445
+
446
+ level1051 = Level.objects.get(name="62", default=True)
447
+ level1051.pk = None
448
+ level1051._state.adding = True
449
+ level1051.name = "1051"
450
+ level1051.pythonViewEnabled = True
451
+ level1051.disable_algorithm_score = False
452
+ level1051.episode = episode22
453
+
454
+ level1052 = Level.objects.get(name="63", default=True)
455
+ level1052.pk = None
456
+ level1052._state.adding = True
457
+ level1052.name = "1052"
458
+ level1052.blocklyEnabled = False
459
+ level1052.pythonEnabled = True
460
+ level1052.model_solution = "[]"
461
+ level1052.disable_algorithm_score = True
462
+ level1052.episode = episode22
463
+
464
+ level1053 = Level.objects.get(name="64", default=True)
465
+ level1053.pk = None
466
+ level1053._state.adding = True
467
+ level1053.name = "1053"
468
+ level1053.blocklyEnabled = False
469
+ level1053.pythonEnabled = True
470
+ level1053.model_solution = "[]"
471
+ level1053.disable_algorithm_score = True
472
+ level1053.episode = episode22
473
+
474
+ level1054 = Level.objects.get(name="65", default=True)
475
+ level1054.pk = None
476
+ level1054._state.adding = True
477
+ level1054.name = "1054"
478
+ level1054.blocklyEnabled = False
479
+ level1054.pythonEnabled = True
480
+ level1054.model_solution = "[]"
481
+ level1054.disable_algorithm_score = True
482
+ level1054.episode = episode22
483
+
484
+ level1055 = Level.objects.get(name="66", default=True)
485
+ level1055.pk = None
486
+ level1055._state.adding = True
487
+ level1055.name = "1055"
488
+ level1055.blocklyEnabled = False
489
+ level1055.pythonEnabled = True
490
+ level1055.model_solution = "[]"
491
+ level1055.disable_algorithm_score = True
492
+ level1055.episode = episode22
493
+
494
+ level1056 = Level.objects.get(name="67", default=True)
495
+ level1056.pk = None
496
+ level1056._state.adding = True
497
+ level1056.name = "1056"
498
+ level1056.blocklyEnabled = False
499
+ level1056.pythonEnabled = True
500
+ level1056.model_solution = "[]"
501
+ level1056.disable_algorithm_score = True
502
+ level1056.episode = episode22
503
+
504
+ level1057 = Level.objects.get(name="90", default=True)
505
+ level1057.pk = None
506
+ level1057._state.adding = True
507
+ level1057.name = "1057"
508
+ level1057.blocklyEnabled = False
509
+ level1057.pythonViewEnabled = False
510
+ level1057.pythonEnabled = True
511
+ level1057.disable_algorithm_score = True
512
+ level1057.episode = episode22
513
+
514
+ level1058 = Level.objects.get(name="91", default=True)
515
+ level1058.pk = None
516
+ level1058._state.adding = True
517
+ level1058.name = "1058"
518
+ level1058.blocklyEnabled = False
519
+ level1058.pythonViewEnabled = False
520
+ level1058.pythonEnabled = True
521
+ level1058.disable_algorithm_score = True
522
+ level1058.episode = episode22
523
+
524
+ level1059 = Level.objects.get(name="101", default=True)
525
+ level1059.pk = None
526
+ level1059._state.adding = True
527
+ level1059.name = "1059"
528
+ level1059.episode = episode22
529
+
530
+ level1060 = Level.objects.get(name="102", default=True)
531
+ level1060.pk = None
532
+ level1060._state.adding = True
533
+ level1060.name = "1060"
534
+ level1060.episode = episode22
535
+
536
+ def save_all_levels():
537
+ level1014.save()
538
+ level1015.save()
539
+ level1016.save()
540
+ level1017.save()
541
+ level1018.save()
542
+ level1019.save()
543
+ level1020.save()
544
+ level1021.save()
545
+ level1022.save()
546
+ level1023.save()
547
+ level1024.save()
548
+ level1025.save()
549
+ level1026.save()
550
+ level1027.save()
551
+ level1028.save()
552
+ level1029.save()
553
+ level1030.save()
554
+ level1031.save()
555
+ level1032.save()
556
+ level1033.save()
557
+ level1034.save()
558
+ level1035.save()
559
+ level1036.save()
560
+ level1037.save()
561
+ level1038.save()
562
+ level1039.save()
563
+ level1040.save()
564
+ level1041.save()
565
+ level1042.save()
566
+ level1043.save()
567
+ level1044.save()
568
+ level1045.save()
569
+ level1046.save()
570
+ level1047.save()
571
+ level1048.save()
572
+ level1049.save()
573
+ level1050.save()
574
+ level1051.save()
575
+ level1052.save()
576
+ level1053.save()
577
+ level1054.save()
578
+ level1055.save()
579
+ level1056.save()
580
+ level1057.save()
581
+ level1058.save()
582
+ level1059.save()
583
+ level1060.save()
584
+
585
+ save_all_levels()
586
+ level1014.next_level = level1015
587
+ level1015.next_level = level1016
588
+ level1016.next_level = level1017
589
+ level1017.next_level = level1018
590
+ level1018.next_level = level1019
591
+ level1019.next_level = level1020
592
+ level1020.next_level = level1021
593
+ level1021.next_level = level1022
594
+ level1022.next_level = level1023
595
+ level1023.next_level = level1024
596
+ level1024.next_level = level1025
597
+ level1025.next_level = level1026
598
+ level1026.next_level = level1027
599
+ level1027.next_level = level1028
600
+ level1028.next_level = level1029
601
+ level1029.next_level = level1030
602
+ level1030.next_level = level1031
603
+ level1031.next_level = level1032
604
+ level1032.next_level = level1033
605
+ level1033.next_level = level1034
606
+ level1034.next_level = level1035
607
+ level1035.next_level = level1036
608
+ level1036.next_level = level1037
609
+ level1037.next_level = level1038
610
+ level1038.next_level = level1039
611
+ level1039.next_level = level1040
612
+ level1040.next_level = level1041
613
+ level1041.next_level = level1042
614
+ level1042.next_level = level1043
615
+ level1043.next_level = level1044
616
+ level1044.next_level = level1045
617
+ level1045.next_level = level1046
618
+ level1046.next_level = level1047
619
+ level1047.next_level = level1048
620
+ level1048.next_level = level1049
621
+ level1050.next_level = level1051
622
+ level1051.next_level = level1052
623
+ level1052.next_level = level1053
624
+ level1053.next_level = level1054
625
+ level1054.next_level = level1055
626
+ level1055.next_level = level1056
627
+ level1056.next_level = level1057
628
+ level1057.next_level = level1058
629
+ level1058.next_level = level1059
630
+ level1059.next_level = level1060
631
+ level1060.next_level = None
632
+
633
+ save_all_levels()
634
+
635
+
636
+ def delete_python_den_levels(apps, schema_editor):
637
+ Level = apps.get_model("game", "Level")
638
+ Level.objects.filter(name__in=range(1014, 1061)).delete()
639
+
640
+
641
+ def add_python_den_blocks(apps, schema_editor):
642
+ Level = apps.get_model("game", "Level")
643
+ LevelBlock = apps.get_model("game", "LevelBlock")
644
+ Block = apps.get_model("game", "Block")
645
+
646
+ def set_blocks(level, blocks):
647
+ set_blocks_inner(level, blocks, LevelBlock, Block)
648
+
649
+ level1014 = Level.objects.get(name="1014", default=True)
650
+ level1015 = Level.objects.get(name="1015", default=True)
651
+ level1019 = Level.objects.get(name="1019", default=True)
652
+ level1022 = Level.objects.get(name="1022", default=True)
653
+ level1023 = Level.objects.get(name="1023", default=True)
654
+ level1026 = Level.objects.get(name="1026", default=True)
655
+ level1027 = Level.objects.get(name="1027", default=True)
656
+ level1028 = Level.objects.get(name="1028", default=True)
657
+ level1029 = Level.objects.get(name="1029", default=True)
658
+ level1031 = Level.objects.get(name="1031", default=True)
659
+ level1032 = Level.objects.get(name="1032", default=True)
660
+ level1035 = Level.objects.get(name="1035", default=True)
661
+ level1036 = Level.objects.get(name="1036", default=True)
662
+ level1041 = Level.objects.get(name="1041", default=True)
663
+ level1044 = Level.objects.get(name="1044", default=True)
664
+ level1050 = Level.objects.get(name="1050", default=True)
665
+ level1051 = Level.objects.get(name="1051", default=True)
666
+ level1057 = Level.objects.get(name="1057", default=True)
667
+ level1058 = Level.objects.get(name="1058", default=True)
668
+
669
+ set_blocks(
670
+ level1014,
671
+ json.loads(
672
+ '[{"type": "variables_numeric_set"},'
673
+ + '{"type": "controls_repeat_while"},'
674
+ + '{"type": "variables_get"},'
675
+ + '{"type": "math_number"},'
676
+ + '{"type": "logic_compare"},'
677
+ + '{"type": "controls_if"},'
678
+ + '{"type": "cow_crossing"},'
679
+ + '{"type": "sound_horn"},'
680
+ + '{"type": "move_forwards"},'
681
+ + '{"type": "variables_increment"}]'
682
+ ),
683
+ )
684
+
685
+ set_blocks(
686
+ level1015,
687
+ json.loads(
688
+ '[{"type": "variables_numeric_set"},'
689
+ + '{"type": "controls_repeat_while"},'
690
+ + '{"type": "variables_get"},'
691
+ + '{"type": "math_number"},'
692
+ + '{"type": "logic_compare"},'
693
+ + '{"type": "controls_if"},'
694
+ + '{"type": "road_exists"},'
695
+ + '{"type": "turn_left"},'
696
+ + '{"type": "turn_right"},'
697
+ + '{"type": "move_forwards"},'
698
+ + '{"type": "variables_increment"}]'
699
+ ),
700
+ )
701
+
702
+ set_blocks(
703
+ level1019,
704
+ json.loads(
705
+ '[{"type": "variables_numeric_set"},'
706
+ + '{"type": "controls_repeat_while"},'
707
+ + '{"type": "variables_get"},'
708
+ + '{"type": "math_number"},'
709
+ + '{"type": "logic_compare"},'
710
+ + '{"type": "controls_if"},'
711
+ + '{"type": "road_exists"},'
712
+ + '{"type": "turn_left"},'
713
+ + '{"type": "turn_right"},'
714
+ + '{"type": "move_forwards"},'
715
+ + '{"type": "variables_increment"}]'
716
+ ),
717
+ )
718
+
719
+ set_blocks(
720
+ level1022,
721
+ json.loads(
722
+ '[{"type": "variables_numeric_set"},'
723
+ + '{"type": "controls_repeat_while"},'
724
+ + '{"type": "variables_get"},'
725
+ + '{"type": "math_number"},'
726
+ + '{"type": "logic_compare"},'
727
+ + '{"type": "controls_if"},'
728
+ + '{"type": "road_exists"},'
729
+ + '{"type": "turn_left"},'
730
+ + '{"type": "turn_right"},'
731
+ + '{"type": "move_forwards"},'
732
+ + '{"type": "variables_increment"}]'
733
+ ),
734
+ )
735
+
736
+ set_blocks(
737
+ level1023,
738
+ json.loads(
739
+ '[{"type": "variables_numeric_set"},'
740
+ + '{"type": "controls_repeat_while"},'
741
+ + '{"type": "variables_get"},'
742
+ + '{"type": "math_number"},'
743
+ + '{"type": "logic_compare"},'
744
+ + '{"type": "controls_if"},'
745
+ + '{"type": "road_exists"},'
746
+ + '{"type": "turn_left"},'
747
+ + '{"type": "turn_right"},'
748
+ + '{"type": "move_forwards"},'
749
+ + '{"type": "variables_increment"}]'
750
+ ),
751
+ )
752
+
753
+ set_blocks(
754
+ level1026,
755
+ json.loads(
756
+ '[{"type": "move_forwards"},'
757
+ + '{"type": "turn_left"},'
758
+ + '{"type": "turn_right"},'
759
+ + '{"type": "at_destination"},'
760
+ + '{"type": "logic_negate"},'
761
+ + '{"type": "controls_repeat_while"}]'
762
+ ),
763
+ )
764
+
765
+ set_blocks(
766
+ level1027,
767
+ json.loads(
768
+ '[{"type": "controls_repeat_while"},'
769
+ + '{"type": "logic_negate"},'
770
+ + '{"type": "at_destination"},'
771
+ + '{"type": "move_forwards"}]'
772
+ ),
773
+ )
774
+
775
+ set_blocks(
776
+ level1028,
777
+ json.loads(
778
+ '[{"type": "controls_repeat_while"},'
779
+ + '{"type": "logic_negate"},'
780
+ + '{"type": "at_destination"},'
781
+ + '{"type": "turn_left"},'
782
+ + '{"type": "turn_right"}]'
783
+ ),
784
+ )
785
+
786
+ set_blocks(
787
+ level1029,
788
+ json.loads(
789
+ '[{"type": "controls_repeat_while"},'
790
+ + '{"type": "logic_negate"},'
791
+ + '{"type": "at_destination"},'
792
+ + '{"type": "turn_left"},'
793
+ + '{"type": "turn_right"},'
794
+ + '{"type": "move_forwards"}]'
795
+ ),
796
+ )
797
+
798
+ set_blocks(
799
+ level1031,
800
+ json.loads(
801
+ '[{"type": "controls_repeat_while"},'
802
+ + '{"type": "logic_negate"},'
803
+ + '{"type": "at_destination"},'
804
+ + '{"type": "controls_if"},'
805
+ + '{"type": "road_exists"},'
806
+ + '{"type": "turn_left"},'
807
+ + '{"type": "move_forwards"}]'
808
+ ),
809
+ )
810
+
811
+ set_blocks(
812
+ level1032,
813
+ json.loads(
814
+ '[{"type": "controls_repeat_while"},'
815
+ + '{"type": "logic_negate"},'
816
+ + '{"type": "at_destination"},'
817
+ + '{"type": "controls_if"},'
818
+ + '{"type": "road_exists"},'
819
+ + '{"type": "turn_left"},'
820
+ + '{"type": "move_forwards"}]'
821
+ ),
822
+ )
823
+
824
+ set_blocks(
825
+ level1035,
826
+ json.loads(
827
+ '[{"type": "controls_repeat_while"},'
828
+ + '{"type": "logic_negate"},'
829
+ + '{"type": "at_destination"},'
830
+ + '{"type": "controls_if"},'
831
+ + '{"type": "road_exists"},'
832
+ + '{"type": "move_forwards"},'
833
+ + '{"type": "turn_left"},'
834
+ + '{"type": "turn_right"}]'
835
+ ),
836
+ )
837
+
838
+ set_blocks(
839
+ level1036,
840
+ json.loads(
841
+ '[{"type": "controls_repeat_while"},'
842
+ + '{"type": "logic_negate"},'
843
+ + '{"type": "at_destination"},'
844
+ + '{"type": "controls_if"},'
845
+ + '{"type": "cow_crossing"},'
846
+ + '{"type": "sound_horn"},'
847
+ + '{"type": "road_exists"},'
848
+ + '{"type": "move_forwards"},'
849
+ + '{"type": "turn_left"},'
850
+ + '{"type": "turn_right"}]'
851
+ ),
852
+ )
853
+
854
+ set_blocks(
855
+ level1041,
856
+ json.loads(
857
+ '[{"type": "move_forwards"},'
858
+ + '{"type": "turn_left"},'
859
+ + '{"type": "turn_right"},'
860
+ + '{"type": "controls_repeat"}]'
861
+ ),
862
+ )
863
+
864
+ set_blocks(
865
+ level1044,
866
+ json.loads(
867
+ '[{"type": "move_forwards"},'
868
+ + '{"type": "turn_left"},'
869
+ + '{"type": "turn_right"},'
870
+ + '{"type": "controls_repeat"}]'
871
+ ),
872
+ )
873
+
874
+ set_blocks(
875
+ level1050,
876
+ json.loads(
877
+ '[{"type": "call_proc"},'
878
+ + '{"type": "declare_proc"},'
879
+ + '{"type": "move_forwards"},'
880
+ + '{"type": "turn_left"},'
881
+ + '{"type": "turn_right"},'
882
+ + '{"type": "controls_repeat"}]'
883
+ ),
884
+ )
885
+
886
+ set_blocks(
887
+ level1051,
888
+ json.loads(
889
+ '[{"type": "call_proc"},'
890
+ + '{"type": "declare_proc"},'
891
+ + '{"type": "move_forwards"},'
892
+ + '{"type": "turn_right"},'
893
+ + '{"type": "wait"},'
894
+ + '{"type": "controls_repeat_until"},'
895
+ + '{"type": "traffic_light"}]'
896
+ ),
897
+ )
898
+
899
+ set_blocks(
900
+ level1057,
901
+ json.loads(
902
+ '[{"type":"move_forwards"},'
903
+ + '{"type":"turn_left"},'
904
+ + '{"type":"turn_right"},'
905
+ + '{"type":"controls_repeat"},'
906
+ + '{"type":"call_proc"},'
907
+ + '{"type":"declare_proc"}]'
908
+ ),
909
+ )
910
+
911
+ set_blocks(
912
+ level1058,
913
+ json.loads(
914
+ '[{"type":"move_forwards"},'
915
+ + '{"type":"turn_left"},'
916
+ + '{"type":"turn_right"},'
917
+ + '{"type":"controls_repeat"},'
918
+ + '{"type":"call_proc"},'
919
+ + '{"type":"declare_proc"}]'
920
+ ),
921
+ )
922
+
923
+
924
+ def delete_python_den_blocks(apps, schema_editor):
925
+ LevelBlock = apps.get_model("game", "LevelBlock")
926
+ LevelBlock.objects.filter(level_id__in=range(1014, 1061)).delete()
927
+
928
+
929
+ def add_python_den_decor(apps, schema_editor):
930
+ Level = apps.get_model("game", "Level")
931
+ LevelDecor = apps.get_model("game", "LevelDecor")
932
+
933
+ def set_decor(level, decor):
934
+ """Helper method creating LevelDecor objects given a list of decor in dictionary form."""
935
+ LevelDecor.objects.filter(level=level).delete()
936
+
937
+ level_decors = []
938
+ for data in decor:
939
+ level_decors.append(
940
+ LevelDecor(
941
+ level_id=level.id, x=data["x"], y=data["y"], decorName=data[
942
+ "decorName"]
943
+ )
944
+ )
945
+ LevelDecor.objects.bulk_create(level_decors)
946
+
947
+ def bulk_copy_decor(old_level_name, new_level_name):
948
+ old_level = Level.objects.get(name=old_level_name, default=True)
949
+ decor_to_copy = LevelDecor.objects.filter(level_id=old_level.id).values()
950
+ new_level = Level.objects.get(name=new_level_name, default=True)
951
+
952
+ new_level_decor = []
953
+ for decor in decor_to_copy:
954
+ new_level_decor.append(
955
+ LevelDecor(
956
+ level_id=new_level.pk,
957
+ x=decor["x"],
958
+ y=decor["y"],
959
+ decorName=decor["decorName"],
960
+ )
961
+ )
962
+ LevelDecor.objects.bulk_create(new_level_decor)
963
+
964
+ level1014 = Level.objects.get(name="1014", default=True)
965
+ level1015 = Level.objects.get(name="1015", default=True)
966
+ level1016 = Level.objects.get(name="1016", default=True)
967
+ level1017 = Level.objects.get(name="1017", default=True)
968
+ level1018 = Level.objects.get(name="1018", default=True)
969
+ level1019 = Level.objects.get(name="1019", default=True)
970
+ level1020 = Level.objects.get(name="1020", default=True)
971
+ level1021 = Level.objects.get(name="1021", default=True)
972
+ level1022 = Level.objects.get(name="1022", default=True)
973
+ level1023 = Level.objects.get(name="1023", default=True)
974
+ level1024 = Level.objects.get(name="1024", default=True)
975
+ level1027 = Level.objects.get(name="1027", default=True)
976
+ level1028 = Level.objects.get(name="1028", default=True)
977
+ level1033 = Level.objects.get(name="1033", default=True)
978
+ level1034 = Level.objects.get(name="1034", default=True)
979
+
980
+ set_decor(
981
+ level1014,
982
+ json.loads(
983
+ '[{"x": 149, "y": 299, "decorName": "pond"},'
984
+ + '{"x": 398, "y": 354, "decorName": "bush"},'
985
+ + '{"x": 399, "y": 318, "decorName": "bush"},'
986
+ + '{"x": 311, "y": 309, "decorName": "tree2"},'
987
+ + '{"x": 568, "y": 516, "decorName": "tree1"},'
988
+ + '{"x": 654, "y": 512, "decorName": "tree1"}]'
989
+ ),
990
+ )
991
+
992
+ set_decor(
993
+ level1015,
994
+ json.loads(
995
+ '[{"x": 404, "y": 602, "decorName": "pond"},'
996
+ + '{"x": 563, "y": 600, "decorName": "pond"},'
997
+ + '{"x": 501, "y": 503, "decorName": "pond"},'
998
+ + '{"x": 254, "y": 655, "decorName": "bush"},'
999
+ + '{"x": 253, "y": 617, "decorName": "bush"},'
1000
+ + '{"x": 407, "y": 512, "decorName": "tree2"},'
1001
+ + '{"x": 494, "y": 391, "decorName": "tree1"},'
1002
+ + '{"x": 486, "y": 318, "decorName": "tree1"},'
1003
+ + '{"x": 286, "y": 327, "decorName": "tree1"},'
1004
+ + '{"x": 252, "y": 256, "decorName": "tree1"}]'
1005
+ ),
1006
+ )
1007
+
1008
+ set_decor(
1009
+ level1016,
1010
+ json.loads(
1011
+ '[{"x": 699, "y": 499, "decorName": "pond"},'
1012
+ + '{"x": 700, "y": 402, "decorName": "pond"},'
1013
+ + '{"x": 611, "y": 469, "decorName": "bush"},'
1014
+ + '{"x": 610, "y": 427, "decorName": "bush"},'
1015
+ + '{"x": 613, "y": 505, "decorName": "tree2"}]'
1016
+ ),
1017
+ )
1018
+
1019
+ set_decor(
1020
+ level1017,
1021
+ json.loads(
1022
+ '[{"x": 461, "y": 314, "decorName": "pond"},'
1023
+ + '{"x": 428, "y": 371, "decorName": "tree1"},'
1024
+ + '{"x": 500, "y": 179, "decorName": "tree1"}]'
1025
+ ),
1026
+ )
1027
+
1028
+ set_decor(
1029
+ level1018,
1030
+ json.loads(
1031
+ '[{"x": 301, "y": 594, "decorName": "tree1"},'
1032
+ + '{"x": 421, "y": 598, "decorName": "tree1"},'
1033
+ + '{"x": 529, "y": 600, "decorName": "tree1"},'
1034
+ + '{"x": 120, "y": 415, "decorName": "tree2"},'
1035
+ + '{"x": 93, "y": 300, "decorName": "tree2"}]'
1036
+ ),
1037
+ )
1038
+
1039
+ set_decor(
1040
+ level1019,
1041
+ json.loads(
1042
+ '[{"x": 562, "y": 42, "decorName": "pond"},'
1043
+ + '{"x": 551, "y": 501, "decorName": "bush"},'
1044
+ + '{"x": 551, "y": 562, "decorName": "bush"},'
1045
+ + '{"x": 602, "y": 299, "decorName": "tree2"},'
1046
+ + '{"x": 618, "y": 500, "decorName": "tree1"},'
1047
+ + '{"x": 460, "y": 495, "decorName": "tree1"},'
1048
+ + '{"x": 145, "y": 364, "decorName": "tree1"},'
1049
+ + '{"x": 145, "y": 269, "decorName": "tree1"}]'
1050
+ ),
1051
+ )
1052
+
1053
+ set_decor(
1054
+ level1020,
1055
+ json.loads(
1056
+ '[{"x": 443, "y": 578, "decorName": "pond"},'
1057
+ + '{"x": 640, "y": 434, "decorName": "tree2"},'
1058
+ + '{"x": 623, "y": 362, "decorName": "tree1"},'
1059
+ + '{"x": 647, "y": 292, "decorName": "tree2"},'
1060
+ + '{"x": 694, "y": 341, "decorName": "tree1"},'
1061
+ + '{"x": 516, "y": 651, "decorName": "tree2"},'
1062
+ + '{"x": 412, "y": 648, "decorName": "tree1"}]'
1063
+ ),
1064
+ )
1065
+
1066
+ set_decor(
1067
+ level1021,
1068
+ json.loads(
1069
+ '[{"x": 149, "y": 292, "decorName": "pond"},'
1070
+ + '{"x": 300, "y": 507, "decorName": "tree1"},'
1071
+ + '{"x": 308, "y": 583, "decorName": "tree1"}]'
1072
+ ),
1073
+ )
1074
+
1075
+ set_decor(
1076
+ level1022,
1077
+ json.loads(
1078
+ '[{"x": 663, "y": 191, "decorName": "pond"},'
1079
+ + '{"x": 364, "y": 395, "decorName": "tree1"},'
1080
+ + '{"x": 463, "y": 317, "decorName": "tree2"},'
1081
+ + '{"x": 367, "y": 237, "decorName": "tree1"},'
1082
+ + '{"x": 250, "y": 391, "decorName": "tree2"}]'
1083
+ ),
1084
+ )
1085
+
1086
+ set_decor(
1087
+ level1023,
1088
+ json.loads(
1089
+ '[{"x": 599, "y": 310, "decorName": "pond"},'
1090
+ + '{"x": 599, "y": 208, "decorName": "pond"},'
1091
+ + '{"x": 754, "y": 337, "decorName": "bush"},'
1092
+ + '{"x": 755, "y": 370, "decorName": "bush"},'
1093
+ + '{"x": 754, "y": 302, "decorName": "bush"},'
1094
+ + '{"x": 809, "y": 370, "decorName": "bush"},'
1095
+ + '{"x": 810, "y": 334, "decorName": "bush"},'
1096
+ + '{"x": 810, "y": 298, "decorName": "bush"},'
1097
+ + '{"x": 602, "y": 418, "decorName": "tree2"},'
1098
+ + '{"x": 646, "y": 483, "decorName": "tree1"},'
1099
+ + '{"x": 678, "y": 426, "decorName": "tree1"}]'
1100
+ ),
1101
+ )
1102
+
1103
+ set_decor(
1104
+ level1024,
1105
+ json.loads(
1106
+ '[{"x": 316, "y": 302, "decorName": "pond"},'
1107
+ + '{"x": 207, "y": 198, "decorName": "pond"},'
1108
+ + '{"x": 371, "y": 198, "decorName": "pond"},'
1109
+ + '{"x": 533, "y": 195, "decorName": "pond"},'
1110
+ + '{"x": 491, "y": 367, "decorName": "bush"},'
1111
+ + '{"x": 498, "y": 330, "decorName": "bush"},'
1112
+ + '{"x": 553, "y": 354, "decorName": "bush"},'
1113
+ + '{"x": 546, "y": 318, "decorName": "bush"},'
1114
+ + '{"x": 230, "y": 317, "decorName": "tree2"}]'
1115
+ ),
1116
+ )
1117
+
1118
+ set_decor(
1119
+ level1027,
1120
+ json.loads(
1121
+ '[{"x": 147, "y": 214, "decorName": "pond"},'
1122
+ + '{"x": 434, "y": 255, "decorName": "bush"},'
1123
+ + '{"x": 489, "y": 259, "decorName": "bush"},'
1124
+ + '{"x": 298, "y": 188, "decorName": "tree2"},'
1125
+ + '{"x": 158, "y": 398, "decorName": "tree2"},'
1126
+ + '{"x": 220, "y": 410, "decorName": "tree1"},'
1127
+ + '{"x": 548, "y": 411, "decorName": "tree1"},'
1128
+ + '{"x": 617, "y": 407, "decorName": "tree2"},'
1129
+ + '{"x": 669, "y": 199, "decorName": "tree2"}]'
1130
+ ),
1131
+ )
1132
+
1133
+ set_decor(
1134
+ level1028,
1135
+ json.loads(
1136
+ '[{"x": 443, "y": 578, "decorName": "pond"},'
1137
+ + '{"x": 640, "y": 434, "decorName": "tree2"},'
1138
+ + '{"x": 623, "y": 362, "decorName": "tree1"},'
1139
+ + '{"x": 647, "y": 292, "decorName": "tree2"},'
1140
+ + '{"x": 694, "y": 341, "decorName": "tree1"},'
1141
+ + '{"x": 516, "y": 651, "decorName": "tree2"},'
1142
+ + '{"x": 412, "y": 648, "decorName": "tree1"}]'
1143
+ ),
1144
+ )
1145
+
1146
+ set_decor(
1147
+ level1033,
1148
+ json.loads(
1149
+ '[{"x": 459, "y": 602, "decorName": "pond"},'
1150
+ + '{"x": 381, "y": 606, "decorName": "tree2"},'
1151
+ + '{"x": 692, "y": 688, "decorName": "tree1"},'
1152
+ + '{"x": 717, "y": 620, "decorName": "tree1"},'
1153
+ + '{"x": 686, "y": 530, "decorName": "tree2"}]'
1154
+ ),
1155
+ )
1156
+
1157
+ set_decor(
1158
+ level1034,
1159
+ json.loads(
1160
+ '[{"x": 625, "y": 408, "decorName": "pond"},'
1161
+ + '{"x": 201, "y": 411, "decorName": "tree2"},'
1162
+ + '{"x": 200, "y": 342, "decorName": "tree1"},'
1163
+ + '{"x": 405, "y": 443, "decorName": "tree2"},'
1164
+ + '{"x": 400, "y": 514, "decorName": "tree1"}]'
1165
+ ),
1166
+ )
1167
+
1168
+ bulk_copy_decor("85", "1026")
1169
+ bulk_copy_decor("119", "1029")
1170
+ bulk_copy_decor("84", "1030")
1171
+ bulk_copy_decor("34", "1031")
1172
+ bulk_copy_decor("99", "1035")
1173
+ bulk_copy_decor("38", "1036")
1174
+ bulk_copy_decor("100", "1037")
1175
+ bulk_copy_decor("39", "1038")
1176
+ bulk_copy_decor("47", "1039")
1177
+ bulk_copy_decor("48", "1040")
1178
+ bulk_copy_decor("83", "1041")
1179
+ bulk_copy_decor("95", "1042")
1180
+ bulk_copy_decor("96", "1043")
1181
+ bulk_copy_decor("84", "1044")
1182
+ bulk_copy_decor("97", "1045")
1183
+ bulk_copy_decor("106", "1046")
1184
+ bulk_copy_decor("107", "1047")
1185
+ bulk_copy_decor("108", "1048")
1186
+ bulk_copy_decor("109", "1049")
1187
+ bulk_copy_decor("61", "1050")
1188
+ bulk_copy_decor("62", "1051")
1189
+ bulk_copy_decor("63", "1052")
1190
+ bulk_copy_decor("64", "1053")
1191
+ bulk_copy_decor("65", "1054")
1192
+ bulk_copy_decor("66", "1055")
1193
+ bulk_copy_decor("67", "1056")
1194
+ bulk_copy_decor("90", "1057")
1195
+ bulk_copy_decor("91", "1058")
1196
+ bulk_copy_decor("101", "1059")
1197
+ bulk_copy_decor("102", "1060")
1198
+
1199
+
1200
+ def delete_python_den_decor(apps, schema_editor):
1201
+ LevelDecor = apps.get_model("game", "LevelDecor")
1202
+ LevelDecor.objects.filter(level_id__in=range(1014, 1061)).delete()
1203
+
1204
+
1205
+ def create_python_den_episodes(apps, schema_editor):
1206
+ Episode = apps.get_model("game", "Episode")
1207
+
1208
+ episode16 = Episode.objects.create(
1209
+ pk=16,
1210
+ name="Output, Operators, and Data",
1211
+ )
1212
+
1213
+ episode17 = Episode.objects.create(
1214
+ pk=17,
1215
+ name="Variables, Input, and Casting",
1216
+ )
1217
+
1218
+ episode18 = Episode.objects.create(
1219
+ pk=18,
1220
+ name="Selection",
1221
+ )
1222
+
1223
+ episode19 = Episode.objects.create(
1224
+ pk=19,
1225
+ name="Complex Selection",
1226
+ )
1227
+
1228
+ episode20 = Episode.objects.create(
1229
+ pk=20,
1230
+ name="String Manipulation",
1231
+ )
1232
+
1233
+ episode21 = Episode.objects.create(
1234
+ pk=21,
1235
+ name="Lists",
1236
+ )
1237
+
1238
+ Episode.objects.create(
1239
+ pk=22,
1240
+ name="Procedures",
1241
+ )
1242
+
1243
+ episode12 = Episode.objects.get(pk=12)
1244
+ episode13 = Episode.objects.get(pk=13)
1245
+ episode14 = Episode.objects.get(pk=14)
1246
+ episode15 = Episode.objects.get(pk=15)
1247
+ episode16.next_episode = episode17
1248
+ episode17.next_episode = episode18
1249
+ episode18.next_episode = episode19
1250
+ episode19.next_episode = episode12
1251
+ episode12.next_episode = episode13
1252
+ episode13.next_episode = episode14
1253
+ episode14.next_episode = episode20
1254
+ episode20.next_episode = episode21
1255
+ episode21.next_episode = episode15
1256
+
1257
+ episode12.save()
1258
+ episode13.save()
1259
+ episode14.save()
1260
+ episode16.save()
1261
+ episode17.save()
1262
+ episode18.save()
1263
+ episode19.save()
1264
+ episode20.save()
1265
+ episode21.save()
1266
+
1267
+
1268
+ def delete_python_den_episodes(apps, schema_editor):
1269
+ Episode = apps.get_model("game", "Episode")
1270
+ Episode.objects.filter(pk__in=range(16, 23)).delete()
1271
+
1272
+ episode14 = Episode.objects.get(pk=14)
1273
+ episode15 = Episode.objects.get(pk=15)
1274
+ episode14.next_episode = episode15
1275
+
1276
+ episode14.save()
1277
+
1278
+
1279
+ def set_first_and_last_levels(apps, schema_editor):
1280
+ Episode = apps.get_model("game", "Episode")
1281
+ Level = apps.get_model("game", "Level")
1282
+
1283
+ episode13 = Episode.objects.get(pk=13)
1284
+ episode13.first_level = Level.objects.get(name="1014", default=True)
1285
+ episode13.save()
1286
+
1287
+ episode14 = Episode.objects.get(pk=14)
1288
+ episode14.first_level = Level.objects.get(name="1026", default=True)
1289
+ episode14.save()
1290
+
1291
+ episode15 = Episode.objects.get(pk=15)
1292
+ episode15.first_level = Level.objects.get(name="1041", default=True)
1293
+ episode15.save()
1294
+
1295
+ episode22 = Episode.objects.get(pk=22)
1296
+ episode22.first_level = Level.objects.get(name="1050", default=True)
1297
+ episode22.save()
1298
+
1299
+
1300
+ def reset_first_and_last_levels(apps, schema_editor):
1301
+ Episode = apps.get_model("game", "Episode")
1302
+
1303
+ episode13 = Episode.objects.get(pk=13)
1304
+ episode13.first_level = None
1305
+ episode13.save()
1306
+
1307
+ episode14 = Episode.objects.get(pk=14)
1308
+ episode14.first_level = None
1309
+ episode14.save()
1310
+
1311
+ episode15 = Episode.objects.get(pk=15)
1312
+ episode15.first_level = None
1313
+ episode15.save()
1314
+
1315
+ episode22 = Episode.objects.get(pk=22)
1316
+ episode22.first_level = None
1317
+ episode22.save()
1318
+
1319
+
1320
+ def delete_old_loop_levels(apps, schema_editor):
1321
+ Level = apps.get_model("game", "Level")
1322
+ Level.objects.filter(name__in=range(123, 154)).delete()
1323
+
1324
+
1325
+ def recreate_old_loop_levels(apps, schema_editor):
1326
+ Episode = apps.get_model("game", "Episode")
1327
+ Level = apps.get_model("game", "Level")
1328
+
1329
+ episode_15 = Episode.objects.get(pk=15)
1330
+ episode_14 = Episode.objects.get(pk=14)
1331
+ episode_13 = Episode.objects.get(pk=13)
1332
+
1333
+ level_153 = Level.objects.create(
1334
+ name="153",
1335
+ episode=episode_15,
1336
+ )
1337
+ level_152 = Level.objects.create(
1338
+ name="152",
1339
+ episode=episode_15,
1340
+ next_level=level_153,
1341
+ )
1342
+ level_151 = Level.objects.create(
1343
+ name="151",
1344
+ episode=episode_15,
1345
+ next_level=level_152,
1346
+ )
1347
+ level_150 = Level.objects.create(
1348
+ name="150",
1349
+ episode=episode_15,
1350
+ next_level=level_151,
1351
+ )
1352
+ level_149 = Level.objects.create(
1353
+ name="149",
1354
+ episode=episode_15,
1355
+ next_level=level_150,
1356
+ )
1357
+
1358
+ # Episode 14, Levels 141 - 148
1359
+ level_148 = Level.objects.create(
1360
+ name="148",
1361
+ episode=episode_14,
1362
+ next_level=level_149,
1363
+ )
1364
+ level_147 = Level.objects.create(
1365
+ name="147",
1366
+ episode=episode_14,
1367
+ next_level=level_148,
1368
+ )
1369
+ level_146 = Level.objects.create(
1370
+ name="146",
1371
+ episode=episode_14,
1372
+ next_level=level_147,
1373
+ )
1374
+ level_145 = Level.objects.create(
1375
+ name="145",
1376
+ episode=episode_14,
1377
+ next_level=level_146,
1378
+ )
1379
+ level_144 = Level.objects.create(
1380
+ name="144",
1381
+ episode=episode_14,
1382
+ next_level=level_145,
1383
+ )
1384
+ level_143 = Level.objects.create(
1385
+ name="143",
1386
+ episode=episode_14,
1387
+ next_level=level_144,
1388
+ )
1389
+ level_142 = Level.objects.create(
1390
+ name="142",
1391
+ episode=episode_14,
1392
+ next_level=level_143,
1393
+ )
1394
+ level_141 = Level.objects.create(
1395
+ name="141",
1396
+ episode=episode_14,
1397
+ next_level=level_142,
1398
+ )
1399
+
1400
+ # Episode 13, Levels 123 - 140
1401
+ level_140 = Level.objects.create(
1402
+ name="140",
1403
+ episode=episode_13,
1404
+ next_level=level_141,
1405
+ )
1406
+ level_139 = Level.objects.create(
1407
+ name="139",
1408
+ episode=episode_13,
1409
+ next_level=level_140,
1410
+ )
1411
+ level_138 = Level.objects.create(
1412
+ name="138",
1413
+ episode=episode_13,
1414
+ next_level=level_139,
1415
+ )
1416
+ level_137 = Level.objects.create(
1417
+ name="137",
1418
+ episode=episode_13,
1419
+ next_level=level_138,
1420
+ )
1421
+ level_136 = Level.objects.create(
1422
+ name="136",
1423
+ episode=episode_13,
1424
+ next_level=level_137,
1425
+ )
1426
+ level_135 = Level.objects.create(
1427
+ name="135",
1428
+ episode=episode_13,
1429
+ next_level=level_136,
1430
+ )
1431
+ level_134 = Level.objects.create(
1432
+ name="134",
1433
+ episode=episode_13,
1434
+ next_level=level_135,
1435
+ )
1436
+ level_133 = Level.objects.create(
1437
+ name="133",
1438
+ episode=episode_13,
1439
+ next_level=level_134,
1440
+ )
1441
+ level_132 = Level.objects.create(
1442
+ name="132",
1443
+ episode=episode_13,
1444
+ next_level=level_133,
1445
+ )
1446
+ level_131 = Level.objects.create(
1447
+ name="131",
1448
+ episode=episode_13,
1449
+ next_level=level_132,
1450
+ )
1451
+ level_130 = Level.objects.create(
1452
+ name="130",
1453
+ episode=episode_13,
1454
+ next_level=level_131,
1455
+ )
1456
+ level_129 = Level.objects.create(
1457
+ name="129",
1458
+ episode=episode_13,
1459
+ next_level=level_130,
1460
+ )
1461
+ level_128 = Level.objects.create(
1462
+ name="128",
1463
+ episode=episode_13,
1464
+ next_level=level_129,
1465
+ )
1466
+ level_127 = Level.objects.create(
1467
+ name="127",
1468
+ episode=episode_13,
1469
+ next_level=level_128,
1470
+ )
1471
+ level_126 = Level.objects.create(
1472
+ name="126",
1473
+ episode=episode_13,
1474
+ next_level=level_127,
1475
+ )
1476
+ level_125 = Level.objects.create(
1477
+ name="125",
1478
+ episode=episode_13,
1479
+ next_level=level_126,
1480
+ )
1481
+ level_124 = Level.objects.create(
1482
+ name="124",
1483
+ episode=episode_13,
1484
+ next_level=level_125,
1485
+ )
1486
+ Level.objects.create(
1487
+ name="123",
1488
+ episode=episode_13,
1489
+ next_level=level_124,
1490
+ )
1491
+
1492
+
1493
+ class Migration(migrations.Migration):
1494
+ dependencies = [("game", "0096_alter_level_commands")]
1495
+
1496
+ operations = [
1497
+ migrations.RunPython(
1498
+ code=delete_old_loop_levels, reverse_code=recreate_old_loop_levels
1499
+ ),
1500
+ migrations.RunPython(
1501
+ code=create_python_den_episodes, reverse_code=delete_python_den_episodes
1502
+ ),
1503
+ migrations.RunPython(
1504
+ code=add_python_den_levels, reverse_code=delete_python_den_levels
1505
+ ),
1506
+ migrations.RunPython(
1507
+ code=add_python_den_blocks, reverse_code=delete_python_den_blocks
1508
+ ),
1509
+ migrations.RunPython(
1510
+ code=add_python_den_decor, reverse_code=delete_python_den_decor
1511
+ ),
1512
+ migrations.RunPython(
1513
+ code=set_first_and_last_levels, reverse_code=reset_first_and_last_levels
1514
+ ),
1515
+ ]