Exemple #1
0
def parse():
    """
    Parses an excel spreadsheet and returns students
    """

    try:
        if "excel_doc" not in request.files:
            return bad_request()

        excel_doc = request.files["excel_doc"]

        if not models.allowed_file(excel_doc.filename):
            return bad_request()

        file_path = models.save_excel_doc(excel_doc)

        students = models.parse_students(file_path)

        os.remove(file_path)
    except ValueError as e:
        return bad_request()
    except Exception as e:
        print(e)
        return server_error()

    return success(students)
Exemple #2
0
def edit_quiz(quiz_id):
    """
    Changes quiz info
    """
    try:
        body = request.get_json()

        name = body["name"]
        start_date = body["start_date"]
        end_date = body["end_date"]
        description = body["description"]
        language = body["language"]

        if not models.check_dates(
                start_date, end_date) and not models.check_languages(language):
            return bad_request()

        models.edit_quiz(quiz_id, name, start_date, end_date, description,
                         language)

    except KeyError:
        return bad_request()
    except Exception as e:
        print(e)
        return server_error()
    return success()
Exemple #3
0
def create_quiz(course_id):
    """
    Creates a quiz
    """
    try:
        body = request.get_json()

        name = body["name"]
        start_date = body["start_date"]
        end_date = body["end_date"]
        description = body["description"]
        language = body["language"]

        if not models.check_dates(
                start_date, end_date) and not models.check_languages(language):
            return bad_request()

        quiz_id = models.insert_quiz(course_id, name, start_date, end_date,
                                     description, language)

    except KeyError:
        return bad_request()
    except Exception:
        return server_error()
    return created({"quiz_id": quiz_id})
Exemple #4
0
def activate():
    """
    Activates a student account and set's there password
    """
    try:
        body = request.get_json()

        activate_token = body["activate_token"]
        password = body["password"]

        if len(password) < 3 or len(password) > 50:
            return bad_request()

        if not models.token_exists(activate_token):

            return bad_request()

        student_hash = models.create_hash(password)
        models.save_hash(student_hash, activate_token)

    except KeyError:
        return bad_request()
    except Exception as e:
        print(e)
        return server_error()

    return created()
Exemple #5
0
def signin():
    """
    Signs in either a teacher or a student
    """
    try:
        body = request.get_json()

        email = body["email"]
        password = body["password"]
        # Returns the user_id (either teacher or student) and if the user is a teacher or a student
        user_id, is_teacher = models.id_from_credentials(email, password)

        if not user_id:
            return bad_request()

        token = models.create_token()
        models.save_token(token, user_id, is_teacher)

    except KeyError:
        return bad_request()
    except Exception as e:
        print(e)
        return server_error()

    return success({
        "token": token,
        "teacher_id" if is_teacher else "student_id": user_id
    })
Exemple #6
0
def precheck(qc_id, question_id):
    """
    Adds one question to a quiz
    """

    try:
        student_id = request.student_id if hasattr(
            request, "student_id") else str(uuid.uuid4().hex)

        body = request.get_json()

        code = body["code"]

        filename = models.precheck_file_name(student_id, qc_id, question_id)
        filepath = os.path.join("app", "packages", "quizzes", "question_files",
                                filename)

        with open(filepath, "w") as f:
            f.write(code)

        bashCommand = "pylint --errors-only {}".format(filepath)
        process = subprocess.Popen(bashCommand.split(), stdout=subprocess.PIPE)
        process.wait()
        output, _ = process.communicate()

        os.remove(filepath)

    except KeyError:
        return bad_request()
    except Exception as e:
        print(e)
        return server_error()

    return success({"output": output.decode()})
Exemple #7
0
def change_class(class_id):
    """
    Changes information about a class
    """
    try:
        body = request.get_json()

        name = body["name"]

        if not name:
            return bad_request()

        models.change_class(class_id, name)

    except KeyError:
        return bad_request()
    except Exception:
        return server_error()
    return success()
Exemple #8
0
def change_course(course_id):
    """
    Changes name of a course
    """
    try:
        body = request.get_json()

        name = body["name"]

        if not name:
            return bad_request()

        models.change_course(course_id, name)

    except KeyError:
        return bad_request()
    except Exception:
        return server_error()
    return success()
Exemple #9
0
def create():
    """
    Creates a class
    """
    try:
        body = request.get_json()

        teacher_id = request.teacher_id
        name = body["name"]

        if not name:
            return bad_request()

        class_id = models.insert_class(teacher_id, name)

    except KeyError:
        return bad_request()
    except Exception:
        return server_error()
    return created({"class_id": class_id})
Exemple #10
0
def add_class(course_id):
    """
    Adds a class to a course
    """
    try:
        body = request.get_json()

        teacher_id = request.teacher_id
        class_id = body["id"]

        if not models.class_exists(teacher_id, class_id):
            return bad_request()

        models.add_class(course_id, class_id)

    except KeyError:
        return bad_request()
    except Exception:
        return server_error()
    return success()
Exemple #11
0
def check(qc_id, question_id):
    """
    Checks students code for a particular question against test cases
    """
    try:
        # If user is not a student, assign them random uuid for filename
        student_id = request.student_id if hasattr(
            request, "student_id") else str(uuid.uuid4().hex)
        body = request.get_json()

        code = body["code"]

        code_runner = CodeRunner(student_id, qc_id, question_id)

        code_runner.write_code(code)  # Writes students code to file

        test_cases = models.get_test_cases(question_id)

        # question_worth, total_negated and last_attempt_wrong only valid for free quiz!
        results, question_worth, total_negated, last_attempt_wrong = code_runner.run(
            test_cases)

        code_runner.remove_code()  # Deletes students code

        # If user is not student or the quiz is a free quiz, then don't save their attempt
        if hasattr(request, "is_free_quiz"):
            return success({
                "results": results,
                "question_worth": question_worth,
                "total_negated": total_negated,
                "last_attempt_wrong": last_attempt_wrong
            })

        attempt_id = models.insert_attempt(question_id, student_id)

        models.insert_test_cases(results, attempt_id)

        question_worth, total_negated, last_attempt_wrong = models.get_mark_worth(
            question_id, student_id)
    except KeyError as e:
        print(e)
        return bad_request()
    except Exception as e:
        print(e)
        return server_error()

    return success({
        "results": results,
        "question_worth": question_worth,
        "total_negated": total_negated,
        "last_attempt_wrong": last_attempt_wrong
    })
Exemple #12
0
def signup():
    """
    Signs a teacher up and returns their id
    """
    try:
        body = request.get_json()

        name = body["name"]
        email = body["email"]
        password = body["password"]

        # Checks if email is taken in the teacher or student table
        if models.taken_email(email):
            return bad_request()

        teacher_hash = models.create_hash(password)
        teacher_id = models.insert_teacher(name, email, teacher_hash)
    except KeyError:
        return bad_request()
    except Exception:
        return server_error()

    return created({"teacher_id": teacher_id})
Exemple #13
0
def create_free_quizzes():
    """
    Creates a free quiz
    """

    try:
        json = request.get_json()

        quiz_name = json["quiz_name"]
        quiz_language_id = json["quiz_language_id"]
        quiz_short_desc = json["quiz_short_desc"]

        models.create_free_quiz(quiz_name, quiz_language_id, quiz_short_desc)
    except KeyError as e:
        print(e)
        return bad_request()
    # Error checking will be done in create_free_quiz route and will return ValueError if so
    except ValueError as e:
        print(e)
        return bad_request()
    except Exception:
        return server_error()

    return created()
Exemple #14
0
def questions(quiz_id):
    """
    Adds one question to a quiz
    """

    try:
        json = request.get_json()

        description = json["description"]

        question_id = models.add_question(quiz_id, description)
    except KeyError:
        return bad_request()
    except Exception as e:
        return server_error()

    return created({"question_id": question_id})
Exemple #15
0
def update_question(quiz_id, question_id):
    """
    Updates a question from a quiz
    """

    try:
        json = request.get_json()

        question_description = json["question_description"]

        models.update_description(question_description, question_id)

    except (KeyError, ValueError):
        return bad_request()
    except Exception as e:
        return server_error()

    return success()
Exemple #16
0
def create_test_case(quiz_id, question_id):
    """
    Creates a test case
    """

    try:
        json = request.get_json()

        test_input = json["test_input"]
        test_expected = json["test_expected"]

        test_id = models.create_test_case(question_id, test_input,
                                          test_expected)
    except (KeyError, ValueError):
        return bad_request()
    except Exception as e:
        print(e)
        return server_error()

    return created({"test_id": test_id})
Exemple #17
0
def add_students(class_id):
    """
    Adds students to the database
    """
    try:
        body = request.get_json()

        teacher_id = request.teacher_id
        students = body["students"]
        emails = []

        for email in students:
            emails.append(email["email"])

        models.insert_students(students, teacher_id)
        models.delete_unique()
        models.insert_into_class(class_id, tuple(emails))

    except KeyError:
        return bad_request()
    except Exception:
        return server_error()
    return created()