📚 The CoCalc Library - books, templates and other resources
License: OTHER
import os12from nbgrader.apps import FormgradeApp3from nbgrader.auth import BaseAuth4from notebook.utils import url_path_join as ujoin5from traitlets import Unicode6from traitlets.config import Config789def _jupyter_server_extension_paths():10return [11dict(module="formgrade_extension")12]131415class NotebookAuth(BaseAuth):16"""Notebook server authenticator."""1718notebook_base_url = Unicode(config=True, help="Base URL of the notebook server.")19def _notebook_base_url_default(self):20return '/'2122notebook_url_prefix = Unicode(None, config=True, allow_none=True, help="""23Relative path of the formgrader with respect to the notebook's base24directory. No trailing slash. i.e. "Documents" or "Documents/notebooks". """)25def _notebook_url_prefix_changed(self, name, old, new):26self.notebook_url_prefix = new.strip('/')2728remap_url = Unicode(config=True, help="""Suffix appened to29`NotebookAuth.notebook_base_url` to form the full URL to the formgrade30server. By default this is '/formgrader'.""")31def _remap_url_default(self):32return '/formgrader'33def _remap_url_changed(self, name, old, new):34self.remap_url = new.rstrip('/')3536def __init__(self, *args, **kwargs):37super(NotebookAuth, self).__init__(*args, **kwargs)38self._base_url = self.notebook_base_url.rstrip('/') + self.remap_url3940def add_remap_url_prefix(self, url):41if url == '/':42return self.remap_url + '/?'43else:44if not url.startswith('/'):45return self.remap_url + '/' + url46else:47return self.remap_url + url4849def transform_handler(self, handler):50new_handler = list(handler)5152# transform the handler url53url = self.add_remap_url_prefix(handler[0])54new_handler[0] = url5556# transform any urls in the arguments57if len(handler) > 2:58new_args = handler[2].copy()59if 'url' in new_args:60new_args['url'] = self.add_remap_url_prefix(new_args['url'])61new_handler[2] = new_args6263return tuple(new_handler)6465def notebook_server_exists(self):66return True6768def get_notebook_url(self, relative_path):69"""Gets the notebook's url."""70if self.notebook_url_prefix is not None:71relative_path = self.notebook_url_prefix + '/' + relative_path72return "{}/notebooks/{}".format(self.notebook_base_url.rstrip('/'), relative_path)737475def load_jupyter_server_extension(nbapp):76"""Load the nbserver"""7778c = Config()79c.FormgradeApp.authenticator_class = NotebookAuth80c.BaseAuth.connect_ip = nbapp.ip81c.BaseAuth.connect_port = nbapp.port82c.BaseAuth.url_prefix = '/formgrader'83c.NotebookAuth.notebook_base_url = nbapp.base_url84c.NotebookAuth.notebook_url_prefix = "instructor"85c.NbGrader.log_level = nbapp.log_level86c.NbGrader.course_directory = os.path.join(os.getcwd(), "instructor")8788formgrader = FormgradeApp(parent=nbapp)89formgrader.update_config(c)90super(FormgradeApp, formgrader).initialize([])91formgrader.init_tornado_settings()92formgrader.init_handlers()9394# update handlers95webapp = nbapp.web_app96base_url = webapp.settings["base_url"]97handlers = []98for handler in formgrader.handlers:99handler = list(handler)100handler[0] = ujoin(base_url, handler[0])101handlers.append(tuple(handler))102webapp.add_handlers(".*$", handlers)103104# update settings105formgrader.tornado_settings['nbgrader_mathjax_url'] = webapp.settings['mathjax_url']106formgrader.tornado_settings['log_function'] = webapp.settings['log_function']107webapp.settings.update(formgrader.tornado_settings)108109110