/// <summary> /// Gets the connection opportunities queryable that matches the specified /// options. /// </summary> /// <param name="options">The filter to apply to the query.</param> /// <returns>A queryable of <see cref="ConnectionOpportunity"/> objects.</returns> /// <exception cref="System.InvalidOperationException">Context is not a RockContext.</exception> public IQueryable <ConnectionOpportunity> GetConnectionOpportunitiesQuery(ConnectionOpportunityQueryOptions options = null) { if (!(Context is RockContext rockContext)) { throw new InvalidOperationException("Context is not a RockContext."); } options = options ?? DefaultGetConnectionTypesOptions; var qry = Queryable(); if (options.ConnectionTypeGuids != null && options.ConnectionTypeGuids.Any()) { qry = qry.Where(o => options.ConnectionTypeGuids.Contains(o.ConnectionType.Guid)); } if (options.ConnectorPersonIds != null && options.ConnectorPersonIds.Any()) { var connectorRequestsQry = new ConnectionRequestService(rockContext).Queryable() .Where(r => r.ConnectionState != ConnectionState.Connected && r.ConnectorPersonAliasId.HasValue && options.ConnectorPersonIds.Contains(r.ConnectorPersonAlias.PersonId)) .Select(r => r.Id); qry = qry.Where(o => o.ConnectionRequests.Any(r => connectorRequestsQry.Contains(r.Id))); } if (!options.IncludeInactive) { qry = qry.Where(o => o.IsActive && o.ConnectionType.IsActive); } return(qry); }
/// <summary> /// Gets the connection opportunities view model that can be sent to the client. /// </summary> /// <param name="connectionTypeGuid">The connection type unique identifier.</param> /// <param name="filterViewModel">The filter.</param> /// <returns>The <see cref="GetContentViewModel"/> that contains the information about the response.</returns> private GetContentViewModel GetConnectionOpportunities(Guid connectionTypeGuid, GetConnectionOpportunitiesFilterViewModel filterViewModel) { using (var rockContext = new RockContext()) { var opportunityService = new ConnectionOpportunityService(rockContext); var opportunityClientService = new ConnectionOpportunityClientService(rockContext, RequestContext.CurrentPerson); var connectionType = new ConnectionTypeService(rockContext).GetNoTracking(connectionTypeGuid); var filterOptions = new ConnectionOpportunityQueryOptions { ConnectionTypeGuids = new List <Guid> { connectionTypeGuid }, IncludeInactive = true }; if (filterViewModel.OnlyMyConnections) { filterOptions.ConnectorPersonIds = new List <int> { RequestContext.CurrentPerson?.Id ?? 0 }; } // Put all the opportunities in memory so we can check security. var qry = opportunityService.GetConnectionOpportunitiesQuery(filterOptions); var opportunities = qry.ToList() .Where(o => o.IsAuthorized(Authorization.VIEW, RequestContext.CurrentPerson)); // Get the various counts to make available to the Lava template. // The conversion of the value to a dictionary is a temporary work-around // until we have a way to mark external types as lava safe. var opportunityIds = opportunities.Select(o => o.Id).ToList(); var requestCounts = opportunityClientService.GetOpportunityRequestCounts(opportunityIds) .ToDictionary(k => k.Key, k => k.Value .GetType() .GetProperties(BindingFlags.Instance | BindingFlags.Public) .ToDictionary(prop => prop.Name, prop => prop.GetValue(k.Value, null))); // Process the connection opportunities with the template. var mergeFields = RequestContext.GetCommonMergeFields(); mergeFields.AddOrReplace("ConnectionOpportunities", opportunities); mergeFields.AddOrReplace("DetailPage", DetailPageGuid); mergeFields.AddOrReplace("ConnectionRequestCounts", requestCounts); var content = OpportunityTemplate.ResolveMergeFields(mergeFields); // Process the header template for. mergeFields = RequestContext.GetCommonMergeFields(); if (connectionType != null) { mergeFields.Add("ConnectionType", connectionType); } var headerContent = HeaderTemplate.ResolveMergeFields(mergeFields); return(new GetContentViewModel { HeaderContent = headerContent, Content = content }); } }
/// <summary> /// Gets the connection types view model that can be sent to the client. /// </summary> private void GetConnectionOpportunities() { using (var rockContext = new RockContext()) { var opportunityService = new ConnectionOpportunityService(rockContext); var opportunityClientService = new ConnectionOpportunityClientService(rockContext, CurrentPerson); var connectionType = new ConnectionTypeService(rockContext).GetNoTracking(_connectionTypeGuid); if (connectionType == null) { return; } // Determine if we should update the page title with the connection opportunity name var updatePageTitle = GetAttributeValue(AttributeKey.UpdatePageTitle).AsBoolean(); if (updatePageTitle) { RockPage.PageTitle = connectionType.Name; var pageBreadCrumb = RockPage.PageReference.BreadCrumbs.FirstOrDefault(); if (pageBreadCrumb != null) { pageBreadCrumb.Name = RockPage.PageTitle; } } var filterOptions = new ConnectionOpportunityQueryOptions { ConnectionTypeGuids = new List <Guid> { _connectionTypeGuid }, IncludeInactive = true }; if (_onlyShowOpportunitiesWithRequestsForUser && CurrentPerson != null) { filterOptions.ConnectorPersonIds = new List <int> { CurrentPerson.Id }; } else { filterOptions.ConnectorPersonIds = null; } // Put all the opportunities in memory so we can check security. var connectionOpportunityQuery = opportunityService.GetConnectionOpportunitiesQuery(filterOptions); var opportunities = connectionOpportunityQuery.ToList() .Where(o => o.IsAuthorized(Authorization.VIEW, CurrentPerson)); // Get the various counts to make available to the Lava template. // The conversion of the value to a dictionary is a temporary work-around // until we have a way to mark external types as lava safe. var opportunityIds = opportunities.Select(o => o.Id).ToList(); var connectionRequestCounts = new Dictionary <string, string>(); var sumTotalConnectionRequests = 0; // We only need to perform this query under this condition, otherwise we will use the // requestCountsPerOpportunity fetched earlier. if (_onlyShowOpportunitiesWithRequestsForUser && CurrentPerson != null) { var requestCounts = opportunityClientService.GetOpportunityRequestCounts(opportunityIds); foreach (var opportunityId in opportunityIds) { // Note use AssignedToYouCount here: sumTotalConnectionRequests += requestCounts[opportunityId].AssignedToYouCount; connectionRequestCounts.Add(opportunityId.ToString(), requestCounts[opportunityId].AssignedToYouCount.ToString()); } } else { var requestCounts = opportunityClientService.GetOpportunityRequestCounts(opportunityIds); foreach (var opportunityId in opportunityIds) { // Note use TotalCount here: sumTotalConnectionRequests += requestCounts[opportunityId].TotalCount; connectionRequestCounts.Add(opportunityId.ToString(), requestCounts[opportunityId].TotalCount.ToString()); } } var mergeFields = Rock.Lava.LavaHelper.GetCommonMergeFields(this.RockPage, this.CurrentPerson); mergeFields.AddOrReplace("ConnectionOpportunities", opportunities); mergeFields.AddOrReplace("DetailPage", DetailPageGuid); mergeFields.AddOrReplace("ConnectionRequestCounts", connectionRequestCounts); mergeFields.AddOrReplace("SumTotalConnectionRequests", sumTotalConnectionRequests); var content = OpportunityTemplate .ResolveMergeFields(mergeFields) .ResolveClientIds(upConnectionSelectLava.ClientID); lContent.Text = content; } }