Example #1
0
def _upload_to_db(
    exercise_number: int,
    course_id: int,
    user_id: int,
    files: List[File],
    solution_hash: Optional[str] = None,
) -> Solution:
    exercise = Exercise.get_or_none(course=course_id, number=exercise_number)
    user = User.get_by_id(user_id)
    if exercise is None:
        raise UploadError(f'No such exercise id: {exercise_number}')
    elif not user.has_course(course_id):
        raise UploadError(
            f'Exercise {exercise_number} is invalid for this user.', )
    elif not exercise.open_for_new_solutions():
        raise UploadError(
            f'Exercise {exercise_number} is closed for new solutions.')

    if solution_hash and _is_uploaded_before(user, exercise, solution_hash):
        raise AlreadyExists('You try to reupload an old solution.')
    elif not files:
        raise UploadError(
            f'There are no files to upload for {exercise_number}.', )

    return Solution.create_solution(
        exercise=exercise,
        solver=user,
        files=files,
        hash_=solution_hash,
    )
Example #2
0
def new(
    user_id: int,
    course_id: int,
    file: FileStorage,
) -> Tuple[List[int], List[int]]:
    matches: List[int] = []
    misses: List[int] = []
    errors: List[Union[UploadError, AlreadyExists]] = []
    for exercise_number, files, solution_hash in Extractor(file):
        try:
            upload_solution(
                course_id=course_id,
                exercise_number=exercise_number,
                files=files,
                solution_hash=solution_hash,
                user_id=user_id,
            )
        except (UploadError, AlreadyExists) as e:
            log.debug(e)
            errors.append(e)
            misses.append(exercise_number)
        else:
            matches.append(exercise_number)

    if not matches and errors:
        raise UploadError(errors)

    return matches, misses
Example #3
0
def _upload_to_db(
    exercise_id: int,
    user: User,
    files: List[File],
    solution_hash: Optional[str] = None,
) -> Solution:
    exercise = Exercise.get_or_none(exercise_id)
    if exercise is None:
        raise UploadError(f'No such exercise id: {exercise_id}')
    elif not exercise.open_for_new_solutions():
        raise UploadError(
            f'Exercise {exercise_id} is closed for new solutions.')
    elif not files:
        raise UploadError(f'There are no files to upload for {exercise_id}.')

    return Solution.create_solution(
        exercise=exercise,
        solver=user,
        files=files,
        hash_=solution_hash,
    )
Example #4
0
def new(user: User, file: FileStorage) -> Tuple[List[int], List[int]]:
    matches: List[int] = []
    misses: List[int] = []
    errors: List[Union[UploadError, AlreadyExists]] = []
    for exercise_id, files, solution_hash in Extractor(file):
        try:
            solution = _upload_to_db(exercise_id, user, files, solution_hash)
            _run_auto_checks(solution)
        except (UploadError, AlreadyExists) as e:
            log.debug(e)
            errors.append(e)
            misses.append(exercise_id)
        else:
            matches.append(exercise_id)

    if not matches and errors:
        raise UploadError(errors)

    return matches, misses