public ExerciseBlockResponse(AbstractExerciseBlock exerciseBlock, ExerciseSlideRendererContext context) { var reviewId2Comments = context.CodeReviewComments ?.GroupBy(c => c.ReviewId) .ToDictionary(g => g.Key, g => g.AsEnumerable()); if (exerciseBlock is PolygonExerciseBlock polygonExerciseBlock) { Languages = PolygonExerciseBlock.LanguagesInfo.Keys.ToArray(); LanguageInfo = PolygonExerciseBlock.LanguagesInfo; DefaultLanguage = polygonExerciseBlock.DefaultLanguage; } else { Languages = exerciseBlock.Language != null ? new[] { exerciseBlock.Language.Value } : new Language[0]; LanguageInfo = null; DefaultLanguage = null; } RenderedHints = exerciseBlock.Hints.Select(h => RenderHtmlWithHint(h, context.SlideFile)).ToArray(); ExerciseInitialCode = exerciseBlock.ExerciseInitialCode.RemoveEmptyLinesFromStart().TrimEnd().EnsureEnoughLines(4); HideSolutions = exerciseBlock.HideShowSolutionsButton; ExpectedOutput = exerciseBlock.HideExpectedOutputOnError ? null : exerciseBlock.ExpectedOutput?.NormalizeEoln(); AttemptsStatistics = context.AttemptsStatistics; Submissions = context.Submissions .EmptyIfNull() .Select(s => SubmissionInfo.Build(s, reviewId2Comments, context.CanSeeCheckerLogs)) .ToList(); }
private async Task <IEnumerable <IApiSlideBlock> > RenderBlock(AbstractExerciseBlock b, SlideRenderContext context) { var submissions = await solutionsRepo .GetAllSubmissionsByUser(context.CourseId, context.Slide.Id, context.UserId) .Include(s => s.AutomaticChecking).ThenInclude(c => c.Output) .Include(s => s.AutomaticChecking).ThenInclude(c => c.CompilationError) .Include(s => s.AutomaticChecking).ThenInclude(c => c.DebugLogs) .Include(s => s.SolutionCode) .Include(s => s.Reviews).ThenInclude(c => c.Author) .Include(s => s.ManualCheckings).ThenInclude(c => c.Reviews).ThenInclude(r => r.Author) .ToListAsync(); var codeReviewComments = await slideCheckingsRepo.GetExerciseCodeReviewComments(context.CourseId, context.Slide.Id, context.UserId); var isCourseAdmin = await courseRolesRepo.HasUserAccessToCourseAsync(context.UserId, context.CourseId, CourseRoleType.CourseAdmin); ExerciseAttemptsStatistics exerciseAttemptsStatistics = null; if (b.HasAutomaticChecking()) { var exerciseUsersCount = await slideCheckingsRepo.GetExerciseUsersCount(context.CourseId, context.Slide.Id); var exerciseUsersWithRightAnswerCount = await slideCheckingsRepo.GetExerciseUsersWithRightAnswerCount(context.CourseId, context.Slide.Id); var lastSuccessAttemptDate = await slideCheckingsRepo.GetExerciseLastRightAnswerDate(context.CourseId, context.Slide.Id); exerciseAttemptsStatistics = new ExerciseAttemptsStatistics { AttemptedUsersCount = exerciseUsersCount, UsersWithRightAnswerCount = exerciseUsersWithRightAnswerCount, LastSuccessAttemptDate = lastSuccessAttemptDate }; } var exerciseSlideRendererContext = new ExerciseSlideRendererContext { Submissions = submissions, CodeReviewComments = codeReviewComments, SlideFile = context.Slide.Info.SlideFile, CanSeeCheckerLogs = isCourseAdmin, AttemptsStatistics = exerciseAttemptsStatistics, }; return(new[] { new ExerciseBlockResponse(b, exerciseSlideRendererContext) }); }