e2xauthoring 0.3.0.dev4__tar.gz → 0.3.2__tar.gz

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 (129) hide show
  1. e2xauthoring-0.3.2/.github/workflows/ruff.yml +16 -0
  2. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/PKG-INFO +2 -2
  3. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/source/conf.py +1 -1
  4. e2xauthoring-0.3.2/e2xauthoring/__version__.py +1 -0
  5. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/app/handlers/apihandlers.py +1 -3
  6. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/app/handlers/base.py +10 -13
  7. e2xauthoring-0.3.2/e2xauthoring/app/templates/authoring/asset-manifest.json +10 -0
  8. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/app/templates/authoring/index.html +1 -1
  9. e2xauthoring-0.3.2/e2xauthoring/app/templates/authoring/static/js/main.2835591d.js +3 -0
  10. e2xauthoring-0.3.2/e2xauthoring/app/templates/authoring/static/js/main.2835591d.js.map +1 -0
  11. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/git/base.py +4 -12
  12. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/git/gitrepo.py +1 -3
  13. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/managers/assignmentmanager.py +1 -3
  14. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/managers/base.py +4 -6
  15. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/managers/presetmanager.py +8 -18
  16. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/managers/presets/template/Group Info.ipynb +2 -2
  17. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/managers/presets/template/Student Info.ipynb +1 -1
  18. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/managers/taskmanager.py +1 -3
  19. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/managers/worksheetmanager.py +1 -3
  20. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/models/pool.py +9 -9
  21. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/models/poolcollection.py +1 -3
  22. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/models/task.py +31 -29
  23. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/models/template.py +5 -14
  24. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/models/templatecollection.py +2 -6
  25. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/preprocessors/addtaskheader.py +3 -9
  26. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/preprocessors/copyfiles.py +1 -3
  27. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/preprocessors/filltemplate.py +1 -3
  28. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/preprocessors/generatetaskids.py +2 -6
  29. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/preprocessors/makeexercise.py +2 -6
  30. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/preprocessors/removeexercise.py +1 -3
  31. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/utils/pathutils.py +1 -3
  32. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/package-lock.json +6 -6
  33. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/package.json +1 -1
  34. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/pyproject.toml +4 -3
  35. e2xauthoring-0.3.0.dev4/.github/workflows/black.yml +0 -10
  36. e2xauthoring-0.3.0.dev4/.github/workflows/ruff.yml +0 -8
  37. e2xauthoring-0.3.0.dev4/.github/workflows/sonarcloud.yml +0 -68
  38. e2xauthoring-0.3.0.dev4/e2xauthoring/__version__.py +0 -1
  39. e2xauthoring-0.3.0.dev4/e2xauthoring/app/templates/authoring/asset-manifest.json +0 -10
  40. e2xauthoring-0.3.0.dev4/e2xauthoring/app/templates/authoring/static/js/main.5bf82181.js +0 -3
  41. e2xauthoring-0.3.0.dev4/e2xauthoring/app/templates/authoring/static/js/main.5bf82181.js.map +0 -1
  42. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/.gitignore +0 -0
  43. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/.pre-commit-config.yaml +0 -0
  44. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/.readthedocs.yaml +0 -0
  45. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/LICENSE +0 -0
  46. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/MANIFEST.in +0 -0
  47. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/README.md +0 -0
  48. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/Makefile +0 -0
  49. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/make.bat +0 -0
  50. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/requirements.txt +0 -0
  51. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/source/index.rst +0 -0
  52. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/source/setup/index.rst +0 -0
  53. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/source/setup/installation.rst +0 -0
  54. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/source/user_docs/img/add_files.png +0 -0
  55. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/source/user_docs/img/add_question.png +0 -0
  56. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/source/user_docs/img/add_tasks.png +0 -0
  57. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/source/user_docs/img/assignment_worksheets.drawio +0 -0
  58. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/source/user_docs/img/assignment_worksheets.png +0 -0
  59. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/source/user_docs/img/assignments.png +0 -0
  60. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/source/user_docs/img/attachment_editor.png +0 -0
  61. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/source/user_docs/img/autograded_code_question.png +0 -0
  62. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/source/user_docs/img/choose_tasks_1.png +0 -0
  63. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/source/user_docs/img/diagram_question.png +0 -0
  64. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/source/user_docs/img/diagram_question_rendered.png +0 -0
  65. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/source/user_docs/img/freetext_question.png +0 -0
  66. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/source/user_docs/img/make_worksheet.drawio +0 -0
  67. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/source/user_docs/img/make_worksheet.png +0 -0
  68. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/source/user_docs/img/manual_code_question.png +0 -0
  69. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/source/user_docs/img/multiple_choice_question.png +0 -0
  70. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/source/user_docs/img/multiple_choice_question_rendered.png +0 -0
  71. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/source/user_docs/img/new_task.png +0 -0
  72. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/source/user_docs/img/sample_template.png +0 -0
  73. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/source/user_docs/img/sample_template_variables.png +0 -0
  74. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/source/user_docs/img/single_choice_question.png +0 -0
  75. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/source/user_docs/img/single_choice_question_rendered.png +0 -0
  76. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/source/user_docs/img/tasks.png +0 -0
  77. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/source/user_docs/img/templates.png +0 -0
  78. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/source/user_docs/img/upload_question_rendered.png +0 -0
  79. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/source/user_docs/img/worksheet.png +0 -0
  80. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/source/user_docs/img/worksheet_options.png +0 -0
  81. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/source/user_docs/img/worksheets.drawio +0 -0
  82. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/source/user_docs/img/worksheets.png +0 -0
  83. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/source/user_docs/index.rst +0 -0
  84. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/source/user_docs/pool.rst +0 -0
  85. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/source/user_docs/questions.rst +0 -0
  86. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/source/user_docs/task.rst +0 -0
  87. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/source/user_docs/template.rst +0 -0
  88. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/docs/source/user_docs/worksheet.rst +0 -0
  89. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/__init__.py +0 -0
  90. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/app/__init__.py +0 -0
  91. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/app/authoring.py +0 -0
  92. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/app/handlers/handlers.py +0 -0
  93. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/app/templates/authoring/static/favicon.ico +0 -0
  94. /e2xauthoring-0.3.0.dev4/e2xauthoring/app/templates/authoring/static/js/main.5bf82181.js.LICENSE.txt → /e2xauthoring-0.3.2/e2xauthoring/app/templates/authoring/static/js/main.2835591d.js.LICENSE.txt +0 -0
  95. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/assets/.gitignore +0 -0
  96. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/converters/__init__.py +0 -0
  97. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/converters/converter.py +0 -0
  98. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/converters/generateexercise.py +0 -0
  99. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/dataclasses/__init__.py +0 -0
  100. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/dataclasses/gitstatus.py +0 -0
  101. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/dataclasses/jsondataclass.py +0 -0
  102. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/dataclasses/messages.py +0 -0
  103. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/dataclasses/pool.py +0 -0
  104. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/dataclasses/task.py +0 -0
  105. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/dataclasses/template.py +0 -0
  106. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/git/__init__.py +0 -0
  107. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/git/factory.py +0 -0
  108. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/git/utils.py +0 -0
  109. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/managers/__init__.py +0 -0
  110. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/managers/presets/questions/Code (Autograded).ipynb +0 -0
  111. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/managers/presets/questions/Code (Manual).ipynb +0 -0
  112. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/managers/presets/questions/Diagram.ipynb +0 -0
  113. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/managers/presets/questions/Freetext.ipynb +0 -0
  114. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/managers/presets/questions/Multiple Choice.ipynb +0 -0
  115. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/managers/presets/questions/Single Choice.ipynb +0 -0
  116. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/managers/presets/questions/Upload Files.ipynb +0 -0
  117. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/managers/presets/template/Footer.ipynb +0 -0
  118. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/managers/presets/template/Header.ipynb +0 -0
  119. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/managers/taskpoolmanager.py +0 -0
  120. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/managers/templatemanager.py +0 -0
  121. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/models/__init__.py +0 -0
  122. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/patterns/__init__.py +0 -0
  123. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/patterns/observer.py +0 -0
  124. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/preprocessors/__init__.py +0 -0
  125. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/preprocessors/copynotebooks.py +0 -0
  126. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/preprocessors/preprocessor.py +0 -0
  127. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/utils/__init__.py +0 -0
  128. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/e2xauthoring/utils/notebookvariableextractor.py +0 -0
  129. {e2xauthoring-0.3.0.dev4 → e2xauthoring-0.3.2}/lerna.json +0 -0
@@ -0,0 +1,16 @@
1
+ name: Lint and format with Ruff
2
+ on: [ push, pull_request ]
3
+ jobs:
4
+ ruff:
5
+ runs-on: ubuntu-latest
6
+ steps:
7
+ - uses: actions/checkout@v7
8
+ - name: Check formatting
9
+ uses: astral-sh/ruff-action@v4.1.0
10
+ with:
11
+ args: "format --check --diff"
12
+ - name: Lint
13
+ if: ${{ !cancelled() }}
14
+ uses: astral-sh/ruff-action@v3
15
+ with:
16
+ args: "check --output-format=github"
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.5
2
2
  Name: e2xauthoring
3
- Version: 0.3.0.dev4
3
+ Version: 0.3.2
4
4
  Summary: Authoring app for e2xgrader
5
5
  Project-URL: Source, https://github.com/Digiklausur/e2xauthoring
6
6
  Project-URL: Documentation, https://e2xauthoring.readthedocs.io/en/latest/
@@ -9,7 +9,7 @@
9
9
  project = "e2xauthoring"
10
10
  copyright = "2023, Tim Metzler"
11
11
  author = "Tim Metzler"
12
- release = "0.3.0-dev4"
12
+ release = "0.3.2"
13
13
  github_project_url = "https://github.com/Digiklausur/e2xauthoring"
14
14
 
15
15
  # -- General configuration ---------------------------------------------------
@@ -0,0 +1 @@
1
+ __version__ = "0.3.2"
@@ -73,9 +73,7 @@ default_handlers = [
73
73
  manager_cls=TaskManager,
74
74
  actions=dict(
75
75
  delete=dict(default="remove", actions=["remove"]),
76
- get=dict(
77
- default="get", actions=["get", "list", "list_all", "git_diff"]
78
- ),
76
+ get=dict(default="get", actions=["get", "list", "list_all", "git_diff"]),
79
77
  post=dict(default="create", actions=["create"]),
80
78
  put=dict(actions=["copy", "rename", "commit"]),
81
79
  ),
@@ -54,12 +54,10 @@ class ApiManageHandler(E2xApiHandler):
54
54
  if request_type in allowed_actions:
55
55
  actions = allowed_actions[request_type].get("actions", [])
56
56
  for action in actions:
57
- assert hasattr(
58
- self.__manager, action
59
- ), f"The manager class does not provide an action called {action}."
60
- action_dict["default"] = allowed_actions[request_type].get(
61
- "default", None
62
- )
57
+ assert hasattr(self.__manager, action), (
58
+ f"The manager class does not provide an action called {action}."
59
+ )
60
+ action_dict["default"] = allowed_actions[request_type].get("default", None)
63
61
  action_dict["actions"].extend(actions)
64
62
 
65
63
  def extract_arguments(self, method: str):
@@ -73,9 +71,9 @@ class ApiManageHandler(E2xApiHandler):
73
71
  return params
74
72
 
75
73
  async def perform_action(self, action: str, allowed_actions: List[str]):
76
- assert (
77
- action is not None and action in allowed_actions
78
- ), f"Action {action} is not a valid action."
74
+ assert action is not None and action in allowed_actions, (
75
+ f"Action {action} is not a valid action."
76
+ )
79
77
  method = getattr(self.__manager, action)
80
78
  arguments = self.extract_arguments(method)
81
79
 
@@ -88,16 +86,15 @@ class ApiManageHandler(E2xApiHandler):
88
86
  @status_msg
89
87
  async def handle_request(self, request_type: str):
90
88
  action = self.get_argument(
91
- "action", default=None # self.__allowed_actions[request_type]["default"]
89
+ "action",
90
+ default=None, # self.__allowed_actions[request_type]["default"]
92
91
  )
93
92
  if action is None:
94
93
  action = (self.get_json_body() or dict()).get(
95
94
  "action", self.__allowed_actions[request_type]["default"]
96
95
  )
97
96
 
98
- return await self.perform_action(
99
- action, self.__allowed_actions[request_type]["actions"]
100
- )
97
+ return await self.perform_action(action, self.__allowed_actions[request_type]["actions"])
101
98
 
102
99
  @web.authenticated
103
100
  @check_xsrf
@@ -0,0 +1,10 @@
1
+ {
2
+ "files": {
3
+ "main.js": "/e2x/authoring/static/js/main.2835591d.js",
4
+ "index.html": "/e2x/authoring/index.html",
5
+ "main.2835591d.js.map": "/e2x/authoring/static/js/main.2835591d.js.map"
6
+ },
7
+ "entrypoints": [
8
+ "static/js/main.2835591d.js"
9
+ ]
10
+ }
@@ -1 +1 @@
1
- <!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="{{base_url}}/e2x/authoring/static/favicon.ico"><title>e²xauthoring</title><script type="text/javascript">window.base_url="{{ base_url }}",window.url_prefix="{{ url_prefix }}",window.webpackstuff="/e2x/authoring/static/js/main.5bf82181.js"</script><script defer="defer" src="{{base_url}}/e2x/authoring/static/js/main.5bf82181.js"></script>{%- block head -%} {%- endblock -%}</head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
1
+ <!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="{{base_url}}/e2x/authoring/static/favicon.ico"><title>e²xauthoring</title><script type="text/javascript">window.base_url="{{ base_url }}",window.url_prefix="{{ url_prefix }}",window.webpackstuff="/e2x/authoring/static/js/main.2835591d.js"</script><script defer="defer" src="{{base_url}}/e2x/authoring/static/js/main.2835591d.js"></script>{%- block head -%} {%- endblock -%}</head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>