Esempio n. 1
0
        /// <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;
        }
Esempio n. 2
0
        /// <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");
        }
Esempio n. 3
0
        /// <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);
        }