def test_register_ip_submission(self):
     self._insert_data()
     Database.add_submission("submissionid", "inputid", "outputid",
                             "sourceid", 42)
     self.register_ip(submission_id="submissionid", _ip="1.1.1.1")
     users = Database.get_users()
     self.assertEqual("1.1.1.1", users[0]["ip"][0]["ip"])
Exemplo n.º 2
0
def analyze_pack(pack, workdir, token, all, source_only, no_group_venue,
                 outdir):
    packname = os.path.basename(pack)[:4]
    if packname[3] == "0":
        packname = packname[:3]
    with common.extract_and_connect(pack, workdir):
        users = Database.get_users()
        if token:
            users = list(filter(lambda u: u["token"] in token, users))
        if not users:
            return False
        for user in users:
            token = user["token"]
            print("Found user %s %s" % (user["name"], user["surname"]))
            tasks = common.get_tasks()
            num_submissions = 0
            for task in tasks:
                submissions = Database.get_submissions(token, task)
                num_submissions += len(submissions)
                if no_group_venue:
                    taskdir = os.path.join(outdir, task, token)
                else:
                    taskdir = os.path.join(outdir, packname, task, token)
                os.makedirs(taskdir, exist_ok=True)
                if not all:
                    best = max(submissions,
                               key=lambda x: x["score"],
                               default=None)
                    if best:
                        submissions = [best]
                for submission in submissions:
                    store_submission(submission, taskdir, workdir, source_only)
            print("    > %d submissions" % num_submissions, file=sys.stderr)
        return len(token) == 1 and num_submissions > 0
Exemplo n.º 3
0
    def test_read_from_disk(self):
        path = Utils.new_tmp_dir()
        self._prepare_contest_dir(path)
        Config.statementdir = Utils.new_tmp_dir()
        Config.contest_path = path

        with patch("gevent.spawn") as mock:
            ContestManager.read_from_disk()
            mock.assert_has_calls(
                [call(ContestManager.worker, "poldo")], any_order=True)

        self.assertEqual(18000, Database.get_meta(
            "contest_duration", type=int))
        tasks = Database.get_tasks()
        self.assertEqual(1, len(tasks))
        self.assertEqual("poldo", tasks[0]["name"])
        self.assertEqual("Poldo", tasks[0]["title"])
        self.assertEqual(42, tasks[0]["max_score"])
        self.assertEqual(0, tasks[0]["num"])

        users = Database.get_users()
        self.assertEqual(1, len(users))
        self.assertEqual("token", users[0]["token"])
        self.assertEqual("Test", users[0]["name"])
        self.assertEqual("User", users[0]["surname"])
        self.assertEqual(0, users[0]["extra_time"])

        user_tasks = Database.get_user_task("token", "poldo")
        self.assertEqual("token", user_tasks["token"])
        self.assertEqual("poldo", user_tasks["task"])
        self.assertEqual(0, user_tasks["score"])
        self.assertIsNone(user_tasks["current_attempt"])

        self.assertTrue(Database.get_meta("contest_imported", type=bool))
        self.assertTrue(ContestManager.has_contest)
        self.assertIn("poldo", ContestManager.tasks)
        self.assertIn("poldo", ContestManager.input_queue)
Exemplo n.º 4
0
 def user_list(self):
     """
     POST /admin/user_list
     """
     return BaseHandler.format_dates({"items": Database.get_users()},
                                     fields=["first_date"])
Exemplo n.º 5
0
    def read_from_disk(remove_enc=True):
        """
        Load a task from the disk and load the data into the database
        """
        try:
            contest = ContestManager.import_contest(Config.contest_path)
        except FileNotFoundError as ex:
            error = (
                "Contest not found, you probably need to unzip it. Missing file %s"
                % ex.filename)
            Logger.warning("CONTEST", error)
            shutil.rmtree(Config.statementdir, ignore_errors=True)
            shutil.rmtree(Config.web_statementdir, ignore_errors=True)
            shutil.rmtree(Config.contest_path, ignore_errors=True)
            if remove_enc:
                with suppress(Exception):
                    os.remove(Config.encrypted_file)
            with suppress(Exception):
                os.remove(Config.decrypted_file)
            Database.del_meta("admin_token")
            BaseHandler.raise_exc(UnprocessableEntity, "CONTEST", error)

        if not Database.get_meta("contest_imported", default=False, type=bool):
            Database.begin()
            try:
                Database.set_meta("contest_duration",
                                  contest["duration"],
                                  autocommit=False)
                Database.set_meta("contest_name",
                                  contest.get("name", "Contest"),
                                  autocommit=False)
                Database.set_meta(
                    "contest_description",
                    contest.get("description", ""),
                    autocommit=False,
                )
                Database.set_meta(
                    "window_duration",
                    # if None the contest is not USACO-style
                    contest.get("window_duration"),
                    autocommit=False,
                )
                count = 0

                for task in contest["tasks"]:
                    Database.add_task(
                        task["name"],
                        task["description"],
                        task["statement_path"],
                        task["max_score"],
                        count,
                        autocommit=False,
                    )
                    count += 1

                for user in contest["users"]:
                    Database.add_user(user["token"],
                                      user["name"],
                                      user["surname"],
                                      autocommit=False)

                for user in Database.get_users():
                    for task in Database.get_tasks():
                        Database.add_user_task(user["token"],
                                               task["name"],
                                               autocommit=False)

                Database.set_meta("contest_imported", True, autocommit=False)
                Database.commit()
            except:
                Database.rollback()
                raise
        else:
            # TODO: check that the contest is still the same
            pass

        # store the task in the ContestManager singleton
        ContestManager.tasks = dict(
            (task["name"], task) for task in contest["tasks"])
        ContestManager.has_contest = True

        # create the queues for the task inputs
        for task in ContestManager.tasks:
            ContestManager.input_queue[task] = gevent.queue.Queue(
                Config.queue_size)
            gevent.spawn(ContestManager.worker, task)
 def test_register_ip_source(self):
     self._insert_data()
     self.register_ip(source_id="sourceid", _ip="1.1.1.1")
     users = Database.get_users()
     self.assertEqual("1.1.1.1", users[0]["ip"][0]["ip"])
 def test_register_ip_output(self):
     self._insert_data()
     self.register_ip(output_id="outputid", _ip="1.1.1.1")
     users = Database.get_users()
     self.assertEqual("1.1.1.1", users[0]["ip"][0]["ip"])
 def test_register_ip_token(self):
     self._insert_data()
     self.register_ip(token="token", _ip="1.1.1.1")
     users = Database.get_users()
     self.assertEqual("1.1.1.1", users[0]["ip"][0]["ip"])