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, )
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
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, )
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