diff --git a/cmscontrib/loaders/base_loader.py b/cmscontrib/loaders/base_loader.py index ddac01578..bd786976b 100644 --- a/cmscontrib/loaders/base_loader.py +++ b/cmscontrib/loaders/base_loader.py @@ -19,6 +19,69 @@ from abc import ABCMeta, abstractmethod +LANGUAGE_MAP = { + 'afrikaans': 'af', + 'arabic': 'ar', + 'armenian': 'hy', + 'azerbaijani': 'az', + 'belarusian': 'be', + 'bengali': 'bn', + 'bosnian': 'bs', + 'bulgarian': 'bg', + 'catalan': 'ca', + 'chinese': 'zh', + 'croatian': 'hr', + 'czech': 'cs', + 'danish': 'da', + 'dutch': 'nl', + 'english': 'en', + 'estonian': 'et', + 'filipino': 'fil', + 'finnish': 'fi', + 'french': 'fr', + 'georgian': 'ka', + 'german': 'de', + 'greek': 'el', + 'hebrew': 'he', + 'hindi': 'hi', + 'hungarian': 'hu', + 'icelandic': 'is', + 'indonesian': 'id', + 'irish': 'ga', + 'italian': 'it', + 'japanese': 'ja', + 'kazakh': 'kk', + 'korean': 'ko', + 'kyrgyz': 'ky', + 'latvian': 'lv', + 'lithuanian': 'lt', + 'macedonian': 'mk', + 'malay': 'ms', + 'mongolian': 'mn', + 'norwegian': 'no', + 'persian': 'fa', + 'polish': 'pl', + 'portuguese': 'pt', + 'romanian': 'ro', + 'russian': 'ru', + 'serbian': 'sr', + 'sinhala': 'si', + 'slovak': 'sk', + 'slovene': 'sl', + 'spanish': 'es', + 'swedish': 'sv', + 'tajik': 'tg', + 'tamil': 'ta', + 'thai': 'th', + 'turkish': 'tr', + 'turkmen': 'tk', + 'ukrainian': 'uk', + 'urdu': 'ur', + 'uzbek': 'uz', + 'vietnamese': 'vi', + 'other': 'other', +} + class BaseLoader(metaclass=ABCMeta): """Base class for deriving loaders. diff --git a/cmscontrib/loaders/italy_yaml.py b/cmscontrib/loaders/italy_yaml.py index 3543135a0..27d8f756b 100644 --- a/cmscontrib/loaders/italy_yaml.py +++ b/cmscontrib/loaders/italy_yaml.py @@ -41,7 +41,7 @@ from cmscommon.crypto import build_password from cmscommon.datetime import make_datetime from cmscontrib import touch -from .base_loader import ContestLoader, TaskLoader, UserLoader, TeamLoader +from .base_loader import ContestLoader, TaskLoader, UserLoader, TeamLoader, LANGUAGE_MAP logger = logging.getLogger(__name__) @@ -356,27 +356,49 @@ def get_task(self, get_statement=True): logger.info("Loading parameters for task %s.", name) if get_statement: + # language of testo.pdf / statement.pdf primary_language = load(conf, None, "primary_language") if primary_language is None: primary_language = 'it' paths = [os.path.join(self.path, "statement", "statement.pdf"), os.path.join(self.path, "testo", "testo.pdf")] + statement_path = None for path in paths: if os.path.exists(path): - digest = self.file_cacher.put_file_from_path( - path, - "Statement for task %s (lang: %s)" % - (name, primary_language)) + statement_path = path break - else: - logger.critical("Couldn't find any task statement, aborting.") - sys.exit(1) - args["statements"] = { - primary_language: Statement(primary_language, digest) - } + + if statement_path is not None: + digest = self.file_cacher.put_file_from_path( + statement_path, + "Statement for task %s (lang: %s)" % + (name, primary_language)) + args["statements"] = { + primary_language: Statement( + primary_language, digest) + } args["primary_statements"] = [primary_language] + for (lang, lang_code) in LANGUAGE_MAP.items(): + # .pdf always overrides the corresponding language. + paths = [os.path.join(self.path, "statement", "%s.pdf" % lang), + os.path.join(self.path, "testo", "%s.pdf" % lang)] + for path in paths: + if os.path.exists(path): + digest = self.file_cacher.put_file_from_path( + path, + "Statement for task %s (lang: %s)" % + (name, lang_code)) + args["statements"][lang_code] = Statement( + lang_code, digest) + break + + if primary_language not in args["statements"]: + logger.critical( + "Couldn't find statement for primary language %s, aborting." % primary_language) + sys.exit(1) + args["submission_format"] = ["%s.%%l" % name] # Import the feedback level when explicitly set to full @@ -563,7 +585,7 @@ def get_task(self, get_statement=True): if subtask_detected: # Close the previous subtask if points is None: - assert(testcases == 0) + assert testcases == 0 else: subtasks.append([points, testcases]) # Open the new one @@ -582,7 +604,7 @@ def get_task(self, get_statement=True): args["score_type_parameters"] = input_value else: subtasks.append([points, testcases]) - assert(100 == sum([int(st[0]) for st in subtasks])) + assert 100 == sum([int(st[0]) for st in subtasks]) n_input = sum([int(st[1]) for st in subtasks]) args["score_type"] = "GroupMin" args["score_type_parameters"] = subtasks @@ -799,6 +821,9 @@ def task_has_changed(self): # Statement files.append(os.path.join(self.path, "statement", "statement.pdf")) files.append(os.path.join(self.path, "testo", "testo.pdf")) + for lang in LANGUAGE_MAP: + files.append(os.path.join(self.path, "statement", "%s.pdf" % lang)) + files.append(os.path.join(self.path, "testo", "%s.pdf" % lang)) # Managers files.append(os.path.join(self.path, "check", "checker")) diff --git a/cmscontrib/loaders/polygon.py b/cmscontrib/loaders/polygon.py index 6107b6b3e..fb4a4b4ad 100644 --- a/cmscontrib/loaders/polygon.py +++ b/cmscontrib/loaders/polygon.py @@ -31,7 +31,7 @@ from cms.db import Contest, User, Task, Statement, Dataset, Manager, Testcase from cmscommon.crypto import build_password from cmscontrib import touch -from .base_loader import ContestLoader, TaskLoader, UserLoader +from .base_loader import ContestLoader, TaskLoader, UserLoader, LANGUAGE_MAP logger = logging.getLogger(__name__) @@ -41,70 +41,6 @@ def make_timedelta(t): return timedelta(seconds=t) -LANGUAGE_MAP = { - 'afrikaans': 'af', - 'arabic': 'ar', - 'armenian': 'hy', - 'azerbaijani': 'az', - 'belarusian': 'be', - 'bengali': 'bn', - 'bosnian': 'bs', - 'bulgarian': 'bg', - 'catalan': 'ca', - 'chinese': 'zh', - 'croatian': 'hr', - 'czech': 'cs', - 'danish': 'da', - 'dutch': 'nl', - 'english': 'en', - 'estonian': 'et', - 'filipino': 'fil', - 'finnish': 'fi', - 'french': 'fr', - 'georgian': 'ka', - 'german': 'de', - 'greek': 'el', - 'hebrew': 'he', - 'hindi': 'hi', - 'hungarian': 'hu', - 'icelandic': 'is', - 'indonesian': 'id', - 'irish': 'ga', - 'italian': 'it', - 'japanese': 'ja', - 'kazakh': 'kk', - 'korean': 'ko', - 'kyrgyz': 'ky', - 'latvian': 'lv', - 'lithuanian': 'lt', - 'macedonian': 'mk', - 'malay': 'ms', - 'mongolian': 'mn', - 'norwegian': 'no', - 'persian': 'fa', - 'polish': 'pl', - 'portuguese': 'pt', - 'romanian': 'ro', - 'russian': 'ru', - 'serbian': 'sr', - 'sinhala': 'si', - 'slovak': 'sk', - 'slovene': 'sl', - 'spanish': 'es', - 'swedish': 'sv', - 'tajik': 'tg', - 'tamil': 'ta', - 'thai': 'th', - 'turkish': 'tr', - 'turkmen': 'tk', - 'ukrainian': 'uk', - 'urdu': 'ur', - 'uzbek': 'uz', - 'vietnamese': 'vi', - 'other': 'other', -} - - class PolygonTaskLoader(TaskLoader): """Load a task stored using the Codeforces Polygon format.