/// <summary> /// Saves test data /// </summary> /// <param name="data">Session data</param> /// <param name="sessionId">Session id (needed if data stores in database)</param> /// <param name="saveToCookie">'True' to make data stored in cookie</param> private void SetTestData(TestData data, int sessionId = 0, bool saveToCookie = false) { string dataString = XmlManager.SerializeObjectUTF8(data); string tokenString; string testInfoString; if (saveToCookie) { testInfoString = HttpUtility.UrlEncode(dataString); tokenString = MD5HashManager.GenerateKey(testInfoString); } else { tokenString = MD5HashManager.GenerateKey(dataString); testInfoString = TestSessionManager.Write(dataString, sessionId).ToString(CultureInfo.InvariantCulture); } var testInfo = new HttpCookie("TestInfo", testInfoString); var securityToken = new HttpCookie("SecurityToken", tokenString); Response.Cookies.Add(testInfo); Response.Cookies.Add(securityToken); TempData["testInfo"] = testInfo; TempData["securityToken"] = securityToken; }
/// <summary> /// Initialize test /// </summary> /// <param name="subjectIds">Subject ids in which questions taking</param> /// <param name="testType">Test type</param> /// <param name="sourceType">See TestSourceTypes class</param> /// <param name="source">Nullable id of source</param> /// <returns></returns> private ActionResult StartTest(IEnumerable<int> subjectIds, TestType testType, int sourceType, int? source) { if (subjectIds == null || !subjectIds.Any()) return RedirectToAction("Index", "Home"); var questionBank = new QuestionBank(); var questions = _db.Questions.Where( x => subjectIds.Contains(x.SubjectID) && x.IsPublished && x.Answers.Any()); if (!questions.Any()) return RedirectToAction("Error", new {message = "Для теста не найдено ни одного вопроса. Обратитесь к администратору."}); for (int i = 1; i <= 10; i++) { questionBank.Questions.Add(new List<int>(questions.Where(x => x.Difficulty == i).Select(x => x.ID))); } var testData = new TestData { TestCompleted = false, TrueDifficultyLevel = 5, SubjectsIds = subjectIds.ToList(), QuestionBank = questionBank, Started = TimeManager.GetCurrentTime(), TestType = testType, MaxAmountOfQuestions = _db.Questions.Count(x => subjectIds.Contains(x.SubjectID) && x.IsPublished), SourceType = sourceType, Source = source, }; Question selectedQuestion = GetQuestion(testData); testData.TestSeed = TemplateManager.GetRandomSeed(); testData.CurrentQuestionDifficulty = selectedQuestion.Difficulty; testData.CurrentQuestionId = selectedQuestion.ID; SetTestData(testData); return RedirectToAction("Index"); }
/// <summary> /// Returns next question /// </summary> /// <param name="testData">Test session info</param> /// <returns></returns> private Question GetQuestion(TestData testData) { int[] priorityArray = GetDifficultyPriorityArray(testData.TrueDifficultyLevel); int i = 0; int nextQuestionId = -1; while (nextQuestionId == -1 && i < 10) { nextQuestionId = testData.QuestionBank.GetQuestion(priorityArray[i]); if (++i >= 10) throw new Exception("Нет подходящих вопросов"); } return QuestionController.GetById(nextQuestionId); }