You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
111 lines
3.6 KiB
Python
111 lines
3.6 KiB
Python
"""Tornado handlers for frontend config storage."""
|
|
|
|
# Copyright (c) Jupyter Development Team.
|
|
# Distributed under the terms of the Modified BSD License.
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
from typing import Any
|
|
|
|
from jsonschema import ValidationError
|
|
from jupyter_server.extension.handler import ExtensionHandlerJinjaMixin, ExtensionHandlerMixin
|
|
from tornado import web
|
|
|
|
from .settings_utils import SchemaHandler, get_settings, save_settings
|
|
from .translation_utils import translator
|
|
|
|
|
|
class SettingsHandler(ExtensionHandlerMixin, ExtensionHandlerJinjaMixin, SchemaHandler):
|
|
"""A settings API handler."""
|
|
|
|
def initialize( # type:ignore[override]
|
|
self,
|
|
name: str,
|
|
app_settings_dir: str,
|
|
schemas_dir: str,
|
|
settings_dir: str,
|
|
labextensions_path: list[str],
|
|
overrides: dict[str, Any] | None = None,
|
|
**kwargs: Any, # noqa: ARG002
|
|
) -> None:
|
|
"""Initialize the handler."""
|
|
SchemaHandler.initialize(
|
|
self, app_settings_dir, schemas_dir, settings_dir, labextensions_path, overrides
|
|
)
|
|
ExtensionHandlerMixin.initialize(self, name)
|
|
|
|
@web.authenticated
|
|
def get(self, schema_name: str = "") -> Any:
|
|
"""
|
|
Get setting(s)
|
|
|
|
Parameters
|
|
----------
|
|
schema_name: str
|
|
The id of a unique schema to send, added to the URL
|
|
|
|
## NOTES:
|
|
An optional argument `ids_only=true` can be provided in the URL to get only the
|
|
ids of the schemas instead of the content.
|
|
"""
|
|
# Need to be update here as translator locale is not change when a new locale is put
|
|
# from frontend
|
|
locale = self.get_current_locale()
|
|
translator.set_locale(locale)
|
|
|
|
ids_only = self.get_argument("ids_only", "") == "true"
|
|
|
|
result, warnings = get_settings(
|
|
self.app_settings_dir,
|
|
self.schemas_dir,
|
|
self.settings_dir,
|
|
labextensions_path=self.labextensions_path,
|
|
schema_name=schema_name,
|
|
overrides=self.overrides,
|
|
translator=translator.translate_schema,
|
|
ids_only=ids_only,
|
|
)
|
|
|
|
# Print all warnings.
|
|
for w in warnings:
|
|
if w:
|
|
self.log.warning(w)
|
|
|
|
return self.finish(json.dumps(result))
|
|
|
|
@web.authenticated
|
|
def put(self, schema_name: str) -> None:
|
|
"""Update a setting"""
|
|
overrides = self.overrides
|
|
schemas_dir = self.schemas_dir
|
|
settings_dir = self.settings_dir
|
|
settings_error = "No current settings directory"
|
|
invalid_json_error = "Failed parsing JSON payload: %s"
|
|
invalid_payload_format_error = (
|
|
"Invalid format for JSON payload. Must be in the form {'raw': ...}"
|
|
)
|
|
validation_error = "Failed validating input: %s"
|
|
|
|
if not settings_dir:
|
|
raise web.HTTPError(500, settings_error)
|
|
|
|
raw_payload = self.request.body.strip().decode("utf-8")
|
|
try:
|
|
raw_settings = json.loads(raw_payload)["raw"]
|
|
save_settings(
|
|
schemas_dir,
|
|
settings_dir,
|
|
schema_name,
|
|
raw_settings,
|
|
overrides,
|
|
self.labextensions_path,
|
|
)
|
|
except json.decoder.JSONDecodeError as e:
|
|
raise web.HTTPError(400, invalid_json_error % str(e)) from None
|
|
except (KeyError, TypeError):
|
|
raise web.HTTPError(400, invalid_payload_format_error) from None
|
|
except ValidationError as e:
|
|
raise web.HTTPError(400, validation_error % str(e)) from None
|
|
|
|
self.set_status(204)
|