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); } }
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 Program(VisitsRepo repo, StaffClient staffClient, int maxGiftsPerRun, JObject settings, GiftsTelegramBot telegramBot) { this.repo = repo; this.staffClient = staffClient; this.maxGiftsPerRun = maxGiftsPerRun; this.settings = settings; this.telegramBot = telegramBot; }
public ExerciseController(CourseManager courseManager) { this.courseManager = courseManager; groupsRepo = new GroupsRepo(db); solutionsRepo = new UserSolutionsRepo(db); visitsRepo = new VisitsRepo(db); slideCheckingsRepo = new SlideCheckingsRepo(db); }
public AnalyticsController(CourseManager courseManager) { this.courseManager = courseManager; additionalScoresRepo = new AdditionalScoresRepo(db); userSolutionsRepo = new UserSolutionsRepo(db); groupsRepo = new GroupsRepo(db); usersRepo = new UsersRepo(db); visitsRepo = new VisitsRepo(db); }
public QuizController(CourseManager courseManager) { this.courseManager = courseManager; userQuizzesRepo = new UserQuizzesRepo(db); visitsRepo = new VisitsRepo(db); quizzesRepo = new QuizzesRepo(db); groupsRepo = new GroupsRepo(db); slideCheckingsRepo = new SlideCheckingsRepo(db); }
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 static async Task UpdateTests(UlearnDb db, string courseId) { var courseManager = new CourseManager(CourseManager.GetCoursesDirectory()); var course = courseManager.GetCourse(courseId); var slideCheckingsRepo = new SlideCheckingsRepo(db, null); var visitsRepo = new VisitsRepo(db, slideCheckingsRepo); var tests = course.GetSlides(true).OfType <QuizSlide>().ToList(); foreach (var test in tests) { var testVisits = db.Visits.Where(v => v.CourseId == courseId && v.SlideId == test.Id && v.IsPassed && v.Score == 0).ToList(); foreach (var visit in testVisits) { var answers = db.UserQuizAnswers.Where(s => s.Submission.CourseId == courseId && s.Submission.UserId == visit.UserId && s.Submission.SlideId == visit.SlideId).ToList(); var groupsBySubmission = answers.GroupBy(a => a.Submission.Id).ToList(); foreach (var group in groupsBySubmission) { var submissionAnswers = group.ToList(); var blockAnswers = submissionAnswers.GroupBy(s => s.BlockId); var allQuizInfos = new List <QuizInfoForDb>(); foreach (var ans in blockAnswers) { var quizInfos = CreateQuizInfo(test, ans); if (quizInfos != null) { allQuizInfos.AddRange(quizInfos); } } foreach (var answer in submissionAnswers) { var valid = allQuizInfos.First(i => i.BlockId == answer.BlockId && i.ItemId == answer.ItemId); answer.QuizBlockScore = valid.QuizBlockScore; answer.QuizBlockMaxScore = valid.QuizBlockMaxScore; } var score = allQuizInfos .DistinctBy(forDb => forDb.BlockId) .Sum(forDb => forDb.QuizBlockScore); var checking = db.AutomaticQuizCheckings.FirstOrDefault(c => c.Submission.Id == group.Key); if (checking != null) // В случае попытки сверх лимита AutomaticQuizCheckings не создается, но ответы сохраняются в UserQuizAnswers { checking.Score = score; } db.SaveChanges(); } await visitsRepo.UpdateScoreForVisit(courseId, test, visit.UserId); } Console.WriteLine(test.Id); } }
public QuizController() { metricSender = new GraphiteMetricSender("web"); userQuizzesRepo = new UserQuizzesRepo(db); visitsRepo = new VisitsRepo(db); groupsRepo = new GroupsRepo(db, courseManager); slideCheckingsRepo = new SlideCheckingsRepo(db); notificationsRepo = new NotificationsRepo(db); }
public RunnerController(ULearnDb db, CourseManager courseManager) { this.db = db; this.courseManager = courseManager; userSolutionsRepo = new UserSolutionsRepo(db, courseManager); slideCheckingsRepo = new SlideCheckingsRepo(db); visitsRepo = new VisitsRepo(db); groupsRepo = new GroupsRepo(db, courseManager); usersRepo = new UsersRepo(db); metricSender = new MetricSender(ApplicationConfiguration.Read <UlearnConfiguration>().GraphiteServiceName); }
public AccountController() { db = new ULearnDb(); userManager = new ULearnUserManager(db); courseManager = WebCourseManager.Instance; usersRepo = new UsersRepo(db); userRolesRepo = new UserRolesRepo(db); groupsRepo = new GroupsRepo(db); certificatesRepo = new CertificatesRepo(db); visitsRepo = new VisitsRepo(db); }
public QuizController() { metricSender = new MetricSender(ApplicationConfiguration.Read <UlearnConfiguration>().GraphiteServiceName); userQuizzesRepo = new UserQuizzesRepo(db); visitsRepo = new VisitsRepo(db); groupsRepo = new GroupsRepo(db, courseManager); slideCheckingsRepo = new SlideCheckingsRepo(db); notificationsRepo = new NotificationsRepo(db); unitsRepo = new UnitsRepo(db); }
public SlideNavigationController() { var db = new ULearnDb(); unitsRepo = new UnitsRepo(db); solutionsRepo = new UserSolutionsRepo(db, courseManager); visitsRepo = new VisitsRepo(db); userQuizzesRepo = new UserQuizzesRepo(db); groupsRepo = new GroupsRepo(db, courseManager); additionalScoresRepo = new AdditionalScoresRepo(db); }
public NotificationsController(ULearnDb db, CourseManager courseManager) { notificationsRepo = new NotificationsRepo(db); usersRepo = new UsersRepo(db); visitsRepo = new VisitsRepo(db); userManager = new ULearnUserManager(db); this.courseManager = courseManager; telegramBotName = WebConfigurationManager.AppSettings["ulearn.telegram.botName"]; secretForHashes = WebConfigurationManager.AppSettings["ulearn.secretForHashes"] ?? ""; }
public CertificateGenerator( UserQuizzesRepo userQuizzesRepo, UserSolutionsRepo userSolutionsRepo, SlideCheckingsRepo slideCheckingsRepo, VisitsRepo visitsRepo) { this.userQuizzesRepo = userQuizzesRepo; this.userSolutionsRepo = userSolutionsRepo; this.slideCheckingsRepo = slideCheckingsRepo; this.visitsRepo = visitsRepo; }
public CourseController() { slideCheckingsRepo = new SlideCheckingsRepo(db); visitsRepo = new VisitsRepo(db); unitsRepo = new UnitsRepo(db); slideRateRepo = new SlideRateRepo(db); solutionsRepo = new UserSolutionsRepo(db, courseManager); ltiRequestsRepo = new LtiRequestsRepo(db); groupsRepo = new GroupsRepo(db, courseManager); userQuizzesRepo = new UserQuizzesRepo(db); coursesRepo = new CoursesRepo(db); }
public AccountController() { userRolesRepo = new UserRolesRepo(db); groupsRepo = new GroupsRepo(db, courseManager); certificatesRepo = new CertificatesRepo(db); visitsRepo = new VisitsRepo(db); notificationsRepo = new NotificationsRepo(db); coursesRepo = new CoursesRepo(db); systemAccessesRepo = new SystemAccessesRepo(db); telegramSecret = WebConfigurationManager.AppSettings["ulearn.telegram.webhook.secret"] ?? ""; }
public BaseExerciseController(ULearnDb db, CourseManager courseManager, GraphiteMetricSender metricSender) { this.db = db; this.courseManager = courseManager; this.metricSender = metricSender; userSolutionsRepo = new UserSolutionsRepo(db, courseManager); slideCheckingsRepo = new SlideCheckingsRepo(db); groupsRepo = new GroupsRepo(db, courseManager); visitsRepo = new VisitsRepo(db); notificationsRepo = new NotificationsRepo(db); usersRepo = new UsersRepo(db); styleErrorsRepo = new StyleErrorsRepo(db); }
public GroupsRepo( UlearnDb db, SlideCheckingsRepo slideCheckingsRepo, UserSolutionsRepo userSolutionsRepo, UserQuizzesRepo userQuizzesRepo, VisitsRepo visitsRepo, GroupsCreatorAndCopier groupsCreatorAndCopier, WebCourseManager courseManager, ILogger logger) { this.db = db; this.slideCheckingsRepo = slideCheckingsRepo; this.userSolutionsRepo = userSolutionsRepo; this.userQuizzesRepo = userQuizzesRepo; this.visitsRepo = visitsRepo; this.groupsCreatorAndCopier = groupsCreatorAndCopier; this.courseManager = courseManager; this.logger = logger; }
private static void Main(string[] args) { var settings = JObject.Parse(File.ReadAllText("appsettings.json")); var hostLog = settings["hostLog"].ToObject <HostLogConfiguration>(); var graphiteServiceName = settings["graphiteServiceName"].Value <string>(); LoggerSetup.Setup(hostLog, graphiteServiceName); try { var staff = new StaffClient(settings["staff"]["clientAuth"].Value <string>()); if (args.Contains("-r")) { Console.WriteLine("Username (example: KONTUR\\pe):"); var username = Console.ReadLine(); Console.WriteLine($"Password for {username}:"); var password = GetConsolePassword(); var refreshToken = staff.GetRefreshToken(username, password); Console.WriteLine($"RefreshToken: {refreshToken}"); return; } var telegramBot = new GiftsTelegramBot(); try { staff.UseRefreshToken(settings["staff"]["refreshToken"].Value <string>()); var maxGiftsPerRun = args.Length > 0 ? int.Parse(args[0]) : settings["maxGiftsPerRun"].Value <int>(); log.Info("UseGiftGrantsLimitPerRun\t" + maxGiftsPerRun); var db = new ULearnDb(); var repo = new VisitsRepo(db); var courses = settings["courses"].Values <string>(); var program = new Program(repo, staff, maxGiftsPerRun, settings, telegramBot); foreach (var courseId in courses) { program.GrantGiftsForCourse(courseId); } } catch (Exception e) { telegramBot.PostToChannel($"Error while grant staff gifts.\n\n{e}"); log.Error(e, "UnhandledException"); } } finally { FileLog.FlushAll(); } }
private static async Task UpdateExerciseVisits(UlearnDb db, string courseId) { var courseManager = new CourseManager(CourseManager.GetCoursesDirectory()); var course = courseManager.GetCourse(courseId); var slideCheckingsRepo = new SlideCheckingsRepo(db, null); var visitsRepo = new VisitsRepo(db, slideCheckingsRepo); var slides = course.GetSlides(true).OfType <ExerciseSlide>().ToList(); foreach (var slide in slides) { var slideVisits = db.Visits.Where(v => v.CourseId == courseId && v.SlideId == slide.Id && v.IsPassed).ToList(); foreach (var visit in slideVisits) { await visitsRepo.UpdateScoreForVisit(courseId, slide, visit.UserId); } } }
public static async Task <bool> SendToReviewAndUpdateScore(UserExerciseSubmission submission, CourseManager courseManager, SlideCheckingsRepo slideCheckingsRepo, GroupsRepo groupsRepo, VisitsRepo visitsRepo, MetricSender metricSender, bool startTransaction) { var userId = submission.User.Id; var courseId = submission.CourseId; var course = courseManager.GetCourse(courseId); var exerciseSlide = course.FindSlideById(submission.SlideId, true) as ExerciseSlide; // SlideId проверен в вызывающем методе if (exerciseSlide == null) { return(false); } var exerciseMetricId = GetExerciseMetricId(courseId, exerciseSlide); var automaticChecking = submission.AutomaticChecking; var isProhibitedUserToSendForReview = slideCheckingsRepo.IsProhibitedToSendExerciseToManualChecking(courseId, exerciseSlide.Id, userId); var sendToReview = exerciseSlide.Scoring.RequireReview && submission.AutomaticCheckingIsRightAnswer && !isProhibitedUserToSendForReview && groupsRepo.IsManualCheckingEnabledForUser(course, userId); if (sendToReview) { await slideCheckingsRepo.RemoveWaitingManualCheckings <ManualExerciseChecking>(courseId, exerciseSlide.Id, userId, false); await slideCheckingsRepo.AddManualExerciseChecking(courseId, exerciseSlide.Id, userId, submission); await visitsRepo.MarkVisitsAsWithManualChecking(courseId, exerciseSlide.Id, userId); metricSender.SendCount($"exercise.{exerciseMetricId}.sent_to_review"); metricSender.SendCount("exercise.sent_to_review"); } await visitsRepo.UpdateScoreForVisit(courseId, exerciseSlide, userId); if (automaticChecking != null) { var verdictForMetric = automaticChecking.GetVerdict().Replace(" ", ""); metricSender.SendCount($"exercise.{exerciseMetricId}.{verdictForMetric}"); } return(sendToReview); }
public Save(VisitsRepo visitsRepo) { _visitsRepo = visitsRepo.Instance; }
public Find(VisitsRepo visitsRepo) { _visitsRepo = visitsRepo.Instance; }