コード例 #1
0
        private static async Task ResendLti(UlearnDb db)
        {
            var ltiConsumersRepo   = new LtiConsumersRepo(db);
            var slideCheckingsRepo = new SlideCheckingsRepo(db, null);
            var visitsRepo         = new VisitsRepo(db, slideCheckingsRepo);
            // current 288064
            var ltiRequests = await db.LtiRequests.Where(r => r.RequestId > 285417).OrderByDescending(r => r.RequestId).ToListAsync();

            var courseManager = new CourseManager(CourseManager.GetCoursesDirectory());

            var i = 0;

            foreach (var ltiRequest in ltiRequests)
            {
                i++;
                Console.WriteLine($"{i} requestId {ltiRequest.RequestId}");
                try
                {
                    var course = courseManager.GetCourse(ltiRequest.CourseId);
                    var slide  = course.GetSlideById(ltiRequest.SlideId, true);
                    var score  = await visitsRepo.GetScore(ltiRequest.CourseId, ltiRequest.SlideId, ltiRequest.UserId);

                    await LtiUtils.SubmitScore(slide, ltiRequest.UserId, score, ltiRequest.Request, ltiConsumersRepo);

                    Console.WriteLine($"{i} requestId {ltiRequest.RequestId} score {score}");
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                }
            }
        }
コード例 #2
0
ファイル: LtiUtils.cs プロジェクト: ALVirtualTech/uLearn
        public static void SubmitScore(Slide slide, string userId)
        {
            var ltiRequestsRepo = new LtiRequestsRepo();
            var consumersRepo   = new ConsumersRepo();
            var visitsRepo      = new VisitsRepo();

            var ltiRequest = ltiRequestsRepo.Find(userId, slide.Id);

            if (ltiRequest == null)
            {
                throw new Exception("LtiRequest for user '" + userId + "' not found");
            }

            var consumerSecret = consumersRepo.Find(ltiRequest.ConsumerKey).Secret;

            var score = visitsRepo.GetScore(slide.Id, userId);

            // TODO: fix outcome address in local edx (no localhost and no https)
            var uri = new UriBuilder(ltiRequest.LisOutcomeServiceUrl);

            if (uri.Host == "localhost")
            {
                uri.Host   = "192.168.33.10";
                uri.Port   = 80;
                uri.Scheme = "http";
            }

            var result = OutcomesClient.PostScore(uri.ToString(), ltiRequest.ConsumerKey, consumerSecret,
                                                  ltiRequest.LisResultSourcedId, score / (double)slide.MaxScore);

            if (!result.IsValid)
            {
                throw new Exception(uri + "\r\n\r\n" + result.Message);
            }
        }
コード例 #3
0
ファイル: LtiUtils.cs プロジェクト: DerArvend/Ulearn
        public static void SubmitScore(string courseId, Slide slide, string userId, Visit visit = null)
        {
            var db = new ULearnDb();
            var ltiRequestsRepo = new LtiRequestsRepo(db);
            var consumersRepo   = new ConsumersRepo(db);
            var visitsRepo      = new VisitsRepo(db);

            var ltiRequest = ltiRequestsRepo.Find(courseId, userId, slide.Id);

            if (ltiRequest == null)
            {
                throw new Exception("LtiRequest for user '" + userId + "' not found");
            }

            var consumerSecret = consumersRepo.Find(ltiRequest.ConsumerKey).Secret;

            var score = visit?.Score ?? visitsRepo.GetScore(courseId, slide.Id, userId);

            log.Info($"Надо отправить результаты слайда {slide.Id} пользователя {userId} по LTI. Нашёл LtiRequest: {ltiRequest.JsonSerialize()}");
            UriBuilder uri;

            try
            {
                uri = new UriBuilder(ltiRequest.LisOutcomeServiceUrl);
            }
            catch (Exception e)
            {
                log.Error($"Неверный адрес отправки результатов по LTI: {ltiRequest.LisOutcomeServiceUrl}", e);
                throw;
            }

            if (uri.Host == "localhost")
            {
                uri.Host   = "192.168.33.10";
                uri.Port   = 80;
                uri.Scheme = "http";
            }

            var maxScore    = ControllerUtils.GetMaxScoreForUsersSlide(slide, true, false, false);
            var outputScore = score / (double)maxScore;

            log.Info($"Отправляю результаты на {ltiRequest.LisOutcomeServiceUrl}: {score} из {maxScore} ({outputScore})");

            /* Sometimes score is bigger then slide's MaxScore, i.e. in case of manual checking */
            if (score > maxScore)
            {
                outputScore = 1;
            }
            var result = OutcomesClient.PostScore(uri.ToString(), ltiRequest.ConsumerKey, consumerSecret,
                                                  ltiRequest.LisResultSourcedId, outputScore);

            if (!result.IsValid)
            {
                throw new Exception(uri + "\r\n\r\n" + result.Message);
            }
        }
コード例 #4
0
        public async Task <ActionResult> SimpleScoreExercise(int submissionId, int exerciseScore, bool ignoreNewestSubmission = false, int?updateCheckingId = null)
        {
            var submission = solutionsRepo.FindSubmissionById(submissionId);
            var courseId   = submission.CourseId;
            var slideId    = submission.SlideId;
            var userId     = submission.UserId;

            if (!User.HasAccessFor(courseId, CourseRole.Instructor))
            {
                return(new HttpStatusCodeResult(HttpStatusCode.Forbidden));
            }

            if (!ignoreNewestSubmission && !updateCheckingId.HasValue)
            {
                var lastAcceptedSubmission = solutionsRepo.GetAllAcceptedSubmissionsByUser(courseId, slideId, userId).OrderByDescending(s => s.Timestamp).FirstOrDefault();
                if (lastAcceptedSubmission != null && lastAcceptedSubmission.Id != submission.Id)
                {
                    return(Json(
                               new {
                        status = "error",
                        error = "has_newest_submission",
                        submissionId = lastAcceptedSubmission.Id,
                        submissionDate = lastAcceptedSubmission.Timestamp.ToAgoPrettyString(true)
                    }));
                }
            }

            var manualScore = slideCheckingsRepo.GetManualScoreForSlide(courseId, slideId, userId);

            if (exerciseScore < manualScore && !updateCheckingId.HasValue)
            {
                return(Json(
                           new
                {
                    status = "error",
                    error = "has_greatest_score",
                    score = manualScore,
                    checkedQueueUrl = Url.Action("ManualExerciseCheckingQueue", "Admin", new { courseId, done = true, userId, slideId })
                }));
            }

            /* TODO: check if 0 <= exercisScore <= exercise.MaxReviewScore */

            await slideCheckingsRepo.RemoveWaitingManualExerciseCheckings(courseId, slideId, userId);

            ManualExerciseChecking checking;

            if (updateCheckingId.HasValue)
            {
                checking = slideCheckingsRepo.FindManualCheckingById <ManualExerciseChecking>(updateCheckingId.Value);
            }
            else
            {
                checking = await slideCheckingsRepo.AddManualExerciseChecking(courseId, slideId, userId, submission);
            }
            await slideCheckingsRepo.LockManualChecking(checking, User.Identity.GetUserId());

            await slideCheckingsRepo.MarkManualCheckingAsChecked(checking, exerciseScore);

            await visitsRepo.UpdateScoreForVisit(courseId, slideId, userId);

            return(Json(
                       new
            {
                status = "ok",
                score = exerciseScore.PluralizeInRussian(new RussianPluralizationOptions {
                    One = "балл", Two = "балла", Five = "баллов", Gender = Gender.Male, hideNumberOne = false, smallNumbersAreWords = false
                }),
                totalScore = visitsRepo.GetScore(slideId, userId),
                checkingId = checking.Id,
            }));
        }