Exemple #1
0
        public async Task <ActionResult> ExportGroupMembersAsTsv([Required] int groupId, Guid?quizSlideId = null)
        {
            var group = await groupsRepo.FindGroupByIdAsync(groupId).ConfigureAwait(false);

            if (group == null)
            {
                return(StatusCode((int)HttpStatusCode.NotFound, "Group not found"));
            }

            var isSystemAdministrator = await IsSystemAdministratorAsync().ConfigureAwait(false);

            var isCourseAdmin = await courseRolesRepo.HasUserAccessToCourseAsync(UserId, group.CourseId, CourseRoleType.CourseAdmin).ConfigureAwait(false);

            if (!(isSystemAdministrator || isCourseAdmin))
            {
                return(StatusCode((int)HttpStatusCode.Forbidden, "You should be course or system admin"));
            }

            var users = await groupMembersRepo.GetGroupMembersAsUsersAsync(groupId).ConfigureAwait(false);

            var extendedUserInfo = await GetExtendedUserInfo(users).ConfigureAwait(false);

            List <string> questions = null;
            var           courseId  = group.CourseId;
            var           course    = await courseManager.GetCourseAsync(courseId);

            if (quizSlideId != null)
            {
                var slide = course.FindSlideById(quizSlideId.Value, false);
                if (slide == null)
                {
                    return(StatusCode((int)HttpStatusCode.NotFound, $"Slide not found in course {courseId}"));
                }

                if (!(slide is QuizSlide quizSlide))
                {
                    return(StatusCode((int)HttpStatusCode.NotFound, $"Slide is not quiz slide in course {courseId}"));
                }

                List <List <string> > answers;
                (questions, answers) = await GetQuizAnswers(users, courseId, quizSlide).ConfigureAwait(false);

                extendedUserInfo = extendedUserInfo.Zip(answers, (u, a) => { u.Answers = a; return(u); }).ToList();
            }

            var slides = course.GetSlides(false).Where(s => s.ShouldBeSolved).Select(s => s.Id).ToList();
            var scores = GetScoresByScoringGroups(users.Select(u => u.Id).ToList(), slides, course);
            var scoringGroupsWithScores = scores.Select(kvp => kvp.Key.ScoringGroup).ToHashSet();
            var scoringGroups           = course.Settings.Scoring.Groups.Values.Where(sg => scoringGroupsWithScores.Contains(sg.Id)).ToList();

            var headers = new List <string> {
                "Id", "Login", "Email", "FirstName", "LastName", "VisibleName", "Gender", "LastVisit", "IpAddress"
            };

            if (questions != null)
            {
                headers = headers.Concat(questions).ToList();
            }
            if (scoringGroups.Count > 0)
            {
                headers = headers.Concat(scoringGroups.Select(s => s.Abbreviation)).ToList();
            }

            var rows = new List <List <string> > {
                headers
            };

            foreach (var i in extendedUserInfo)
            {
                var row = new List <string> {
                    i.Id, i.Login, i.Email, i.FirstName, i.LastName, i.VisibleName, i.Gender.ToString(), i.LastVisit.ToSortableDate(), i.IpAddress
                };
                if (i.Answers != null)
                {
                    row = row.Concat(i.Answers).ToList();
                }
                row.AddRange(scoringGroups.Select(scoringGroup => (scores.ContainsKey((i.Id, scoringGroup.Id)) ? scores[(i.Id, scoringGroup.Id)] : 0).ToString()));