Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve tps loader #1212

Open
wants to merge 4 commits into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 33 additions & 1 deletion cmscontrib/loaders/tps.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
from datetime import timedelta

from cms.db import Task, Dataset, Manager, Testcase, Attachment, Statement
from cmscommon.constants import SCORE_MODE_MAX_SUBTASK
from .base_loader import TaskLoader


Expand All @@ -42,7 +43,7 @@ class TpsTaskLoader(TaskLoader):
"""

short_name = 'tps_task'
description = 'TPS task format'
description = 'TPS task format (version 2)'

@staticmethod
def detect(path):
Expand All @@ -58,6 +59,18 @@ def task_has_changed(self):
return True

def _get_task_type_parameters(self, data, task_type, evaluation_param):
if self.protocol_version >= 2:
# Task type parameters are completely specified in the json file.
task_type_params = data.get('task_type_params')
if task_type_params is None:
logger.critical("'task_type_params' is not provided.")
return None
if not isinstance(task_type_params, list):
logger.critical("Given 'task_type_params' is not a list.")
return None
return task_type_params

# protocol_version 1: Create the task type parameters manually...
parameters_str = data['task_type_params']
if parameters_str is None or parameters_str == '':
parameters_str = '{}'
Expand Down Expand Up @@ -116,13 +129,29 @@ def get_task(self, get_statement=True):
with open(json_src, 'rt', encoding='utf-8') as json_file:
data = json.load(json_file)

if "protocol_version" in data:
self.protocol_version = data["protocol_version"]
logger.info("protocol_version=%s" % str(self.protocol_version))
else:
self.protocol_version = 1
logger.info("The protocol_version is not defined. Setting to default value: %s" % str(self.protocol_version))

if not isinstance(self.protocol_version, int):
logger.critical("Given protocol_version is not an integer")
return None

if not (1 <= self.protocol_version <= 2):
logger.critical("Invalid protocol_version %d" % self.protocol_version)
return None

name = data['code']
logger.info("Loading parameters for task %s.", name)

args = {}

args["name"] = name
args["title"] = data['name']
args["score_mode"] = data.get("score_mode", SCORE_MODE_MAX_SUBTASK)

# Statements
if get_statement:
Expand Down Expand Up @@ -251,6 +280,9 @@ def get_task(self, get_statement=True):
self._get_task_type_parameters(
data, data['task_type'], evaluation_param)

if args["task_type_parameters"] is None:
return None

# Graders
graders_dir = os.path.join(self.path, 'graders')

Expand Down