Exemplo n.º 1
0
        public async Task <ActionResult> ScoreExercise(int id, string nextUrl, string exerciseScore, bool?prohibitFurtherReview, string errorUrl = "", bool recheck = false)
        {
            if (string.IsNullOrEmpty(errorUrl))
            {
                errorUrl = nextUrl;
            }

            using (var transaction = db.Database.BeginTransaction())
            {
                var checking = slideCheckingsRepo.FindManualCheckingById <ManualExerciseChecking>(id);

                if (checking.IsChecked && !recheck)
                {
                    return(Redirect(errorUrl + "Эта работа уже была проверена"));
                }

                if (!checking.IsLockedBy(User.Identity))
                {
                    return(Redirect(errorUrl + "Эта работа проверяется другим инструктором"));
                }

                var course   = courseManager.GetCourse(checking.CourseId);
                var slide    = (ExerciseSlide)course.GetSlideById(checking.SlideId);
                var exercise = slide.Exercise;

                int score;
                /* Invalid form: score isn't integer */
                if (!int.TryParse(exerciseScore, out score))
                {
                    return(Redirect(errorUrl + "Неверное количество баллов"));
                }

                /* Invalid form: score isn't from range 0..MAX_SCORE */
                if (score < 0 || score > exercise.MaxReviewScore)
                {
                    return(Redirect(errorUrl + $"Неверное количество баллов: {score}"));
                }

                checking.ProhibitFurtherManualCheckings = false;
                await slideCheckingsRepo.MarkManualCheckingAsChecked(checking, score);

                if (prohibitFurtherReview.HasValue && prohibitFurtherReview.Value)
                {
                    await slideCheckingsRepo.ProhibitFurtherExerciseManualChecking(checking);
                }
                await visitsRepo.UpdateScoreForVisit(checking.CourseId, checking.SlideId, checking.UserId);

                transaction.Commit();
            }

            return(Redirect(nextUrl));
        }