def post(self): data = request.get_json() if data and USERNAME in data: user = UserModel.get_by_username(data[USERNAME]) oj_data = OjModel.get_by_username(data[USERNAME]) if not user: return {MESSAGE: "User Not Found"}, 404 else: return { FIRST_NAME: user.first_name, LAST_NAME: user.last_name, USERNAME: user.username, EMAIL: user.email, OJ_INFO: oj_data.oj_info if oj_data else {}, "delete_access": user.is_admin }, 200 else: user_list = [] for user in UserModel.get_all_users(): oj_data = OjModel.get_by_username(user[USERNAME]) user_list.append( { FIRST_NAME: user[FIRST_NAME], LAST_NAME: user[LAST_NAME], USERNAME: user[USERNAME], EMAIL: user[EMAIL], OJ_INFO: oj_data.oj_info if oj_data else {} } ) return { "user_list": user_list, "delete_access": UserModel.get_by_username(get_jwt_identity()).is_admin }, 200
def get_todos(username, classroom_name): user = UserModel.get_by_username(username) oj_info = OjModel.get_by_username(username) if not user or not oj_info: return None oj_info = oj_info.oj_info todo_list = [] if VJUDGE not in oj_info or USERNAME not in oj_info[ VJUDGE] or not oj_info[VJUDGE][USERNAME]: todo_list.append("Please add your Vjudge username in your profile") if CODEFORCES not in oj_info or USERNAME not in oj_info[ CODEFORCES] or not oj_info[CODEFORCES][USERNAME]: todo_list.append("Please add your Codeforces username in your profile") if ATCODER not in oj_info or USERNAME not in oj_info[ ATCODER] or not oj_info[ATCODER][USERNAME]: todo_list.append("Please add your Atcoder username in your profile") timestamp = datetime.now().timestamp() * 1000 all_todos = TodosModel.get_todos_by_group(group="all") for todo in all_todos: if timestamp <= todo["expires_on"]: todo_list.append(todo["todo"]) classroom_todos = TodosModel.get_todos_by_group(group=classroom_name) for todo in classroom_todos: if timestamp <= todo["expires_on"]: todo_list.append(todo["todo"]) return todo_list
def put(self): user = UserModel.get_by_username(get_jwt_identity()) data = request.get_json() if not user or not user.is_admin: return {MESSAGE: "admin privilege required"}, 400 if not data or CLASSROOM_NAME not in data: return {MESSAGE: "invalid data"}, 400 classroom = ClassroomModel.get_by_classroom_name(data[CLASSROOM_NAME]) if not classroom: return {MESSAGE: "classroom not found"}, 404 vjudge_username = {} for username in data["user_list"]: user = UserModel.get_by_username(username) if not user: return {MESSAGE: "user not found"}, 404 try: vjudge_handle = OjModel.get_by_username( username).oj_info["VJudge"]["username"] except: continue vjudge_username[username] = vjudge_handle data["user_details"] = {"vjudge_username": vjudge_username} classroom.update_to_mongo(data) classroom = ClassroomModel.get_by_classroom_name(data[CLASSROOM_NAME]) threading.Thread(target=update_students, args=[classroom]).start() return {MESSAGE: "data updated"}, 200
def put(self): data = request.get_json() identity = get_jwt_identity() user = UserModel.get_by_username(identity) if not user: return {MESSAGE: "user not found"}, 400 if EMAIL in data: email_user = UserModel.get_by_email(data[EMAIL]) if EMAIL in data and email_user and email_user != user: return {MESSAGE: "email already exists"}, 400 if not WhitelistEmailsModel.check_email(data[EMAIL]): return {MESSAGE: "email is not valid"}, 400 if PASSWORD in data: if "old_password" not in data: return {MESSAGE: "current password is required to set new password"}, 400 if not UserModel.login_valid_username(user.username, data["old_password"]): return {MESSAGE: "wrong current password"}, 400 del data["old_password"] user.update_to_mongo(data) oj_info = OjModel.get_by_username(identity) if oj_info: oj_info.update_to_mongo(data) threading.Thread(target=update_user_with_username, args=[user.username]).start() return {MESSAGE: "User data is being updated"}, 200
def post(self): data = request.get_json() user = UserModel.get_by_username(get_jwt_identity()) if not user.is_admin: return {MESSAGE: "admin privilege required"}, 400 if not data or CLASSROOM_NAME not in data: return {MESSAGE: "invalid data"}, 400 if ClassroomModel.get_by_classroom_name(data[CLASSROOM_NAME]): return {MESSAGE: "A classroom with that name already exists"}, 400 vjudge_username = {} for username in data["user_list"]: user = UserModel.get_by_username(username) if not user: return {MESSAGE: "user not found"}, 404 try: vjudge_handle = OjModel.get_by_username( username).oj_info["VJudge"]["username"] except: continue vjudge_username[username] = vjudge_handle data["user_details"] = {"vjudge_username": vjudge_username} classroom = ClassroomModel(**data) classroom.save_to_mongo() threading.Thread(target=update_students, args=[classroom]).start() return {MESSAGE: "Classroom created successfully."}, 201
def post(self): data = request.get_json() if UserModel.get_by_username(data[USERNAME]): return {MESSAGE: "A user with that username already exists"}, 400 if UserModel.get_by_email(data[EMAIL]): return {MESSAGE: "A user with that email already exists"}, 400 if not WhitelistEmailsModel.check_email(data[EMAIL]): return {MESSAGE: "email is not valid"}, 400 data["password"] = UserModel.encrypt_password(data["password"]) user = UserModel(**data) user.save_to_mongo() oj_data = OjModel(data[USERNAME]) oj_data.save_to_mongo() # app.logger.info("User created successfully " + user.username + " " + user.email) return {MESSAGE: "User created successfully."}, 201
def delete(self): user = UserModel.get_by_username(get_jwt_identity()) if not user.is_admin: return {MESSAGE: "admin privilege required"}, 400 data = request.get_json() user = UserModel.get_by_username(data[USERNAME]) if not user: return {MESSAGE: "User Not Found"}, 404 user.delete_from_db() oj_info = OjModel.get_by_username(data[USERNAME]) oj_info.delete_from_db() return {MESSAGE: "User deleted."}, 200
def get(self): identity = get_jwt_identity() user = UserModel.get_by_username(identity) if not user: return {MESSAGE: "user not found"}, 400 oj_data = OjModel.get_by_username(identity) return { FIRST_NAME: user.first_name, LAST_NAME: user.last_name, USERNAME: user.username, EMAIL: user.email, OJ_INFO: oj_data.oj_info if oj_data else {} }, 200
def post(self): data = request.get_json() username = get_jwt_identity() if data and USERNAME in data: username = data[USERNAME] classroom_name = "" if "classroom_name" in data: classroom_name = data["classroom_name"] else: classroom_list = ClassroomModel.get_all_classrooms({}) # print(username, classroom_list) for classroom in classroom_list: if username not in classroom["user_list"]: continue curr_name = classroom["classroom_name"] if curr_name == "rated": classroom_name = curr_name break else: if classroom_name == "": classroom_name = curr_name else: if int(curr_name[1, len(curr_name) - 1]) > int( classroom_name[1, len(classroom_name) - 1]): classroom_name = curr_name student = StudentModel.get_by_username_and_classroom_name( username, classroom_name) if not student: return {MESSAGE: "no data found"}, 404 res = student.json() vjudge_username = OjModel.get_vjudge_username(username) if not vjudge_username: return res, 200 contest_data = ContestDataModel.get_vjudge_contest_data() last_day_solve = get_last_day_solve(contest_data.data, vjudge_username) last_30_days_solve = get_last_30_days_solve(contest_data.data, vjudge_username) todo_list = get_todos(username, classroom_name) announcement_list = get_announcements(username, classroom_name) res["last_day_solve"] = last_day_solve res["last_30_days_solve"] = last_30_days_solve res["todo_list"] = todo_list res["announcement_list"] = announcement_list return res, 200
def update_students(classroom): StudentModel.remove({CLASSROOM_NAME: classroom.classroom_name}) for username in classroom.user_list: user = UserModel.get_by_username(username) if not user: print("not found user: "******"no student found with username = "******" in classroom " + str(classroom.classroom_name)) continue long_contests = [] for contest in classroom.vjudge_contest_list: long_contests.append({ "contest_title": contest["contest_title"], "contest_id": contest["contest_id"], "total_problems": contest["total_problems"], "minimum_solve_required": contest["minimum_solve_required"], "solved_problems": vjudge_sraper.solve_details_in_contest_from_data( data=data_map[contest[CONTEST_ID]], username=vjudge_handle), "contest_type": contest["contest_type"] }) new_values = {"long_contests": long_contests} student.update_to_mongo(new_values)
def get_rank_list_from_db(user_list, contest_list, start_time, end_time): contest_data = Database.find_one("contest_data", {"name": "vjudge_contest_data"}) header = ["username", "Total Solve", "Tasks Completed"] data_map = contest_data["data"] for contest in contest_list: if contest[CONTEST_ID] in data_map: header.append(data_map[contest[CONTEST_ID]]["title"]) else: header.append(contest[CONTEST_ID]) rank_list = [] for username in user_list: solve_list = [username] total_solve = 0 min_solve_required = 0 min_solve_completed = 0 try: vjudge_handle = OjModel.get_by_username( username).oj_info[VJUDGE][USERNAME] except: continue for contest in contest_list: if contest[CONTEST_ID] in data_map and vjudge_handle in data_map[ contest[CONTEST_ID]]["submission"]: solve_count = count_in_range( data_map[contest[CONTEST_ID]]["submission"][vjudge_handle], start_time, end_time) else: solve_count = 0 min_solve_completed = min_solve_completed + min( solve_count, contest["minimum_solve_required"]) min_solve_required = min_solve_required + contest[ "minimum_solve_required"] total_solve += solve_count solve_list.append(int(solve_count)) tasks = (min_solve_completed * 100) // min_solve_required solve_list.insert(1, total_solve) solve_list.insert(2, tasks) rank_list.append(solve_list) rank_list = sorted(rank_list, key=lambda row: row[1], reverse=True) rank_list.insert(0, header) return rank_list
def get_rank_list_live(user_list, contest_list, start_time, end_time, contest_data=None): header = ["username"] data_map = {} for contest in contest_list: if contest_data and contest[CONTEST_ID] in contest_data: data = contest_data[contest[CONTEST_ID]] else: data = vjudge_sraper.get_contest_details_data(contest[CONTEST_ID]) data_map[contest[CONTEST_ID]] = data header.append(vjudge_sraper.get_contest_name_from_data(data)) header.append("Total Solve") rank_list = [] for username in user_list: vjudge_handle = None solve_list = [username] total_solve = 0 try: vjudge_handle = OjModel.get_by_username( username).oj_info[VJUDGE][USERNAME] except: continue for contest in contest_list: solve_count = vjudge_sraper.solve_details_in_contest_from_data_with_timestamp( data=data_map[contest[CONTEST_ID]], username=vjudge_handle, end_time=end_time, start_time=start_time) total_solve += solve_count solve_list.append(int(solve_count)) solve_list.append(total_solve) rank_list.append(solve_list) rank_list = sorted(rank_list, key=lambda row: row[len(row) - 1], reverse=True) rank_list.insert(0, header) return rank_list
def post(self): data = request.get_json() identity = get_jwt_identity() user = UserModel.get_by_username(identity) if not user: return {MESSAGE: "user not found"}, 400 if EMAIL in data: email_user = UserModel.get_by_email(data[EMAIL]) if EMAIL in data and email_user and email_user != user: return {MESSAGE: "email already exists"}, 400 user.update_to_mongo(data) oj_info = OjModel.get_by_username(identity) if oj_info: oj_info.update_to_mongo(data) update_user_with_username(user.username) return {MESSAGE: "data updated"}, 200
def update_user_with_username(username): user = OjModel.get_by_username(username) oj_profiles = user.oj_info try: vjudge_data = vjudge_details(oj_profiles[VJUDGE][USERNAME]) except: vjudge_data = {} for oj in vjudge_data: if oj not in oj_profiles: oj_profiles[oj] = {USERNAME: None, SOLVE_LIST: vjudge_data[oj]} else: oj_profiles[oj][SOLVE_LIST] = vjudge_data[oj] oj_profiles[oj][SOLVE_LIST] = [ str(x) for x in oj_profiles[oj][SOLVE_LIST] ] # converting to list of strings update_profile(oj_profiles, CODEFORCES, cf_details) update_profile(oj_profiles, ATCODER, atc_details) # update_json(oj_profiles, LIGHTOJ, loj_details) user.update_to_mongo({"oj_info": oj_profiles})