public void ProcessRequest(HttpContext context) { request = context.Request; response = context.Response; string cacheKey = "Rock:GetChannelFeed:" + request.RawUrl; var contentCache = RockCache.Get(cacheKey); var mimeTypeCache = RockCache.Get(cacheKey + ":MimeType"); if (mimeTypeCache != null && contentCache != null) { response.ContentType = ( string )mimeTypeCache; response.Write(( string )contentCache); response.StatusCode = 200; return; } if (request.HttpMethod != "GET" && request.HttpMethod != "HEAD") { response.TrySkipIisCustomErrors = true; response.StatusCode = 405; response.Headers.Add("Allow", "GET"); response.Write("Invalid request method."); return; } if (request.QueryString["ChannelId"] == null) { response.TrySkipIisCustomErrors = true; response.StatusCode = 400; response.Write("A ChannelId is required."); return; } int?channelId = request.QueryString["ChannelId"].AsIntegerOrNull(); if (channelId == null) { response.TrySkipIisCustomErrors = true; response.StatusCode = 400; response.Write("Invalid channel id."); return; } var channel = ContentChannelCache.Get(channelId.Value); if (channel == null) { response.TrySkipIisCustomErrors = true; response.StatusCode = 404; response.Write("Channel does not exist."); return; } if (!channel.EnableRss) { response.TrySkipIisCustomErrors = true; response.StatusCode = 403; response.Write("RSS is not enabled for this channel."); return; } DefinedValueCache dvRssTemplate = null; if (request.QueryString["TemplateId"] != null) { int?templateDefinedValueId = request.QueryString["TemplateId"].AsIntegerOrNull(); if (templateDefinedValueId == null) { response.TrySkipIisCustomErrors = true; response.StatusCode = 400; response.Write("Invalid template id."); return; } dvRssTemplate = DefinedValueCache.Get(templateDefinedValueId.Value); } if (dvRssTemplate == null) { dvRssTemplate = DefinedValueCache.Get(Rock.SystemGuid.DefinedValue.DEFAULT_RSS_CHANNEL); } if (dvRssTemplate.DefinedType.Guid != new Guid(Rock.SystemGuid.DefinedType.LAVA_TEMPLATES)) { response.TrySkipIisCustomErrors = true; response.StatusCode = 400; response.Write("Invalid template id."); return; } string rssTemplate = dvRssTemplate.GetAttributeValue("Template"); if (string.IsNullOrWhiteSpace(dvRssTemplate.GetAttributeValue("MimeType"))) { response.ContentType = "application/rss+xml"; } else { response.ContentType = dvRssTemplate.GetAttributeValue("MimeType"); } if (request.HttpMethod == "HEAD") { response.StatusCode = 200; return; } // load merge fields var mergeFields = Rock.Lava.LavaHelper.GetCommonMergeFields(null); mergeFields.Add("Channel", channel); Dictionary <string, object> requestObjects = new Dictionary <string, object>(); requestObjects.Add("Scheme", request.Url.Scheme); requestObjects.Add("Host", WebRequestHelper.GetHostNameFromRequest(context)); requestObjects.Add("Authority", request.Url.Authority); requestObjects.Add("LocalPath", request.Url.LocalPath); requestObjects.Add("AbsoluteUri", request.Url.AbsoluteUri); requestObjects.Add("AbsolutePath", request.Url.AbsolutePath); requestObjects.Add("Port", request.Url.Port); requestObjects.Add("Query", request.Url.Query); requestObjects.Add("OriginalString", request.Url.OriginalString); mergeFields.Add("Request", requestObjects); // check for new rss item limit if (request.QueryString["Count"] != null) { int.TryParse(request.QueryString["Count"], out rssItemLimit); } // get channel items var rockContext = new RockContext(); ContentChannelItemService contentService = new ContentChannelItemService(rockContext); var content = contentService.Queryable().AsNoTracking().Where(c => c.ContentChannelId == channel.Id && c.StartDateTime <= RockDateTime.Now); if (!channel.ContentChannelType.DisableStatus && channel.RequiresApproval) { content = content.Where(cci => cci.Status == ContentChannelItemStatus.Approved); } if (channel.ContentChannelType.DateRangeType == ContentChannelDateType.DateRange) { if (channel.ContentChannelType.IncludeTime) { content = content.Where(c => !c.ExpireDateTime.HasValue || c.ExpireDateTime >= RockDateTime.Now); } else { content = content.Where(c => !c.ExpireDateTime.HasValue || c.ExpireDateTime > RockDateTime.Today); } } if (channel.ItemsManuallyOrdered) { content = content.OrderBy(c => c.Order); } else { content = content.OrderByDescending(c => c.StartDateTime); } var contentItems = content.Take(rssItemLimit).ToList(); foreach (var item in contentItems) { item.Content = item.Content.ResolveMergeFields(mergeFields); // resolve any relative links var globalAttributes = GlobalAttributesCache.Get(); string publicAppRoot = globalAttributes.GetValue("PublicApplicationRoot").EnsureTrailingForwardslash(); item.Content = item.Content.Replace(@" src=""/", @" src=""" + publicAppRoot); item.Content = item.Content.Replace(@" href=""/", @" href=""" + publicAppRoot); // get item attributes and add them as elements to the feed item.LoadAttributes(rockContext); foreach (var attributeValue in item.AttributeValues) { attributeValue.Value.Value = attributeValue.Value.Value.ResolveMergeFields(mergeFields); } } mergeFields.Add("Items", contentItems); mergeFields.Add("RockVersion", Rock.VersionInfo.VersionInfo.GetRockProductVersionNumber()); var outputContent = rssTemplate.ResolveMergeFields(mergeFields); response.Write(outputContent); var cacheDuration = dvRssTemplate.GetAttributeValue("CacheDuration").AsInteger(); if (cacheDuration > 0) { var expiration = RockDateTime.Now.AddMinutes(cacheDuration); if (expiration > RockDateTime.Now) { RockCache.AddOrUpdate(cacheKey + ":MimeType", null, response.ContentType, expiration); RockCache.AddOrUpdate(cacheKey, null, outputContent, expiration); } ; } }
/// <summary> /// Executes the specified workflow. /// </summary> /// <param name="rockContext">The rock context.</param> /// <param name="action">The workflow action.</param> /// <param name="entity">The entity.</param> /// <param name="errorMessages">The error messages.</param> /// <returns></returns> /// <exception cref="System.NotImplementedException"></exception> public override bool Execute(RockContext rockContext, Rock.Model.WorkflowAction action, Object entity, out List <string> errorMessages) { var checkInState = GetCheckInState(entity, out errorMessages); if (checkInState == null) { return(false); } var dataViewAttributeKey = string.Empty; var dataViewAttributeGuid = GetAttributeValue(action, "DataViewGroupAttribute").AsGuid(); if (dataViewAttributeGuid != Guid.Empty) { dataViewAttributeKey = AttributeCache.Get(dataViewAttributeGuid).Key; } var dataViewService = new DataViewService(new RockContext()); var family = checkInState.CheckIn.CurrentFamily; if (family != null) { var remove = GetAttributeValue(action, "Remove").AsBoolean(); foreach (var person in family.People) { foreach (var groupType in person.GroupTypes.ToList()) { foreach (var group in groupType.Groups.ToList()) { if (group.ExcludedByFilter == true) { continue; } var approvedPeopleGuid = group.Group.GetAttributeValue(dataViewAttributeKey); if (string.IsNullOrWhiteSpace(approvedPeopleGuid)) { continue; } //Get approved people dataview from cache or from db var approvedPeopleList = RockCache.Get(approvedPeopleGuid) as List <int>; if (approvedPeopleList == null) { DataView approvedPeople = dataViewService.Get(approvedPeopleGuid.AsGuid()); if (approvedPeople == null) { continue; } var errors = new List <string>(); var dbContext = approvedPeople.GetDbContext(); var approvedPeopleQry = (IQueryable <Person>)approvedPeople.GetQuery(null, dbContext, 30, out errors).AsNoTracking(); if (approvedPeopleQry != null) { try { approvedPeopleQry = approvedPeopleQry.Skip(0).Take(5000); approvedPeopleList = approvedPeopleQry.Select(e => e.Id).ToList(); RockCache.AddOrUpdate(approvedPeopleGuid, null, approvedPeopleList, RockDateTime.Now.AddMinutes(10), Constants.CACHE_TAG); } catch (Exception ex) { if (remove) { groupType.Groups.Remove(group); } else { group.ExcludedByFilter = true; } ExceptionLogService.LogException(ex); } } } if (approvedPeopleList != null && !approvedPeopleList.Contains(person.Person.Id)) { if (remove) { groupType.Groups.Remove(group); } else { group.ExcludedByFilter = true; } } } } } } return(true); }
/// <summary> /// Loads and displays the event item occurrences /// </summary> private void BindData() { List <int> campusIds = cblCampus.Items.OfType <ListItem>().Where(l => l.Selected).Select(a => a.Value.AsInteger()).ToList(); List <int> categories = cblCategory.Items.OfType <ListItem>().Where(l => l.Selected).Select(a => a.Value.AsInteger()).ToList(); var cacheKey = string.Format("{0}^{1}^{2}CalendarLava", string.Join("-", campusIds), string.Join("-", categories), BlockCache.Id.ToString()); var content = RockCache.Get(cacheKey, System.Globalization.CultureInfo.CurrentCulture.ToString()); if (content != null && !string.IsNullOrWhiteSpace(( string )content)) { lOutput.Text = ( string )content; return; } var rockContext = new RockContext(); var eventItemOccurrenceService = new EventItemOccurrenceService(rockContext); var attributeService = new AttributeService(rockContext); var attributeValueService = new AttributeValueService(rockContext); int calendarItemEntityTypeId = EntityTypeCache.GetId(typeof(EventCalendarItem)).Value; int eventItemOccurrenceEntityTypeId = EntityTypeCache.GetId(typeof(EventItemOccurrence)).Value; // Grab events var firstQry = eventItemOccurrenceService .Queryable("EventItem, EventItem.EventItemAudiences,Schedule") .Where(e => e.EventItem.EventCalendarItems.Any(i => i.EventCalendarId == _calendarId) && e.EventItem.IsActive && e.EventItem.IsApproved).ToList(); var qry = firstQry .GroupJoin( attributeValueService.Queryable().Where(av => av.Attribute.EntityTypeId == ( int? )calendarItemEntityTypeId || av.Attribute.EntityTypeId == ( int? )eventItemOccurrenceEntityTypeId), obj => obj.EventItem.EventCalendarItems.Where(i => i.EventCalendarId == _calendarId).Select(i => i.Id).FirstOrDefault(), av => av.EntityId, (obj, av) => new { EventItemOccurrence = obj, EventCalendarItemAttributeValues = av, }) .GroupJoin( attributeValueService.Queryable().Where(av => av.Attribute.EntityTypeId == ( int? )eventItemOccurrenceEntityTypeId), obj => obj.EventItemOccurrence.Id, av => av.EntityId, (obj, av) => new { EventItemOccurrence = obj.EventItemOccurrence, EventCalendarItemAttributeValues = obj.EventCalendarItemAttributeValues, EventItemOccurrenceAttributeValues = av } ); // Filter by campus if (campusIds.Any()) { qry = qry .Where(c => !c.EventItemOccurrence.CampusId.HasValue || // All campusIds.Contains(c.EventItemOccurrence.CampusId.Value)); } // Filter by Category if (categories.Any()) { qry = qry .Where(i => i.EventItemOccurrence.EventItem.EventItemAudiences .Any(c => categories.Contains(c.DefinedValueId))); } // Get the beginning and end dates var today = RockDateTime.Now; var filterStart = FilterStartDate.HasValue ? FilterStartDate.Value : today; var monthStart = new DateTime(filterStart.Year, filterStart.Month, 1); var rangeStart = monthStart.AddMonths(-1); var rangeEnd = monthStart.AddMonths(2); var beginDate = FilterStartDate.HasValue ? FilterStartDate.Value : rangeStart; var endDate = FilterEndDate.HasValue ? FilterEndDate.Value : rangeEnd; endDate = endDate.AddDays(1).AddMilliseconds(-1); var scheduleEntityType = EntityTypeCache.Get(Rock.SystemGuid.EntityType.SCHEDULE).Id; var attributeId = attributeService.Queryable() .Where(a => a.EntityTypeId == scheduleEntityType && a.Key == "NextStartDate") .FirstOrDefault() .Id; // Get the occurrences var occurrences = qry .Where(o => o.EventItemOccurrence.Schedule != null) .ToList(); var eventSchedules = occurrences.Select(o => o.EventItemOccurrence.Schedule.Id).ToList(); var schedules = attributeValueService.Queryable() .Where(av => av.AttributeId == attributeId) .Where(av => eventSchedules.Contains(av.EntityId ?? 0)) .ToDictionary(av => av.EntityId, av => av.Value); var occurrencesWithDates = occurrences .Select(o => new EventOccurrenceDate { EventItemOccurrence = o.EventItemOccurrence, EventCalendarItemAttributeValues = o.EventCalendarItemAttributeValues, EventItemOccurrenceAttributeValues = o.EventItemOccurrenceAttributeValues, Date = schedules.ContainsKey(o.EventItemOccurrence.Schedule.Id) ? schedules[o.EventItemOccurrence.Schedule.Id].AsDateTime() ?? new DateTime() : new DateTime() }) .Where(d => d.Date >= RockDateTime.Today) .ToList(); var priorityAttributeKey = GetAttributeValue("PriorityAttributeKey"); var eventOccurrenceSummaries = new List <EventOccurrenceSummary>(); foreach (var occurrenceDates in occurrencesWithDates) { var eventItemOccurrence = occurrenceDates.EventItemOccurrence; if (occurrenceDates.Date >= beginDate && occurrenceDates.Date < endDate) { var primaryMinistry = DefinedValueCache.Get(occurrenceDates.EventCalendarItemAttributeValues.Where(av => av.AttributeKey == "PrimaryMinistry").Select(av => av.Value).FirstOrDefault()); var primaryMinistryImageGuid = ""; var primaryMinistryName = ""; if (primaryMinistry != null) { primaryMinistryName = primaryMinistry.Value; primaryMinistryImageGuid = primaryMinistry.GetAttributeValue("CalendarImage"); } eventOccurrenceSummaries.Add(new EventOccurrenceSummary { EventItemOccurrence = eventItemOccurrence, EventItem = eventItemOccurrence.EventItem, EventItemPhotoId = eventItemOccurrence.EventItem.PhotoId ?? 0, ICalendarContent = eventItemOccurrence.Schedule.iCalendarContent, Name = eventItemOccurrence.EventItem.Name, DateTime = occurrenceDates.Date, Date = occurrenceDates.Date.ToShortDateString(), Time = occurrenceDates.Date.ToShortTimeString(), Campus = eventItemOccurrence.Campus != null ? eventItemOccurrence.Campus.Name : "All Campuses", Location = eventItemOccurrence.Campus != null ? eventItemOccurrence.Campus.Name : "All Campuses", LocationDescription = eventItemOccurrence.Location, Description = eventItemOccurrence.EventItem.Description, Summary = eventItemOccurrence.EventItem.Summary, OccurrenceNote = eventItemOccurrence.Note.SanitizeHtml(), DetailPage = String.IsNullOrWhiteSpace(eventItemOccurrence.EventItem.DetailsUrl) ? null : eventItemOccurrence.EventItem.DetailsUrl, PrimaryMinistryImageGuid = primaryMinistryImageGuid, PrimaryMinstryTitle = primaryMinistryName, URLSlugs = occurrenceDates.EventCalendarItemAttributeValues.Where(av => av.AttributeKey == "URLSlugs").Select(av => av.Value).FirstOrDefault(), Priority = occurrenceDates.EventCalendarItemAttributeValues.Where(av => av.AttributeKey == priorityAttributeKey).Select(av => av.Value).FirstOrDefault().AsIntegerOrNull() ?? int.MaxValue, ImageHeaderText = occurrenceDates.EventCalendarItemAttributeValues.Where(av => av.AttributeKey == "ImageHeaderText").Select(av => av.Value).FirstOrDefault(), ImageHeaderTextSmall = occurrenceDates.EventCalendarItemAttributeValues.Where(av => av.AttributeKey == "ImageHeaderTextSmall").Select(av => av.Value).FirstOrDefault(), EventDatesHide = occurrenceDates.EventCalendarItemAttributeValues.Where(av => av.AttributeKey == "EventDatesHide").Select(av => av.Value).FirstOrDefault(), AttChildcareAvailable = occurrenceDates.EventItemOccurrenceAttributeValues.Where(av => av.AttributeKey == "ChildcareAvailable").Select(av => av.Value).FirstOrDefault(), AttScheduleText = occurrenceDates.EventItemOccurrenceAttributeValues.Where(av => av.AttributeKey == "ScheduleText").Select(av => av.Value).FirstOrDefault(), AttUseOnlyScheduleText = occurrenceDates.EventItemOccurrenceAttributeValues.Where(av => av.AttributeKey == "UseOnlyScheduleText").Select(av => av.Value).FirstOrDefault(), CustomDateText = occurrenceDates.EventCalendarItemAttributeValues.Where(av => av.AttributeKey == "CustomDateText").Select(av => av.Value).FirstOrDefault(), CustomLocationText = occurrenceDates.EventCalendarItemAttributeValues.Where(av => av.AttributeKey == "CustomLocationText").Select(av => av.Value).FirstOrDefault(), }); } } var eventSummaries = eventOccurrenceSummaries .OrderBy(e => e.DateTime) .GroupBy(e => e.Name) .OrderBy(e => e.First().Priority) .Select(e => e.ToList()) .Take(GetAttributeValue("Limit").AsInteger()) .ToList(); eventOccurrenceSummaries = eventOccurrenceSummaries .OrderBy(e => e.DateTime) .ThenBy(e => e.Name) .ToList(); var mergeFields = new Dictionary <string, object>(); mergeFields.Add("TimeFrame", ViewMode); mergeFields.Add("DetailsPage", LinkedPageRoute("DetailsPage")); mergeFields.Add("EventItems", eventSummaries); mergeFields.Add("EventItemOccurrences", eventOccurrenceSummaries); mergeFields.Add("CurrentPerson", CurrentPerson); var text = GetAttributeValue("LavaTemplate"); var commands = GetAttributeValue("EnabledLavaCommands"); lOutput.Text = text.ResolveMergeFields(mergeFields, commands); var minutes = GetAttributeValue("CacheDuration").AsInteger(); if (minutes > 0) { string cacheTags = GetAttributeValue("CacheTags") ?? string.Empty; RockCache.AddOrUpdate(cacheKey, System.Globalization.CultureInfo.CurrentCulture.ToString(), lOutput.Text, RockDateTime.Now.AddMinutes(minutes), cacheTags); } }
/// <summary> /// Renders the specified context. /// </summary> /// <param name="context">The context.</param> /// <param name="result">The result.</param> public override void Render(Context context, TextWriter result) { // First ensure that cached commands are allowed in the context if (!this.IsAuthorized(context)) { result.Write(string.Format(RockLavaBlockBase.NotAuthorizedMessage, this.Name)); base.Render(context, result); return; } var parms = ParseMarkup(_markup, context); var twoPassEnabled = parms["twopass"].AsBoolean(); var cacheKey = "lavacache-" + parms["key"]; if (cacheKey == string.Empty) { result.Write("* No cache key provided. *"); base.Render(context, result); return; } // Get content from cache var cachedResult = RockCache.Get(cacheKey) as CacheLavaTag; // Check that the cached value is current if (cachedResult != null) { var currentHash = CalculateContentHash(_blockMarkup.ToString()); if (currentHash != cachedResult.Hash) { cachedResult = null; } } // Use the cached value if (cachedResult != null) { if (twoPassEnabled) { result.Write(MergeLava(cachedResult.Content, context)); } else { result.Write(cachedResult.Content); } base.Render(context, result); return; } // Cached value not available so render the template and cache it var lavaResults = MergeLava(_blockMarkup.ToString(), context); var cacheDuration = parms["duration"].AsInteger(); if (cacheDuration > 0) { // Don't cache if it's too large var maxCacheSize = parms["maxcachesize"].AsInteger(); if (lavaResults.Length < maxCacheSize) { var expiration = RockDateTime.Now.AddSeconds(cacheDuration); var cachedHash = CalculateContentHash(_blockMarkup.ToString()); RockCache.AddOrUpdate(cacheKey, string.Empty, new CacheLavaTag { Hash = cachedHash, Content = lavaResults }, expiration, parms["tags"]); } } // If twopass is enabled run the lava again if (twoPassEnabled) { lavaResults = MergeLava(lavaResults, context); } result.Write(lavaResults); base.Render(context, result); }
/// <summary> /// Returns the cached HTML for a specific blockId or, if specified, a specific entityValue (Entity Context) /// </summary> /// <param name="blockId">The block identifier.</param> /// <param name="entityValue">The entity value.</param> /// <returns></returns> public static string GetCachedContent(int blockId, string entityValue) { string cacheKey = HtmlContentCacheKey(blockId, entityValue); return(RockCache.Get(cacheKey) as string); }
/// <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) { if (!Page.IsPostBack) { var output = RockCache.Get("TimedContentChannel_" + this.BlockId.ToString()); if (output != null) { ltOutput.Text = output as string; return; } RockContext rockContext = new RockContext(); ContentChannelService contentChannelService = new ContentChannelService(rockContext); ScheduleService scheduleService = new ScheduleService(rockContext); var cacheLength = GetAttributeValue("MaximumCache").AsDouble(); var contentChannelGuid = GetAttributeValue("ContentChannel").AsGuid(); var contentChannel = contentChannelService.Get(contentChannelGuid); if (contentChannel == null) { return; } var contentChannelItems = contentChannel.Items.OrderBy(i => i.Order).ToList(); List <ContentChannelItem> mergeItems = new List <ContentChannelItem>(); var scheduleKey = GetAttributeValue("TimerAttributeKey"); foreach (var item in contentChannelItems) { item.LoadAttributes(); var scheduleValue = item.GetAttributeValue(scheduleKey); if (scheduleValue.IsNotNullOrWhiteSpace()) { var schedule = scheduleService.Get(scheduleValue.AsGuid()); if (schedule == null) { continue; } if (schedule.WasScheduleActive(Rock.RockDateTime.Now)) { mergeItems.Add(item); var end = schedule.GetICalEvent().DtEnd; var tsEnd = new TimeSpan(end.Hour, end.Minute, end.Second); var endMinutes = (tsEnd - Rock.RockDateTime.Now.TimeOfDay).TotalSeconds; cacheLength = Math.Min(cacheLength, endMinutes); } else { var nextTime = schedule.GetNextStartDateTime(Rock.RockDateTime.Now); if (nextTime.HasValue) { var time = nextTime.Value - Rock.RockDateTime.Now; var minutes = time.TotalSeconds; cacheLength = Math.Min(cacheLength, minutes); } } } else { mergeItems.Add(item); } } var lava = GetAttributeValue("Lava"); var mergefields = Rock.Lava.LavaHelper.GetCommonMergeFields(this.RockPage, CurrentPerson); mergefields.Add("ContentChannelItems", mergeItems); lava = lava.ResolveMergeFields(mergefields, CurrentPerson, GetAttributeValue("EnabledLavaCommands")); ltOutput.Text = lava; if (cacheLength > 5) //the time could be low enough to throw an error { RockCache.AddOrUpdate("TimedContentChannel_" + this.BlockId.ToString(), "", lava, Rock.RockDateTime.Now.AddSeconds(cacheLength)); } } }
public IHttpActionResult GetSpeakerSeries(string slug = "", string speaker = "", int offset = 0) { var cacheKey = string.Format("api/sermonfeed/{0}/{1}/{2}", slug, speaker, offset); var output = RockCache.Get(cacheKey) as List <SermonSeries>; if (output != null) { return(Json(output)); } var now = Rock.RockDateTime.Now; string imageLocation = GlobalAttributesCache.Get().GetValue("PublicApplicationRoot").EnsureTrailingForwardslash() + "GetImage.ashx?Guid="; string audioLocation = GlobalAttributesCache.Get().GetValue("PublicApplicationRoot").EnsureTrailingForwardslash() + "GetFile.ashx?Guid="; RockContext rockContext = new RockContext(); var speakerQry = new AttributeValueService(rockContext).Queryable().Where(av => av.AttributeId == SPEAKER_ATTRIBUTE && av.Value == speaker); ContentChannelItemService contentChannelItemService = new ContentChannelItemService(rockContext); var sermonSeriesQry = contentChannelItemService.Queryable() .Where(i => i.ContentChannelId == CONTENT_CHANNEL) .Where(i => i.StartDateTime <= now && (i.ExpireDateTime == null || i.ExpireDateTime >= now)); if (!string.IsNullOrWhiteSpace(slug)) { sermonSeriesQry = sermonSeriesQry.Where(i => i.ContentChannelItemSlugs.Where(s => s.ContentChannelItemId == i.Id && s.Slug == slug).Any()); } var sermonSeriesList = sermonSeriesQry.SelectMany(i => i.ChildItems) .Select(i => i.ChildContentChannelItem) .Join( speakerQry, i => i.Id, a => a.EntityId, (i, a) => i ) .Select(i => i.ParentItems.FirstOrDefault().ContentChannelItem) .DistinctBy(i => i.Id) .OrderByDescending(i => i.StartDateTime) .Skip(offset) .Take(12) .ToList(); output = new List <SermonSeries>(); foreach (var seriesItem in sermonSeriesList) { seriesItem.LoadAttributes(); var sermonSeries = new SermonSeries { id = seriesItem.Id, title = seriesItem.Title, description = seriesItem.Content, slug = seriesItem.PrimarySlug, image = imageLocation + seriesItem.GetAttributeValue("Image"), image_url = imageLocation + seriesItem.GetAttributeValue("Image"), last_updated = ConvertTime(seriesItem.StartDateTime), sermons = new List <Sermon>() }; if (string.IsNullOrWhiteSpace(seriesItem.GetAttributeValue("Image"))) { var childItem = seriesItem.ChildItems.FirstOrDefault().ChildContentChannelItem; childItem.LoadAttributes(); sermonSeries.image_url = imageLocation + childItem.GetAttributeValue("Image"); sermonSeries.image = imageLocation + childItem.GetAttributeValue("Image"); } output.Add(sermonSeries); //add sermons to series foreach (var sermonItem in seriesItem.ChildItems .Where(s => s.ChildContentChannelItem.ContentChannelId == SERMON_CONTENT_CHANNEL) .Select(s => s.ChildContentChannelItem) .Where(s => s.StartDateTime <= now && (s.ExpireDateTime == null || s.ExpireDateTime >= now)) .ToList()) { sermonItem.LoadAttributes(); if (sermonItem.GetAttributeValue("Speaker").ToLower() != speaker.ToLower()) { continue; } sermonSeries.sermons.Add( new Sermon { id = sermonItem.Id, title = sermonItem.Title, description = sermonItem.Content, slug = sermonItem.PrimarySlug, audio_link = audioLocation + sermonItem.GetAttributeValue("Audio"), date = ConvertTime(sermonItem.StartDateTime), duration = sermonItem.GetAttributeValue("Duration").AsInteger(), image = imageLocation + sermonItem.GetAttributeValue("Image"), image_url = imageLocation + sermonItem.GetAttributeValue("Image"), speaker = sermonItem.GetAttributeValue("Speaker"), vimeo_id = sermonItem.GetAttributeValue("VimeoId").AsInteger() }); } } RockCache.AddOrUpdate(cacheKey, null, output, RockDateTime.Now.AddHours(1)); return(Json(output)); }
private static List <BreakoutGroupItem> GetBreakoutGroupItems(Person person) { List <BreakoutGroupItem> allBreakoutGroupItems = RockCache.Get(cacheKey) as List <BreakoutGroupItem>; if (allBreakoutGroupItems == null || !allBreakoutGroupItems.Any()) { allBreakoutGroupItems = new List <BreakoutGroupItem>(); RockContext rockContext = new RockContext(); var attributeService = new AttributeService(rockContext); var attributeValueService = new AttributeValueService(rockContext); var groupEntityTypeId = EntityTypeCache.GetId(typeof(Rock.Model.Group)); var breakoutGroupGroupTypeId = GroupTypeCache.GetId(Constants.GROUP_TYPE_BREAKOUT_GROUPS.AsGuid()); if (groupEntityTypeId == null || breakoutGroupGroupTypeId == null) { ExceptionLogService.LogException(new Exception("Could not load breakout groups due to missing breakoutgroup type")); return(new List <BreakoutGroupItem>()); } var letterAttribute = attributeService.GetByEntityTypeQualifier(groupEntityTypeId, "GroupTypeId", breakoutGroupGroupTypeId.Value.ToString(), false) .Where(a => a.Key == Constants.GROUP_ATTRIBUTE_KEY_LETTER) .FirstOrDefault(); if (letterAttribute == null) { ExceptionLogService.LogException(new Exception("Could not load breakout group letter attribute.")); return(new List <BreakoutGroupItem>()); } var attributeQueryable = attributeValueService.Queryable().AsNoTracking() .Where(av => letterAttribute.Id == av.AttributeId); //Get all the data in one go var breakoutData = new GroupService(rockContext) .Queryable() .AsNoTracking() .Where(g => g.GroupTypeId == breakoutGroupGroupTypeId && g.IsActive && !g.IsArchived) .Join(attributeQueryable, g => g.Id, av => av.EntityId, (g, av) => new { ScheduleId = g.ScheduleId ?? 0, PersonIds = g.Members.Where(gm => gm.IsArchived == false && gm.GroupMemberStatus == GroupMemberStatus.Active).Select(gm => gm.PersonId), Letter = av.Value }) .ToList(); foreach (var item in breakoutData) { foreach (var personId in item.PersonIds) { allBreakoutGroupItems.Add(new BreakoutGroupItem { Letter = item.Letter, PersonId = personId, ScheduleId = item.ScheduleId }); } } RockCache.AddOrUpdate(cacheKey, null, allBreakoutGroupItems, RockDateTime.Now.AddMinutes(10), Constants.CACHE_TAG); } return(allBreakoutGroupItems.Where(i => i.PersonId == person.Id).ToList()); }
private void ShowView() { var rockContext = new RockContext(); var missingConfiguration = new List <string>(); var contentChannelGuid = GetAttributeValue("ContentChannel").AsGuidOrNull(); if (!contentChannelGuid.HasValue) { missingConfiguration.Add("The content channel has not yet been configured."); } var blockTitleTemplate = GetAttributeValue("BlockTitleTemplate"); if (blockTitleTemplate.IsNullOrWhiteSpace()) { missingConfiguration.Add("The block title template appears to be blank."); } var bodyTemplate = GetAttributeValue("BodyTemplate"); if (bodyTemplate.IsNullOrWhiteSpace()) { missingConfiguration.Add("The body template appears to be blank."); } if (missingConfiguration.Count > 0) { StringBuilder message = new StringBuilder(); message.Append("Currently, there are some missing configuration items. These items are summarized below: <ul>"); foreach (var configurationItem in missingConfiguration) { message.Append(string.Format("<li>{0}</li>", configurationItem)); } message.Append("</ul>"); nbMessages.Text = message.ToString(); nbMessages.NotificationBoxType = NotificationBoxType.Validation; return; } var enabledLavaCommands = GetAttributeValue("EnabledLavaCommands"); var blockTitleIconCssClass = GetAttributeValue("BlockTitleIconCssClass"); var metricValueCount = GetAttributeValue("MetricValueCount").AsInteger(); var cacheDuration = GetAttributeValue("CacheDuration").AsInteger(); string cacheTags = GetAttributeValue("CacheTags") ?? string.Empty; var mergeFields = Rock.Lava.LavaHelper.GetCommonMergeFields(RockPage, CurrentPerson); var cacheKey = "internal-commmunication-view-" + this.BlockId.ToString(); ContentChannelItem contentChannelItem = null; List <MetricResult> metrics = null; var showPrev = false; CachedBlockData cachedItem = null; if (cacheDuration > 0 && _currentPage == 0) { var serializedCachedItem = RockCache.Get(cacheKey); if (serializedCachedItem != null && serializedCachedItem is string && !string.IsNullOrWhiteSpace(( string )serializedCachedItem)) { cachedItem = (( string )serializedCachedItem).FromJsonOrNull <CachedBlockData>(); } } if (cachedItem != null) { contentChannelItem = cachedItem.ContentChannelItem; metrics = cachedItem.Metrics; showPrev = cachedItem.ShowPrev; } else { // Get latest content channel items, get two so we know if a previous one exists for paging var contentChannelItems = new ContentChannelItemService(rockContext).Queryable().AsNoTracking() .Where(i => i.ContentChannel.Guid == contentChannelGuid && i.Status == ContentChannelItemStatus.Approved) .OrderByDescending(i => i.StartDateTime) .Take(2) .Skip(_currentPage) .ToList(); if (contentChannelItems.IsNull() || contentChannelItems.Count == 0) { nbMessages.Text = "It appears that there are no active communications to display for this content channel."; nbMessages.NotificationBoxType = NotificationBoxType.Info; return; } contentChannelItem = contentChannelItems.First(); showPrev = (contentChannelItems.Count > 1); // Get metrics var metricCategories = Rock.Attribute.MetricCategoriesFieldAttribute.GetValueAsGuidPairs(GetAttributeValue("Metrics")); var metricGuids = metricCategories.Select(a => a.MetricGuid).ToList(); metrics = new MetricService(rockContext).GetByGuids(metricGuids) .Select(m => new MetricResult { Id = m.Id, Title = m.Title, Description = m.Description, IconCssClass = m.IconCssClass, UnitsLabel = m.YAxisLabel, LastRunDateTime = m.MetricValues.OrderByDescending(v => v.MetricValueDateTime).Select(v => v.MetricValueDateTime).FirstOrDefault(), LastValue = m.MetricValues.OrderByDescending(v => v.MetricValueDateTime).Select(v => v.YValue).FirstOrDefault() }).ToList(); // Get metric values for each metric if requested if (metricValueCount > 0) { foreach (var metric in metrics) { metric.MetricValues = new MetricValueService(rockContext).Queryable() .Where(v => v.MetricId == metric.Id) .OrderByDescending(v => v.MetricValueDateTime) .Select(v => new MetricValue { DateTime = v.MetricValueDateTime, Value = v.YValue, Note = v.Note }) .Take(metricValueCount) .ToList(); } } // Set Cache if (cacheDuration > 0 && _currentPage == 0) { var cachedData = new CachedBlockData(); cachedData.ContentChannelItem = contentChannelItem.Clone(false); cachedData.ShowPrev = showPrev; cachedData.Metrics = metrics; var expiration = RockDateTime.Now.AddSeconds(cacheDuration); RockCache.AddOrUpdate(cacheKey, string.Empty, cachedData.ToJson(), expiration, cacheTags); } } mergeFields.Add("Item", contentChannelItem); mergeFields.Add("Metrics", metrics); lBlockTitleIcon.Text = string.Format("<i class='{0}'></i>", blockTitleIconCssClass); lBlockTitle.Text = blockTitleTemplate.ResolveMergeFields(mergeFields, enabledLavaCommands); lBlockBody.Text = bodyTemplate.ResolveMergeFields(mergeFields, enabledLavaCommands); // Determine if we can page backwards btnPrevious.Visible = showPrev; // Determine if we can page forwards btnNext.Visible = (_currentPage > 0); // Set the current page hidden field hfCurrentPage.Value = _currentPage.ToString(); }