diff --git a/cmsranking/Config.py b/cmsranking/Config.py
index 27a37d3a20..1d96f10eec 100644
--- a/cmsranking/Config.py
+++ b/cmsranking/Config.py
@@ -16,7 +16,7 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
-from dataclasses import dataclass
+from dataclasses import dataclass, field
import logging
import os
import sys
@@ -37,6 +37,11 @@ def default_path(name):
return os.path.join(sys.prefix, name)
+@dataclass
+class PublicConfig:
+ show_id_column: bool = False
+
+
@dataclass
class Config:
# Connection.
@@ -51,6 +56,9 @@ class Config:
username: str = "usern4me"
password: str = "passw0rd"
+ # UI.
+ public: PublicConfig = field(default_factory=PublicConfig)
+
# Buffers
buffer_size: int = 100
diff --git a/cmsranking/RankingWebServer.py b/cmsranking/RankingWebServer.py
index bd55a0035f..9b1d58f3b7 100755
--- a/cmsranking/RankingWebServer.py
+++ b/cmsranking/RankingWebServer.py
@@ -42,7 +42,7 @@
# Needed for initialization. Do not remove.
import cmsranking.Logger # noqa
from cmscommon.eventsource import EventSource
-from cmsranking.Config import load_config
+from cmsranking.Config import PublicConfig, load_config
from cmsranking.Contest import Contest
from cmsranking.Entity import InvalidData
from cmsranking.Scoring import ScoringStore
@@ -473,6 +473,32 @@ def wsgi_app(self, environ, start_response):
return response
+class PublicConfigHandler:
+
+ def __init__(self, pub_config: PublicConfig):
+ self.pub_config = pub_config
+
+ def __call__(self, environ, start_response):
+ return self.wsgi_app(environ, start_response)
+
+ @responder
+ def wsgi_app(self, environ, start_response):
+ request = Request(environ)
+ request.encoding_errors = "strict"
+
+ response = Response()
+ response.status_code = 200
+ response.mimetype = "application/json"
+ print(str(self.pub_config))
+ response.data = json.dumps(
+ self.pub_config,
+ default=lambda o: o.__dict__,
+ sort_keys=True,
+ )
+
+ return response
+
+
class RoutingHandler:
def __init__(
@@ -482,6 +508,7 @@ def __init__(
logo_handler: ImageHandler,
score_handler: ScoreHandler,
history_handler: HistoryHandler,
+ public_config_handler: PublicConfigHandler,
):
self.router = Map([
Rule("/", methods=["GET"], endpoint="root"),
@@ -489,6 +516,7 @@ def __init__(
Rule("/scores", methods=["GET"], endpoint="scores"),
Rule("/events", methods=["GET"], endpoint="events"),
Rule("/logo", methods=["GET"], endpoint="logo"),
+ Rule("/config", methods=["GET"], endpoint="public_config")
], encoding_errors="strict")
self.event_handler = event_handler
@@ -496,6 +524,7 @@ def __init__(
self.score_handler = score_handler
self.history_handler = history_handler
self.root_handler = root_handler
+ self.public_config_handler = public_config_handler
def __call__(self, environ, start_response):
return self.wsgi_app(environ, start_response)
@@ -517,6 +546,8 @@ def wsgi_app(self, environ, start_response):
return self.score_handler(environ, start_response)
elif endpoint == "history":
return self.history_handler(environ, start_response)
+ elif endpoint == 'public_config':
+ return self.public_config_handler(environ, start_response)
def main() -> int:
@@ -593,7 +624,8 @@ def main() -> int:
os.path.join(config.lib_dir, '%(name)s'),
os.path.join(web_dir, 'img', 'logo.png')),
ScoreHandler(stores),
- HistoryHandler(stores))
+ HistoryHandler(stores),
+ PublicConfigHandler(config.public))
wsgi_app = SharedDataMiddleware(DispatcherMiddleware(
toplevel_handler, {
diff --git a/cmsranking/static/Config.js b/cmsranking/static/Config.js
index b04e59f924..09a8869394 100644
--- a/cmsranking/static/Config.js
+++ b/cmsranking/static/Config.js
@@ -73,4 +73,24 @@ var Config = new function () {
self.get_history_url = function () {
return "history";
}
+
+ self.get_public_config_url = function () {
+ return "config";
+ }
+};
+
+var PublicConfig = {
+ show_id_column: false
};
+
+$.ajax({
+ url: Config.get_public_config_url(),
+ dataType: "json",
+ async: false,
+ success: function (data, status, xhr) {
+ PublicConfig = data;
+ },
+ error: function () {
+ console.error("Error while getting public configuration data");
+ }
+});
diff --git a/cmsranking/static/Scoreboard.js b/cmsranking/static/Scoreboard.js
index 699eb857cc..ee16ca5a39 100644
--- a/cmsranking/static/Scoreboard.js
+++ b/cmsranking/static/Scoreboard.js
@@ -194,9 +194,9 @@ var Scoreboard = new function () {
| \
Rank | \
First Name | \
- Last Name | \
- ID | \
- Team | ";
+ Last Name | " +
+ (PublicConfig.show_id_column ? "ID | " : "") +
+ "Team | ";
var contests = DataStore.contest_list;
for (var i in contests) {
@@ -244,8 +244,8 @@ var Scoreboard = new function () {
| \
" + user["rank"] + " | \
" + escapeHTML(user["f_name"]) + " | \
- " + escapeHTML(user["l_name"]) + " | \
- " + user["key"] + " | ";
+ " + escapeHTML(user["l_name"]) + " | " +
+ (PublicConfig.show_id_column ? "" + user["key"] + " | " : "");
if (user['team']) {
result += " \
diff --git a/config/cms_ranking.sample.toml b/config/cms_ranking.sample.toml
index 5d006e4890..5807e42e36 100644
--- a/config/cms_ranking.sample.toml
+++ b/config/cms_ranking.sample.toml
@@ -25,3 +25,7 @@ buffer_size = 100
#log_dir = "INSTALL_DIR/log/ranking"
# Data directory (the scoreboard data is stored here).
#lib_dir = "INSTALL_DIR/lib/ranking"
+
+# UI
+[public]
+show_id_column = false