Пример #1
0
        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;
        }
Пример #2
0
        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));
            }
        }
Пример #3
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());
        }
Пример #4
0
        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());
        }
Пример #5
0
        /// <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);
        }
Пример #6
0
 /// <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();
 }
Пример #7
0
        /// <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;
            }
        }
Пример #8
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);
            }
        }
Пример #9
0
        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);
            }
        }
Пример #10
0
 public abstract Task ConvertAndSendSurveyResultToLmsAsync(IEnumerable <SurveyQuestionResultDTO> results, SurveyResult surveyResult, LmsUserParameters lmsUserParameters);
Пример #11
0
 public abstract Task ConvertAndSendQuizResultToLmsAsync(IEnumerable <QuizQuestionResultDTO> results, QuizResult quizResult, LmsUserParameters lmsUserParameters);
Пример #12
0
        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);
        }
Пример #13
0
        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);
        }