Exemplo n.º 1
0
        private Slide GetInitialSlideForStartup(string courseId, IEnumerable <Unit> visibleUnits)
        {
            var userId        = User.Identity.GetUserId();
            var visitedIds    = visitsRepo.GetIdOfVisitedSlides(courseId, userId);
            var visibleSlides = visibleUnits.SelectMany(u => u.Slides).ToList();
            var lastVisited   = visibleSlides.LastOrDefault(slide => visitedIds.Contains(slide.Id));

            if (lastVisited == null)
            {
                return(visibleSlides.Any() ? visibleSlides.First() : null);
            }

            var unitSlides = lastVisited.Info.Unit.Slides.Where(s => visibleSlides.Contains(s)).ToList();

            var lastVisitedSlide = unitSlides.First();

            foreach (var slide in unitSlides)
            {
                if (visitedIds.Contains(slide.Id))
                {
                    lastVisitedSlide = slide;
                }
                else
                {
                    return(lastVisitedSlide);
                }
            }
            return(lastVisitedSlide);
        }
Exemplo n.º 2
0
        private Slide GetInitialSlideForStartup(string courseId, List <Unit> orderedVisibleUnits, bool isInstructor)
        {
            var userId               = User.Identity.GetUserId();
            var lastVisit            = visitsRepo.FindLastVisit(courseId, userId);
            var orderedVisibleSlides = orderedVisibleUnits.SelectMany(u => u.GetSlides(isInstructor)).ToList();

            if (lastVisit != null)
            {
                var lastVisitedSlide = orderedVisibleSlides.FirstOrDefault(s => s.Id == lastVisit.SlideId);
                if (lastVisitedSlide != null)
                {
                    return(lastVisitedSlide);
                }
                if (isInstructor)
                {
                    var instructorNoteSlide = orderedVisibleUnits.FirstOrDefault(u => u.Id == lastVisit.SlideId)?.InstructorNote?.Slide;
                    if (instructorNoteSlide != null)
                    {
                        return(instructorNoteSlide);
                    }
                }
            }

            var unorderedVisitedIds     = visitsRepo.GetIdOfVisitedSlides(courseId, userId);
            var lastVisitedVisibleSlide = orderedVisibleSlides.LastOrDefault(slide => unorderedVisitedIds.Contains(slide.Id));

            if (lastVisitedVisibleSlide != null)
            {
                return(lastVisitedVisibleSlide);
            }
            return(orderedVisibleSlides.Any() ? orderedVisibleSlides.First() : null);
        }
Exemplo n.º 3
0
        private int GetInitialIndexForStartup(string courseId, Course course, List <string> visibleUnits)
        {
            var userId        = User.Identity.GetUserId();
            var visitedIds    = visitsRepo.GetIdOfVisitedSlides(courseId, userId);
            var visibleSlides = course.Slides.Where(slide => visibleUnits.Contains(slide.Info.UnitName)).OrderBy(slide => slide.Index).ToList();
            var lastVisited   = visibleSlides.LastOrDefault(slide => visitedIds.Contains(slide.Id));

            if (lastVisited == null)
            {
                return(visibleSlides.Any() ? visibleSlides.First().Index : 0);
            }

            var slides = visibleSlides.Where(slide => lastVisited.Info.UnitName == slide.Info.UnitName).ToList();

            var lastVisitedSlide = slides.First().Index;

            foreach (var slide in slides)
            {
                if (visitedIds.Contains(slide.Id))
                {
                    lastVisitedSlide = slide.Index;
                }
                else
                {
                    return(lastVisitedSlide);
                }
            }
            return(lastVisitedSlide);
        }
        private TocModel CreateTocModel(Course course, Guid?currentSlideId, string userId)
        {
            var visibleUnits    = unitsRepo.GetVisibleUnits(course, User);
            var visited         = visitsRepo.GetIdOfVisitedSlides(course.Id, userId);
            var scoresForSlides = visitsRepo.GetScoresForSlides(course.Id, userId);

            var solvedSlidesIds = ControllerUtils.GetSolvedSlides(solutionsRepo, userQuizzesRepo, course, userId);
            var slidesWithUsersManualChecking      = visitsRepo.GetSlidesWithUsersManualChecking(course.Id, userId).ToImmutableHashSet();
            var enabledManualCheckingForUser       = groupsRepo.IsManualCheckingEnabledForUser(course, userId);
            Func <Slide, int> getSlideMaxScoreFunc = s => ControllerUtils.GetMaxScoreForUsersSlide(s, solvedSlidesIds.Contains(s.Id), slidesWithUsersManualChecking.Contains(s.Id), enabledManualCheckingForUser);

            var userGroupsIds           = groupsRepo.GetUserGroupsIds(course.Id, userId);
            var enabledScoringGroupsIds = groupsRepo.GetEnabledAdditionalScoringGroups(course.Id)
                                          .Where(e => userGroupsIds.Contains(e.GroupId))
                                          .Select(e => e.ScoringGroupId)
                                          .ToList();
            var additionalScores = additionalScoresRepo.GetAdditionalScoresForUser(course.Id, userId);

            var builder = new TocModelBuilder(
                s => Url.RouteUrl("Course.SlideById", new { courseId = course.Id, slideId = s.Url }),
                s => scoresForSlides.ContainsKey(s.Id) ? scoresForSlides[s.Id] : 0,
                getSlideMaxScoreFunc,
                (u, g) => additionalScores.GetOrDefault(Tuple.Create(u.Id, g.Id), 0),
                course,
                currentSlideId)
            {
                GetUnitInstructionNotesUrl = unit => Url.Action("InstructorNote", "Course", new { courseId = course.Id, unitId = unit.Id }),
                GetUnitStatisticsUrl       = unit => Url.Action("UnitStatistics", "Analytics", new { courseId = course.Id, unitId = unit.Id }),
                IsInstructor  = User.HasAccessFor(course.Id, CourseRole.Instructor),
                IsSolved      = s => solvedSlidesIds.Contains(s.Id),
                IsVisited     = s => visited.Contains(s.Id),
                IsUnitVisible = visibleUnits.Contains,
                IsSlideHidden = s => s is QuizSlide && ((QuizSlide)s).ManualChecking &&
                                !enabledManualCheckingForUser && !solvedSlidesIds.Contains(s.Id),
                EnabledScoringGroupsIds = enabledScoringGroupsIds,
            };

            var userGroups             = groupsRepo.GetUserGroups(course.Id, User.Identity.GetUserId());
            var tocGroupsForStatistics = userGroups.Select(g => new TocGroupForStatistics
            {
                GroupName     = g.Name,
                StatisticsUrl = Url.Action("CourseStatistics", "Analytics", new { courseId = course.Id, group = g.Id })
            });
            var toc = builder.CreateTocModel(tocGroupsForStatistics.ToList());

            toc.NextUnitTime = unitsRepo.GetNextUnitPublishTime(course.Id);
            return(toc);
        }
        private TocModel CreateTocModel(Course course, int slideIndex, string userId)
        {
            var visibleUnits    = unitsRepo.GetVisibleUnits(course.Id, User);
            var solved          = GetSolvedSlides(course, userId);
            var visited         = visitsRepo.GetIdOfVisitedSlides(course.Id, userId);
            var scoresForSlides = visitsRepo.GetScoresForSlides(course.Id, userId);
            var builder         = new TocModelBuilder(
                s => Url.Action("Slide", "Course", new { courseId = course.Id, slideIndex = s.Index }),
                s => scoresForSlides.ContainsKey(s.Id) ? scoresForSlides[s.Id] : 0,
                course,
                slideIndex);

            builder.GetUnitInstructionNotesUrl = unitName => Url.Action("InstructorNote", "Course", new { courseId = course.Id, unitName });
            builder.GetUnitStatisticsUrl       = unitName => Url.Action("UnitStatistics", "Analytics", new { courseId = course.Id, unitName });
            builder.IsInstructor  = User.HasAccessFor(course.Id, CourseRole.Instructor);
            builder.IsSolved      = s => solved.Contains(s.Id);
            builder.IsVisited     = s => visited.Contains(s.Id);
            builder.IsUnitVisible = visibleUnits.Contains;
            var toc = builder.CreateTocModel();

            toc.NextUnitTime = unitsRepo.GetNextUnitPublishTime(course.Id);
            return(toc);
        }