Beispiel #1
0
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
Beispiel #2
0
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
Beispiel #3
0
    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))
Beispiel #4
0
    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))
Beispiel #5
0
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