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