/// <summary> /// Raises the <see cref="E:System.Web.UI.Control.Load" /> event. /// </summary> /// <param name="e">The <see cref="T:System.EventArgs" /> object that contains the event data.</param> protected override void OnLoad(EventArgs e) { base.OnLoad(e); if (!Page.IsPostBack) { var categoryGuids = GetAttributeValue(AttributeKeys.Categories) .SplitDelimitedValues() .Select(i => i.AsGuid()) .ToList(); RockContext rockContext = new RockContext(); CategoryService categoryService = new CategoryService(rockContext); var categoryIds = categoryService.Queryable() .Where(c => categoryGuids.Contains(c.Guid)) .Select(c => c.Id) .ToList(); CourseRequirementStatusService courseRequirementStatusService = new CourseRequirementStatusService(rockContext); var statusQry = courseRequirementStatusService.Queryable() .Where(s => s.PersonAlias.PersonId == CurrentPersonId); CourseRecordService courseRecordService = new CourseRecordService(rockContext); var recordQueryable = courseRecordService.Queryable() .GroupJoin(statusQry, r => r.CourseId, s => s.CourseRequirement.CourseId, (r, s) => new { Record = r, Statuses = s } ) .Where(r => r.Record.PersonAlias.PersonId == CurrentPersonId) .OrderByDescending(r => r.Record.CompletionDateTime); CourseService courseService = new CourseService(rockContext); var courses = courseService.Queryable() .Where(c => c.IsActive) .Where(c => categoryIds.Contains(c.CategoryId ?? 0)) .GroupJoin(recordQueryable, c => c.Id, r => r.Record.CourseId, (c, r) => new { Course = c, Records = r, Category = c.Category }) .ToList(); var courseItems = new List <PersonCourseInfo>(); foreach (var course in courses) { if (!course.Course.PersonCanView(CurrentPerson)) { continue; } var courseItem = new PersonCourseInfo() { Course = course.Course, Category = course.Category, IsComplete = false }; var completedRecords = course.Records.Where(r => r.Record.Passed).ToList(); if (completedRecords.Any()) { var completedCourse = completedRecords.First(); courseItem.IsComplete = true; courseItem.CompletedDateTime = completedCourse.Record.CompletionDateTime; var expired = completedCourse.Statuses .Where(s => s.State == CourseRequirementState.Expired).Any(); if (expired) { courseItem.IsExpired = true; } } courseItems.Add(courseItem); } var mergeFields = LavaHelper.GetCommonMergeFields(RockPage, CurrentPerson); mergeFields.Add("CourseItems", courseItems); ltOutput.Text = GetAttributeValue(AttributeKeys.LavaTemplate).ResolveMergeFields(mergeFields); } }
private static List <PersonCourseInfo> PersonCourseInfo(DotLiquid.Context context, Person person, List <int> categoryIds) { var currentPerson = GetCurrentPerson(context); RockContext rockContext = new RockContext(); CourseService courseService = new CourseService(rockContext); CourseRecordService courseRecordService = new CourseRecordService(rockContext); var courseRecordQry = courseRecordService.Queryable().Where(r => r.PersonAlias.PersonId == person.Id); var courseItems = new List <PersonCourseInfo>(); CourseRequirementStatusService courseRequirementStatusService = new CourseRequirementStatusService(rockContext); var statusQry = courseRequirementStatusService.Queryable() .Where(s => s.PersonAlias.PersonId == person.Id); var recordQueryable = courseRecordService.Queryable() .GroupJoin(statusQry, r => r.CourseId, s => s.CourseRequirement.CourseId, (r, s) => new { Record = r, Statuses = s } ) .Where(r => r.Record.PersonAlias.PersonId == person.Id) .OrderByDescending(r => r.Record.CompletionDateTime); var courses = courseService.Queryable() .Where(c => c.IsActive) .Where(c => categoryIds.Contains(c.CategoryId ?? 0)) .GroupJoin(recordQueryable, c => c.Id, r => r.Record.CourseId, (c, r) => new { Course = c, Records = r, Category = c.Category }) .ToList(); foreach (var course in courses) { if (course.Course.IsAuthorized(Rock.Security.Authorization.VIEW, currentPerson)) { var courseItem = new PersonCourseInfo() { Course = course.Course, Category = course.Category, IsComplete = false }; var completedRecords = course.Records.Where(r => r.Record.Passed).ToList(); if (completedRecords.Any()) { var completedCourse = completedRecords.First(); courseItem.IsComplete = true; courseItem.CompletedDateTime = completedCourse.Record.CompletionDateTime; var expired = completedCourse.Statuses .Where(s => s.State == CourseRequirementState.Expired).Any(); if (expired) { courseItem.IsExpired = true; } } courseItems.Add(courseItem); } } return(courseItems); }