Ejemplo n.º 1
0
        public async Task <ActionResult> ScoreQuiz(int id, string nextUrl, string errorUrl = "")
        {
            metricSender.SendCount("quiz.manual_score");

            if (string.IsNullOrEmpty(errorUrl))
            {
                errorUrl = nextUrl;
            }

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

                var course = courseManager.GetCourse(checking.CourseId);
                var unit   = course.FindUnitBySlideId(checking.SlideId);
                var slide  = course.GetSlideById(checking.SlideId);

                metricSender.SendCount($"quiz.manual_score.{checking.CourseId}");
                metricSender.SendCount($"quiz.manual_score.{checking.CourseId}.{checking.SlideId}");

                var totalScore = 0;

                var quiz = course.FindSlideById(checking.SlideId);
                if (quiz == null)
                {
                    return(Redirect(errorUrl + "Этого теста больше нет в курсе"));
                }

                foreach (var question in quiz.Blocks.OfType <AbstractQuestionBlock>())
                {
                    var scoreFieldName = "quiz__score__" + question.Id;
                    var scoreStr       = Request.Form[scoreFieldName];
                    /* Invalid form: score isn't integer */
                    if (!int.TryParse(scoreStr, out var score))
                    {
                        return(Redirect(errorUrl + $"Неверное количество баллов в задании «{question.QuestionIndex}. {question.Text.TruncateWithEllipsis(50)}»"));
                    }
                    /* Invalid form: score isn't from range 0..MAX_SCORE */
                    if (score < 0 || score > question.MaxScore)
                    {
                        return(Redirect(errorUrl + $"Неверное количество баллов в задании «{question.QuestionIndex}. {question.Text.TruncateWithEllipsis(50)}»: {score}"));
                    }

                    await userQuizzesRepo.SetScoreForQuizBlock(checking.Submission.Id, question.Id, score).ConfigureAwait(false);

                    totalScore += score;
                }

                await slideCheckingsRepo.MarkManualCheckingAsChecked(checking, totalScore).ConfigureAwait(false);

                await visitsRepo.UpdateScoreForVisit(checking.CourseId, checking.SlideId, slide.MaxScore, checking.UserId).ConfigureAwait(false);

                transaction.Commit();

                metricSender.SendCount($"quiz.manual_score.score", totalScore);
                metricSender.SendCount($"quiz.manual_score.{checking.CourseId}.score", totalScore);
                metricSender.SendCount($"quiz.manual_score.{checking.CourseId}.{checking.SlideId}.score", totalScore);
                if (totalScore == quiz.MaxScore)
                {
                    metricSender.SendCount($"quiz.manual_score.full_scored");
                    metricSender.SendCount($"quiz.manual_score.{checking.CourseId}.full_scored");
                    metricSender.SendCount($"quiz.manual_score.{checking.CourseId}.{checking.SlideId}.full_scored");
                }

                if (unit != null && unitsRepo.IsUnitVisibleForStudents(course, unit.Id))
                {
                    await NotifyAboutManualQuizChecking(checking).ConfigureAwait(false);
                }
            }

            return(Redirect(nextUrl));
        }