Esempio n. 1
0
		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;
		}
Esempio n. 2
0
        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,
            });
        }