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); }
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); } }
/// <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)); }
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)); }
/// <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())); }
/// <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); }
/// <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); }
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); }
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); } } }
/// <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); }
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()); }
/// <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); } } }
/// <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); } } }
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); } }
/// <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); }
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); }
/// <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); }