Exemplo n.º 1
0
        public IEnumerable <CourseProgress> GetCoursesProgress(string username)
        {
            var user = _usersService.GetByUsername(username);
            var userSubscriptions = _courseSubscriptions.All().Where(x => x.UserId == user.Id).ToList();
            List <CourseProgress> courseProgresses = new List <CourseProgress>(userSubscriptions.Count);

            foreach (var subscription in userSubscriptions)
            {
                var courseProgress = new CourseProgress
                {
                    CourseId                    = subscription.CourseId,
                    TotalLecturesCount          = _lectures.GetLecturesCount(subscription.CourseId),
                    SubscriptionStatus          = subscription.Status,
                    AssessmentEligibilityStatus = _assessments.GetEligibilityStatus(username, subscription.CourseId)
                };

                if (subscription.Status == SubscriptionStatus.Active)
                {
                    courseProgress.VisitedLecturesCount = _lectures.GetLectureVisitsCount(username, subscription.CourseId);
                }

                if (courseProgress.AssessmentEligibilityStatus == AssessmentEligibilityStatus.Lockout)
                {
                    courseProgress.LockoutLift = _assessments.GetNextAssessmentAttemptDate(
                        username,
                        subscription.CourseId);
                }
                courseProgresses.Add(courseProgress);
            }

            return(courseProgresses);
        }
        public ActionResult Assessment(AssessmentViewModel assessment)
        {
            int    courseId = _coursesContentService.GetCourseId(Umbraco.AssignedContentItem);
            string username = User.Identity.Name;

            if (!_feedbackService.UserHasSentFeedback(username, courseId))
            {
                return(RedirectToRoute("Feedback", new { courseNiceUrl = Umbraco.AssignedContentItem.UrlName }));
            }

            if (_assessments.GetEligibilityStatus(username, courseId) != AssessmentEligibilityStatus.Eligible)
            {
                return(Redirect(Umbraco.AssignedContentItem.Url));
            }

            if (assessment.AssessmentRequestId == default(int))
            {
                throw new ArgumentException("Assessment Id is missing from Assessment Submission. Cannot evaluate assessment");
            }

            var assessmentRequest = _assessments.GetAssessmentRequest(assessment.AssessmentRequestId);

            IEnumerable <IPublishedContent> questions = Umbraco.TypedContent(assessmentRequest.QuestionIds.Split(',').ToList());
            IPublishedContent assessmentContnet       = Umbraco.TypedContent(assessmentRequest.AssessmentExternalId);
            var requiredCorrectAnswers =
                assessmentContnet.GetPropertyValue <int>(
                    nameof(Models.Umbraco.DocumentTypes.Assessment.RequiredCorrectAnswers));

            if (requiredCorrectAnswers == default(int))
            {
                throw new ArgumentException($"Number of required correct answers is not set for assessment with ID: {assessmentRequest.AssessmentExternalId}");
            }

            AssessmentViewModel      assessmentViewModel = new AssessmentViewModel();
            List <QuestionViewModel> questionViewModel   = new List <QuestionViewModel>();


            _mapper.AddCustomMapping(typeof(IEnumerable <QuestionAnswer>).FullName, UmbracoMapperMappings.MapQuestionAnswer)
            .MapCollection(questions, questionViewModel)
            .Map(assessmentContnet, assessmentViewModel);

            assessmentViewModel.Questions = questionViewModel;
            int correctAnswers = 0;

            foreach (QuestionViewModel questionInDb in assessmentViewModel.Questions)
            {
                QuestionViewModel questionAnswered = assessment.Questions.Single(x => x.Id == questionInDb.Id);
                questionAnswered.QuestionText = questionInDb.QuestionText;
                bool isCorrectlyAnswered = true;
                foreach (QuestionAnswer answerInDb in questionInDb.Answers)
                {
                    QuestionAnswer answer = questionAnswered.Answers.Single(x => x.Index == answerInDb.Index);
                    answer.Text = answerInDb.Text;
                    if (answer.IsCorrect != answerInDb.IsCorrect)
                    {
                        isCorrectlyAnswered = false;
                        break;
                    }
                }

                if (isCorrectlyAnswered)
                {
                    correctAnswers++;
                }
            }

            var submission = new AssessmentSubmission
            {
                CourseId          = courseId,
                AssessmentRequest = assessmentRequest,
                Submission        = JsonConvert.SerializeObject(assessment.Questions)
            };

            if (correctAnswers >= requiredCorrectAnswers)
            {
                submission.IsSuccessful = true;
            }

            Certificate certificate;

            _assessments.CreateAssessmentSubmission(submission, out certificate);

            if (submission.IsSuccessful)
            {
                TempData["SuccessfulSubmission"] = true;
                TempData["CorrectAnswers"]       = correctAnswers;
                TempData["RequiredAnswers"]      = requiredCorrectAnswers;
                return(RedirectToRoute("Certificate", new { certificateCode = certificate.Code }));
            }

            return(View("AssessmentFailure", new AssessmentFailureViewModel
            {
                CorrectAnswers = correctAnswers,
                RequiredAnswers = requiredCorrectAnswers,
                NumberOfQuestions = questions.Count(),
                CourseTitle = Umbraco.AssignedContentItem.Name,
                CourseUrl = Umbraco.AssignedContentItem.Url,
                // ReSharper disable once PossibleInvalidOperationException - This should never be null as we've just done a submission
                NextAttempt = _assessments.GetNextAssessmentAttemptDate(username, courseId).Value
            }));
        }