public Dictionary<string, List<UserQuiz>> GetAnswersForShowOnSlide(string courseId, QuizSlide slide, string userId) { if (slide == null) return null; var answer = new Dictionary<string, List<UserQuiz>>(); foreach (var block in slide.Blocks.OfType<AbstractQuestionBlock>()) { var ans = db.UserQuizzes .Where(x => x.UserId == userId && x.SlideId == slide.Id && x.QuizId == block.Id && !x.isDropped).ToList(); answer[block.Id] = ans; } return answer; }
public ActionResult Quiz(QuizSlide slide, string courseId, string userId, bool isGuest, bool isLti = false, ManualQuizChecking manualQuizCheckQueueItem = null, int? groupId = null) { if (isGuest) return PartialView(GuestQuiz(slide, courseId)); var slideId = slide.Id; var maxDropCount = GetMaxDropCount(slide); var state = GetQuizState(courseId, userId, slideId, maxDropCount); var quizState = state.Item1; var tryNumber = state.Item2; var resultsForQuizes = GetResultForQuizes(courseId, userId, slideId, state.Item1); log.Info($"Создаю тест для пользователя {userId} в слайде {courseId}:{slide.Id}, isLti = {isLti}"); var quizVersion = quizzesRepo.GetLastQuizVersion(courseId, slideId); if (quizState != QuizState.NotPassed) quizVersion = userQuizzesRepo.FindQuizVersionFromUsersAnswer(courseId, slideId, userId); /* If we haven't quiz version in database, create it */ if (quizVersion == null) quizVersion = quizzesRepo.AddQuizVersionIfNeeded(courseId, slide); /* Restore quiz slide from version stored in the database */ var quiz = quizVersion.RestoredQuiz; slide = new QuizSlide(slide.Info, quiz); var userAnswers = userQuizzesRepo.GetAnswersForShowOnSlide(courseId, slide, userId); var canUserFillQuiz = CanUserFillQuiz(quizState); var model = new QuizModel { CourseId = courseId, Slide = slide, QuizState = quizState, TryNumber = tryNumber, MaxDropCount = maxDropCount, ResultsForQuizes = resultsForQuizes, AnswersToQuizes = userAnswers, IsLti = isLti, ManualQuizCheckQueueItem = manualQuizCheckQueueItem, CanUserFillQuiz = canUserFillQuiz, GroupId = groupId, }; if (model.QuizState != QuizState.NotPassed && model.Score == quiz.MaxScore) model.QuizState = QuizState.Total; return PartialView(model); }
public Dictionary<string, List<string>> GetAnswersForShowOnSlide(string courseId, QuizSlide slide, string userId) { if (slide == null) return null; var answer = new Dictionary<string, List<string>>(); foreach (var block in slide.Blocks.OfType<AbstractQuestionBlock>()) { var ans = db.UserQuizzes .Where(x => x.UserId == userId && x.SlideId == slide.Id && x.QuizId == block.Id && !x.isDropped).ToList(); if (block is ChoiceBlock) answer[block.Id] = ans.Select(x => x.ItemId).ToList(); else if (block is IsTrueBlock) answer[block.Id] = ans.Select(x => x.Text).ToList(); else if(block is FillInBlock) answer[block.Id] = new List<string> { ans.Select(x => x.Text).FirstOrDefault(), ans.Select(x => x.IsRightAnswer).FirstOrDefault().ToString() }; } return answer; }
public QuizVersion AddQuizVersionIfNeeded(string courseId, QuizSlide slide) { var slideId = slide.Id; var quizXml = slide.QuizNormalizedXml; var lastQuizVersion = GetLastQuizVersion(courseId, slideId); var newQuizVersion = new QuizVersion { CourseId = courseId, SlideId = slideId, LoadingTime = DateTime.Now, NormalizedXml = quizXml }; if (lastQuizVersion == null || lastQuizVersion.NormalizedXml != newQuizVersion.NormalizedXml) { db.QuizVersions.Add(newQuizVersion); db.SaveChanges(); return newQuizVersion; } return lastQuizVersion; }
private static int GetMaxDropCount(QuizSlide quizSlide) { if (quizSlide == null) return MAX_DROPS_COUNT; var maxDropCount = quizSlide.MaxDropCount; return maxDropCount == 0 ? MAX_DROPS_COUNT : maxDropCount; }
public ActionResult Quiz(QuizSlide slide, string courseId, string userId) { var slideId = slide.Id; var maxDropCount = GetMaxDropCount(slide); var state = GetQuizState(courseId, userId, slideId, maxDropCount); var resultsForQuizes = GetResultForQuizes(courseId, userId, slideId, state.Item1); var model = new QuizModel { CourseId = courseId, Slide = slide, QuizState = state.Item1, TryNumber = state.Item2, MaxDropCount = maxDropCount, ResultsForQuizes = resultsForQuizes, AnswersToQuizes = userQuizzesRepo.GetAnswersForShowOnSlide(courseId, slide, userId) }; if (model.QuizState != QuizState.NotPassed && model.RightAnswers == model.QuestionsCount) model.QuizState = QuizState.Total; return PartialView(model); }
private IEnumerable<QuizAnswerInfo> GetUserQuizAnswers(string courseId, QuizSlide slide, string userId) { foreach (var block in slide.Blocks.OfType<AbstractQuestionBlock>()) if (block is FillInBlock) yield return userQuizzesRepo.GetFillInBlockAnswerInfo(courseId, slide.Id, block.Id, userId, block.QuestionIndex); else if (block is ChoiceBlock) yield return userQuizzesRepo.GetChoiseBlockAnswerInfo(courseId, slide.Id, (ChoiceBlock)block, userId, block.QuestionIndex); else if (block is IsTrueBlock) yield return userQuizzesRepo.GetIsTrueBlockAnswerInfo(courseId, slide.Id, block.Id, userId, block.QuestionIndex); }
private static IEnumerable<Vertical> QuizToVerticals(string courseId, QuizSlide slide, string slideUrl, string ltiId) { var ltiComponent = new LtiComponent(slide.Title, slide.Guid + "-quiz", string.Format(slideUrl, courseId, slide.Index), ltiId, true, slide.MaxScore, false); yield return new Vertical(slide.Guid, slide.Title, new Component[] { ltiComponent }); }
private QuizModel GuestQuiz(QuizSlide slide, string courseId) { return new QuizModel { CourseId = courseId, Slide = slide, IsGuest = true, QuizState = QuizState.NotPassed }; }
private static IEnumerable<QuizAnswerInfo> GetUserQuizAnswers(QuizSlide slide, IEnumerable<UserQuiz> userQuizzes) { var answers = userQuizzes.GroupBy(q => q.QuizId).ToDictionary(g => g.Key, g => g.ToList()); foreach (var block in slide.Blocks.OfType<AbstractQuestionBlock>()) if (block is FillInBlock) yield return GetFillInBlockAnswerInfo(answers, block.Id, block.QuestionIndex); else if (block is ChoiceBlock) yield return GetChoiceBlockAnswerInfo(answers, (ChoiceBlock)block, block.QuestionIndex); else if (block is IsTrueBlock) yield return GetIsTrueBlockAnswerInfo(answers, block.Id, block.QuestionIndex); }
private static IEnumerable<Vertical> QuizToVerticals(QuizSlide slide) { var components = slide.Blocks .Select((b, i) => b.ToEdxComponents("", slide, i)) .ToArray(); var slideComponent = new SlideProblemComponent { DisplayName = slide.Title, UrlName = slide.Guid, Subcomponents = components, XmlSubcomponents = components.Select(x => x.AsXmlElement()).ToArray() }; yield return new Vertical(slide.Guid, slide.Title, new Component[] { slideComponent }); }
public ActionResult Analytics(string courseId, Guid slideId, DateTime periodStart) { var course = courseManager.GetCourse(courseId); var quizSlide = (QuizSlide)course.GetSlideById(slideId); var quizVersions = quizzesRepo.GetQuizVersions(courseId, quizSlide.Id).ToList(); var dict = new SortedDictionary<string, List<QuizAnswerInfo>>(); var passes = db.UserQuizzes .Where(q => quizSlide.Id == q.SlideId && !q.isDropped && periodStart <= q.Timestamp) .GroupBy(q => q.UserId) .Join(db.Users, g => g.Key, user => user.Id, (g, user) => new { UserId = user.Id, user.UserName, UserQuizzes = g.ToList(), QuizVersion = g.FirstOrDefault().QuizVersion }) .ToList(); foreach (var pass in passes) { var slide = quizSlide; if (pass.QuizVersion != null) slide = new QuizSlide(quizSlide.Info, pass.QuizVersion.RestoredQuiz); dict[pass.UserName] = GetUserQuizAnswers(slide, pass.UserQuizzes).ToList(); } var userIds = passes.Select(p => p.UserId).Distinct().ToList(); var userNameById = passes.ToDictionary(p => p.UserId, p => p.UserName); var groups = groupsRepo.GetUsersGroupsNamesAsStrings(courseId, userIds, User).ToDictionary(kv => userNameById[kv.Key], kv => kv.Value); var rightAnswersCount = dict.Values .SelectMany(list => list .Where(info => info.Score == info.MaxScore)) .GroupBy(arg => arg.Id) .ToDictionary(grouping => grouping.Key, grouping => grouping.Count()); var usersByQuizVersion = passes.GroupBy(p => p.QuizVersion?.Id).ToDictionary(g => g.Key, g => g.Select(u => u.UserName).ToList()); var usersWaitsForManualCheck = slideCheckingsRepo.GetManualCheckingQueue<ManualQuizChecking>( new ManualCheckingQueueFilterOptions { CourseId = courseId, SlidesIds = new List<Guid> { quizSlide.Id } } ).ToList().Select(i => i.User.UserName).ToImmutableHashSet(); return PartialView(new QuizAnalyticsModel { CourseId = courseId, SlideId = quizSlide.Id, UserAnswers = dict, QuizVersions = quizVersions, UsersByQuizVersion = usersByQuizVersion, RightAnswersCount = rightAnswersCount, GroupByUser = groups, UsersWaitsForManualCheck = usersWaitsForManualCheck, }); }
private IEnumerable<QuizInfoForDb> CreateQuizInfo(QuizSlide slide, IGrouping<string, QuizAnswer> answer) { var block = slide.GetBlockById(answer.Key); if (block is FillInBlock) return CreateQuizInfoForDb(block as FillInBlock, answer.First().Text); if (block is ChoiceBlock) return CreateQuizInfoForDb(block as ChoiceBlock, answer); if (block is OrderingBlock) return CreateQuizInfoForDb(block as OrderingBlock, answer); if (block is MatchingBlock) return CreateQuizInfoForDb(block as MatchingBlock, answer); return CreateQuizInfoForDb(block as IsTrueBlock, answer); }