Skip to content

Commit 8f1757d

Browse files
committed
#142 added script title to the webpage title
1 parent dee6234 commit 8f1757d

6 files changed

Lines changed: 75 additions & 11 deletions

File tree

src/model/external_model.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import json
21
from datetime import timezone
32

43
from utils import date_utils
@@ -105,3 +104,10 @@ def to_execution_info(request_parameters):
105104
info.param_values = param_values
106105

107106
return info
107+
108+
109+
def server_conf_to_external(server_config):
110+
return {
111+
'title': server_config.title,
112+
'enableScriptTitles': server_config.enable_script_titles
113+
}

src/model/server_conf.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import utils.file_utils as file_utils
66
from auth.authorization import ANY_USER
77
from model import model_helper
8-
from model.model_helper import read_list, read_int_from_config
8+
from model.model_helper import read_list, read_int_from_config, read_bool_from_config
99
from utils.string_utils import strip
1010

1111
LOGGER = logging.getLogger('server_conf')
@@ -24,6 +24,7 @@ def __init__(self) -> None:
2424
self.logging_config = None
2525
self.admin_config = None
2626
self.title = None
27+
self.enable_script_titles = None
2728
self.trusted_ips = []
2829
self.user_groups = None
2930
self.admin_users = []
@@ -81,6 +82,7 @@ def from_json(conf_path, temp_folder):
8182

8283
if json_object.get('title'):
8384
config.title = json_object.get('title')
85+
config.enable_script_titles = read_bool_from_config('enable_script_titles', json_object, default=True)
8486

8587
access_config = json_object.get('access')
8688
if access_config:

src/tests/external_model_test.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
from datetime import datetime, timezone
44

55
from execution.logging import HistoryEntry
6-
from model.external_model import to_short_execution_log, to_long_execution_log
6+
from model.external_model import to_short_execution_log, to_long_execution_log, server_conf_to_external
7+
from model.server_conf import ServerConfig
78

89

910
class TestHistoryEntry(unittest.TestCase):
@@ -140,3 +141,23 @@ def _validate_translated_entry(self,
140141

141142
def setUp(self):
142143
self.random_instance = random.seed(a=123)
144+
145+
146+
class TestServerConf(unittest.TestCase):
147+
def test_full_config(self):
148+
config = ServerConfig()
149+
config.title = 'test title'
150+
config.enable_script_titles = False
151+
152+
external_config = server_conf_to_external(config)
153+
self.assertEqual('test title', external_config.get('title'))
154+
self.assertIs(False, external_config.get('enableScriptTitles'))
155+
156+
def test_config_with_none_values(self):
157+
config = ServerConfig()
158+
config.title = None
159+
config.enable_script_titles = None
160+
161+
external_config = server_conf_to_external(config)
162+
self.assertIsNone(external_config.get('title'))
163+
self.assertIsNone(external_config.get('enableScriptTitles'))

src/tests/server_conf_test.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,28 @@ def test_default_value(self):
119119
self.assertEqual(10, config.max_request_size_mb)
120120

121121

122+
class TestSimpleConfigs(unittest.TestCase):
123+
def test_server_title(self):
124+
config = _from_json({'title': 'my server'})
125+
self.assertEqual('my server', config.title)
126+
127+
def test_server_title_default(self):
128+
config = _from_json({})
129+
self.assertIsNone(config.title)
130+
131+
def test_enable_script_titles_enabled(self):
132+
config = _from_json({'enable_script_titles': 'true'})
133+
self.assertIs(True, config.enable_script_titles)
134+
135+
def test_enable_script_titles_disabled(self):
136+
config = _from_json({'enable_script_titles': 'false'})
137+
self.assertIs(False, config.enable_script_titles)
138+
139+
def test_enable_script_titles_default(self):
140+
config = _from_json({})
141+
self.assertIs(True, config.enable_script_titles)
142+
143+
122144
def _from_json(content):
123145
json_obj = json.dumps(content)
124146
conf_path = os.path.join(test_utils.temp_folder, 'conf.json')

src/web/server.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -172,10 +172,9 @@ def set_default_headers(self):
172172
self.set_header('X-Frame-Options', 'DENY')
173173

174174

175-
class GetServerTitle(BaseRequestHandler):
175+
class GetServerConf(BaseRequestHandler):
176176
def get(self):
177-
if self.application.server_title:
178-
self.write(self.application.server_title)
177+
self.write(external_model.server_conf_to_external(self.application.server_config))
179178

180179

181180
class GetScripts(BaseRequestHandler):
@@ -788,7 +787,7 @@ def init(server_config: ServerConfig,
788787

789788
downloads_folder = file_download_feature.get_result_files_folder()
790789

791-
handlers = [(r'/conf/title', GetServerTitle),
790+
handlers = [(r'/conf', GetServerConf),
792791
(r'/scripts', GetScripts),
793792
(r'/scripts/([^/]*)', ScriptConfigSocket),
794793
(r'/scripts/([^/]*)/([^/]*)/list-files', ScriptParameterListFiles),
@@ -825,7 +824,7 @@ def init(server_config: ServerConfig,
825824

826825
application.auth = auth
827826

828-
application.server_title = server_config.title
827+
application.server_config = server_config
829828
application.authorizer = authorizer
830829
application.downloads_folder = downloads_folder
831830
application.file_download_feature = file_download_feature

web-src/js/index.js

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,21 @@ const scriptSelectionListeners = [];
2828
const scriptMenuItems = new Map();
2929
const runningScriptExecutors = [];
3030
let activeScriptController = null;
31+
let enableScriptTitles = false;
32+
let mainTitle = document.title;
3133

3234
window.onload = onLoad;
3335

3436
function onLoad() {
35-
authorizedCallHttp('conf/title', null, 'GET', function (result) {
36-
if (result) {
37-
document.title = result;
37+
authorizedCallHttp('conf', null, 'GET', function (result) {
38+
const config = JSON.parse(result);
39+
if (!isNull(config.title)) {
40+
mainTitle = config.title;
3841
}
42+
enableScriptTitles = isNull(config.enableScriptTitles) || config.enableScriptTitles;
43+
updateTitle();
3944
});
45+
scriptSelectionListeners.push(updateTitle);
4046

4147
var response = authorizedCallHttp('scripts');
4248

@@ -504,4 +510,12 @@ function hideErrorPanel() {
504510
removeClass(scriptPanelContainer, 'collapsed');
505511

506512
hide(errorPanel);
513+
}
514+
515+
function updateTitle() {
516+
if ((enableScriptTitles) && (!isNull(selectedScript))) {
517+
document.title = selectedScript + ' - ' + mainTitle;
518+
} else {
519+
document.title = mainTitle;
520+
}
507521
}

0 commit comments

Comments
 (0)