diff --git a/cmscontrib/loaders/italy_yaml.py b/cmscontrib/loaders/italy_yaml.py index 088e8d86f1..08f04ef25b 100644 --- a/cmscontrib/loaders/italy_yaml.py +++ b/cmscontrib/loaders/italy_yaml.py @@ -49,16 +49,6 @@ logger = logging.getLogger(__name__) -# Patch PyYAML to make it load all strings as unicode instead of str -# (see http://stackoverflow.com/questions/2890146). -def construct_yaml_str(self, node): - return self.construct_scalar(node) - - -yaml.Loader.add_constructor("tag:yaml.org,2002:str", construct_yaml_str) -yaml.SafeLoader.add_constructor("tag:yaml.org,2002:str", construct_yaml_str) - - def getmtime(fname): return os.stat(fname).st_mtime @@ -605,7 +595,7 @@ def get_task(self, get_statement=True) -> Task | None: stubs = True if graders and stubs: - logger.fatal("Task contains both sol/grader and sol/stub") + logger.critical("Task contains both sol/grader and sol/stub") return None elif graders: # Read grader for each language @@ -766,13 +756,7 @@ def get_task(self, get_statement=True) -> Task | None: args["score_type_parameters"] = input_value # If output_only is set, then the task type is OutputOnly - if conf.get('output_only', False): - args["task_type"] = "OutputOnly" - args["time_limit"] = None - args["memory_limit"] = None - args["task_type_parameters"] = [evaluation_param] - task.submission_format = \ - ["output_%03d.txt" % i for i in range(n_input)] + output_only = bool(conf.get('output_only', False)) # If there is check/controller (or equivalent), then the task # type is Interactive @@ -792,8 +776,9 @@ def get_task(self, get_statement=True) -> Task | None: manager_path = path break - if controller_path is not None and manager_path is not None: - logger.fatal("Cannot have both a manager and a controller") + if sum((controller_path is not None, manager_path is not None, output_only)) > 1: + logger.critical("Can have at most one of manager, controller, and output_only") + sys.exit(1) if controller_path is not None: args["task_type"] = "Interactive" @@ -812,6 +797,7 @@ def get_task(self, get_statement=True) -> Task | None: controller_path, "Controller for task %s" % task.name) args["managers"] += [Manager("controller", digest)] + elif manager_path is not None: num_processes = load(conf, None, "num_processes") if num_processes is None: @@ -832,6 +818,14 @@ def get_task(self, get_statement=True) -> Task | None: manager_path, "Manager for task %s" % task.name) args["managers"] += [Manager("manager", digest)] + + elif output_only: + args["task_type"] = "OutputOnly" + args["time_limit"] = None + args["memory_limit"] = None + args["task_type_parameters"] = [evaluation_param] + task.submission_format = ["output_%03d.txt" % i for i in range(n_input)] + else: # Otherwise, the task type is Batch or BatchAndOutput args["task_type"] = "Batch"