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 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 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): args = parser.parse_args() user = UserModel(username=args["username"]) user.get_by_username() if user and user.verify_password(args["password"]): user_token = create_access_token(identity=user.id) return {"access_token": user_token}, 200 return {"message": "invalid username or password"}, 401
def get(self): data = request.get_json() if data and USERNAME in data and EMAIL in data: user_by_username = UserModel.get_by_username(data[USERNAME]) user_by_email = UserModel.get_by_username(data[EMAIL]) res = { "username_exist": user_by_username is not None, "email_exist": user_by_email is not None } return res, 200 return {MESSAGE: "bad request"}, 400
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 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 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 post(self): user = UserModel.get_by_username(get_jwt_identity()) if not user: return {MESSAGE: "user not found"}, 404 if not user.is_admin: return {MESSAGE: "admin privilege required"}, 400 data = request.get_json() level = data["level"] interval = data["interval"] if not user or not user.is_admin: return {"Message", "admin privilege requires"}, 400 if level == "days": cron_job.reschedule_job(job_id="update_data", trigger="interval", days=interval) elif level == "hours": cron_job.reschedule_job(job_id="update_data", trigger="interval", hours=interval) elif level == "minutes": cron_job.reschedule_job(job_id="update_data", trigger="interval", minutes=interval) else: return {"Message", "invalid data"}, 400 return {MESSAGE: "data updater rescheduled"}, 200
def post(self): user = UserModel.get_by_username(get_jwt_identity()) if not user.is_admin: return {MESSAGE: "Admin privilege required"}, 401 # update_everything() threading.Thread(target=update_everything).start() return {MESSAGE: "Data is being updated"}, 200
def get(self): user = UserModel.get_by_username(get_jwt_identity()) if not user: return {MESSAGE: "user not found"}, 404 if not user.is_admin: return {MESSAGE: "admin privilege required"}, 400 whitelist_email = WhitelistEmailsModel.get_whitelisted_email_list() return {"email_list": whitelist_email.email_list}, 200
def get(self): user = UserModel.get_by_username(get_jwt_identity()) if not user: return {MESSAGE: "user not found"}, 404 if not user.is_admin: return {MESSAGE: "admin privilege required"}, 400 announcements = AnnouncementsModel.get_all_announcements() if not announcements: return {MESSAGE: "no announcements found"}, 400 else: return {"announcements_list": announcements}, 200
def delete(self): user = UserModel.get_by_username(get_jwt_identity()) data = request.get_json() if not user.is_admin: return {MESSAGE: "admin privilege required"}, 400 if not ClassroomModel.remove({CLASSROOM_NAME: data[CLASSROOM_NAME]}): return {MESSAGE: "invalid data"}, 400 else: StudentModel.remove({CLASSROOM_NAME: data[CLASSROOM_NAME]}) return {MESSAGE: "classroom deleted"}, 200
def get(self): user = UserModel.get_by_username(get_jwt_identity()) if not user: return {MESSAGE: "user not found"}, 404 if not user.is_admin: return {MESSAGE: "admin privilege required"}, 400 todos = TodosModel.get_all_todos() if not todos: return {MESSAGE: "no todos found"}, 400 else: return {"todos_list": todos}, 200
def get(self): user = UserModel.get_by_username(get_jwt_identity()) if not user: return {MESSAGE: "user not found"}, 404 if not user.is_admin: return {MESSAGE: "admin privilege required"}, 400 return { "interval": str(cron_job.get_job("update_data").trigger), "next_run_time": str(cron_job.get_job("update_data").next_run_time) }, 200
def post(self): data = request.get_json() user = UserModel.get_by_username(data[USERNAME]) if user and UserModel.login_valid_username(data[USERNAME], data[PASSWORD]): expires = timedelta(days=7) access_token = create_access_token(identity=data[USERNAME], fresh=True, expires_delta=expires) refresh_token = create_refresh_token(data[USERNAME]) return { "access_token": access_token, "refresh_token": refresh_token }, 200 return {MESSAGE: "Invalid Credentials!"}, 401
def put(self): user = UserModel.get_by_username(get_jwt_identity()) data = request.get_json() 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 student = StudentModel.get_by_username_and_classroom_name( data[USERNAME], data[CLASSROOM_NAME]) if not student: return {MESSAGE: "student not found"}, 404 student.update_to_mongo(data) return {MESSAGE: "data updated"}, 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): user = UserModel.get_by_username(get_jwt_identity()) if not user.is_admin: return {MESSAGE: "admin privilege required"}, 400 data = request.get_json() if 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 threading.Thread(target=update_students, args=[classroom]).start() return {MESSAGE: "Classroom data is being updated"}, 200
def delete(self): user = UserModel.get_by_username(get_jwt_identity()) if not user: return {MESSAGE: "user not found"}, 404 if not user.is_admin: return {MESSAGE: "admin privilege required"}, 400 data = request.get_json() if "todos_list" not in data: return {MESSAGE: "Invalid data"}, 400 for todo in data["todos_list"]: new_todo = TodosModel(**todo) new_todo.delete_from_db() return {MESSAGE: "todos removed"}, 200
def delete(self): user = UserModel.get_by_username(get_jwt_identity()) if not user: return {MESSAGE: "user not found"}, 404 if not user.is_admin: return {MESSAGE: "admin privilege required"}, 400 data = request.get_json() if "announcements_list" not in data: return {MESSAGE: "Invalid data"}, 400 for announcement in data["announcements_list"]: new_announcement = AnnouncementsModel(**announcement) new_announcement.delete_from_db() return {MESSAGE: "announcements removed"}, 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 delete(self): user = UserModel.get_by_username(get_jwt_identity()) if not user: return {MESSAGE: "user not found"}, 404 if not user.is_admin: return {MESSAGE: "admin privilege required"}, 400 data = request.get_json() if not data or "email_list" not in data: return {MESSAGE: "Invalid data"}, 400 whitelist_email = WhitelistEmailsModel.get_whitelisted_email_list() for removed_email in data["email_list"]: whitelist_email.email_list.remove(removed_email) whitelist_email.update_to_mongo() return {MESSAGE: "emails removed from whitelist"}, 200
def post(self): user = UserModel.get_by_username(get_jwt_identity()) data = request.get_json() if not data or data == {}: classroom_list = ClassroomModel.get_all_classrooms() return { "classroom_list": classroom_list, "edit_access": user.is_admin }, 200 elif CLASSROOM_NAME in data: classroom = ClassroomModel.get_by_classroom_name( data[CLASSROOM_NAME]) if classroom: return classroom.json(), 200 else: return {MESSAGE: "classroom not found"}, 404 else: return {MESSAGE: "invalid data"}, 400
def post(self): user = UserModel.get_by_username(get_jwt_identity()) if not user: return {MESSAGE: "user not found"}, 404 if not user.is_admin: return {MESSAGE: "admin privilege required"}, 400 data = request.get_json() if not data or "user_list" not in data or "email_list" not in data: return {MESSAGE: "Invalid data"}, 400 if "subject" not in data or "body" not in data: return {MESSAGE: "Invalid data"}, 400 receivers_list = data["email_list"] subject = data["subject"] body = data["body"] threading.Thread(target=mail_sender.send_mail, args=[receivers_list, subject, body]).start() return {MESSAGE: "Mail is being sent"}, 200
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 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 post(self): user = UserModel.get_by_username(get_jwt_identity()) if not user: return {MESSAGE: "user not found"}, 404 if not user.is_admin: return {MESSAGE: "admin privilege required"}, 400 data = request.get_json() if not data or "email_list" not in data: return {MESSAGE: "Invalid data"}, 400 whitelist_email = WhitelistEmailsModel.get_whitelisted_email_list() whitelist_email.email_list.extend(data["email_list"]) whitelist_email.email_list = list(set(whitelist_email.email_list)) whitelist_email.update_to_mongo() # sending invitation mail to newly added mails mail_message = MailTemplate.get_by_template_name("invitation") mail_sender.send_mail_in_background_thread(data["email_list"], mail_message.subject, mail_message.message) return {MESSAGE: "emails added to whitelist"}, 200
def post(self): data = request.get_json() if USERNAME in data: user = UserModel.get_by_username(data[USERNAME]) elif EMAIL in data: user = UserModel.get_by_email(data[EMAIL]) else: return {MESSAGE: "username or email is required"}, 400 if not user: return {MESSAGE: "invalid username or password"}, 400 temp_pass = get_random_alphanumeric_string(8) user.reset_pass = { "expires_on": (datetime.today() + timedelta(hours=1)).timestamp(), "temp_pass": UserModel.encrypt_password(temp_pass) } user.update_to_mongo() mail_template = MailTemplate.get_by_template_name("password_reset") threading.Thread(target=mail_sender.send_mail, args=[[user.email], mail_template.subject, mail_template.message % temp_pass]).start() return {MESSAGE: "Please check your mail inbox"}, 200