rapid-router 5.4.1__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 (354) hide show
  1. example_project/rapid_router_test_settings.py +164 -0
  2. example_project/settings.py +152 -0
  3. example_project/urls.py +15 -0
  4. example_project/{example_project/wsgi.py → wsgi.py} +2 -1
  5. game/__init__.py +1 -1
  6. game/admin.py +43 -4
  7. game/app_settings.py +3 -7
  8. game/character.py +26 -18
  9. game/decor.py +172 -97
  10. game/end_to_end_tests/base_game_test.py +44 -33
  11. game/end_to_end_tests/editor_page.py +17 -2
  12. game/end_to_end_tests/game_page.py +127 -45
  13. game/end_to_end_tests/selenium_test_case.py +1 -20
  14. game/end_to_end_tests/test_cow_crashes.py +3 -5
  15. game/end_to_end_tests/test_language_dropdown.py +14 -0
  16. game/end_to_end_tests/test_level_editor.py +290 -0
  17. game/end_to_end_tests/test_level_failures.py +1 -1
  18. game/end_to_end_tests/test_level_selection.py +79 -0
  19. game/end_to_end_tests/test_play_through.py +240 -102
  20. game/end_to_end_tests/test_python_levels.py +44 -13
  21. game/end_to_end_tests/test_saving_workspace.py +22 -0
  22. game/forms.py +9 -2
  23. game/level_management.py +38 -29
  24. game/messages.py +1218 -203
  25. game/migrations/0001_squashed_0025_levels_ordering_pt1.py +19 -1
  26. game/migrations/0026_levels_pt2.py +13 -2
  27. game/migrations/0032_cannot_turn_left_level.py +13 -2
  28. game/migrations/0033_recursion_level.py +13 -2
  29. game/migrations/0034_joes_level.py +13 -2
  30. game/migrations/0035_disable_route_score_level_70.py +0 -2
  31. game/migrations/0036_level_score_73.py +0 -2
  32. game/migrations/0037_level_score_79.py +0 -2
  33. game/migrations/0038_level_score_40.py +0 -1
  34. game/migrations/0042_level_score_73.py +0 -2
  35. game/migrations/0048_add_cow_field_and_blocks.py +0 -2
  36. game/migrations/0049_level_score_34.py +0 -2
  37. game/migrations/0050_level_score_40.py +0 -2
  38. game/migrations/0051_level_score_49.py +0 -1
  39. game/migrations/0076_level_locked_for_class.py +19 -0
  40. game/migrations/0077_alter_level_next_level.py +52 -0
  41. game/migrations/0078_add_block_types.py +23 -0
  42. game/migrations/0079_populate_block_type_add_cow_blocks.py +60 -0
  43. game/migrations/0080_level_disable_algorithm_score.py +18 -0
  44. game/migrations/0081_first_12_levels_no_algo_score.py +29 -0
  45. game/migrations/0082_level_43_solution.py +16 -0
  46. game/migrations/0083_add_cows_to_existing_levels.py +195 -0
  47. game/migrations/0084_alter_block_block_type.py +18 -0
  48. game/migrations/0085_add_new_blocks.py +53 -0
  49. game/migrations/0086_loop_levels.py +482 -0
  50. game/migrations/0087_workspace_python_view_enabled.py +18 -0
  51. game/migrations/0088_rename_episodes.py +35 -0
  52. game/migrations/0089_episodes_in_development.py +30 -0
  53. game/migrations/0090_add_missing_model_solutions.py +144 -0
  54. game/migrations/0091_disable_algo_score_if_no_model_solution.py +46 -0
  55. game/migrations/0092_disable_algo_score_in_custom_levels.py +28 -0
  56. game/migrations/0093_alter_level_character_name.py +18 -0
  57. game/migrations/0094_add_hint_lesson_subtitle_to_levels.py +28 -0
  58. game/migrations/0095_level_commands.py +18 -0
  59. game/migrations/0096_alter_level_commands.py +18 -0
  60. game/migrations/0097_add_python_den_levels.py +1515 -0
  61. game/migrations/0098_add_episode_link_fields.py +44 -0
  62. game/migrations/0099_python_episodes_links.py +103 -0
  63. game/migrations/0100_reorder_python_levels.py +179 -0
  64. game/migrations/0101_rename_episodes.py +45 -0
  65. game/migrations/0102_reoder_episodes_13_14.py +136 -0
  66. game/migrations/0103_level_1015_solution.py +26 -0
  67. game/migrations/0104_remove_level_direct_drive.py +17 -0
  68. game/migrations/0105_delete_invalid_attempts.py +18 -0
  69. game/migrations/0106_fields_to_snake_case.py +48 -0
  70. game/migrations/0107_rename_worksheet_link_episode_student_worksheet_link.py +18 -0
  71. game/migrations/0108_episode_indy_worksheet_link.py +18 -0
  72. game/migrations/0109_create_episodes_23_and_24.py +99 -0
  73. game/migrations/0110_remove_episode_indy_worksheet_link_and_more.py +100 -0
  74. game/migrations/0111_create_worksheets.py +149 -0
  75. game/migrations/0112_worksheet_locked_classes.py +21 -0
  76. game/migrations/0113_level_needs_approval.py +18 -0
  77. game/migrations/0114_default_and_non_student_levels_no_approval.py +31 -0
  78. game/migrations/0115_level_level__default_does_not_need_approval.py +22 -0
  79. game/migrations/0116_update_worksheet_video_links.py +68 -0
  80. game/migrations/0117_update_solutions_to_if_else.py +61 -0
  81. game/models.py +157 -16
  82. game/permissions.py +34 -19
  83. game/python_den_urls.py +26 -0
  84. game/random_road.py +43 -127
  85. game/serializers.py +12 -17
  86. game/static/django_reverse_js/js/reverse.js +171 -0
  87. game/static/game/css/LilitaOne-Regular.ttf +0 -0
  88. game/static/game/css/backgrounds.css +14 -10
  89. game/static/game/css/dataTables.custom.css +4 -2
  90. game/static/game/css/dataTables.jqueryui.css +561 -320
  91. game/static/game/css/editor.css +47 -0
  92. game/static/game/css/game.css +43 -49
  93. game/static/game/css/game_screen.css +116 -53
  94. game/static/game/css/jquery.dataTables.css +455 -251
  95. game/static/game/css/level_editor.css +10 -1
  96. game/static/game/css/level_selection.css +32 -3
  97. game/static/game/css/level_share.css +6 -5
  98. game/static/game/css/skulpt/codemirror.css +1 -0
  99. game/static/game/image/Python_Den_hero_student.png +0 -0
  100. game/static/game/image/Python_levels_page.svg +1954 -0
  101. game/static/game/image/characters/front_view/Electric_van.svg +448 -0
  102. game/static/game/image/characters/top_view/Electric_van.svg +448 -0
  103. game/static/game/image/characters/top_view/Sleigh.svg +436 -0
  104. game/static/game/image/decor/city/solar_panel.svg +1200 -0
  105. game/static/game/image/decor/farm/solar_panel.svg +86 -0
  106. game/static/game/image/decor/grass/solar_panel.svg +86 -0
  107. game/static/game/image/decor/snow/barn.svg +1788 -0
  108. game/static/game/image/decor/snow/cfc.svg +1050 -147
  109. game/static/game/image/decor/snow/crops.svg +7370 -0
  110. game/static/game/image/decor/snow/hospital.svg +1220 -0
  111. game/static/game/image/decor/snow/house1.svg +971 -0
  112. game/static/game/image/decor/snow/house2.svg +1574 -0
  113. game/static/game/image/decor/snow/school.svg +1071 -0
  114. game/static/game/image/decor/snow/shop.svg +3211 -0
  115. game/static/game/image/decor/snow/solar_panel.svg +173 -0
  116. game/static/game/image/electric_van.svg +448 -0
  117. game/static/game/image/icons/add_house.svg +26 -0
  118. game/static/game/image/icons/delete_house.svg +26 -0
  119. game/static/game/image/icons/description.svg +1 -0
  120. game/static/game/image/icons/hint.svg +1 -0
  121. game/static/game/image/icons/if_else.svg +3 -0
  122. game/static/game/image/icons/python.svg +1 -1
  123. game/static/game/image/if_else_example.png +0 -0
  124. game/static/game/image/pigeon.svg +684 -0
  125. game/static/game/image/python_den_header.svg +19 -0
  126. game/static/game/js/animation.js +84 -28
  127. game/static/game/js/blockly/msg/js/bg.js +52 -1
  128. game/static/game/js/blockly/msg/js/ca.js +52 -1
  129. game/static/game/js/blockly/msg/js/en-gb.js +52 -1
  130. game/static/game/js/blockly/msg/js/en.js +52 -1
  131. game/static/game/js/blockly/msg/js/es.js +52 -1
  132. game/static/game/js/blockly/msg/js/fr.js +52 -1
  133. game/static/game/js/blockly/msg/js/hi.js +52 -1
  134. game/static/game/js/blockly/msg/js/it.js +52 -1
  135. game/static/game/js/blockly/msg/js/pl.js +52 -1
  136. game/static/game/js/blockly/msg/js/pt-br.js +52 -1
  137. game/static/game/js/blockly/msg/js/ru.js +52 -1
  138. game/static/game/js/blockly/msg/js/ur.js +52 -1
  139. game/static/game/js/blocklyCompiler.js +550 -392
  140. game/static/game/js/blocklyControl.js +335 -302
  141. game/static/game/js/blocklyCustomBlocks.js +691 -458
  142. game/static/game/js/blocklyCustomisations.js +3 -1
  143. game/static/game/js/button.js +12 -0
  144. game/static/game/js/cow.js +15 -130
  145. game/static/game/js/drawing.js +313 -201
  146. game/static/game/js/editor.js +23 -0
  147. game/static/game/js/game.js +148 -139
  148. game/static/game/js/jquery.dataTables.min.js +3 -159
  149. game/static/game/js/level_editor.js +823 -448
  150. game/static/game/js/level_moderation.js +33 -2
  151. game/static/game/js/level_selection.js +62 -25
  152. game/static/game/js/loadLanguages.js +21 -0
  153. game/static/game/js/map.js +106 -36
  154. game/static/game/js/model.js +55 -107
  155. game/static/game/js/pathFinder.js +73 -72
  156. game/static/game/js/program.js +184 -193
  157. game/static/game/js/pythonControl.js +14 -1
  158. game/static/game/js/scoreboard.js +0 -37
  159. game/static/game/js/scoreboardSharedLevels.js +48 -0
  160. game/static/game/js/sharing.js +22 -10
  161. game/static/game/js/skulpt/codemirror.js +5 -4
  162. game/static/game/js/skulpt/skulpt-stdlib.js +1 -1
  163. game/static/game/js/sound.js +52 -5
  164. game/static/game/js/van.js +0 -7
  165. game/static/game/raphael_image/characters/top_view/Electric_van.svg +448 -0
  166. game/static/game/raphael_image/characters/top_view/Sleigh.svg +436 -0
  167. game/static/game/raphael_image/decor/city/solar_panel.svg +1200 -0
  168. game/static/game/raphael_image/decor/farm/solar_panel.svg +86 -0
  169. game/static/game/raphael_image/decor/grass/solar_panel.svg +86 -0
  170. game/static/game/raphael_image/decor/snow/barn.svg +1788 -0
  171. game/static/game/raphael_image/decor/snow/cfc.svg +1050 -147
  172. game/static/game/raphael_image/decor/snow/crops.svg +7370 -0
  173. game/static/game/raphael_image/decor/snow/hospital.svg +1220 -0
  174. game/static/game/raphael_image/decor/snow/house1.svg +971 -0
  175. game/static/game/raphael_image/decor/snow/house2.svg +1574 -0
  176. game/static/game/raphael_image/decor/snow/school.svg +1071 -0
  177. game/static/game/raphael_image/decor/snow/shop.svg +3211 -0
  178. game/static/game/raphael_image/decor/snow/solar_panel.svg +173 -0
  179. game/static/game/raphael_image/pigeon.svg +685 -0
  180. game/static/game/raphael_image/sleigh_wreckage.svg +430 -0
  181. game/static/game/sass/game.scss +22 -6
  182. game/static/game/sound/clown_horn.mp3 +0 -0
  183. game/static/game/sound/clown_horn.ogg +0 -0
  184. game/static/game/sound/electric_van_starting.mp3 +0 -0
  185. game/static/game/sound/electric_van_starting.ogg +0 -0
  186. game/static/game/sound/pigeon.mp3 +0 -0
  187. game/static/game/sound/pigeon.ogg +0 -0
  188. game/static/game/sound/sleigh_bells.mp3 +0 -0
  189. game/static/game/sound/sleigh_bells.ogg +0 -0
  190. game/static/game/sound/sleigh_crash.mp3 +0 -0
  191. game/static/game/sound/sleigh_crash.ogg +0 -0
  192. game/templates/game/base.html +35 -15
  193. game/templates/game/basenonav.html +23 -17
  194. game/templates/game/game.html +236 -111
  195. game/templates/game/level_editor.html +353 -275
  196. game/templates/game/level_moderation.html +19 -6
  197. game/templates/game/level_selection.html +75 -62
  198. game/templates/game/python_den_level_selection.html +291 -0
  199. game/templates/game/python_den_worksheet.html +101 -0
  200. game/templates/game/scoreboard.html +88 -65
  201. game/tests/test_level_editor.py +210 -35
  202. game/tests/test_level_moderation.py +6 -20
  203. game/tests/test_level_selection.py +332 -11
  204. game/tests/test_python_den_worksheet.py +85 -0
  205. game/tests/test_scoreboard.py +258 -66
  206. game/tests/utils/level.py +43 -3
  207. game/tests/utils/teacher.py +2 -2
  208. game/theme.py +21 -21
  209. game/urls.py +125 -78
  210. game/views/language_code_conversions.py +90 -0
  211. game/views/level.py +201 -63
  212. game/views/level_editor.py +109 -48
  213. game/views/level_moderation.py +29 -6
  214. game/views/level_selection.py +179 -56
  215. game/views/level_solutions.py +600 -106
  216. game/views/scoreboard.py +181 -66
  217. game/views/worksheet.py +25 -0
  218. rapid_router-7.6.8.dist-info/METADATA +174 -0
  219. {rapid_router-5.4.1.dist-info → rapid_router-7.6.8.dist-info}/RECORD +222 -242
  220. {rapid_router-5.4.1.dist-info → rapid_router-7.6.8.dist-info}/WHEEL +1 -1
  221. rapid_router-7.6.8.dist-info/licenses/LICENSE.md +3 -0
  222. example_project/example_project/__init__.py +0 -1
  223. example_project/example_project/settings.py +0 -54
  224. example_project/example_project/urls.py +0 -16
  225. example_project/manage.py +0 -10
  226. game/autoconfig.py +0 -59
  227. game/csp_config.py +0 -23
  228. game/locale/ar_SA/LC_MESSAGES/django.mo +0 -0
  229. game/locale/ar_SA/LC_MESSAGES/django.po +0 -405
  230. game/locale/ar_SA/LC_MESSAGES/djangojs.mo +0 -0
  231. game/locale/ar_SA/LC_MESSAGES/djangojs.po +0 -743
  232. game/locale/bg_BG/LC_MESSAGES/django.mo +0 -0
  233. game/locale/bg_BG/LC_MESSAGES/django.po +0 -405
  234. game/locale/bg_BG/LC_MESSAGES/djangojs.mo +0 -0
  235. game/locale/bg_BG/LC_MESSAGES/djangojs.po +0 -739
  236. game/locale/ca_ES/LC_MESSAGES/django.mo +0 -0
  237. game/locale/ca_ES/LC_MESSAGES/django.po +0 -405
  238. game/locale/ca_ES/LC_MESSAGES/djangojs.mo +0 -0
  239. game/locale/ca_ES/LC_MESSAGES/djangojs.po +0 -740
  240. game/locale/cs_CZ/LC_MESSAGES/django.mo +0 -0
  241. game/locale/cs_CZ/LC_MESSAGES/django.po +0 -405
  242. game/locale/cs_CZ/LC_MESSAGES/djangojs.mo +0 -0
  243. game/locale/cs_CZ/LC_MESSAGES/djangojs.po +0 -741
  244. game/locale/cy_GB/LC_MESSAGES/django.mo +0 -0
  245. game/locale/cy_GB/LC_MESSAGES/django.po +0 -405
  246. game/locale/cy_GB/LC_MESSAGES/djangojs.mo +0 -0
  247. game/locale/cy_GB/LC_MESSAGES/djangojs.po +0 -743
  248. game/locale/de_DE/LC_MESSAGES/django.mo +0 -0
  249. game/locale/de_DE/LC_MESSAGES/django.po +0 -405
  250. game/locale/de_DE/LC_MESSAGES/djangojs.mo +0 -0
  251. game/locale/de_DE/LC_MESSAGES/djangojs.po +0 -739
  252. game/locale/el_GR/LC_MESSAGES/django.mo +0 -0
  253. game/locale/el_GR/LC_MESSAGES/django.po +0 -405
  254. game/locale/el_GR/LC_MESSAGES/djangojs.mo +0 -0
  255. game/locale/el_GR/LC_MESSAGES/djangojs.po +0 -739
  256. game/locale/en_GB/LC_MESSAGES/django.mo +0 -0
  257. game/locale/en_GB/LC_MESSAGES/django.po +0 -405
  258. game/locale/en_GB/LC_MESSAGES/djangojs.mo +0 -0
  259. game/locale/en_GB/LC_MESSAGES/djangojs.po +0 -739
  260. game/locale/es_ES/LC_MESSAGES/django.mo +0 -0
  261. game/locale/es_ES/LC_MESSAGES/django.po +0 -405
  262. game/locale/es_ES/LC_MESSAGES/djangojs.mo +0 -0
  263. game/locale/es_ES/LC_MESSAGES/djangojs.po +0 -739
  264. game/locale/fi_FI/LC_MESSAGES/django.mo +0 -0
  265. game/locale/fi_FI/LC_MESSAGES/django.po +0 -405
  266. game/locale/fi_FI/LC_MESSAGES/djangojs.mo +0 -0
  267. game/locale/fi_FI/LC_MESSAGES/djangojs.po +0 -739
  268. game/locale/fr_FR/LC_MESSAGES/django.mo +0 -0
  269. game/locale/fr_FR/LC_MESSAGES/django.po +0 -405
  270. game/locale/fr_FR/LC_MESSAGES/djangojs.mo +0 -0
  271. game/locale/fr_FR/LC_MESSAGES/djangojs.po +0 -739
  272. game/locale/gu_IN/LC_MESSAGES/django.mo +0 -0
  273. game/locale/gu_IN/LC_MESSAGES/django.po +0 -405
  274. game/locale/gu_IN/LC_MESSAGES/djangojs.mo +0 -0
  275. game/locale/gu_IN/LC_MESSAGES/djangojs.po +0 -739
  276. game/locale/hi_IN/LC_MESSAGES/django.mo +0 -0
  277. game/locale/hi_IN/LC_MESSAGES/django.po +0 -405
  278. game/locale/hi_IN/LC_MESSAGES/djangojs.mo +0 -0
  279. game/locale/hi_IN/LC_MESSAGES/djangojs.po +0 -739
  280. game/locale/id_ID/LC_MESSAGES/django.mo +0 -0
  281. game/locale/id_ID/LC_MESSAGES/django.po +0 -405
  282. game/locale/id_ID/LC_MESSAGES/djangojs.mo +0 -0
  283. game/locale/id_ID/LC_MESSAGES/djangojs.po +0 -738
  284. game/locale/it_IT/LC_MESSAGES/django.mo +0 -0
  285. game/locale/it_IT/LC_MESSAGES/django.po +0 -405
  286. game/locale/it_IT/LC_MESSAGES/djangojs.mo +0 -0
  287. game/locale/it_IT/LC_MESSAGES/djangojs.po +0 -739
  288. game/locale/ja_JP/LC_MESSAGES/django.mo +0 -0
  289. game/locale/ja_JP/LC_MESSAGES/django.po +0 -405
  290. game/locale/ja_JP/LC_MESSAGES/djangojs.mo +0 -0
  291. game/locale/ja_JP/LC_MESSAGES/djangojs.po +0 -738
  292. game/locale/lol_US/LC_MESSAGES/django.mo +0 -0
  293. game/locale/lol_US/LC_MESSAGES/django.po +0 -405
  294. game/locale/lol_US/LC_MESSAGES/djangojs.mo +0 -0
  295. game/locale/lol_US/LC_MESSAGES/djangojs.po +0 -739
  296. game/locale/nb_NO/LC_MESSAGES/django.mo +0 -0
  297. game/locale/nb_NO/LC_MESSAGES/django.po +0 -405
  298. game/locale/nb_NO/LC_MESSAGES/djangojs.mo +0 -0
  299. game/locale/nb_NO/LC_MESSAGES/djangojs.po +0 -739
  300. game/locale/nl_NL/LC_MESSAGES/django.mo +0 -0
  301. game/locale/nl_NL/LC_MESSAGES/django.po +0 -405
  302. game/locale/nl_NL/LC_MESSAGES/djangojs.mo +0 -0
  303. game/locale/nl_NL/LC_MESSAGES/djangojs.po +0 -739
  304. game/locale/pl_PL/LC_MESSAGES/django.mo +0 -0
  305. game/locale/pl_PL/LC_MESSAGES/django.po +0 -405
  306. game/locale/pl_PL/LC_MESSAGES/djangojs.mo +0 -0
  307. game/locale/pl_PL/LC_MESSAGES/djangojs.po +0 -741
  308. game/locale/pt_BR/LC_MESSAGES/django.mo +0 -0
  309. game/locale/pt_BR/LC_MESSAGES/django.po +0 -405
  310. game/locale/pt_BR/LC_MESSAGES/djangojs.mo +0 -0
  311. game/locale/pt_BR/LC_MESSAGES/djangojs.po +0 -739
  312. game/locale/pt_PT/LC_MESSAGES/django.mo +0 -0
  313. game/locale/pt_PT/LC_MESSAGES/django.po +0 -405
  314. game/locale/pt_PT/LC_MESSAGES/djangojs.mo +0 -0
  315. game/locale/pt_PT/LC_MESSAGES/djangojs.po +0 -739
  316. game/locale/ro_RO/LC_MESSAGES/django.mo +0 -0
  317. game/locale/ro_RO/LC_MESSAGES/django.po +0 -405
  318. game/locale/ro_RO/LC_MESSAGES/djangojs.mo +0 -0
  319. game/locale/ro_RO/LC_MESSAGES/djangojs.po +0 -740
  320. game/locale/ru_RU/LC_MESSAGES/django.mo +0 -0
  321. game/locale/ru_RU/LC_MESSAGES/django.po +0 -405
  322. game/locale/ru_RU/LC_MESSAGES/djangojs.mo +0 -0
  323. game/locale/ru_RU/LC_MESSAGES/djangojs.po +0 -741
  324. game/locale/sv_SE/LC_MESSAGES/django.mo +0 -0
  325. game/locale/sv_SE/LC_MESSAGES/django.po +0 -405
  326. game/locale/sv_SE/LC_MESSAGES/djangojs.mo +0 -0
  327. game/locale/sv_SE/LC_MESSAGES/djangojs.po +0 -739
  328. game/locale/tl_PH/LC_MESSAGES/django.mo +0 -0
  329. game/locale/tl_PH/LC_MESSAGES/django.po +0 -405
  330. game/locale/tl_PH/LC_MESSAGES/djangojs.mo +0 -0
  331. game/locale/tl_PH/LC_MESSAGES/djangojs.po +0 -739
  332. game/locale/tlh_AA/LC_MESSAGES/django.mo +0 -0
  333. game/locale/tlh_AA/LC_MESSAGES/django.po +0 -405
  334. game/locale/tlh_AA/LC_MESSAGES/djangojs.mo +0 -0
  335. game/locale/tlh_AA/LC_MESSAGES/djangojs.po +0 -739
  336. game/locale/tr_TR/LC_MESSAGES/django.mo +0 -0
  337. game/locale/tr_TR/LC_MESSAGES/django.po +0 -405
  338. game/locale/tr_TR/LC_MESSAGES/djangojs.mo +0 -0
  339. game/locale/tr_TR/LC_MESSAGES/djangojs.po +0 -740
  340. game/locale/ur_IN/LC_MESSAGES/django.mo +0 -0
  341. game/locale/ur_IN/LC_MESSAGES/django.po +0 -405
  342. game/locale/ur_IN/LC_MESSAGES/djangojs.mo +0 -0
  343. game/locale/ur_IN/LC_MESSAGES/djangojs.po +0 -739
  344. game/locale/ur_PK/LC_MESSAGES/django.mo +0 -0
  345. game/locale/ur_PK/LC_MESSAGES/django.po +0 -405
  346. game/locale/ur_PK/LC_MESSAGES/djangojs.mo +0 -0
  347. game/locale/ur_PK/LC_MESSAGES/djangojs.po +0 -739
  348. game/static/game/image/actions/go.svg +0 -18
  349. game/static/game/image/icons/destination.svg +0 -9
  350. game/static/game/js/pqselect.min.js +0 -9
  351. game/static/game/js/widget-scroller.js +0 -906
  352. rapid_router-5.4.1.dist-info/LICENSE.md +0 -577
  353. rapid_router-5.4.1.dist-info/METADATA +0 -24
  354. {rapid_router-5.4.1.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
 
@@ -0,0 +1,19 @@
1
+ # Generated by Django 3.2.15 on 2022-10-31 15:57
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('common', '0030_add_maintenance_banner'),
10
+ ('game', '0075_level_48_houses'),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AddField(
15
+ model_name='level',
16
+ name='locked_for_class',
17
+ field=models.ManyToManyField(blank=True, related_name='locked_levels', to='common.Class'),
18
+ ),
19
+ ]
@@ -0,0 +1,52 @@
1
+ # Generated by Django 3.2.16 on 2022-12-01 10:49
2
+ from django.db import migrations, models
3
+ import django.db.models.deletion
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+ def add_next_level_to_last_levels(apps, schema_editor):
8
+ Level = apps.get_model("game", "Level")
9
+ db_alias = schema_editor.connection.alias
10
+ Level_Object_Wrapper = Level.objects.using(db_alias)
11
+ levels = Level_Object_Wrapper.filter(
12
+ episode__isnull=False,
13
+ next_level=None,
14
+ ).exclude(name="109")
15
+ for level in levels:
16
+ level.next_level = Level_Object_Wrapper.filter(
17
+ name=int(level.name) + 1, episode__isnull=False
18
+ )[0]
19
+ level.save()
20
+
21
+ def remove_next_level_to_last_levels(apps, schema_editor):
22
+ Level = apps.get_model("game", "Level")
23
+ db_alias = schema_editor.connection.alias
24
+ Level_Object_Wrapper = Level.objects.using(db_alias)
25
+ levels = Level_Object_Wrapper.filter(
26
+ episode__isnull=False,
27
+ name__in=["12", "18", "28", "32", "43", "50", "60", "67", "79", "91"],
28
+ )
29
+ for level in levels:
30
+ level.next_level = None
31
+ level.save()
32
+
33
+ dependencies = [
34
+ ("game", "0076_level_locked_for_class"),
35
+ ]
36
+
37
+ operations = [
38
+ migrations.AlterField(
39
+ model_name="level",
40
+ name="next_level",
41
+ field=models.ForeignKey(
42
+ default=None,
43
+ null=True,
44
+ on_delete=django.db.models.deletion.SET_NULL,
45
+ related_name="prev_level",
46
+ to="game.level",
47
+ ),
48
+ ),
49
+ migrations.RunPython(
50
+ add_next_level_to_last_levels, reverse_code=remove_next_level_to_last_levels
51
+ ),
52
+ ]
@@ -0,0 +1,23 @@
1
+ # Generated by Django 3.2.16 on 2022-12-02 09:12
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('game', '0077_alter_level_next_level'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterModelOptions(
14
+ name='block',
15
+ options={'ordering': ['block_type', 'pk']},
16
+ ),
17
+ migrations.AddField(
18
+ model_name='block',
19
+ name='block_type',
20
+ field=models.IntegerField(choices=[(0, 'Start'), (1, 'Action'), (2, 'Condition'), (3, 'Procedure'), (4, 'ControlFlow')], default=4),
21
+ preserve_default=False,
22
+ ),
23
+ ]
@@ -0,0 +1,60 @@
1
+ # Generated by Django 3.2.15 on 2022-11-06 16:08
2
+
3
+ from django.db import migrations
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+ def block_types(apps, schema_editor):
8
+ ACTION = 1
9
+ CONDITION = 2
10
+ PROCEDURE = 3
11
+ CONTROLFLOW = 4
12
+
13
+ block_types = {
14
+ "move_forwards": ACTION,
15
+ "turn_left": ACTION,
16
+ "turn_right": ACTION,
17
+ "turn_around": ACTION,
18
+ "wait": ACTION,
19
+ "deliver": ACTION,
20
+ "sound_horn": ACTION,
21
+ "controls_repeat": CONTROLFLOW,
22
+ "controls_repeat_while": CONTROLFLOW,
23
+ "controls_repeat_until": CONTROLFLOW,
24
+ "controls_if": CONDITION,
25
+ "logic_negate": CONDITION,
26
+ "at_destination": CONDITION,
27
+ "road_exists": CONDITION,
28
+ "dead_end": CONDITION,
29
+ "traffic_light": CONDITION,
30
+ "cow_crossing": CONDITION,
31
+ "call_proc": PROCEDURE,
32
+ "declare_proc": PROCEDURE,
33
+ }
34
+
35
+ Block = apps.get_model("game", "Block")
36
+ Block.objects.filter(type="puff_up").delete()
37
+ Block.objects.filter(type="declare_event").delete()
38
+
39
+ for block in Block.objects.all():
40
+ block.block_type = block_types[block.type]
41
+ block.save()
42
+ Block.objects.create(type="cow_crossing", block_type=CONDITION)
43
+
44
+ def remove_block_types(apps, schema_editor):
45
+ ACTION = 1
46
+
47
+ Block = apps.get_model("game", "Block")
48
+
49
+ Block.objects.get(type="cow_crossing").delete()
50
+
51
+ Block.objects.create(type="puff_up", block_type=ACTION)
52
+ Block.objects.create(type="declare_event", block_type=ACTION)
53
+
54
+ dependencies = [
55
+ ("game", "0078_add_block_types"),
56
+ ]
57
+
58
+ operations = [
59
+ migrations.RunPython(block_types, reverse_code=remove_block_types),
60
+ ]
@@ -0,0 +1,18 @@
1
+ # Generated by Django 3.2.16 on 2023-01-27 13:31
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('game', '0079_populate_block_type_add_cow_blocks'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name='level',
15
+ name='disable_algorithm_score',
16
+ field=models.BooleanField(default=False),
17
+ ),
18
+ ]
@@ -0,0 +1,29 @@
1
+ # Generated by Django 3.2.15 on 2022-11-06 16:08
2
+
3
+ from django.db import migrations
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+ def populate_disable_algorithm_score(apps, schema_editor):
8
+ Level = apps.get_model("game", "Level")
9
+ official_levels = Level.objects.filter(default=True)
10
+ for i in range(1, 13):
11
+ level = official_levels.get(name=str(i))
12
+ level.disable_algorithm_score = True
13
+ level.save()
14
+
15
+ def unpopulate_disable_algorithm_score(apps, schema_editor):
16
+ Level = apps.get_model("game", "Level")
17
+ official_levels = Level.objects.filter(default=True)
18
+ for i in range(1, 13):
19
+ level = official_levels.get(name=str(i))
20
+ level.disable_algorithm_score = False
21
+ level.save()
22
+
23
+ dependencies = [
24
+ ("game", "0080_level_disable_algorithm_score"),
25
+ ]
26
+
27
+ operations = [
28
+ migrations.RunPython(populate_disable_algorithm_score, reverse_code=unpopulate_disable_algorithm_score),
29
+ ]
@@ -0,0 +1,16 @@
1
+ from django.db import migrations
2
+
3
+
4
+ def update_level(apps, schema_editor):
5
+
6
+ Level = apps.get_model("game", "Level")
7
+ level43 = Level.objects.get(name="43", default=1)
8
+ level43.model_solution = "[9]"
9
+ level43.save()
10
+
11
+
12
+ class Migration(migrations.Migration):
13
+ dependencies = [("game", "0081_first_12_levels_no_algo_score")]
14
+ operations = [
15
+ migrations.RunPython(update_level, reverse_code=migrations.RunPython.noop)
16
+ ]
@@ -0,0 +1,195 @@
1
+ from django.apps.registry import Apps
2
+ from django.db import migrations
3
+
4
+
5
+ def add_cows_to_existing_levels(apps: Apps, *args):
6
+ Level = apps.get_model("game", "Level")
7
+ Block = apps.get_model("game", "Block")
8
+ LevelBlock = apps.get_model("game", "LevelBlock")
9
+ LevelDecor = apps.get_model("game", "LevelDecor")
10
+
11
+ level_38 = Level.objects.get(name="38", default=1)
12
+ level_38.cows = '[{"minCows":1,"maxCows":1,"potentialCoordinates":[{"x":2,"y":6},{"x":3,"y":4},{"x":3,"y":1}],"type":"WHITE"}]'
13
+ level_38.theme_name = "farm"
14
+ level_38.model_solution = "[10]"
15
+ level_38.save()
16
+
17
+ level_39 = Level.objects.get(name="39", default=1)
18
+ level_39.cows = '[{"minCows":1,"maxCows":1,"potentialCoordinates":[{"x":4,"y":4},{"x":8,"y":4},{"x":8,"y":6}],"type":"WHITE"}]'
19
+ level_39.theme_name = "farm"
20
+ level_39.model_solution = "[10]"
21
+ level_39.disable_route_score = True
22
+ level_39.save()
23
+
24
+ level_47 = Level.objects.get(name="47", default=1)
25
+ level_47.traffic_lights = "[]"
26
+ level_47.cows = '[{"minCows":1,"maxCows":1,"potentialCoordinates":[{"x":6,"y":4},{"x":4,"y":6},{"x":2,"y":4}],"type":"WHITE"}]'
27
+ level_47.theme_name = "farm"
28
+ level_47.model_solution = "[8]"
29
+ level_47.save()
30
+
31
+ block_sound_horn = Block.objects.get(type="sound_horn")
32
+ block_cow_crossing = Block.objects.get(type="cow_crossing")
33
+
34
+ LevelBlock.objects.filter(
35
+ level=level_47,
36
+ type__type__in=["traffic_light", "wait"],
37
+ ).delete()
38
+
39
+ LevelBlock.objects.bulk_create(
40
+ [
41
+ LevelBlock(level=level_38, type=block_sound_horn),
42
+ LevelBlock(level=level_38, type=block_cow_crossing),
43
+ LevelBlock(level=level_39, type=block_sound_horn),
44
+ LevelBlock(level=level_39, type=block_cow_crossing),
45
+ LevelBlock(level=level_47, type=block_sound_horn),
46
+ LevelBlock(level=level_47, type=block_cow_crossing),
47
+ ]
48
+ )
49
+
50
+ LevelDecor.objects.filter(
51
+ level_id__in=[
52
+ level_47.id,
53
+ ]
54
+ ).delete()
55
+
56
+ LevelDecor.objects.bulk_create(
57
+ [
58
+ LevelDecor(
59
+ x=570,
60
+ y=296,
61
+ decorName="pond",
62
+ level=level_39,
63
+ ),
64
+ LevelDecor(
65
+ x=570,
66
+ y=408,
67
+ decorName="pond",
68
+ level=level_39,
69
+ ),
70
+ LevelDecor(
71
+ x=570,
72
+ y=514,
73
+ decorName="pond",
74
+ level=level_39,
75
+ ),
76
+ LevelDecor(
77
+ x=293,
78
+ y=300,
79
+ decorName="tree1",
80
+ level=level_39,
81
+ ),
82
+ LevelDecor(
83
+ x=711,
84
+ y=101,
85
+ decorName="tree1",
86
+ level=level_39,
87
+ ),
88
+ LevelDecor(
89
+ x=897,
90
+ y=604,
91
+ decorName="tree1",
92
+ level=level_39,
93
+ ),
94
+ LevelDecor(
95
+ x=114,
96
+ y=315,
97
+ decorName="tree1",
98
+ level=level_39,
99
+ ),
100
+ LevelDecor(
101
+ x=37,
102
+ y=502,
103
+ decorName="pond",
104
+ level=level_47,
105
+ ),
106
+ LevelDecor(
107
+ x=39,
108
+ y=400,
109
+ decorName="pond",
110
+ level=level_47,
111
+ ),
112
+ LevelDecor(
113
+ x=39,
114
+ y=296,
115
+ decorName="pond",
116
+ level=level_47,
117
+ ),
118
+ LevelDecor(
119
+ x=720,
120
+ y=657,
121
+ decorName="bush",
122
+ level=level_47,
123
+ ),
124
+ LevelDecor(
125
+ x=720,
126
+ y=556,
127
+ decorName="bush",
128
+ level=level_47,
129
+ ),
130
+ LevelDecor(
131
+ x=720,
132
+ y=455,
133
+ decorName="bush",
134
+ level=level_47,
135
+ ),
136
+ LevelDecor(
137
+ x=720,
138
+ y=343,
139
+ decorName="bush",
140
+ level=level_47,
141
+ ),
142
+ LevelDecor(
143
+ x=720,
144
+ y=220,
145
+ decorName="bush",
146
+ level=level_47,
147
+ ),
148
+ LevelDecor(
149
+ x=403,
150
+ y=378,
151
+ decorName="tree1",
152
+ level=level_47,
153
+ ),
154
+ LevelDecor(
155
+ x=440,
156
+ y=471,
157
+ decorName="tree1",
158
+ level=level_47,
159
+ ),
160
+ LevelDecor(
161
+ x=132,
162
+ y=649,
163
+ decorName="tree1",
164
+ level=level_47,
165
+ ),
166
+ LevelDecor(
167
+ x=620,
168
+ y=689,
169
+ decorName="tree1",
170
+ level=level_47,
171
+ ),
172
+ LevelDecor(
173
+ x=500,
174
+ y=149,
175
+ decorName="tree1",
176
+ level=level_47,
177
+ ),
178
+ LevelDecor(
179
+ x=550,
180
+ y=483,
181
+ decorName="tree2",
182
+ level=level_47,
183
+ ),
184
+ ]
185
+ )
186
+
187
+
188
+ class Migration(migrations.Migration):
189
+ dependencies = [("game", "0082_level_43_solution")]
190
+ operations = [
191
+ migrations.RunPython(
192
+ add_cows_to_existing_levels,
193
+ reverse_code=migrations.RunPython.noop,
194
+ )
195
+ ]
@@ -0,0 +1,18 @@
1
+ # Generated by Django 3.2.18 on 2023-02-28 14:50
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('game', '0083_add_cows_to_existing_levels'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name='block',
15
+ name='block_type',
16
+ field=models.IntegerField(choices=[(0, 'Start'), (1, 'Action'), (2, 'Condition'), (3, 'Procedure'), (4, 'ControlFlow'), (5, 'Variable'), (6, 'Math')]),
17
+ ),
18
+ ]