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; }
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); }
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; } }
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); }
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}"); } }
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(); } }
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(); } }
public VisitsRepo(UlearnDb db) { this.db = db; slideCheckingsRepo = new SlideCheckingsRepo(db); }
public TextsRepo(UlearnDb db) { this.db = db; }
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(); } }
public FeedRepo(UlearnDb db) { this.db = db; notificationsRepo = new NotificationsRepo(db); visitsRepo = new VisitsRepo(db); }
private static void CampusRegistration(UlearnDb db) { ManualUtils.CampusRegistration.Run(db, courseId: "Campus1920", groupId: 803, slideWithRegistrationQuiz: new Guid("67bf45bd-bebc-4bde-a705-c16763b94678"), false); }
public StepikRepo(UlearnDb db) { this.db = db; }
public LtiConsumersRepo(UlearnDb db) { this.db = db; }
public WorkQueueRepo(UlearnDb db) { this.db = db; }
public LtiRequestsRepo(UlearnDb db) { this.db = db; serializer = new JsonSerializer(); }
public SystemAccessesRepo(UlearnDb db, IUsersRepo usersRepo) { this.db = db; this.usersRepo = usersRepo; }
public XQueueRepo(UlearnDb db, UlearnUserManager userManager, IUserSolutionsRepo userSolutionsRepo) { this.db = db; this.userManager = userManager; this.userSolutionsRepo = userSolutionsRepo; }
public LtiRequestsRepo(UlearnDb db) { this.db = db; }
public SearcherByUserId(UlearnDb db) { this.db = db; }
public UnitsRepo(UlearnDb db) { this.db = db; }
public GradersRepo(UlearnDb db, UlearnUserManager userManager) { this.db = db; this.userManager = userManager; }
public AdditionalScoresRepo(UlearnDb db) { this.db = db; }