Skip to content

Commit

Permalink
Make the yaml importer load multiple languages.
Browse files Browse the repository at this point in the history
  • Loading branch information
veluca93 committed Jan 17, 2024
1 parent 7db9aa1 commit 02112a0
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 70 deletions.
63 changes: 63 additions & 0 deletions cmscontrib/loaders/base_loader.py
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
29 changes: 24 additions & 5 deletions cmscontrib/loaders/italy_yaml.py
Original file line number Diff line number Diff line change
Expand Up @@ -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__)
Expand Down Expand Up @@ -371,12 +371,28 @@ def get_task(self, get_statement=True):
else:
logger.critical("Couldn't find any task statement, aborting.")
sys.exit(1)

args["statements"] = {
primary_language: Statement(primary_language, digest)
primary_language: Statement(
primary_language, digest)
}

args["primary_statements"] = [primary_language]

for (lang, lang_code) in LANGUAGE_MAP.items():
if lang_code == primary_language:
continue
paths = [os.path.join(self.path, "statement", "%s.pdf" % lang),

Check warning on line 384 in cmscontrib/loaders/italy_yaml.py

View check run for this annotation

Codecov / codecov/patch

cmscontrib/loaders/italy_yaml.py#L381-L384

Added lines #L381 - L384 were not covered by tests
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(

Check warning on line 388 in cmscontrib/loaders/italy_yaml.py

View check run for this annotation

Codecov / codecov/patch

cmscontrib/loaders/italy_yaml.py#L386-L388

Added lines #L386 - L388 were not covered by tests
path,
"Statement for task %s (lang: %s)" %
(name, lang_code))
args["statements"][lang_code] = Statement(

Check warning on line 392 in cmscontrib/loaders/italy_yaml.py

View check run for this annotation

Codecov / codecov/patch

cmscontrib/loaders/italy_yaml.py#L392

Added line #L392 was not covered by tests
lang_code, digest)
break

Check warning on line 394 in cmscontrib/loaders/italy_yaml.py

View check run for this annotation

Codecov / codecov/patch

cmscontrib/loaders/italy_yaml.py#L394

Added line #L394 was not covered by tests

args["submission_format"] = ["%s.%%l" % name]

# Import the feedback level when explicitly set to full
Expand Down Expand Up @@ -563,7 +579,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

Check warning on line 582 in cmscontrib/loaders/italy_yaml.py

View check run for this annotation

Codecov / codecov/patch

cmscontrib/loaders/italy_yaml.py#L582

Added line #L582 was not covered by tests
else:
subtasks.append([points, testcases])
# Open the new one
Expand All @@ -582,7 +598,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])

Check warning on line 601 in cmscontrib/loaders/italy_yaml.py

View check run for this annotation

Codecov / codecov/patch

cmscontrib/loaders/italy_yaml.py#L601

Added line #L601 was not covered by tests
n_input = sum([int(st[1]) for st in subtasks])
args["score_type"] = "GroupMin"
args["score_type_parameters"] = subtasks
Expand Down Expand Up @@ -799,6 +815,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))

Check warning on line 820 in cmscontrib/loaders/italy_yaml.py

View check run for this annotation

Codecov / codecov/patch

cmscontrib/loaders/italy_yaml.py#L818-L820

Added lines #L818 - L820 were not covered by tests

# Managers
files.append(os.path.join(self.path, "check", "checker"))
Expand Down
66 changes: 1 addition & 65 deletions cmscontrib/loaders/polygon.py
Original file line number Diff line number Diff line change
Expand Up @@ -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__)
Expand All @@ -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.
Expand Down

0 comments on commit 02112a0

Please sign in to comment.