def add_testcases(archive, input_template, output_template, task_name, dataset_description=None, contest_name=None, public=False, overwrite=False): with SessionGen() as session: task = session.query(Task)\ .filter(Task.name == task_name).first() if not task: logger.error("No task called %s found." % task_name) return False dataset = task.active_dataset if dataset_description is not None: dataset = session.query(Dataset)\ .filter(Dataset.task_id == task.id)\ .filter(Dataset.description == dataset_description)\ .first() if not dataset: logger.error("No dataset called %s found." % dataset_description) return False if contest_name is not None: contest = session.query(Contest)\ .filter(Contest.name == contest_name).first() if task.contest != contest: logger.error("%s is not in %s" % (task_name, contest_name)) return False file_cacher = FileCacher() # Get input/output file names templates input_re = re.compile( re.escape(input_template).replace("\\*", "(.*)") + "$") output_re = re.compile( re.escape(output_template).replace("\\*", "(.*)") + "$") try: successful_subject, successful_message = \ import_testcases_from_zipfile( session, file_cacher, dataset, archive, input_re, output_re, overwrite, public) except Exception as error: logger.error(str(error)) return False logger.info(successful_subject) logger.info(successful_message) return True
def post(self, dataset_id): fallback_page = \ self.url("dataset", dataset_id, "testcases", "add_multiple") # TODO: this method is quite long, some splitting is needed. dataset = self.safe_get_item(Dataset, dataset_id) task = dataset.task try: archive = self.request.files["archive"][0] except KeyError: self.application.service.add_notification( make_datetime(), "Invalid data", "Please choose tests archive.") self.redirect(fallback_page) return public = self.get_argument("public", None) is not None overwrite = self.get_argument("overwrite", None) is not None # Get input/output file names templates, or use default ones. input_template = self.get_argument("input_template", "input.*") output_template = self.get_argument("output_template", "output.*") input_re = re.compile( re.escape(input_template).replace("\\*", "(.*)") + "$") output_re = re.compile( re.escape(output_template).replace("\\*", "(.*)") + "$") fp = StringIO(archive["body"]) try: successful_subject, successful_text = \ import_testcases_from_zipfile( self.sql_session, self.application.service.file_cacher, dataset, fp, input_re, output_re, overwrite, public) except Exception as error: self.application.service.add_notification(make_datetime(), str(error), repr(error)) self.redirect(fallback_page) return self.application.service.add_notification(make_datetime(), successful_subject, successful_text) self.application.service.proxy_service.reinitialize() self.redirect(self.url("task", task.id))
def post(self, dataset_id): fallback_page = \ self.url("dataset", dataset_id, "testcases", "add_multiple") # TODO: this method is quite long, some splitting is needed. dataset = self.safe_get_item(Dataset, dataset_id) task = dataset.task try: archive = self.request.files["archive"][0] except KeyError: self.service.add_notification( make_datetime(), "Invalid data", "Please choose tests archive.") self.redirect(fallback_page) return public = self.get_argument("public", None) is not None overwrite = self.get_argument("overwrite", None) is not None # Get input/output file names templates, or use default ones. input_template = self.get_argument("input_template", "input.*") output_template = self.get_argument("output_template", "output.*") input_re = re.compile(re.escape(input_template).replace("\\*", "(.*)") + "$") output_re = re.compile(re.escape(output_template).replace("\\*", "(.*)") + "$") fp = io.BytesIO(archive["body"]) try: successful_subject, successful_text = \ import_testcases_from_zipfile( self.sql_session, self.service.file_cacher, dataset, fp, input_re, output_re, overwrite, public) except Exception as error: self.service.add_notification( make_datetime(), str(error), repr(error)) self.redirect(fallback_page) return self.service.add_notification( make_datetime(), successful_subject, successful_text) self.service.proxy_service.reinitialize() self.redirect(self.url("task", task.id))
def main(): """Parse arguments and launch process.""" parser = argparse.ArgumentParser(description="Add an admin to CMS.") parser.add_argument("task_name", action="store", type=utf8_decoder, help="task testcases will be attached to") parser.add_argument("file", action="store", type=utf8_decoder, help="a zip file which contains testcases") parser.add_argument("inputtemplate", action="store", type=utf8_decoder, help="format of input") parser.add_argument("outputtemplate", action="store", type=utf8_decoder, help="format of output") parser.add_argument("-p", "--public", action="store_true", help="if testcases should be public") parser.add_argument("-o", "--overwrite", action="store_true", help="if testcases can overwrite existing testcases") parser.add_argument("-c", "--contest_name", action="store", help="contest which testcases will be attached to") parser.add_argument("-d", "--dataset_description", action="store", help="dataset testcases will be attached to") args = parser.parse_args() with SessionGen() as session: task = session.query(Task)\ .filter(Task.name == args.task_name).first() if not task: logger.error("No task called %s found." % args.task_name) return False dataset = task.active_dataset if args.dataset_description is not None: dataset = session.query(Dataset)\ .filter(Dataset.task_id == task.id)\ .filter(Dataset.description == args.dataset_description)\ .first() if not dataset: logger.error("No dataset called %s found." % args.dataset_description) return False if args.contest_name is not None: contest = session.query(Contest)\ .filter(Contest.name == args.contest_name).first() if task.contest != contest: logger.error("%s is not in %s" % (args.task_name, args.contest_name)) return False archive = args.file file_cacher = FileCacher() # Get input/output file names templates input_template = args.inputtemplate output_template = args.outputtemplate input_re = re.compile( re.escape(input_template).replace("\\*", "(.*)") + "$") output_re = re.compile( re.escape(output_template).replace("\\*", "(.*)") + "$") try: successful_subject, successful_message = \ import_testcases_from_zipfile( session, file_cacher, dataset, archive, input_re, output_re, args.overwrite, args.public) except Exception as error: logger.error(str(error)) return False logger.info(successful_subject) logger.info(successful_message) return True