Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News AboutSign UpSign In
| Download

📚 The CoCalc Library - books, templates and other resources

Views: 95712
License: OTHER
1
import os
2
3
from nbgrader.apps import FormgradeApp
4
from nbgrader.auth import BaseAuth
5
from notebook.utils import url_path_join as ujoin
6
from traitlets import Unicode
7
from traitlets.config import Config
8
9
10
def _jupyter_server_extension_paths():
11
return [
12
dict(module="formgrade_extension")
13
]
14
15
16
class NotebookAuth(BaseAuth):
17
"""Notebook server authenticator."""
18
19
notebook_base_url = Unicode(config=True, help="Base URL of the notebook server.")
20
def _notebook_base_url_default(self):
21
return '/'
22
23
notebook_url_prefix = Unicode(None, config=True, allow_none=True, help="""
24
Relative path of the formgrader with respect to the notebook's base
25
directory. No trailing slash. i.e. "Documents" or "Documents/notebooks". """)
26
def _notebook_url_prefix_changed(self, name, old, new):
27
self.notebook_url_prefix = new.strip('/')
28
29
remap_url = Unicode(config=True, help="""Suffix appened to
30
`NotebookAuth.notebook_base_url` to form the full URL to the formgrade
31
server. By default this is '/formgrader'.""")
32
def _remap_url_default(self):
33
return '/formgrader'
34
def _remap_url_changed(self, name, old, new):
35
self.remap_url = new.rstrip('/')
36
37
def __init__(self, *args, **kwargs):
38
super(NotebookAuth, self).__init__(*args, **kwargs)
39
self._base_url = self.notebook_base_url.rstrip('/') + self.remap_url
40
41
def add_remap_url_prefix(self, url):
42
if url == '/':
43
return self.remap_url + '/?'
44
else:
45
if not url.startswith('/'):
46
return self.remap_url + '/' + url
47
else:
48
return self.remap_url + url
49
50
def transform_handler(self, handler):
51
new_handler = list(handler)
52
53
# transform the handler url
54
url = self.add_remap_url_prefix(handler[0])
55
new_handler[0] = url
56
57
# transform any urls in the arguments
58
if len(handler) > 2:
59
new_args = handler[2].copy()
60
if 'url' in new_args:
61
new_args['url'] = self.add_remap_url_prefix(new_args['url'])
62
new_handler[2] = new_args
63
64
return tuple(new_handler)
65
66
def notebook_server_exists(self):
67
return True
68
69
def get_notebook_url(self, relative_path):
70
"""Gets the notebook's url."""
71
if self.notebook_url_prefix is not None:
72
relative_path = self.notebook_url_prefix + '/' + relative_path
73
return "{}/notebooks/{}".format(self.notebook_base_url.rstrip('/'), relative_path)
74
75
76
def load_jupyter_server_extension(nbapp):
77
"""Load the nbserver"""
78
79
c = Config()
80
c.FormgradeApp.authenticator_class = NotebookAuth
81
c.BaseAuth.connect_ip = nbapp.ip
82
c.BaseAuth.connect_port = nbapp.port
83
c.BaseAuth.url_prefix = '/formgrader'
84
c.NotebookAuth.notebook_base_url = nbapp.base_url
85
c.NotebookAuth.notebook_url_prefix = "instructor"
86
c.NbGrader.log_level = nbapp.log_level
87
c.NbGrader.course_directory = os.path.join(os.getcwd(), "instructor")
88
89
formgrader = FormgradeApp(parent=nbapp)
90
formgrader.update_config(c)
91
super(FormgradeApp, formgrader).initialize([])
92
formgrader.init_tornado_settings()
93
formgrader.init_handlers()
94
95
# update handlers
96
webapp = nbapp.web_app
97
base_url = webapp.settings["base_url"]
98
handlers = []
99
for handler in formgrader.handlers:
100
handler = list(handler)
101
handler[0] = ujoin(base_url, handler[0])
102
handlers.append(tuple(handler))
103
webapp.add_handlers(".*$", handlers)
104
105
# update settings
106
formgrader.tornado_settings['nbgrader_mathjax_url'] = webapp.settings['mathjax_url']
107
formgrader.tornado_settings['log_function'] = webapp.settings['log_function']
108
webapp.settings.update(formgrader.tornado_settings)
109
110