public LmsUserParametersDTO(LmsUserParameters param, LmsProvider lmsProvider) { if (param == null) { throw new ArgumentNullException(nameof(param)); } if (lmsProvider == null) { throw new ArgumentNullException(nameof(lmsProvider)); } LmsUserParametersId = param.Id; AcId = param.AcId; Course = param.Course; Domain = param.CompanyLms.LmsDomain; provider = lmsProvider.ShortName; WsToken = param.Wstoken; LmsUserId = param.LmsUser.Return(x => x.Id, (int?)null); CourseName = param.CourseName; UserEmail = param.UserEmail; }
public void PublishQuiz(LmsUserParameters lmsUserParameters, int courseId, int quizId) { var api = lmsUserParameters.CompanyLms.LmsDomain; var userToken = lmsUserParameters.LmsUser.Token; IRestResponse <CanvasQuiz> response; try { Validate(api, userToken); var client = CreateRestClient(api); RestRequest request = CreateRequest( api, $"/api/v1/courses/{courseId}/quizzes/{quizId}", Method.PUT, userToken); request.AddParameter("quiz[published]", true); response = client.Execute <CanvasQuiz>(request); } catch (Exception ex) { _logger.ErrorFormat(ex, "[CanvasAPI.PublishQuiz] API:{0}. UserToken:{1}. CourseId:{2}. QuizId:{3}", api, userToken, courseId, quizId); throw; } if (response.StatusCode != HttpStatusCode.OK) { _logger.ErrorFormat("[CanvasAPI.PublishQuiz] API:{0}. UserToken:{1}. CourseId:{2}. QuizId:{3}. {4}", api, userToken, courseId, quizId, BuildInformation(response)); throw new InvalidOperationException(string.Format("[CanvasAPI.PublishQuiz] Canvas returns '{0}'", response.StatusDescription)); } }
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()); }
public override async Task ConvertAndSendQuizResultToLmsAsync(IEnumerable <QuizQuestionResultDTO> results, QuizResult quizResult, 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; } var userAnswer = this.ProcessAnswers(question, answer); answers.Add(question.LmsQuestionId.GetValueOrDefault(), userAnswer); } var questions = this.QuestionModel.GetAllBySubModuleItemId(quizResult.Quiz.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), quizResult.Quiz.LmsQuizId.GetValueOrDefault().ToString(), false, ret.ToArray()); }
/// <summary> /// The get items info for user. /// </summary> /// <param name="lmsUserParameters"> /// The LMS user parameters. /// </param> /// <param name="isSurvey"> /// The is survey. /// </param> /// <param name="error"> /// The error. /// </param> /// <returns> /// The <see cref="IEnumerable{LmsQuizInfoDTO}"/>. /// </returns> public async Task <(IEnumerable <LmsQuizInfoDTO> Data, string Error)> GetItemsInfoForUserAsync(LmsUserParameters lmsUserParameters, bool isSurvey) { var quizzes = await GetItemsForUserAsync(lmsUserParameters, isSurvey, null); var result = quizzes.Data.Select(q => new LmsQuizInfoDTO { id = q.id, name = q.title, course = q.course, courseName = q.courseName, lastModifiedLMS = q.lastModifiedLMS, isPublished = q.published }); return(Data : result, Error : quizzes.Error); }
/// <summary> /// The send answers. /// </summary> /// <param name="lmsUserParameters"> /// The LMS user parameters. /// </param> /// <param name="json"> /// The JSON. /// </param> /// <param name="isSurvey"> /// The is Survey. /// </param> /// <exception cref="NotImplementedException"> /// Not yet implemented /// </exception> public Task SendAnswersAsync(LmsUserParameters lmsUserParameters, string json, bool isSurvey, string[] answers) { throw new NotImplementedException(); }
/// <summary> /// The get items for user. /// </summary> /// <param name="lmsUserParameters"> /// The LMS user parameters. /// </param> /// <param name="isSurvey"> /// The is survey. /// </param> /// <param name="quizIds"> /// The quiz ids. /// </param> /// <param name="error"> /// The error. /// </param> /// <returns> /// The <see cref="IEnumerable{LmsQuizDTO}"/>. /// </returns> public async Task <(IEnumerable <LmsQuizDTO> Data, string Error)> GetItemsForUserAsync(LmsUserParameters lmsUserParameters, bool isSurvey, IEnumerable <int> quizIds) { try { Validate(lmsUserParameters.CompanyLms.LmsDomain, lmsUserParameters.LmsUser.Token); var course = GetCourse( lmsUserParameters.CompanyLms.LmsDomain, lmsUserParameters.LmsUser.Token, lmsUserParameters.Course); var client = CreateRestClient(lmsUserParameters.CompanyLms.LmsDomain); RestRequest request = CreateRequest( lmsUserParameters.CompanyLms.LmsDomain, string.Format("/api/v1/courses/{0}/quizzes", lmsUserParameters.Course), Method.GET, lmsUserParameters.LmsUser.Token); request.AddParameter("per_page", 1000); IRestResponse <List <CanvasQuizDTO> > response = client.Execute <List <CanvasQuizDTO> >(request); if (response.StatusCode != HttpStatusCode.OK) { _logger.ErrorFormat("[EGCEnabledCanvasAPI.GetItemsForUser] API:{0}. UserToken:{1}. CourseId:{2}. {3}", lmsUserParameters.CompanyLms.LmsDomain, lmsUserParameters.LmsUser.Token, lmsUserParameters.Course, BuildInformation(response)); throw new InvalidOperationException(string.Format("[EGCEnabledCanvasAPI.GetItemsForUser] Canvas returns '{0}'", response.StatusDescription)); } if (quizIds != null) { response.Data = response.Data.Where(q => quizIds.Contains(q.id)).ToList(); } response.Data = response.Data.Where( q => isSurvey ? q.quiz_type.ToLower().Contains("survey") : (!q.quiz_type.ToLower().Contains("survey"))) .ToList(); foreach (CanvasQuizDTO q in response.Data) { if (quizIds != null) { q.questions = GetQuestionsForQuiz( lmsUserParameters.CompanyLms.LmsDomain, lmsUserParameters.LmsUser.Token, lmsUserParameters.Course, q.id).ToArray(); CanvasQuizParser.Parse(q); foreach (var question in q.questions) { foreach (var fileIndex in question.files.Keys) { var file = question.files[fileIndex]; if (!file.fileUrl.StartsWith("http", StringComparison.InvariantCultureIgnoreCase)) { var canvasFile = GetFile( lmsUserParameters.CompanyLms.LmsDomain, lmsUserParameters.LmsUser.Token, CanvasQuizParser.GetFileId(file.fileUrl)); file.fileUrl = canvasFile.url; } question.question_text = CanvasQuizParser.ReplaceFilePlaceHolder(question.question_text, fileIndex, file); question.answers.ForEach( a => a.text = CanvasQuizParser.ReplaceFilePlaceHolder(a.text, fileIndex, file)); } } } q.course = course.id; q.courseName = course.name; } return(Data : response.Data, Error : string.Empty); } catch (Exception ex) { _logger.ErrorFormat(ex, "[EGCEnabledCanvasAPI.GetItemsForUser] API:{0}. UserToken:{1}. CourseId:{2}.", lmsUserParameters.CompanyLms.LmsDomain, lmsUserParameters.LmsUser.Token, lmsUserParameters.Course); throw; } }
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); } }
public override async Task ConvertAndSendQuizResultToLmsAsync(IEnumerable <QuizQuestionResultDTO> results, QuizResult quizResult, LmsUserParameters lmsUserParameters) { var quizSubmission = await _canvasApi.CreateQuizSubmission( lmsUserParameters.CompanyLms.LmsDomain, lmsUserParameters.LmsUser.Token, lmsUserParameters.Course, quizResult.Quiz.LmsQuizId.GetValueOrDefault()); foreach (var answer in results) { Question question = this.QuestionModel.GetOneById(answer.questionId).Value; if (question.LmsQuestionId == null) { continue; } var answers = this.ProcessAnswers(question, answer); 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); } }
public abstract Task ConvertAndSendSurveyResultToLmsAsync(IEnumerable <SurveyQuestionResultDTO> results, SurveyResult surveyResult, LmsUserParameters lmsUserParameters);
public abstract Task ConvertAndSendQuizResultToLmsAsync(IEnumerable <QuizQuestionResultDTO> results, QuizResult quizResult, LmsUserParameters lmsUserParameters);
public override async Task ConvertAndSendSurveyResultToLmsAsync(IEnumerable <SurveyQuestionResultDTO> results, SurveyResult surveyResult, LmsUserParameters lmsUserParameters) { var toSend = new List <MoodleQuizResultDTO>(); foreach (SurveyQuestionResultDTO r in results.Where(x => x.questionTypeId != (int)QuestionTypeEnum.TextNoQuestion)) { var m = new MoodleQuizResultDTO(); m.quizId = surveyResult.Survey.LmsSurveyId ?? 0; Question question = this.QuestionModel.GetOneById(r.questionId).Value; m.questionId = question.LmsQuestionId ?? 0; m.questionType = question.QuestionType.Type; m.userId = lmsUserParameters.LmsUser.UserId; m.startTime = surveyResult.StartTime.ConvertToUTCTimestamp(); m.answers = (question.QuestionType.Id == (int)QuestionTypeEnum.SingleMultipleChoiceText || question.QuestionType.Id == (int)QuestionTypeEnum.Rate) ? this.GetSurveyAnswerLmsIds(question, r) : this.ConvertSurveyAnswersToQuizAnswers(question, r, false); toSend.Add(m); } if (toSend.Count == 0) { return; } var ret = toSend.GroupBy(s => s.quizId) .Select( s => new { surveyId = s.Key, courseId = surveyResult.Survey.SubModuleItem.SubModuleCategory.LmsCourseId, usersResults = s.GroupBy(u => new { u.userId, u.startTime }) .Select( u => new { u.Key.userId, u.Key.startTime, answers = u.Select(a => new { a.questionId, answer = a.answers.Aggregate((b, c) => b.ToString() + "|" + c.ToString()) }) }) }); string json = (new JsonSerializer()).Serialize(ret); await this.MoodleApi.SendAnswersAsync(lmsUserParameters.CompanyLms.GetLMSSettings(Settings, lmsUserParameters), json, true, null); }
public override async Task ConvertAndSendQuizResultToLmsAsync(IEnumerable <QuizQuestionResultDTO> results, QuizResult quizResult, LmsUserParameters lmsUserParameters) { var toSend = new List <MoodleQuizResultDTO>(); foreach (QuizQuestionResultDTO r in results.Where(x => x.questionTypeId != (int)QuestionTypeEnum.TextNoQuestion)) { var m = new MoodleQuizResultDTO(); m.quizId = quizResult.Quiz.LmsQuizId ?? 0; Question question = this.QuestionModel.GetOneById(r.questionId).Value; m.questionId = question.LmsQuestionId ?? 0; m.questionType = question.QuestionType.Type; m.userId = lmsUserParameters.LmsUser.UserId; m.startTime = quizResult.StartTime.ConvertToUTCTimestamp(); m.answers = this.ProcessAnswers(question, r); toSend.Add(m); } if (toSend.Count == 0) { return; } var ret = toSend.GroupBy(s => s.quizId) .Select( s => new { quizId = s.Key, usersResults = s.GroupBy(u => new { u.userId, u.startTime }) .Select( u => new { u.Key.userId, u.Key.startTime, answers = u.Select(a => new { a.questionId, a.answers }) }) }); string json = (new JsonSerializer()).Serialize(ret); await this.MoodleApi.SendAnswersAsync(lmsUserParameters.CompanyLms.GetLMSSettings(Settings, lmsUserParameters), json, false, null); }