Exemplo n.º 1
0
		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;
		}
Exemplo n.º 2
0
		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);
		}
Exemplo n.º 3
0
		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;
		}
Exemplo n.º 4
0
		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;
		}
Exemplo n.º 5
0
		private static int GetMaxDropCount(QuizSlide quizSlide)
		{
			if (quizSlide == null)
				return MAX_DROPS_COUNT;
			var maxDropCount = quizSlide.MaxDropCount;
			return maxDropCount == 0 ? MAX_DROPS_COUNT : maxDropCount;
		}
Exemplo n.º 6
0
		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);
		}
Exemplo n.º 7
0
		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);
		}
Exemplo n.º 8
0
		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 });
		}
Exemplo n.º 9
0
		private QuizModel GuestQuiz(QuizSlide slide, string courseId)
		{
			return new QuizModel
			{
				CourseId = courseId,
				Slide = slide,
				IsGuest = true,
				QuizState = QuizState.NotPassed
			};
		}
Exemplo n.º 10
0
		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);
		}
Exemplo n.º 11
0
		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 });
		}
Exemplo n.º 12
0
		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,
			});
		}
Exemplo n.º 13
0
		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);
		}