Example #1
0
        public async Task SetupTestInfrastructureAsync(Action <IServiceCollection> addServices = null)
        {
            var loggerFactory = new LoggerFactory().AddVostok(LogProvider.Get());

            db = CreateDbContext(loggerFactory);

            serviceProvider = ConfigureServices(addServices);

            await CreateInitialDataInDatabaseAsync().ConfigureAwait(false);
            await CreateTestUsersAsync().ConfigureAwait(false);

            /* Configuring Z.EntityFramework.Plus for working with In-Memory database
             * See https://entityframework-plus.net/batch-delete for details */
            BatchDeleteManager.InMemoryDbContextFactory = () => CreateDbContext(loggerFactory);

            /* Cache Manager is not working with In-Memory database.
             * See https://github.com/zzzprojects/EntityFramework-Plus/issues/391 for details. */
            QueryCacheManager.IsEnabled = false;
        }
Example #2
0
        public static void PrintCourseAdmins(UlearnDb db)
        {
            var courseRolesRepo = new CourseRolesRepo(db, null);
            var adminIds        = courseRolesRepo.GetListOfUsersWithCourseRoleAsync(CourseRoleType.CourseAdmin, null, false).Result;
            var users           = adminIds.Select(
                adminId =>
            {
                var roles = courseRolesRepo.Internal_GetActualUserRoles(adminId).Result.Where(r => r.Role == CourseRoleType.CourseAdmin).ToList();
                return(new
                {
                    Name = roles[0].User.VisibleName,
                    Email = roles[0].User.Email,
                    Courses = string.Join(", ", roles.Select(e => e.CourseId).ToList()),
                    Comments = string.Join(", ", roles.Select(e => e.Comment).Where(c => !string.IsNullOrWhiteSpace(c)).ToList())
                });
            }).ToList();
            var lines = users.Select(u => $"{u.Name}\t{u.Email}\t{u.Courses}\t{u.Comments}");

            File.WriteAllLines("admins.txt", lines);
        }
Example #3
0
        public virtual void SetUp()
        {
            var loggerFactory = new LoggerFactory().AddVostok(LogProvider.Get());

            db = CreateDbContext(loggerFactory);

            serviceProvider = ConfigureServices();

            userManager = serviceProvider.GetService <UlearnUserManager>();
            CreateInitialDataInDatabaseAsync().GetAwaiter().GetResult();
            CreateTestUsersAsync().GetAwaiter().GetResult();

            /* Configuring Z.EntityFramework.Plus for working with In-Memory database
             * See https://entityframework-plus.net/batch-delete for details. */
            BatchDeleteManager.InMemoryDbContextFactory = () => CreateDbContext(loggerFactory);

            /* Cache Manager is not working with In-Memory database.
             * See https://github.com/zzzprojects/EntityFramework-Plus/issues/391 for details. */
            QueryCacheManager.IsEnabled = false;
        }
 private static void SetCode(UlearnDb db, Guid[] slides, Dictionary <string, RegistrationData> regData)
 {
     foreach (var data in regData.Values)
     {
         for (var i = 0; i < slides.Length; i++)
         {
             var slide      = slides[i];
             var submission = db.UserExerciseSubmissions
                              .Where(es => es.UserId == data.UserId && es.SlideId == slide)
                              .ToList()
                              .OrderByDescending(es => es.Timestamp)
                              .FirstOrDefault();
             if (submission == null)
             {
                 continue;
             }
             data.Code[i] = db.Texts.FirstOrDefault(t => t.Hash == submission.SolutionCodeHash)?.Text;
         }
     }
 }
        public static IEnumerable <string> GetBlackAndWhiteLabels(UlearnDb db, AntiPlagiarismDb adb, IEnumerable <BestPairWeight> bestPairWeights)
        {
            var weightsDict = bestPairWeights.ToDictionary(e => e.Submission, e => e.Weight);
            var blackLabels = GetBlackLabels(db).ToList();

            Console.WriteLine($"Black labels count: {blackLabels.Count}");
            var whiteLabels = GetWhiteLabels(db).ToList();
            var concat      = blackLabels.Concat(whiteLabels).ToList();

            Console.WriteLine($"Labels count: {concat.Count}");
            Thread.Sleep(5000);
            var i = 0;

            foreach (var e in concat)
            {
                var info1 = $"{{\"SubmissionId\": {e.SubmissionId}}}";
                var info2 = $"{{\r\n  \"SubmissionId\": {e.SubmissionId}\r\n}}";
                var asi   = adb.Submissions
                            .Where(s => s.AdditionalInfo == info1 || s.AdditionalInfo == info2)
                            .Select(s => new { s.Id })
                            .FirstOrDefault();
                i++;
                if (i % 1000 == 0)
                {
                    Console.WriteLine($"i: {i}");
                }
                if (asi == null)
                {
                    Console.WriteLine("asi is null");
                    continue;
                }
                e.AntiplagSubmissionId = asi.Id;
                if (weightsDict.ContainsKey(e.AntiplagSubmissionId))
                {
                    e.Weight = weightsDict[e.AntiplagSubmissionId];
                }
            }
            return(concat
                   .Where(e => e.Weight != null)
                   .Select(JsonConvert.SerializeObject));
        }
        private static void SetQuizAnswers(Guid slideWithRegistrationQuiz, UlearnDb db, Dictionary <string, ApplicationUser> users, Dictionary <string, RegistrationData> regData)
        {
            var submissions = db.UserQuizSubmissions.Where(qs => qs.SlideId == slideWithRegistrationQuiz)
                              .ToList()
                              .GroupBy(gm => gm.UserId)
                              .Where(g => users.ContainsKey(g.Key))
                              .Select(g => g.OrderByDescending(s => s.Timestamp).First())
                              .ToList();

            foreach (var submission in submissions)
            {
                var answers = db.UserQuizAnswers.Where(a => a.SubmissionId == submission.Id).ToList();
                var userId  = submission.User.Id;
                var reg     = regData[userId];
                reg.CourseNumber = answers.FirstOrDefault(a => a.BlockId == "CourseNumber")?.Text;
                reg.PhoneNumber  = answers.FirstOrDefault(a => a.BlockId == "PhoneNumber")?.Text;
                reg.City         = answers.FirstOrDefault(a => a.BlockId == "City")?.Text;
                reg.Specialty    = answers.FirstOrDefault(a => a.BlockId == "Specialty")?.Text;
                reg.University   = answers.FirstOrDefault(a => a.BlockId == "University")?.Text;
            }
        }
Example #7
0
 public RunnerController(IWebCourseManager courseManager, UlearnDb db, IOptions <WebApiConfiguration> options,
                         IUsersRepo usersRepo, IUserSolutionsRepo userSolutionsRepo, ISlideCheckingsRepo slideCheckingsRepo,
                         IGroupsRepo groupsRepo, IVisitsRepo visitsRepo, MetricSender metricSender,
                         XQueueResultObserver xQueueResultObserver, SandboxErrorsResultObserver sandboxErrorsResultObserver,
                         AntiPlagiarismResultObserver antiPlagiarismResultObserver, StyleErrorsResultObserver styleErrorsResultObserver)
     : base(courseManager, db, usersRepo)
 {
     configuration   = options.Value;
     resultObservers = new List <IResultObserver>
     {
         xQueueResultObserver,
         sandboxErrorsResultObserver,
         antiPlagiarismResultObserver,
         styleErrorsResultObserver,
     };
     this.userSolutionsRepo  = userSolutionsRepo;
     this.slideCheckingsRepo = slideCheckingsRepo;
     this.groupsRepo         = groupsRepo;
     this.visitsRepo         = visitsRepo;
     this.metricSender       = metricSender;
 }
        private static void SetIpAddresses(string courseId, UlearnDb db, Dictionary <string, ApplicationUser> users, Dictionary <string, RegistrationData> regData)
        {
            var time   = DateTime.Now.AddMonths(-4);
            var visits = db.Visits
                         .Where(v =>
                                v.Timestamp > time &&
                                v.IpAddress != null &&
                                v.CourseId == courseId
                                )
                         .GroupBy(v => v.UserId)
                         .Select(kvp => kvp.OrderByDescending(v => v.Timestamp).FirstOrDefault())
                         .ToList()
                         .Where(v => users.ContainsKey(v.UserId))
                         .ToList();

            foreach (var visit in visits)
            {
                var userId = visit.User.Id;
                var reg    = regData[userId];
                reg.IpAddress = visit.IpAddress;
            }
        }
        public static void Run(UlearnDb db, string courseId, int groupId, Guid slideWithRegistrationQuiz, bool exportCode)
        {
            var regData = new Dictionary <string, RegistrationData>();

            var users = db.GroupMembers
                        .Where(gm => gm.GroupId == groupId)
                        .ToList()
                        .ToDictSafe(gm => gm.UserId, gm => gm.User);

            SetProfileData(users, regData);
            SetQuizAnswers(slideWithRegistrationQuiz, db, users, regData);
            SetIpAddresses(courseId, db, users, regData);

            var slides = new[]
            {
                "6e33f73a-67a3-47e2-9ec4-32fd3ec9f94f",
                "7d886a4b-c5da-4c84-b1d6-4f276b8a092e",
                "5185bf31-e336-4af4-9bd0-85b7e9593e9f",
                "d89b4498-dae6-481c-8ec5-7a8dd0e4eb1d",
                "4f2c38b5-891e-48a8-a202-a3f0239b5d45",
                "82f41a06-fcab-4aa2-ac59-a437eb4415fe"
            }.Select(s => new Guid(s)).ToArray();

            SetTasksCount(slides, regData, db);
            if (exportCode)
            {
                SetCode(db, slides, regData);
            }

            var regs = regData.Values.OrderBy(r => r.LastName).ThenBy(r => r.FirstName).ThenBy(r => r.Login).ToList();

            File.WriteAllText("students.tsv", "UserId\tFirstName\tLastName\tLogin\tEmail\tPhoneNumber\tCity\tUniversity\tSpecialty\tCourseNumber\tTasksCount\tIpAddress\r\n");
            File.WriteAllLines("students.tsv", regs.Select(v => $"{v.UserId}\t{v.FirstName}\t{v.LastName}\t{v.Login}\t{v.Email}\t{v.PhoneNumber}\t{v.City}\t{v.University}\t{v.Specialty}\t{v.CourseNumber}\t{v.TasksCount}\t{v.IpAddress}"));

            var json = JsonConvert.SerializeObject(regs);

            File.WriteAllText("students.json", json);
        }
Example #10
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);
            var ltiRequests        = await db.LtiRequests.Where(r => r.RequestId > 284927).OrderByDescending(r => r.RequestId).ToListAsync();

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

            var i = 0;

            foreach (var ltiRequest in ltiRequests)
            {
                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);

                i++;
                Console.WriteLine($"{i} requestId {ltiRequest.RequestId} score {score}");
            }
        }
Example #11
0
        public static async Task Main(string[] args)
        {
            var configuration = ApplicationConfiguration.Read <UlearnConfiguration>();

            LoggerSetup.Setup(configuration.HostLog, configuration.GraphiteServiceName);
            try
            {
                var optionsBuilder = new DbContextOptionsBuilder <UlearnDb>()
                                     .UseLazyLoadingProxies()
                                     .UseNpgsql(configuration.Database, o => o.SetPostgresVersion(13, 2));
                var db = new UlearnDb(optionsBuilder.Options);
                var aOptionsBuilder = new DbContextOptionsBuilder <AntiPlagiarismDb>()
                                      .UseLazyLoadingProxies()
                                      .UseNpgsql(configuration.Database, o => o.SetPostgresVersion(13, 2));
                var adb             = new AntiPlagiarismDb(aOptionsBuilder.Options);
                var serviceProvider = ConfigureDI(adb, db);
                await Run(adb, db, serviceProvider);
            }
            finally
            {
                await FileLog.FlushAllAsync();
            }
        }
Example #12
0
        private static void TextBlobsWithZeroByte(UlearnDb db)
        {
            int i      = 0;
            var hashes = new List <string>();

            foreach (var text in db.Texts.AsNoTracking())
            {
                if (text.Text.Contains('\0'))
                {
                    Console.WriteLine(i);
                    hashes.Add(text.Hash);
                    i++;
                }
            }
            i = 0;
            foreach (var hash in hashes)
            {
                var temp = db.Texts.Find(hash);
                temp.Text = temp.Text.Replace("\0", "");
                Console.WriteLine("s" + i);
                i++;
                db.SaveChanges();
            }
        }
Example #13
0
 public VisitsRepo(UlearnDb db)
 {
     this.db            = db;
     slideCheckingsRepo = new SlideCheckingsRepo(db);
 }
Example #14
0
 public TextsRepo(UlearnDb db)
 {
     this.db = db;
 }
Example #15
0
 public ExerciseStatisticsController(IWebCourseManager courseManager, IUserSolutionsRepo userSolutionsRepo, UlearnDb db, IUsersRepo usersRepo,
                                     IUserSolutionsRepo solutionsRepo, IUserQuizzesRepo userQuizzesRepo, IVisitsRepo visitsRepo, IGroupsRepo groupsRepo,
                                     SlideRenderer slideRenderer, ICourseRolesRepo courseRolesRepo, ICoursesRepo coursesRepo)
     : base(courseManager, db, usersRepo)
 {
     this.coursesRepo       = coursesRepo;
     this.courseRolesRepo   = courseRolesRepo;
     this.userSolutionsRepo = userSolutionsRepo;
     this.solutionsRepo     = solutionsRepo;
     this.userQuizzesRepo   = userQuizzesRepo;
     this.visitsRepo        = visitsRepo;
     this.groupsRepo        = groupsRepo;
     this.slideRenderer     = slideRenderer;
 }
 public UserFlashcardsUnlockingRepo(UlearnDb db)
 {
     this.db = db;
 }
        public NotificationsController(ILogger logger, WebCourseManager courseManager, UlearnDb db,
                                       IUsersRepo usersRepo,
                                       INotificationsRepo notificationsRepo, IFeedRepo feedRepo,
                                       IServiceProvider serviceProvider,
                                       INotificationDataPreloader notificationDataPreloader)
            : base(logger, courseManager, db, usersRepo)
        {
            this.notificationsRepo         = notificationsRepo ?? throw new ArgumentNullException(nameof(notificationsRepo));
            this.feedRepo                  = feedRepo ?? throw new ArgumentNullException(nameof(feedRepo));
            this.serviceProvider           = serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider));
            this.notificationDataPreloader = notificationDataPreloader ?? throw new ArgumentNullException(nameof(notificationDataPreloader));

            if (commentsFeedNotificationTransport == null)
            {
                commentsFeedNotificationTransport = feedRepo.GetCommentsFeedNotificationTransport();
            }
        }
Example #18
0
 public FeedRepo(UlearnDb db)
 {
     this.db           = db;
     notificationsRepo = new NotificationsRepo(db);
     visitsRepo        = new VisitsRepo(db);
 }
Example #19
0
 private static void CampusRegistration(UlearnDb db)
 {
     ManualUtils.CampusRegistration.Run(db, courseId: "Campus1920", groupId: 803, slideWithRegistrationQuiz: new Guid("67bf45bd-bebc-4bde-a705-c16763b94678"), false);
 }
Example #20
0
 public StepikRepo(UlearnDb db)
 {
     this.db = db;
 }
Example #21
0
 public LtiConsumersRepo(UlearnDb db)
 {
     this.db = db;
 }
Example #22
0
 public WorkQueueRepo(UlearnDb db)
 {
     this.db = db;
 }
Example #23
0
 public LtiRequestsRepo(UlearnDb db)
 {
     this.db    = db;
     serializer = new JsonSerializer();
 }
Example #24
0
 public SystemAccessesRepo(UlearnDb db, IUsersRepo usersRepo)
 {
     this.db        = db;
     this.usersRepo = usersRepo;
 }
Example #25
0
 public XQueueRepo(UlearnDb db, UlearnUserManager userManager, IUserSolutionsRepo userSolutionsRepo)
 {
     this.db                = db;
     this.userManager       = userManager;
     this.userSolutionsRepo = userSolutionsRepo;
 }
Example #26
0
 public LtiRequestsRepo(UlearnDb db)
 {
     this.db = db;
 }
Example #27
0
 public SearcherByUserId(UlearnDb db)
 {
     this.db = db;
 }
Example #28
0
 public UnitsRepo(UlearnDb db)
 {
     this.db = db;
 }
Example #29
0
 public GradersRepo(UlearnDb db, UlearnUserManager userManager)
 {
     this.db          = db;
     this.userManager = userManager;
 }
Example #30
0
 public AdditionalScoresRepo(UlearnDb db)
 {
     this.db = db;
 }