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); } } }
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); } }
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); } }
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, })); }