Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
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);
                }
            }
        }
Ejemplo n.º 3
0
 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;
 }
Ejemplo n.º 4
0
 public ExerciseController(CourseManager courseManager)
 {
     this.courseManager = courseManager;
     groupsRepo         = new GroupsRepo(db);
     solutionsRepo      = new UserSolutionsRepo(db);
     visitsRepo         = new VisitsRepo(db);
     slideCheckingsRepo = new SlideCheckingsRepo(db);
 }
Ejemplo n.º 5
0
 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);
 }
Ejemplo n.º 6
0
 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);
 }
Ejemplo n.º 7
0
        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);
            }
        }
Ejemplo n.º 8
0
        // Обновляет пройденные тесты с нулевым баллом
        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);
            }
        }
Ejemplo n.º 9
0
        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);
        }
Ejemplo n.º 10
0
 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);
 }
Ejemplo n.º 11
0
 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);
 }
Ejemplo n.º 12
0
        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);
        }
Ejemplo n.º 14
0
        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"] ?? "";
        }
Ejemplo n.º 15
0
 public CertificateGenerator(
     UserQuizzesRepo userQuizzesRepo,
     UserSolutionsRepo userSolutionsRepo,
     SlideCheckingsRepo slideCheckingsRepo,
     VisitsRepo visitsRepo)
 {
     this.userQuizzesRepo    = userQuizzesRepo;
     this.userSolutionsRepo  = userSolutionsRepo;
     this.slideCheckingsRepo = slideCheckingsRepo;
     this.visitsRepo         = visitsRepo;
 }
Ejemplo n.º 16
0
 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);
 }
Ejemplo n.º 17
0
        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"] ?? "";
        }
Ejemplo n.º 18
0
        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);
        }
Ejemplo n.º 19
0
 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;
 }
Ejemplo n.º 20
0
        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();
            }
        }
Ejemplo n.º 21
0
        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);
                }
            }
        }
Ejemplo n.º 22
0
        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;
 }