e2xauthoring 0.1.0__tar.gz → 0.2.0.dev1__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.
- {e2xauthoring-0.1.0 → e2xauthoring-0.2.0.dev1}/.pre-commit-config.yaml +9 -3
- {e2xauthoring-0.1.0 → e2xauthoring-0.2.0.dev1}/PKG-INFO +4 -3
- e2xauthoring-0.2.0.dev1/README.md +5 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/__version__.py +1 -0
- {e2xauthoring-0.1.0 → e2xauthoring-0.2.0.dev1}/e2xauthoring/app/authoring.py +3 -4
- {e2xauthoring-0.1.0/e2xauthoring/app → e2xauthoring-0.2.0.dev1/e2xauthoring/app/handlers}/apihandlers.py +65 -18
- e2xauthoring-0.2.0.dev1/e2xauthoring/app/handlers/base.py +41 -0
- {e2xauthoring-0.1.0/e2xauthoring/app → e2xauthoring-0.2.0.dev1/e2xauthoring/app/handlers}/handlers.py +3 -3
- e2xauthoring-0.2.0.dev1/e2xauthoring/app/templates/authoring/asset-manifest.json +10 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/app/templates/authoring/index.html +1 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/app/templates/authoring/static/js/main.fe9bcd55.js +3 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/app/templates/authoring/static/js/main.fe9bcd55.js.LICENSE.txt +88 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/app/templates/authoring/static/js/main.fe9bcd55.js.map +1 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/converters/__init__.py +4 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/converters/converter.py +28 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/converters/generateexercise.py +40 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/models/__init__.py +15 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/models/assignmentmodel.py +34 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/models/basemodel.py +20 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/models/dataclasses/__init__.py +28 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/models/dataclasses/message.py +13 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/models/dataclasses/template.py +6 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/models/exercisemodel.py +44 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/models/lister/lister.py +27 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/models/lister/taskpoollister.py +33 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/models/lister/templatelister.py +17 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/models/managers/manager.py +40 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/models/managers/taskmanager.py +123 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/models/managers/taskpoolmanager.py +63 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/models/managers/templatemanager.py +50 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/models/presetmodel.py +71 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/models/presets/questions/Code (Autograded).ipynb +92 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/models/presets/questions/Code (Manual).ipynb +68 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/models/presets/questions/Diagram.ipynb +73 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/models/presets/questions/Freetext.ipynb +63 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/models/presets/questions/Multiple Choice.ipynb +54 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/models/presets/questions/Single Choice.ipynb +52 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/models/presets/questions/Upload Files.ipynb +64 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/models/presets/template/Footer.ipynb +47 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/models/presets/template/Group Info.ipynb +42 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/models/presets/template/Header.ipynb +47 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/models/presets/template/Student Info.ipynb +41 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/models/taskmodel.py +186 -0
- {e2xauthoring-0.1.0 → e2xauthoring-0.2.0.dev1}/e2xauthoring/models/taskpoolmodel.py +59 -2
- e2xauthoring-0.2.0.dev1/e2xauthoring/models/templatemodel.py +67 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/preprocessors/__init__.py +19 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/preprocessors/addtaskheader.py +98 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/preprocessors/copyfiles.py +91 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/preprocessors/copynotebooks.py +21 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/preprocessors/filltemplate.py +37 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/preprocessors/generatetaskids.py +60 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/preprocessors/makeexercise.py +73 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/preprocessors/preprocessor.py +10 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/preprocessors/removeexercise.py +19 -0
- e2xauthoring-0.2.0.dev1/e2xauthoring/utils/__init__.py +3 -0
- e2xauthoring-0.1.0/e2xauthoring/utils.py → e2xauthoring-0.2.0.dev1/e2xauthoring/utils/gitutils.py +14 -10
- e2xauthoring-0.2.0.dev1/e2xauthoring/utils/notebookvariableextractor.py +16 -0
- {e2xauthoring-0.1.0 → e2xauthoring-0.2.0.dev1}/package-lock.json +6 -6
- {e2xauthoring-0.1.0 → e2xauthoring-0.2.0.dev1}/package.json +1 -1
- {e2xauthoring-0.1.0 → e2xauthoring-0.2.0.dev1}/pyproject.toml +44 -4
- e2xauthoring-0.1.0/README.md +0 -5
- e2xauthoring-0.1.0/e2xauthoring/__version__.py +0 -1
- e2xauthoring-0.1.0/e2xauthoring/models/__init__.py +0 -4
- e2xauthoring-0.1.0/e2xauthoring/models/taskmodel.py +0 -63
- {e2xauthoring-0.1.0 → e2xauthoring-0.2.0.dev1}/.github/workflows/sonarcloud.yml +0 -0
- {e2xauthoring-0.1.0 → e2xauthoring-0.2.0.dev1}/.gitignore +0 -0
- {e2xauthoring-0.1.0 → e2xauthoring-0.2.0.dev1}/LICENSE +0 -0
- {e2xauthoring-0.1.0 → e2xauthoring-0.2.0.dev1}/MANIFEST.in +0 -0
- {e2xauthoring-0.1.0 → e2xauthoring-0.2.0.dev1}/e2xauthoring/__init__.py +0 -0
- {e2xauthoring-0.1.0 → e2xauthoring-0.2.0.dev1}/e2xauthoring/app/__init__.py +0 -0
- {e2xauthoring-0.1.0 → e2xauthoring-0.2.0.dev1}/e2xauthoring/assets/.gitignore +0 -0
- {e2xauthoring-0.1.0 → e2xauthoring-0.2.0.dev1}/lerna.json +0 -0
|
@@ -1,20 +1,26 @@
|
|
|
1
1
|
repos:
|
|
2
2
|
- repo: https://github.com/psf/black
|
|
3
|
-
rev:
|
|
3
|
+
rev: 23.1.0
|
|
4
4
|
hooks:
|
|
5
5
|
- id: black
|
|
6
6
|
|
|
7
7
|
- repo: https://github.com/PyCQA/isort
|
|
8
|
-
rev: 5.
|
|
8
|
+
rev: 5.11.5
|
|
9
9
|
hooks:
|
|
10
10
|
- id: isort
|
|
11
11
|
files: \.py$
|
|
12
12
|
args: [--profile=black]
|
|
13
13
|
|
|
14
|
+
- repo: https://github.com/charliermarsh/ruff-pre-commit
|
|
15
|
+
rev: "v0.0.267"
|
|
16
|
+
hooks:
|
|
17
|
+
- id: ruff
|
|
18
|
+
|
|
14
19
|
- repo: local
|
|
15
20
|
hooks:
|
|
16
21
|
- id: prettier
|
|
17
22
|
name: prettier
|
|
18
23
|
entry: 'npm run prettier:files'
|
|
19
24
|
language: node
|
|
20
|
-
types_or: [json, markdown, ts, tsx, javascript, jsx, css]
|
|
25
|
+
types_or: [json, markdown, ts, tsx, javascript, jsx, css]
|
|
26
|
+
exclude_types: [jupyter]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: e2xauthoring
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.2.0.dev1
|
|
4
4
|
Summary: Authoring app for e2xgrader
|
|
5
5
|
Project-URL: Source, https://github.com/Digiklausur/e2xauthoring
|
|
6
6
|
Author-email: Tim Metzler <tim.metzler@h-brs.de>
|
|
@@ -12,15 +12,16 @@ Classifier: Programming Language :: Python :: 3.7
|
|
|
12
12
|
Classifier: Programming Language :: Python :: 3.8
|
|
13
13
|
Classifier: Programming Language :: Python :: 3.9
|
|
14
14
|
Requires-Python: >=3.7
|
|
15
|
-
Requires-Dist:
|
|
15
|
+
Requires-Dist: e2xcore==0.0.2
|
|
16
16
|
Requires-Dist: gitpython
|
|
17
17
|
Provides-Extra: dev
|
|
18
18
|
Requires-Dist: hatchling; extra == 'dev'
|
|
19
19
|
Requires-Dist: pre-commit; extra == 'dev'
|
|
20
|
+
Requires-Dist: tbump; extra == 'dev'
|
|
20
21
|
Description-Content-Type: text/markdown
|
|
21
22
|
|
|
22
23
|
# e2xauthoring
|
|
23
24
|
|
|
24
25
|
---
|
|
25
26
|
|
|
26
|
-
This is an authoring component for e2xgrader
|
|
27
|
+
This is an authoring component for e2xgrader
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.2.0-dev1"
|
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
import os
|
|
2
2
|
|
|
3
|
-
from
|
|
3
|
+
from e2xcore import BaseApp
|
|
4
4
|
from nbgrader.apps.baseapp import NbGrader
|
|
5
5
|
from tornado import web
|
|
6
6
|
|
|
7
|
-
from .apihandlers import default_handlers
|
|
8
|
-
from .handlers import default_handlers as handlers
|
|
7
|
+
from .handlers.apihandlers import default_handlers
|
|
8
|
+
from .handlers.handlers import default_handlers as handlers
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
class AuthoringApp(NbGrader, BaseApp):
|
|
12
|
-
|
|
13
12
|
template_path = os.path.join(os.path.dirname(__file__), "templates")
|
|
14
13
|
static_path = os.path.join(template_path, "authoring", "static")
|
|
15
14
|
|
|
@@ -1,27 +1,71 @@
|
|
|
1
1
|
import json
|
|
2
|
+
import os
|
|
2
3
|
|
|
3
|
-
from
|
|
4
|
-
from
|
|
5
|
-
from
|
|
6
|
-
BaseApiListHandler,
|
|
7
|
-
BaseApiManageHandler,
|
|
8
|
-
E2xApiHandler,
|
|
9
|
-
ExerciseModel,
|
|
10
|
-
KernelSpecHandler,
|
|
11
|
-
PresetHandler,
|
|
12
|
-
TemplateVariableHandler,
|
|
13
|
-
api_url,
|
|
14
|
-
assignment_regex,
|
|
15
|
-
name_regex,
|
|
16
|
-
pool_regex,
|
|
17
|
-
)
|
|
18
|
-
from e2xgrader.utils import urljoin
|
|
4
|
+
from e2xcore.handlers import E2xApiHandler
|
|
5
|
+
from e2xcore.utils import urljoin
|
|
6
|
+
from jupyter_client.kernelspec import KernelSpecManager
|
|
19
7
|
from nbgrader.server_extensions.formgrader.base import check_xsrf
|
|
20
8
|
from tornado import web
|
|
21
9
|
|
|
22
|
-
from
|
|
10
|
+
from ...converters import GenerateExercise
|
|
11
|
+
from ...models import (
|
|
12
|
+
AssignmentModel,
|
|
13
|
+
ExerciseModel,
|
|
14
|
+
PresetModel,
|
|
15
|
+
TaskModel,
|
|
16
|
+
TaskPoolModel,
|
|
17
|
+
TemplateModel,
|
|
18
|
+
)
|
|
19
|
+
from ...utils import NotebookVariableExtractor
|
|
20
|
+
from ...utils.gitutils import get_author, set_author
|
|
21
|
+
from .base import BaseApiListHandler, BaseApiManageHandler
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class PresetHandler(E2xApiHandler):
|
|
25
|
+
def initialize(self):
|
|
26
|
+
self.__model = PresetModel(self.coursedir)
|
|
27
|
+
|
|
28
|
+
def _list_template(self):
|
|
29
|
+
self.write(json.dumps(self.__model.list_template_presets()))
|
|
30
|
+
|
|
31
|
+
def _get_template(self):
|
|
32
|
+
name = self.get_argument("name")
|
|
33
|
+
self.write(json.dumps(self.__model.get_template_preset(name)))
|
|
34
|
+
|
|
35
|
+
def _list_question(self):
|
|
36
|
+
self.write(json.dumps(self.__model.list_question_presets()))
|
|
37
|
+
|
|
38
|
+
def _get_question(self):
|
|
39
|
+
name = self.get_argument("name")
|
|
40
|
+
self.write(json.dumps(self.__model.get_question_preset(name)))
|
|
41
|
+
|
|
42
|
+
@web.authenticated
|
|
43
|
+
@check_xsrf
|
|
44
|
+
def get(self):
|
|
45
|
+
action = self.get_argument("action")
|
|
46
|
+
preset_type = self.get_argument("type")
|
|
47
|
+
handler = getattr(self, "_{}_{}".format(action, preset_type))
|
|
48
|
+
handler()
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class TemplateVariableHandler(E2xApiHandler):
|
|
52
|
+
@web.authenticated
|
|
53
|
+
@check_xsrf
|
|
54
|
+
def get(self):
|
|
55
|
+
template = self.get_argument("template")
|
|
56
|
+
variables = NotebookVariableExtractor().extract(
|
|
57
|
+
os.path.join(
|
|
58
|
+
self.url_prefix, "templates", template, "{}.ipynb".format(template)
|
|
59
|
+
)
|
|
60
|
+
)
|
|
61
|
+
self.write(json.dumps(variables))
|
|
62
|
+
|
|
23
63
|
|
|
24
|
-
|
|
64
|
+
class KernelSpecHandler(E2xApiHandler):
|
|
65
|
+
@web.authenticated
|
|
66
|
+
@check_xsrf
|
|
67
|
+
def get(self):
|
|
68
|
+
self.write(json.dumps(KernelSpecManager().get_all_specs()))
|
|
25
69
|
|
|
26
70
|
|
|
27
71
|
class ManagePoolsHandler(E2xApiHandler):
|
|
@@ -185,6 +229,9 @@ class GitAuthorHandler(E2xApiHandler):
|
|
|
185
229
|
self.write(json.dumps(set_author(name=name, email=email)))
|
|
186
230
|
|
|
187
231
|
|
|
232
|
+
api_url = urljoin("e2x", "authoring", "api")
|
|
233
|
+
name_regex = r"(?P<name>[^/]+)"
|
|
234
|
+
assignment_regex = r"(?P<assignment>[^/]+)"
|
|
188
235
|
pool_action_regex = r"(?P<action>new|list|remove|get|init_repo)"
|
|
189
236
|
task_action_regex = r"(?P<action>new|list|list_all|remove|commit|get|diff)"
|
|
190
237
|
template_action_regex = r"(?P<action>new|list|remove)"
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import json
|
|
2
|
+
|
|
3
|
+
from e2xcore.handlers import E2xApiHandler
|
|
4
|
+
from nbgrader.server_extensions.formgrader.base import check_xsrf
|
|
5
|
+
from tornado import web
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class BaseApiManageHandler(E2xApiHandler):
|
|
9
|
+
def initialize(self, model_cls):
|
|
10
|
+
self.__model = model_cls(self.coursedir)
|
|
11
|
+
|
|
12
|
+
@web.authenticated
|
|
13
|
+
@check_xsrf
|
|
14
|
+
def post(self, **kwargs):
|
|
15
|
+
self.write(self.__model.new(**kwargs))
|
|
16
|
+
|
|
17
|
+
@web.authenticated
|
|
18
|
+
@check_xsrf
|
|
19
|
+
def delete(self, **kwargs):
|
|
20
|
+
self.__model.remove(**kwargs)
|
|
21
|
+
self.write({"status": True})
|
|
22
|
+
|
|
23
|
+
@web.authenticated
|
|
24
|
+
@check_xsrf
|
|
25
|
+
def get(self, **kwargs):
|
|
26
|
+
self.write(json.dumps(self.__model.get(**kwargs)))
|
|
27
|
+
|
|
28
|
+
@web.authenticated
|
|
29
|
+
@check_xsrf
|
|
30
|
+
def put(self, **kwargs):
|
|
31
|
+
self.write(self.__model.new(**kwargs))
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class BaseApiListHandler(E2xApiHandler):
|
|
35
|
+
def initialize(self, model_cls):
|
|
36
|
+
self.__model = model_cls(self.coursedir)
|
|
37
|
+
|
|
38
|
+
@web.authenticated
|
|
39
|
+
@check_xsrf
|
|
40
|
+
def get(self, **kwargs):
|
|
41
|
+
self.write(json.dumps(self.__model.list(**kwargs)))
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import os
|
|
2
2
|
import sys
|
|
3
|
-
from email.policy import default
|
|
4
3
|
|
|
5
|
-
from
|
|
6
|
-
from e2xgrader.utils import urljoin
|
|
4
|
+
from e2xcore.utils import urljoin
|
|
7
5
|
from nbgrader.server_extensions.formgrader.base import (
|
|
8
6
|
BaseHandler,
|
|
9
7
|
check_notebook_dir,
|
|
@@ -11,6 +9,8 @@ from nbgrader.server_extensions.formgrader.base import (
|
|
|
11
9
|
)
|
|
12
10
|
from tornado import web
|
|
13
11
|
|
|
12
|
+
app_url = urljoin("e2x", "authoring", "app")
|
|
13
|
+
|
|
14
14
|
|
|
15
15
|
class AuthoringHandler(BaseHandler):
|
|
16
16
|
@web.authenticated
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>e²xgrader - Authoring</title><script type="text/javascript">window.base_url="{{ base_url }}",window.url_prefix="{{ url_prefix }}",window.webpackstuff="/e2x/authoring/static/js/main.fe9bcd55.js"</script><script defer="defer" src="{{base_url}}/e2x/authoring/static/js/main.fe9bcd55.js"></script>{%- block head -%} {%- endblock -%}</head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
|