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
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
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))
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
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
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)
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
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))