/// <summary>
        /// Returns the assignment results for the given set of submissions.
        /// </summary>
        public IList <SectionAssignmentResults> GetAssignmentGroupResultsSnapshot(
            IList <Assignment> assignments,
            IList <User> users,
            Section section,
            IList <UserQuestionSubmission> submissions,
            DateTime snapshotDate)
        {
            var sectionAssignments = _assignmentFilter.FilterAssignments
                                     (
                assignments,
                section,
                assignmentGroupName: null,
                maxDueDate: snapshotDate
                                     );

            var assignmentGroups = _assignmentFilter.GetAssignmentGroups
                                   (
                section,
                sectionAssignments
                                   );

            var sectionAssignmentSubmissions = _assignmentFilter.FilterSubmissions
                                               (
                sectionAssignments,
                submissions,
                null /*user*/,
                snapshotDate
                                               );

            var submissionsByGroup = sectionAssignmentSubmissions.GroupBy
                                     (
                submission => submission.UserQuestionData
                .AssignmentQuestion
                .Assignment
                .GroupName
                                     ).ToDictionary(g => g.Key, g => g.ToList());

            return(assignmentGroups.Select
                   (
                       assignmentGroup => _sectionAssignmentReportGenerator
                       .GetSectionAssignmentGroupResults
                       (
                           assignmentGroup.Key,
                           assignmentGroup.ToList(),
                           section,
                           users,
                           submissionsByGroup.GetValueOrNew(assignmentGroup.Key)
                       )
                   ).ToList());
        }
        /// <summary>
        /// Calculates the scores of all assignment groups for a given student.
        /// </summary>
        public StudentAssignmentResults GetStudentAssignmentGroupResults(
            User user,
            Section section,
            IList <Assignment> assignments,
            IList <UserQuestionSubmission> submissions,
            bool admin)
        {
            var sectionAssignments = _assignmentFilter.FilterAssignments
                                     (
                assignments,
                section
                                     );

            var userSubmissions = _assignmentFilter.FilterSubmissions
                                  (
                sectionAssignments,
                submissions,
                user
                                  );

            var assignmentGroups = _assignmentFilter.GetAssignmentGroups
                                   (
                section,
                sectionAssignments
                                   );

            var assignmentGroupResults = assignmentGroups.Select
                                         (
                assignmentGroup => _assignmentGroupResultGenerator.GetAssignmentGroupResult
                (
                    assignmentGroup.Key,
                    assignmentGroup.ToList(),
                    section,
                    user,
                    userSubmissions,
                    admin
                )
                                         ).ToList();

            return(new StudentAssignmentResults
                   (
                       user.LastName,
                       user.FirstName,
                       section?.DisplayName,
                       assignmentGroupResults
                   ));
        }