예제 #1
0
    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
예제 #2
0
    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
예제 #3
0
    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
예제 #5
0
 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
예제 #6
0
 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
예제 #7
0
    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
예제 #8
0
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
예제 #9
0
    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
예제 #10
0
 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
예제 #11
0
 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
예제 #12
0
 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
예제 #13
0
    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
예제 #14
0
 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
예제 #15
0
 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
예제 #16
0
    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
예제 #17
0
 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
예제 #18
0
 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
예제 #19
0
    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
예제 #20
0
    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
예제 #21
0
    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
예제 #22
0
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)
예제 #23
0
    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
예제 #24
0
 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
예제 #25
0
    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
예제 #26
0
    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
예제 #27
0
    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
예제 #28
0
    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
예제 #29
0
    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