public IQueryable<UserExerciseSubmission> GetAllSubmissionsByUsers(SubmissionsFilterOptions filterOptions) { var submissions = GetAllSubmissions(filterOptions.CourseId, filterOptions.SlideIds); if (filterOptions.IsUserIdsSupplement) submissions = submissions.Where(s => !filterOptions.UserIds.Contains(s.UserId)); else submissions = submissions.Where(s => filterOptions.UserIds.Contains(s.UserId)); return submissions; }
private StudentSubmissionsModel GetStudentSubmissionsModel(string courseId, Guid slideId, string name) { const int maxUsersCount = 30; var course = courseManager.GetCourse(courseId); var slide = course.GetSlideById(slideId) as ExerciseSlide; if (slide == null) { throw new HttpResponseException(HttpStatusCode.NotFound); } var canViewAllSubmissions = User.HasAccessFor(courseId, CourseRole.CourseAdmin) || User.HasCourseAccess(courseId, CourseAccessType.ViewAllStudentsSubmissions); var hasFilterByName = !string.IsNullOrEmpty(name); /* By default show members of `my` groups, but if filter is enabled course admin's and users with special access can view any student's submissions */ SubmissionsFilterOptions filterOptions; var slideIdInList = new List <Guid> { slideId }; var visitedUserIds = visitsRepo.GetVisitsInPeriod(new VisitsFilterOptions { CourseId = courseId, SlidesIds = slideIdInList, PeriodStart = DateTime.MinValue, PeriodFinish = DateTime.MaxValue }) .Select(v => v.UserId) .ToList(); if (hasFilterByName && canViewAllSubmissions) { /* Get all members who has visits to this slide */ filterOptions = new SubmissionsFilterOptions { CourseId = courseId, UserIds = visitedUserIds, SlideIds = slideIdInList, }; } else { /* Get members of `my` groups */ filterOptions = ControllerUtils.GetFilterOptionsByGroup <SubmissionsFilterOptions>(groupsRepo, User, courseId, groupsIds: new List <string>()); filterOptions.SlideIds = slideIdInList; /* Filter out only users with visits to this slide */ filterOptions.UserIds = filterOptions.UserIds.Intersect(visitedUserIds).ToList(); } if (hasFilterByName) { var filteredUserIds = usersRepo.FilterUsersByNamePrefix(name); filterOptions.UserIds = filterOptions.UserIds.Intersect(filteredUserIds).ToList(); } filterOptions.UserIds = filterOptions.UserIds.Take(maxUsersCount).ToList(); var submissions = userSolutionsRepo.GetAllSubmissionsByUsers(filterOptions); var submissionsByUser = submissions.GroupBy(s => s.UserId).ToDictionary(g => g.Key, g => g.ToList()).ToDefaultDictionary(); var automaticCheckingScores = slideCheckingsRepo.GetAutomaticScoresForSlide(courseId, slideId, filterOptions.UserIds); var manualCheckingScores = slideCheckingsRepo.GetManualScoresForSlide(courseId, slideId, filterOptions.UserIds); var userGroups = groupsRepo.GetUsersGroupsNamesAsStrings(courseId, filterOptions.UserIds, User).ToDefaultDictionary(); return(new StudentSubmissionsModel { CourseId = courseId, Slide = slide, Users = usersRepo.GetUsersByIds(filterOptions.UserIds).ToDictionary(u => u.Id), SubmissionsByUser = submissionsByUser, AutomaticCheckingScores = automaticCheckingScores, ManualCheckingScores = manualCheckingScores, HasFilterByName = hasFilterByName, UserGroups = userGroups, }); }