def build_contests(base_dir, all_contests, students, user_stu):
    contests = []
    for zip_name in all_contests:
        cid = util.get_contest_id(zip_name)
        zip_path = os.path.join(base_dir, zip_name)
        assert (os.path.exists(zip_path))

        info = util.get_contest_info(cid)
        assert (info is not None)

        name = str(info["title"])
        begin_unix = int(info["begin"] / 1000)
        begin = datetime.datetime.fromtimestamp(begin_unix)

        unzip_dir = os.path.join(base_dir, name, "submissions")
        assert (os.path.exists(unzip_dir))

        prob_ids = os.listdir(unzip_dir)
        prob_num = len(prob_ids)

        pass_info = {}
        for stu in students:
            pass_info[stu.stu_id] = set()

        for problem in os.listdir(unzip_dir):
            problem_dir = os.path.join(unzip_dir, problem)
            for sub in os.listdir(problem_dir):
                user_id = util.get_userid(sub)
                if user_id not in user_stu:
                    continue
                stu_id = user_stu[user_id]
                pass_info[stu_id].add(problem)
        contests.append(
            Contest(cid, name, begin, prob_ids, prob_num, pass_info))
    return contests
Example #2
0
def update_invite(inviteid, action):
    if not util.is_user():
        return 403
    userid = util.get_userid(util.get_username())
    invite = db.session.execute(
        "SELECT id, shopid FROM invites WHERE receiverid = :userid AND id = :inviteid AND invitestatus = 0",
        {
            "userid": userid,
            "inviteid": inviteid
        }).fetchone()
    if invite == None:
        return 404
    newstatus = 0
    if action == "accept":
        newstatus = 1
        # become owner
        db.session.execute(
            "INSERT INTO shop_owners (userid, shopid) VALUES (:userid, :shopid)",
            {
                "userid": userid,
                "shopid": invite[1]
            })
    elif action == "decline":
        newstatus = 2
    db.session.execute(
        "UPDATE invites SET invitestatus = :status WHERE id = :inviteid", {
            "inviteid": inviteid,
            "status": newstatus
        })
    db.session.commit()
    return 200
Example #3
0
def buy(shopid, productid):
    if not util.is_user():
        return render_template("login.html")
    if util.owns_shop(shopid):  # cannot buy from self
        abort(403)
    code = do_transaction(productid, util.get_userid(session["username"]))
    if code != 200:
        abort(code)
    return redirect("/shops/" + str(shopid))
Example #4
0
def get_public_user(name):
    userid = util.get_userid(name)
    if userid == None:
        return None
    shops = db.session.execute(
        "SELECT shops.id, shops.shopname FROM shops, shop_owners WHERE :userid = shop_owners.userid AND shops.id = shop_owners.shopid",
        {
            "userid": userid
        }).fetchall()
    return ((userid, name), shops)
def remove_duplicate_submissions(submission_dir):
    user_sub = {}
    for sub in os.listdir(submission_dir):
        user_id = util.get_userid(sub)
        user_sub.setdefault(user_id,
                            []).append(os.path.join(submission_dir, sub))

    remove_list = []
    for user_id in user_sub:
        remove_list.extend(sorted(user_sub[user_id])[:-1])

    for file_name in remove_list:
        os.remove(file_name)
    return remove_list
Example #6
0
def delete_product(productid, shopid):
    if not util.is_user():
        return 403
    owns_shop_with_product = db.session.execute(
        "SELECT product.id FROM products, shop_owners WHERE product.id = :productid AND product.shopid = :shopid AND shop_owners.userid = :userid AND shop_owners.shopid = :shopid",
        {
            "productid": productid,
            "shopid": shopid,
            "userid": util.get_userid()
        }).fetchone()
    if owns_shop_with_product == None:
        return 403
    db.session.execute("DELETE FROM products WHERE id = :id",
                       {"id": productid})
    db.session.commit()
    return 200
Example #7
0
def get_private_user(name):
    userid = util.get_userid(name)
    if userid == None:
        return None
    shops = db.session.execute(
        "SELECT shops.id, shops.shopname FROM shops, shop_owners WHERE :userid = shop_owners.userid AND shops.id = shop_owners.shopid",
        {
            "userid": userid
        }).fetchall()
    balance = db.session.execute(
        "SELECT balance FROM users WHERE id = :userid", {
            "userid": userid
        }).fetchone()[0]
    inventory = db.session.execute(
        """
        SELECT items.itemname, user_inventory.quantity FROM items, user_inventory
        WHERE user_inventory.userid = :userid AND user_inventory.itemid = items.id AND user_inventory.quantity > 0""",
        {
            "userid": userid
        }).fetchall()
    # Get the private profile activity stuff
    incoming_invites = db.session.execute(
        "SELECT invites.id, users.username, shops.shopname, invites.invitestatus FROM users, shops, invites WHERE users.id = invites.senderid AND shops.id = invites.shopid AND invites.receiverid = :userid",
        {
            "userid": userid
        }).fetchall()
    sent_invites = db.session.execute(
        "SELECT invites.id, users.username, shops.shopname, invites.invitestatus FROM users, shops, invites WHERE users.id = invites.receiverid AND shops.id = invites.shopid AND invites.senderid = :userid",
        {
            "userid": userid
        }).fetchall()
    pending_incoming_invites = [
        invite for invite in incoming_invites if invite[3] == 0
    ]
    pending_sent_invites = [
        invite for invite in sent_invites if invite[3] == 0
    ]
    activity = []  # TODO activity (description, timestamp)
    return ((userid, name), shops, pending_incoming_invites,
            pending_sent_invites, balance, inventory)
def preprocess(unzip_dir, config):
    all_removed = []
    for problem in config.ignore_problem:
        problem_dir = os.path.join(unzip_dir, problem)
        if os.path.exists(problem_dir):
            shutil.rmtree(problem_dir)
            all_removed.append(problem_dir)
    output_list("Ignored problem:", all_removed)

    all_removed = []
    for problem in os.listdir(unzip_dir):
        problem_dir = os.path.join(unzip_dir, problem)
        for sub in os.listdir(problem_dir):
            user_id = util.get_userid(sub)
            if not any(
                (re.match(regex, user_id) for regex in config.include_userid)):
                all_removed.append(os.path.join(problem_dir, sub))
            elif user_id in config.ignore_userid:
                all_removed.append(os.path.join(problem_dir, sub))
    for f in all_removed:
        os.remove(f)
    output_list("Ignore submission by userid:", all_removed)

    if config.remove_duplicate:
        all_removed = []
        for problem in os.listdir(unzip_dir):
            submission_dir = os.path.join(unzip_dir, problem)
            all_removed.extend(remove_duplicate_submissions(submission_dir))
        output_list("Removed duplicate file:", all_removed)

    # rename *.c to *.cpp
    rename_list = glob.glob(os.path.join(unzip_dir, '*', '*.c'))
    for f in rename_list:
        new_file = f + "pp"
        if os.path.exists(new_file):
            os.remove(f)
        else:
            os.rename(f, new_file)
    output_list("Rename c to cpp:", rename_list)
Example #9
0
def invite(receivername, shopid):
    sendername = util.get_username()
    if sendername == None:
        return 403
    if not util.owns_shop(shopid):
        print("doesnt own shop")
        return 403
    if sendername == receivername:
        print("cannot invite self")
        return 403
    print("inviting " + receivername + " for shop " + str(shopid))
    receiver = db.session.execute(  # get the receiver who is not an owner nor has an invite to the shop
        """SELECT U.id 
        FROM users U, shop_owners S 
        WHERE U.username = :username 
        /* receiver not an owner of the shop */
        AND U.id = S.userid AND NOT S.shopid = :shopid 
        /* receiver does not have an active invite to the shop */
        AND U.id NOT IN (SELECT users.id FROM users, invites WHERE users.id = invites.receiverid AND invites.shopid = :shopid AND invites.invitestatus = 0)""",
        {
            "username": receivername,
            "shopid": shopid
        }).fetchone()
    if receiver == None:
        # TODO handle receiver already owner, receiver already invited, receiver does not exist
        return 404
    receiverid = receiver[0]
    senderid = util.get_userid(sendername)
    db.session.execute(
        "INSERT INTO invites (senderid, receiverid, shopid, invitestatus) VALUES (:senderid, :receiverid, :shopid, 0)",
        {
            "senderid": senderid,
            "receiverid": receiverid,
            "shopid": shopid
        })
    db.session.commit()
    return 200
Example #10
0
def produce(shopid, productid):
    if not util.is_user():
        return render_template("login.html")
    userid = util.get_userid(session["username"])
    produce_product(productid, userid)
    return redirect("/shops/" + str(shopid))