示例#1
0
        protected override string GetTrueFalseLmsIdAnswer(Question question, QuizQuestionResultDTO answer)
        {
            Distractor distractor = question.Distractors != null
                ? question.Distractors.FirstOrDefault(x => x.IsActive.GetValueOrDefault())
                : null;

            if (distractor != null)
            {
                bool answ;
                // TRICK: for survey using isCorrect logic is not valid
                // but only surveys have 'answers' property populated
                if ((answer.answers != null) && (answer.answers.Length > 0))
                {
                    answ = answer.answers[0] == "1";
                }
                else
                {
                    answ = (answer.isCorrect && distractor.IsCorrect.GetValueOrDefault()) ||
                           (!answer.isCorrect && !distractor.IsCorrect.GetValueOrDefault());
                }

                return(answ ? distractor.LmsAnswer : distractor.LmsAnswerId.ToString());
            }

            return(string.Empty);
        }
示例#2
0
        private object[] ProcessAnswers(Question question, QuizQuestionResultDTO answer)
        {
            switch (question.QuestionType.Id)
            {
            case (int)QuestionTypeEnum.TrueFalse:
                return(new[] { this.GetTrueFalseStringAnswer(question, answer) });

            case (int)QuestionTypeEnum.CalculatedMultichoice:
            case (int)QuestionTypeEnum.SingleMultipleChoiceText:
                return(this.GetMultipleChoiceLmsAnswers(question, answer).ToArray());

            case (int)QuestionTypeEnum.Matching:
                var userAnswers = this.GetMatchingValues(question, answer, false);

                var match = new List <JsonObject>();

                foreach (var left in userAnswers.Keys)
                {
                    var jsonObject = new JsonObject();
                    jsonObject.Add(left, userAnswers[left]);
                    match.Add(jsonObject);
                }

                return(match.ToArray());

            default:
                return(answer.answers);
            }
        }
示例#3
0
        /// <summary>
        /// The get multiple choice answers string.
        /// </summary>
        /// <param name="question">
        /// The question.
        /// </param>
        /// <param name="answer">
        /// The answer.
        /// </param>
        /// <returns>
        /// The <see cref="string"/>.
        /// </returns>
        protected string GetMultipleChoiceAnswersString(Question question, QuizQuestionResultDTO answer)
        {
            var answers    = answer.answers ?? new string[0];
            var boolValues =
                question.Distractors.Select(q => answers.Contains(q.Id.ToString(CultureInfo.InvariantCulture)) ? "true" : "false");

            return(string.Join(";", boolValues));
        }
示例#4
0
        protected string GetMultipleChoiceAnswers(Question question, QuizQuestionResultDTO answer)
        {
            var answers       = answer.answers ?? new string[] { };
            var distractorIds = question.Distractors.Select((distractor, index) => answers.Contains(distractor.Id.ToString(CultureInfo.InvariantCulture)) ? index : -1).Where(x => x != -1);

            //var distractorIds = question.Distractors.Select((distractor, index) => (answers.Contains(distractor.Id.ToString(CultureInfo.InvariantCulture)) && distractor.IsCorrect.HasValue &&  distractor.IsCorrect.Value)? index : -1 ).Where(x => x != -1);
            return(string.Join(";", distractorIds));
        }
示例#5
0
        /// <summary>
        /// The get multiple choice lms ids.
        /// </summary>
        /// <param name="question">
        /// The question.
        /// </param>
        /// <param name="answer">
        /// The answer.
        /// </param>
        /// <returns>
        /// The <see cref="IEnumerable"/>.
        /// </returns>
        protected IEnumerable <int> GetMultipleChoiceLmsIds(Question question, QuizQuestionResultDTO answer)
        {
            var answers = answer.answers ?? new string[0];

            return(question.Distractors.Where(
                       q =>
                       answers.Contains(q.Id.ToString(CultureInfo.InvariantCulture)))
                   .Select(d => d.LmsAnswerId.GetValueOrDefault()));
        }
示例#6
0
        /// <summary>
        /// The get match values.
        /// </summary>
        /// <param name="question">
        /// The question.
        /// </param>
        /// <param name="answer">
        /// The answer.
        /// </param>
        /// <param name="useLmsId">
        /// The use lms id.
        /// </param>
        /// <returns>
        /// The <see cref="Dictionary"/>.
        /// </returns>
        protected Dictionary <string, string> GetMatchingValues(
            Question question,
            QuizQuestionResultDTO answer,
            bool useLmsId)
        {
            var userAnswers = new Dictionary <string, string>();

            if (answer.answers != null)
            {
                answer.answers.ToList().ForEach(
                    a =>
                {
                    int splitInd = a.IndexOf("$$", System.StringComparison.Ordinal);
                    if (splitInd > -1)
                    {
                        string left = a.Substring(0, splitInd),
                        right       = a.Substring(splitInd + 2, a.Length - splitInd - 2);
                        if (!userAnswers.ContainsKey(left))
                        {
                            userAnswers.Add(left, right);
                        }
                    }
                });
            }

            if (!useLmsId)
            {
                return(userAnswers);
            }

            var ret = new Dictionary <string, string>();

            foreach (var leftDistractor in question.Distractors.OrderBy(d => d.LmsAnswerId))
            {
                var left = leftDistractor.DistractorName.Substring(0, leftDistractor.DistractorName.IndexOf("$$", StringComparison.Ordinal));
                if (userAnswers.ContainsKey(left))
                {
                    var rightDistractor = question.Distractors.FirstOrDefault(d => d.DistractorName.EndsWith("$$" + userAnswers[left]));
                    if (rightDistractor != null)
                    {
                        ret.Add(leftDistractor.LmsAnswerId.ToString(), rightDistractor.LmsAnswer);
                    }
                    else
                    {
                        ret.Add(leftDistractor.LmsAnswerId.ToString(), "0");
                    }
                }
                else
                {
                    ret.Add(leftDistractor.LmsAnswerId.ToString(), "0");
                }
            }

            return(ret);
        }
示例#7
0
        /// <summary>
        /// The get true false lms id answer.
        /// </summary>
        /// <param name="question">
        /// The question.
        /// </param>
        /// <param name="answer">
        /// The answer.
        /// </param>
        /// <returns>
        /// The <see cref="string"/>.
        /// </returns>
        protected virtual string GetTrueFalseLmsIdAnswer(Question question, QuizQuestionResultDTO answer)
        {
            Distractor distractor = question.Distractors?.FirstOrDefault();

            if (distractor != null)
            {
                bool answ = (answer.isCorrect && distractor.IsCorrect.GetValueOrDefault()) ||
                            (!answer.isCorrect && !distractor.IsCorrect.GetValueOrDefault());
                return(answ ? distractor.LmsAnswer : distractor.LmsAnswerId.ToString());
            }

            return(string.Empty);
        }
示例#8
0
        private QuizQuestionResult ConvertDto(QuizQuestionResultDTO resultDTO, QuizResult quizResult)
        {
            var instance = new QuizQuestionResult
            {
                Question     = resultDTO.question,
                IsCorrect    = resultDTO.isCorrect,
                QuestionType = QuestionTypeModel.GetById(resultDTO.questionTypeId),
                QuizResult   = quizResult,
                QuestionRef  = QuestionModel.GetOneById(resultDTO.questionId).Value
            };

            return(instance);
        }
示例#9
0
        private void CreateAnswers(QuizQuestionResultDTO dto, QuizQuestionResult result)
        {
            foreach (var answerString in dto.answers)
            {
                var answer = new QuizQuestionResultAnswer();
                try
                {
                    answer.QuizQuestionResult = result;
                    answer.Value = answerString;

                    switch (result.QuestionType.Id)
                    {
                    case (int)QuestionTypeEnum.SingleMultipleChoiceText:
                        if (int.TryParse(answerString, out var distractorId))
                        {
                            var distractor = result.QuestionRef.Distractors.FirstOrDefault(x => x.Id == distractorId);
                            if (distractor != null)
                            {
                                answer.QuizDistractorAnswer = distractor;
                                answer.Value = distractor.DistractorName;
                            }
                            else
                            {
                                answer.Value = answerString;
                            }
                        }
                        else
                        {
                            answer.Value = answerString;
                        }

                        break;

                    default:
                        answer.Value = answerString;
                        break;
                    }

                    QuizQuestionResultAnswerModel.RegisterSave(answer);
                }
                catch (Exception ex)
                {
                    Logger.ErrorFormat("Saving answers:" + ex);
                }
            }
        }
示例#10
0
        /// <summary>
        /// The get true false string answer.
        /// </summary>
        /// <param name="question">
        /// The question.
        /// </param>
        /// <param name="answer">
        /// The answer.
        /// </param>
        /// <returns>
        /// The <see cref="string"/>.
        /// </returns>
        protected string GetTrueFalseStringAnswer(Question question, QuizQuestionResultDTO answer)
        {
            Distractor distractor = question.Distractors?.FirstOrDefault();

            if (distractor != null)
            {
                bool answ = (answer.isCorrect && distractor.IsCorrect.GetValueOrDefault()) ||
                            (!answer.isCorrect && !distractor.IsCorrect.GetValueOrDefault());

                return(string.Format(
                           "{0}{1}",
                           distractor.DistractorName == null || distractor.DistractorName.Equals("truefalse") || distractor.DistractorName.Equals(string.Empty)
                        ? string.Empty
                        : (distractor.DistractorName + "."),
                           answ ? "true" : "false"));
            }
            return(string.Empty);
        }
示例#11
0
        public override async Task ConvertAndSendSurveyResultToLmsAsync(IEnumerable <SurveyQuestionResultDTO> results, SurveyResult surveyResult, LmsUserParameters lmsUserParameters)
        {
            Dictionary <int, string> answers = new Dictionary <int, string>();

            foreach (var answer in results)
            {
                Question question = this.QuestionModel.GetOneById(answer.questionId).Value;
                if (question.LmsQuestionId == null)
                {
                    continue;
                }

                QuizQuestionResultDTO quizAnswer = new QuizQuestionResultDTO();
                quizAnswer.isCorrect = answer.isCorrect;

                quizAnswer.answers = this.ConvertSurveyAnswersToQuizAnswers(
                    question,
                    answer,
                    question.QuestionType.Id == (int)QuestionTypeEnum.SingleMultipleChoiceText ||
                    question.QuestionType.Id == (int)QuestionTypeEnum.RateScaleLikert);

                var userAnswer  = this.ProcessAnswers(question, quizAnswer);
                var questionKey = question.LmsQuestionId.GetValueOrDefault();

                if (!answers.ContainsKey(questionKey))
                {
                    answers.Add(questionKey, userAnswer);
                }
            }

            var questions = this.QuestionModel.GetAllBySubModuleItemId(surveyResult.Survey.SubModuleItem.Id);

            var ret = new List <string>();

            foreach (var question in questions)
            {
                ret.Add(answers.ContainsKey(question.LmsQuestionId.GetValueOrDefault()) ? answers[question.LmsQuestionId.GetValueOrDefault()] : "0");
            }

            await SakaiApi.SendAnswersAsync(lmsUserParameters.CompanyLms.GetLMSSettings(Settings, lmsUserParameters), surveyResult.Survey.LmsSurveyId.GetValueOrDefault().ToString(), true, ret.ToArray());
        }
示例#12
0
        /// <summary>
        /// The process blackboard answers.
        /// </summary>
        /// <param name="question">
        /// The question.
        /// </param>
        /// <param name="answer">
        /// The answer.
        /// </param>
        /// <returns>
        /// The <see cref="string"/>.
        /// </returns>
        private string ProcessAnswers(Question question, QuizQuestionResultDTO answer)
        {
            switch (question.QuestionType.Id)
            {
            //case (int)QuestionTypeEnum.FillInTheBlank:
            //    {
            //        var obj = new JsonObject();
            //        var userAnswers = this.GetMultipleBlanksValues(question, answer);
            //        foreach (var key in userAnswers.Keys)
            //        {
            //            obj.Add(key, userAnswers[key]);
            //        }

            //        var answers = JsonConvert.SerializeObject(obj);

            //        return answers;
            //    }

            case (int)QuestionTypeEnum.TrueFalse:
            {
                return(this.GetTrueFalseStringAnswer(question, answer));
            }

            case (int)QuestionTypeEnum.SingleMultipleChoiceText:
            case (int)QuestionTypeEnum.MultipleAnswer:
            {
                //var isSingle = this.IsSingleAnswer(question);
                //if (isSingle)
                //{
                //    return this.GetMultipleChoiceLmsIds(question, answer).FirstOrDefault().ToString();
                //}
                return(this.GetMultipleChoiceAnswers(question, answer));
            }

            case (int)QuestionTypeEnum.RateScaleLikert:
            {
                return(this.GetMultipleChoiceLmsIds(question, answer).FirstOrDefault().ToString());
            }

            case (int)QuestionTypeEnum.Calculated:
            {
                return(string.Format("{0};{1}", question.Distractors.First().LmsAnswer, answer.answers.First()));
            }

            case (int)QuestionTypeEnum.Hotspot:
            {
                return(answer.isCorrect ? question.Distractors.First().LmsAnswer : "0, 0");
            }

            case (int)QuestionTypeEnum.MultipleDropdowns:
            {
                var userAnswers = this.GetMultipleDropdownValues(question, answer, true);
                return(string.Join(";", userAnswers.Keys.OrderBy(k => k).Select(k => userAnswers[k])));
            }

            case (int)QuestionTypeEnum.Sequence:
            {
                var distractors = question.Distractors.OrderBy(d => d.DistractorOrder).ToList();
                if (answer.isCorrect)
                {
                    return(string.Join(";", distractors.Select(d => d.LmsAnswerId.ToString())));
                }
                else
                {
                    return(string.Join(";", distractors.Select(d => (d.DistractorOrder - 1).ToString())));
                }
            }

            case (int)QuestionTypeEnum.Matching:
            {
                var userAnswers = this.GetMatchingValues(question, answer, true);
                return(string.Join(";", userAnswers.Keys.OrderBy(k => k).Select(k => userAnswers[k])));
            }

            default:
            {
                return(answer.answers != null
                        ? string.Join(";", answer.answers.Select(a => a ?? string.Empty))
                        : string.Empty);
            }
            }
        }
示例#13
0
        /// <summary>
        /// The process blackboard answers.
        /// </summary>
        /// <param name="question">
        /// The question.
        /// </param>
        /// <param name="answer">
        /// The answer.
        /// </param>
        /// <returns>
        /// The <see cref="string"/>.
        /// </returns>
        private string ProcessAnswers(Question question, QuizQuestionResultDTO answer)
        {
            switch (question.QuestionType.Id)
            {
            case (int)QuestionTypeEnum.TrueFalse:
            {
                return(this.GetTrueFalseStringAnswer(question, answer));
            }

            case (int)QuestionTypeEnum.SingleMultipleChoiceText:
            {
                var isSingle = this.IsSingleAnswer(question);
                if (isSingle)
                {
                    return(this.GetMultipleChoiceLmsIds(question, answer).FirstOrDefault().ToString());
                }
                return(this.GetMultipleChoiceAnswersString(question, answer));
            }

            case (int)QuestionTypeEnum.RateScaleLikert:
            {
                return(this.GetMultipleChoiceLmsIds(question, answer).FirstOrDefault().ToString());
            }

            case (int)QuestionTypeEnum.Calculated:
            {
                return(string.Format("{0};{1}", question.Distractors.First().LmsAnswer, answer.answers.First()));
            }

            case (int)QuestionTypeEnum.Hotspot:
            {
                return(answer.isCorrect ? question.Distractors.First().LmsAnswer : "0, 0");
            }

            case (int)QuestionTypeEnum.MultipleDropdowns:
            {
                var userAnswers = this.GetMultipleDropdownValues(question, answer, true);
                return(string.Join(";", userAnswers.Keys.OrderBy(k => k).Select(k => userAnswers[k])));
            }

            case (int)QuestionTypeEnum.Sequence:
            {
                var distractors = question.Distractors.OrderBy(d => d.DistractorOrder).ToList();
                if (answer.isCorrect)
                {
                    return(string.Join(";", distractors.Select(d => d.LmsAnswerId.ToString())));
                }
                else
                {
                    return(string.Join(";", distractors.Select(d => (d.DistractorOrder - 1).ToString())));
                }
            }

            case (int)QuestionTypeEnum.Matching:
            {
                var userAnswers = this.GetMatchingValues(question, answer, true);
                return(string.Join(";", userAnswers.Keys.OrderBy(k => k).Select(k => userAnswers[k])));
            }

            default:
            {
                return(answer.answers != null
                                   ? string.Join(";", answer.answers.Select(a => a ?? string.Empty))
                                   : string.Empty);
            }
            }
        }
示例#14
0
        public override async Task ConvertAndSendSurveyResultToLmsAsync(IEnumerable <SurveyQuestionResultDTO> results,
                                                                        SurveyResult surveyResult,
                                                                        LmsUserParameters lmsUserParameters)
        {
            var quizSubmission = await _canvasApi.CreateQuizSubmission(
                lmsUserParameters.CompanyLms.LmsDomain,
                lmsUserParameters.LmsUser.Token,
                lmsUserParameters.Course,
                surveyResult.Survey.LmsSurveyId.GetValueOrDefault()
                );

            foreach (var answer in results)
            {
                Question question = this.QuestionModel.GetOneById(answer.questionId).Value;
                if (question.LmsQuestionId == null)
                {
                    continue;
                }

                var quizAnswer = new QuizQuestionResultDTO();
                quizAnswer.isCorrect = answer.isCorrect;
                if (question.QuestionType.Id == (int)QuestionTypeEnum.SingleMultipleChoiceText)
                {
                    quizAnswer.answers =
                        answer.answers.Where(a => a.surveyDistractorAnswerId != null)
                        .Select(a => a.surveyDistractorAnswerId.GetValueOrDefault().ToString())
                        .ToArray();
                }
                else
                {
                    quizAnswer.answers =
                        answer.answers.Where(a => a.value != null)
                        .Select(a => a.value)
                        .ToArray();
                }
                var answers = this.ProcessAnswers(question, quizAnswer);

                if (answers != null)
                {
                    quizSubmission.quiz_questions.Add(
                        new CanvasQuizSubmissionQuestionDTO {
                        id = question.LmsQuestionId.Value, answer = answers
                    });
                }
            }

            try
            {
                await _canvasApi.AnswerQuestionsForQuiz(
                    lmsUserParameters.CompanyLms.LmsDomain,
                    lmsUserParameters.LmsUser.Token,
                    quizSubmission);
            }
            catch (Exception ex)
            {
            }
            finally
            {
                await _canvasApi.CompleteQuizSubmission(
                    lmsUserParameters.CompanyLms.LmsDomain,
                    lmsUserParameters.LmsUser.Token,
                    lmsUserParameters.Course,
                    quizSubmission);
            }
        }
示例#15
0
        /// <summary>
        /// The process answers.
        /// </summary>
        /// <param name="question">
        /// The question.
        /// </param>
        /// <param name="answer">
        /// The answer.
        /// </param>
        /// <returns>
        /// The <see cref="object"/>.
        /// </returns>
        private object ProcessAnswers(Question question, QuizQuestionResultDTO answer)
        {
            object answers;

            switch (question.QuestionType.Id)
            {
            case (int)QuestionTypeEnum.TextNoQuestion:
                return(null);

            case (int)QuestionTypeEnum.TrueFalse:
                answers = this.GetTrueFalseLmsIdAnswer(question, answer);
                break;

            case (int)QuestionTypeEnum.SingleMultipleChoiceText:
                var isSingle  = this.IsSingleAnswer(question);
                var answerIds = this.GetMultipleChoiceLmsIds(question, answer);

                if (isSingle)
                {
                    answers = answerIds.FirstOrDefault();
                }
                else
                {
                    answers = answerIds;
                }

                break;

            case (int)QuestionTypeEnum.Matching:
            {
                var userAnswers = this.GetMatchingValues(question, answer, true);

                var match = new List <JsonObject>();

                foreach (var left in userAnswers.Keys)
                {
                    var jsonObject = new JsonObject();
                    jsonObject.Add("answer_id", left);
                    jsonObject.Add("match_id", userAnswers[left]);
                    match.Add(jsonObject);
                }

                answers = match;
                break;
            }

            case (int)QuestionTypeEnum.MultipleDropdowns:
            {
                var obj         = new JsonObject();
                var userAnswers = this.GetMultipleDropdownValues(question, answer, false);
                foreach (var key in userAnswers.Keys)
                {
                    obj.Add(key, userAnswers[key]);
                }
                answers = obj;
                break;
            }

            case (int)QuestionTypeEnum.FillInTheBlank:
            {
                var obj         = new JsonObject();
                var userAnswers = this.GetMultipleBlanksValues(question, answer);
                foreach (var key in userAnswers.Keys)
                {
                    obj.Add(key, userAnswers[key]);
                }

                answers = obj;

                break;
            }

            default:
                answers = answer.answers.FirstOrDefault();
                break;
            }

            return(answers);
        }
示例#16
0
        protected Dictionary <string, string> GetMultipleBlanksValues(Question question, QuizQuestionResultDTO answer)
        {
            var ret = new Dictionary <string, string>();

            Distractor distractor = question.Distractors?.FirstOrDefault();

            if (distractor == null || distractor.LmsAnswer == null)
            {
                return(ret);
            }

            var answersDict = JsonConvert.DeserializeObject <Dictionary <string, int> >(distractor.LmsAnswer);

            var xmlDoc = new XmlDocument();

            xmlDoc.LoadXml(distractor.DistractorName);

            foreach (var key in answersDict.Keys)
            {
                var order = answersDict[key];
                if (answer.answers.Length > order)
                {
                    var userText = answer.answers[order];

                    ret.Add(key, userText);
                }
            }

            return(ret);
        }
示例#17
0
        /// <summary>
        /// The get dropdown values.
        /// </summary>
        /// <param name="question">
        /// The question.
        /// </param>
        /// <param name="answer">
        /// The answer.
        /// </param>
        /// <param name="orderAsKey">
        /// The order as key.
        /// </param>
        /// <returns>
        /// The <see cref="Dictionary"/>.
        /// </returns>
        protected Dictionary <string, string> GetMultipleDropdownValues(Question question, QuizQuestionResultDTO answer, bool orderAsKey)
        {
            var ret = new Dictionary <string, string>();

            Distractor distractor = question.Distractors?.FirstOrDefault();

            if (distractor == null || distractor.LmsAnswer == null)
            {
                return(ret);
            }

            var answersDict = JsonConvert.DeserializeObject <Dictionary <string, int> >(distractor.LmsAnswer);

            var xmlDoc = new XmlDocument();

            xmlDoc.LoadXml(distractor.DistractorName);
            var textTags = xmlDoc.SelectNodes(string.Format("data//text[@isBlank='true']"));

            var orderKey = 0;

            foreach (var key in answersDict.Keys)
            {
                var order = answersDict[key];
                if (answer.answers.Length > order)
                {
                    var userText = answer.answers[order];

                    var textTag = textTags.Count > order ? textTags[order] : null;
                    if (textTag != null)
                    {
                        var id = textTag.Attributes["id"].Value;

                        xmlDoc.DocumentElement.SetAttribute("searchName", userText);
                        var optionTag =
                            xmlDoc.SelectSingleNode(
                                string.Format("data//options[@id='{0}']//option[@name=/*/@searchName]", id, userText));
                        if (optionTag != null && optionTag.Attributes["lmsid"] != null)
                        {
                            ret.Add(orderAsKey ? order.ToString() : key, optionTag.Attributes["lmsid"].Value);
                            orderKey++;
                        }
                    }
                }
            }

            return(ret);
        }