public int GetLastVisitOnSite( int personId, int siteId ) { PageView mostRecentPageView = new PageViewService( (Rock.Data.RockContext)Service.Context ).Queryable() .Where( p => p.PersonAlias.PersonId == personId && p.SiteId == siteId ) .OrderByDescending( p => p.DateTimeViewed ) .FirstOrDefault(); if ( mostRecentPageView != null && mostRecentPageView.DateTimeViewed.HasValue) { TimeSpan duration = RockDateTime.Now - mostRecentPageView.DateTimeViewed.Value; return duration.Days; } return -1; }
/// <summary> /// Shows the active users. /// </summary> private void ShowActiveUsers() { int? siteId = GetAttributeValue( "Site" ).AsIntegerOrNull(); if (!siteId.HasValue) { lMessages.Text = "<div class='alert alert-warning'>No site is currently configured.</div>"; return; } else { int? pageViewCount = GetAttributeValue( "PageViewCount" ).AsIntegerOrNull(); if ( !pageViewCount.HasValue || pageViewCount.Value == 0 ) { pageViewCount = 1; } StringBuilder sbUsers = new StringBuilder(); var site = SiteCache.Read( siteId.Value ); lSiteName.Text = "<h4>" + site.Name + "</h4>"; lSiteName.Visible = GetAttributeValue( "ShowSiteNameAsTitle" ).AsBoolean(); lMessages.Text = string.Empty; using ( var rockContext = new RockContext() ) { IQueryable<PageView> pageViewQry = new PageViewService( rockContext ).Queryable( "Page" ); // Query to get who is logged in and last visit was to selected site var activeLogins = new UserLoginService( rockContext ).Queryable( "Person" ) .Where( l => l.PersonId.HasValue && l.IsOnLine == true ) .OrderByDescending( l => l.LastActivityDateTime ) .Select( l => new { login = l, pageViews = pageViewQry .Where( v => v.PersonAlias.PersonId == l.PersonId ) .OrderByDescending( v => v.DateTimeViewed ) .Take( pageViewCount.Value ) } ) .Where( a => a.pageViews.Any() && a.pageViews.FirstOrDefault().SiteId == site.Id ); if ( CurrentUser != null ) { activeLogins = activeLogins.Where( m => m.login.UserName != CurrentUser.UserName ); } foreach ( var activeLogin in activeLogins ) { var login = activeLogin.login; var pageViews = activeLogin.pageViews.ToList(); Guid? latestSession = pageViews.FirstOrDefault().SessionId; string pageViewsHtml = activeLogin.pageViews.ToList() .Where( v => v.SessionId == latestSession ) .Select( v => HttpUtility.HtmlEncode( v.Page.PageTitle ) ).ToList().AsDelimited( "<br> " ); TimeSpan tsLastActivity = login.LastActivityDateTime.HasValue ? RockDateTime.Now.Subtract( login.LastActivityDateTime.Value ) : TimeSpan.MaxValue; string className = tsLastActivity.Minutes <= 5 ? "recent" : "not-recent"; // create link to the person string personLink = login.Person.FullName; if ( GetAttributeValue( "PersonProfilePage" ) != null ) { string personProfilePage = GetAttributeValue( "PersonProfilePage" ); var pageParams = new Dictionary<string, string>(); pageParams.Add( "PersonId", login.Person.Id.ToString() ); var pageReference = new Rock.Web.PageReference( personProfilePage, pageParams ); personLink = string.Format( @"<a href='{0}'>{1}</a>", pageReference.BuildUrl(), login.Person.FullName ); } // determine whether to show last page views if ( GetAttributeValue( "PageViewCount" ).AsInteger() > 0 ) { string format = @" <li class='active-user {0}' data-toggle='tooltip' data-placement='top' title='{2}'> <i class='fa-li fa fa-circle'></i> {1} </li>"; sbUsers.Append( string.Format( format, className, personLink, pageViewsHtml ) ); } else { string format = @" <li class='active-user {0}'> <i class='fa-li fa fa-circle'></i> {1} </li>"; sbUsers.Append( string.Format( format, className, personLink ) ); } } } if ( sbUsers.Length > 0 ) { lUsers.Text = string.Format( @"<ul class='activeusers fa-ul'>{0}</ul>", sbUsers.ToString() ); } else { lMessages.Text = string.Format( "There are no logged in users on the {0} site.", site.Name ); } } }
/// <summary> /// Handles the Click event of the btnDeleteConfirm control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param> protected void btnDeleteConfirm_Click( object sender, EventArgs e ) { bool canDelete = false; var rockContext = new RockContext(); SiteService siteService = new SiteService( rockContext ); Site site = siteService.Get( int.Parse( hfSiteId.Value ) ); LayoutService layoutService = new LayoutService( rockContext ); PageService pageService = new PageService( rockContext ); PageViewService pageViewService = new PageViewService( rockContext ); if ( site != null ) { var sitePages = new List<int> { site.DefaultPageId ?? -1, site.LoginPageId ?? -1, site.RegistrationPageId ?? -1, site.PageNotFoundPageId ?? -1 }; foreach ( var pageView in pageViewService .Queryable() .Where( t => t.Page != null && t.Page.Layout != null && t.Page.Layout.SiteId == site.Id ) ) { pageView.Page = null; pageView.PageId = null; } var pageQry = pageService.Queryable( "Layout" ) .Where( t => t.Layout.SiteId == site.Id || sitePages.Contains( t.Id ) ); pageService.DeleteRange( pageQry ); var layoutQry = layoutService.Queryable() .Where( l => l.SiteId == site.Id ); layoutService.DeleteRange( layoutQry ); rockContext.SaveChanges( true ); string errorMessage; canDelete = siteService.CanDelete( site, out errorMessage, includeSecondLvl: true ); if ( !canDelete ) { mdDeleteWarning.Show( errorMessage, ModalAlertType.Alert ); return; } siteService.Delete( site ); rockContext.SaveChanges(); SiteCache.Flush( site.Id ); } NavigateToParentPage(); }
/// <summary> /// Handles the Delete event of the gPages control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="RowEventArgs" /> instance containing the event data.</param> protected void gPages_Delete( object sender, RowEventArgs e ) { var rockContext = new RockContext(); PageService pageService = new PageService( rockContext ); var pageViewService = new PageViewService(rockContext); var siteService = new SiteService(rockContext); Rock.Model.Page page = pageService.Get( new Guid( e.RowKeyValue.ToString() ) ); if ( page != null ) { string errorMessage; if ( !pageService.CanDelete( page, out errorMessage, includeSecondLvl: true ) ) { mdGridWarning.Show( errorMessage, ModalAlertType.Alert ); return; } foreach (var site in siteService.Queryable()) { if (site.DefaultPageId == page.Id) { site.DefaultPageId = null; site.DefaultPageRouteId = null; } if (site.LoginPageId == page.Id) { site.LoginPageId = null; site.LoginPageRouteId = null; } if (site.RegistrationPageId == page.Id) { site.RegistrationPageId = null; site.RegistrationPageRouteId = null; } } foreach (var pageView in pageViewService.GetByPageId(page.Id)) { pageView.Page = null; pageView.PageId = null; } pageService.Delete( page ); rockContext.SaveChanges(); PageCache.Flush( page.Id ); } BindPagesGrid(); }
/// <summary> /// Deletes the family's addresses, phone numbers, photos, viewed records, and people. /// TODO: delete attendance codes for attendance data that's about to be deleted when /// we delete the person record. /// </summary> /// <param name="families">The families.</param> /// <param name="rockContext">The rock context.</param> private void DeleteExistingFamilyData( XElement families, RockContext rockContext ) { PersonService personService = new PersonService( rockContext ); PhoneNumberService phoneNumberService = new PhoneNumberService( rockContext ); PersonViewedService personViewedService = new PersonViewedService( rockContext ); PageViewService pageViewService = new PageViewService( rockContext ); BinaryFileService binaryFileService = new BinaryFileService( rockContext ); PersonAliasService personAliasService = new PersonAliasService( rockContext ); PersonDuplicateService personDuplicateService = new PersonDuplicateService( rockContext ); NoteService noteService = new NoteService( rockContext ); AuthService authService = new AuthService( rockContext ); CommunicationService communicationService = new CommunicationService( rockContext ); CommunicationRecipientService communicationRecipientService = new CommunicationRecipientService( rockContext ); FinancialBatchService financialBatchService = new FinancialBatchService( rockContext ); FinancialTransactionService financialTransactionService = new FinancialTransactionService( rockContext ); PersonPreviousNameService personPreviousNameService = new PersonPreviousNameService( rockContext ); ConnectionRequestService connectionRequestService = new ConnectionRequestService( rockContext ); ConnectionRequestActivityService connectionRequestActivityService = new ConnectionRequestActivityService( rockContext ); // delete the batch data List<int> imageIds = new List<int>(); foreach ( var batch in financialBatchService.Queryable().Where( b => b.Name.StartsWith( "SampleData" ) ) ) { imageIds.AddRange( batch.Transactions.SelectMany( t => t.Images ).Select( i => i.BinaryFileId ).ToList() ); financialTransactionService.DeleteRange( batch.Transactions ); financialBatchService.Delete( batch ); } // delete all transaction images foreach ( var image in binaryFileService.GetByIds( imageIds ) ) { binaryFileService.Delete( image ); } foreach ( var elemFamily in families.Elements( "family" ) ) { Guid guid = elemFamily.Attribute( "guid" ).Value.Trim().AsGuid(); GroupService groupService = new GroupService( rockContext ); Group family = groupService.Get( guid ); if ( family != null ) { var groupMemberService = new GroupMemberService( rockContext ); var members = groupMemberService.GetByGroupId( family.Id, true ); // delete the people records string errorMessage; List<int> photoIds = members.Select( m => m.Person ).Where( p => p.PhotoId != null ).Select( a => (int)a.PhotoId ).ToList(); foreach ( var person in members.Select( m => m.Person ) ) { person.GivingGroup = null; person.GivingGroupId = null; person.PhotoId = null; // delete phone numbers foreach ( var phone in phoneNumberService.GetByPersonId( person.Id ) ) { if ( phone != null ) { phoneNumberService.Delete( phone ); } } // delete communication recipient foreach ( var recipient in communicationRecipientService.Queryable().Where( r => r.PersonAlias.PersonId == person.Id ) ) { communicationRecipientService.Delete( recipient ); } // delete communication foreach ( var communication in communicationService.Queryable().Where( c => c.SenderPersonAliasId == person.PrimaryAlias.Id ) ) { communicationService.Delete( communication ); } // delete person viewed records foreach ( var view in personViewedService.GetByTargetPersonId( person.Id ) ) { personViewedService.Delete( view ); } // delete page viewed records foreach ( var view in pageViewService.GetByPersonId( person.Id ) ) { pageViewService.Delete( view ); } // delete notes created by them or on their record. foreach ( var note in noteService.Queryable().Where ( n => n.CreatedByPersonAlias.PersonId == person.Id || (n.NoteType.EntityTypeId == _personEntityTypeId && n.EntityId == person.Id ) ) ) { noteService.Delete( note ); } // delete previous names on their records foreach ( var previousName in personPreviousNameService.Queryable().Where( r => r.PersonAlias.PersonId == person.Id ) ) { personPreviousNameService.Delete( previousName ); } // delete any GroupMember records they have foreach ( var groupMember in groupMemberService.Queryable().Where( gm => gm.PersonId == person.Id ) ) { groupMemberService.Delete( groupMember ); } //// delete any Authorization data //foreach ( var auth in authService.Queryable().Where( a => a.PersonId == person.Id ) ) //{ // authService.Delete( auth ); //} // delete their aliases foreach ( var alias in personAliasService.Queryable().Where( a => a.PersonId == person.Id ) ) { foreach ( var duplicate in personDuplicateService.Queryable().Where( d => d.DuplicatePersonAliasId == alias.Id ) ) { personDuplicateService.Delete( duplicate ); } personAliasService.Delete( alias ); } // delete any connection requests tied to them foreach ( var request in connectionRequestService.Queryable().Where( r => r.PersonAlias.PersonId == person.Id || r.ConnectorPersonAlias.PersonId == person.Id ) ) { connectionRequestActivityService.DeleteRange( request.ConnectionRequestActivities ); connectionRequestService.Delete( request ); } // Save these changes so the CanDelete passes the check... //rockContext.ChangeTracker.DetectChanges(); rockContext.SaveChanges( disablePrePostProcessing: true ); if ( personService.CanDelete( person, out errorMessage ) ) { personService.Delete( person ); //rockContext.ChangeTracker.DetectChanges(); //rockContext.SaveChanges( disablePrePostProcessing: true ); } else { throw new Exception( string.Format( "Trying to delete {0}, but: {1}", person.FullName, errorMessage ) ); } } //rockContext.ChangeTracker.DetectChanges(); rockContext.SaveChanges( disablePrePostProcessing: true ); // delete all member photos foreach ( var photo in binaryFileService.GetByIds( photoIds ) ) { binaryFileService.Delete( photo ); } DeleteGroupAndMemberData( family, rockContext ); } } }
void ShowList() { var rockContext = new RockContext(); int sessionCount = Int32.Parse( GetAttributeValue( "SessionCount" ) ); int skipCount = pageNumber * sessionCount; var person = new PersonService( rockContext ).GetByUrlEncodedKey( PageParameter( "Person" ) ); if (person != null) { if ( GetAttributeValue( "ShowHeader" ).AsBoolean() ) { pnlHeader.Visible = true; lPersonName.Text = person.FullName.FormatAsHtmlTitle() + " Page Views"; } else { pnlHeader.Visible = false; } PageViewService pageviewService = new PageViewService( rockContext ); var pageViews = pageviewService.Queryable(); var sessionInfo = pageviewService.Queryable() .Where( s => s.PersonAlias.PersonId == person.Id ) .GroupBy( s => new { s.SessionId, s.SiteId, SiteName = s.Site.Name, s.ClientType, s.IpAddress, s.UserAgent }) .Select( s => new WebSession { SessionId = s.Key.SessionId, StartDateTime = s.Min(x => x.DateTimeViewed), EndDateTime = s.Max(x => x.DateTimeViewed), SiteId = s.Key.SiteId, Site = s.Key.SiteName, ClientType = s.Key.ClientType, IpAddress = s.Key.IpAddress, UserAgent = s.Key.UserAgent, PageViews = pageViews.Where(p=> p.SessionId == s.Key.SessionId).ToList() }); if ( startDate != DateTime.MinValue ) { sessionInfo = sessionInfo.Where( s => s.StartDateTime > drpDateFilter.LowerValue ); } if ( endDate != DateTime.MaxValue ) { sessionInfo = sessionInfo.Where( s => s.StartDateTime < drpDateFilter.UpperValue ); } if ( siteId != -1 ) { sessionInfo = sessionInfo.Where( s => s.SiteId == siteId ); } sessionInfo = sessionInfo.OrderByDescending(p => p.StartDateTime) .Skip( skipCount ) .Take( sessionCount + 1); rptSessions.DataSource = sessionInfo.ToList().Take(sessionCount); rptSessions.DataBind(); // set next button if ( sessionInfo.Count() > sessionCount ) { hlNext.Visible = hlNext.Enabled = true; Dictionary<string, string> queryStringNext = new Dictionary<string, string>(); queryStringNext.Add( "Page", (pageNumber + 1).ToString() ); queryStringNext.Add( "Person", person.UrlEncodedKey ); if ( siteId != -1 ) { queryStringNext.Add( "SiteId", siteId.ToString() ); } if ( startDate != DateTime.MinValue ) { queryStringNext.Add( "StartDate", startDate.ToShortDateString() ); } if ( endDate != DateTime.MaxValue ) { queryStringNext.Add( "EndDate", endDate.ToShortDateString() ); } var pageReferenceNext = new Rock.Web.PageReference( CurrentPageReference.PageId, CurrentPageReference.RouteId, queryStringNext ); hlNext.NavigateUrl = pageReferenceNext.BuildUrl(); } else { hlNext.Visible = hlNext.Enabled = false; } // set prev button if ( pageNumber == 0 ) { hlPrev.Visible = hlPrev.Enabled = false; } else { hlPrev.Visible = hlPrev.Enabled = true; Dictionary<string, string> queryStringPrev = new Dictionary<string, string>(); queryStringPrev.Add( "Page", (pageNumber - 1).ToString() ); queryStringPrev.Add( "Person", person.UrlEncodedKey ); if ( siteId != -1 ) { queryStringPrev.Add( "SiteId", siteId.ToString() ); } if ( startDate != DateTime.MinValue ) { queryStringPrev.Add( "StartDate", startDate.ToShortDateString() ); } if ( endDate != DateTime.MaxValue ) { queryStringPrev.Add( "EndDate", endDate.ToShortDateString() ); } var pageReferencePrev = new Rock.Web.PageReference( CurrentPageReference.PageId, CurrentPageReference.RouteId, queryStringPrev ); hlPrev.NavigateUrl = pageReferencePrev.BuildUrl(); } } else { lMessages.Text = "<div class='alert alert-warning'>No person provided to show results for.</div>"; } }
/// <summary> /// Shows the active users. /// </summary> private void ShowActiveUsers() { int? siteId = GetAttributeValue( "Site" ).AsIntegerOrNull(); if ( !siteId.HasValue || SiteCache.Read(siteId.Value) == null ) { lMessages.Text = "<div class='alert alert-warning'>No site is currently configured.</div>"; return; } else { int pageViewCount = GetAttributeValue( "PageViewCount" ).AsIntegerOrNull() ?? 0; StringBuilder sbUsers = new StringBuilder(); var site = SiteCache.Read( siteId.Value ); lSiteName.Text = "<h4>" + site.Name + "</h4>"; lSiteName.Visible = GetAttributeValue( "ShowSiteNameAsTitle" ).AsBoolean(); if ( !site.EnablePageViews ) { lMessages.Text = "<div class='alert alert-warning'>Active " + site.Name + " users not available because page views are not enabled for site.</div>"; return; } lMessages.Text = string.Empty; string guestVisitorsStr = string.Empty; using ( var rockContext = new RockContext() ) { var qryPageViews = new PageViewService( rockContext ).Queryable(); var qryPersonAlias = new PersonAliasService( rockContext ).Queryable(); var pageViewQry = qryPageViews.Join( qryPersonAlias, pv => pv.PersonAliasId, pa => pa.Id, ( pv, pa ) => new { PersonAliasPersonId = pa.PersonId, pv.DateTimeViewed, pv.SiteId, pv.PageViewSessionId, PagePageTitle = pv.PageTitle } ); var last24Hours = RockDateTime.Now.AddDays( -1 ); int pageViewTakeCount = pageViewCount; if ( pageViewTakeCount == 0 ) { pageViewTakeCount = 1; } // Query to get who is logged in and last visit was to selected site var activeLogins = new UserLoginService( rockContext ).Queryable() .Where( l => l.PersonId.HasValue && l.IsOnLine == true ) .OrderByDescending( l => l.LastActivityDateTime ) .Select( l => new { login = new { l.UserName, l.LastActivityDateTime, l.PersonId, Person = new { l.Person.NickName, l.Person.LastName, l.Person.SuffixValueId } }, pageViews = pageViewQry .Where( v => v.PersonAliasPersonId == l.PersonId ) .Where( v => v.DateTimeViewed > last24Hours ) .OrderByDescending( v => v.DateTimeViewed ) .Take( pageViewTakeCount ) } ) .Select( a => new { a.login, pageViews = a.pageViews.ToList() } ); if ( CurrentUser != null ) { activeLogins = activeLogins.Where( m => m.login.UserName != CurrentUser.UserName ); } foreach ( var activeLogin in activeLogins ) { var login = activeLogin.login; if ( !activeLogin.pageViews.Any() || activeLogin.pageViews.FirstOrDefault().SiteId != site.Id ) { // only show active logins with PageViews and the most recent pageview is for the specified site continue; } var latestPageViewSessionId = activeLogin.pageViews.FirstOrDefault().PageViewSessionId; TimeSpan tsLastActivity = login.LastActivityDateTime.HasValue ? RockDateTime.Now.Subtract( login.LastActivityDateTime.Value ) : TimeSpan.MaxValue; string className = tsLastActivity.Minutes <= 5 ? "recent" : "not-recent"; // create link to the person string personFullName = Person.FormatFullName( login.Person.NickName, login.Person.LastName, login.Person.SuffixValueId ); string personLink = personFullName; if ( GetAttributeValue( "PersonProfilePage" ) != null ) { string personProfilePage = GetAttributeValue( "PersonProfilePage" ); var pageParams = new Dictionary<string, string>(); pageParams.Add( "PersonId", login.PersonId.ToString() ); var pageReference = new Rock.Web.PageReference( personProfilePage, pageParams ); personLink = string.Format( @"<a href='{0}'>{1}</a>", pageReference.BuildUrl(), personFullName ); } // determine whether to show last page views if ( GetAttributeValue( "PageViewCount" ).AsInteger() > 0 ) { string activeLoginFormat = @" <li class='active-user {0}' data-toggle='tooltip' data-placement='top' title='{2}'> <i class='fa-li fa fa-circle'></i> {1} </li>"; // define the formatting for each user entry if ( activeLogin.pageViews != null ) { string pageViewsHtml = activeLogin.pageViews .Where( v => v.PageViewSessionId == latestPageViewSessionId ) .Select( v => HttpUtility.HtmlEncode( v.PagePageTitle ) ).ToList().AsDelimited( "<br> " ); sbUsers.Append( string.Format( activeLoginFormat, className, personLink, pageViewsHtml ) ); } } else { string inactiveLoginFormat = @" <li class='active-user {0}'> <i class='fa-li fa fa-circle'></i> {1} </li>"; sbUsers.Append( string.Format( inactiveLoginFormat, className, personLink ) ); } } // get the 'show guests' attribute and if it's true, determine how many guests there are. bool showGuestVisitors = GetAttributeValue( "ShowGuestVisitors" ).AsBoolean(); if ( showGuestVisitors ) { // build a list of unique sessions views in the past 15 minutes. // We'll only take entries with a null personAliasID, which means they're not logged in, // and thus ARE guests. var last5Minutes = RockDateTime.Now.AddMinutes( -5 ); var last15Minutes = RockDateTime.Now.AddMinutes( -15 ); var qryGuests = new PageViewService( rockContext ).Queryable().AsNoTracking() .Where( p => p.SiteId == site.Id && p.DateTimeViewed > last15Minutes && p.PersonAliasId == null && p.PageViewSession.PageViewUserAgent.Browser != "Other" && p.PageViewSession.PageViewUserAgent.ClientType != "Crawler" ) .GroupBy( p => p.PageViewSessionId ) .Select( g => new { SessionId = g.Key, LastVisit = g.Max( p => p.DateTimeViewed ) } ) .ToList(); var numRecentGuests = qryGuests.Where( g => g.LastVisit >= last5Minutes ).Count(); var numInactiveGuests = qryGuests.Where( g => g.LastVisit < last5Minutes ).Count(); // now build the formatted entry, which is "Current Guests (0) (1)" where the first is a green badge, and the second yellow. if ( numRecentGuests > 0 || numInactiveGuests > 0 ) { guestVisitorsStr = "Current Guests:"; if ( numRecentGuests > 0 ) { guestVisitorsStr += string.Format( " <span class=\"badge badge-success\">{0}</span>", numRecentGuests ); } if ( numInactiveGuests > 0 ) { guestVisitorsStr += string.Format( " <span class=\"badge badge-warning\">{0}</span>", numInactiveGuests ); } } } } if ( sbUsers.Length > 0 ) { lUsers.Text = string.Format( @"<ul class='activeusers fa-ul'>{0}</ul>", sbUsers.ToString() ); lUsers.Text += string.Format( @"<p class='margin-l-sm'>{0}</p>", guestVisitorsStr ); } else { lMessages.Text = string.Format( "There are no logged in users on the {0} site.", site.Name ); lMessages.Text += "<br /><br />" + guestVisitorsStr; } } }
/// <summary> /// Handles the Delete event of the rGrid control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="RowEventArgs"/> instance containing the event data.</param> protected void rGrid_Delete( object sender, RowEventArgs e ) { var rockContext = new RockContext(); var pageService = new PageService( rockContext ); var pageViewService = new PageViewService( rockContext ); var siteService = new SiteService( rockContext ); var page = pageService.Get( e.RowKeyId ); if ( page != null ) { string errorMessage = string.Empty; if ( !pageService.CanDelete( page, out errorMessage ) ) { mdDeleteWarning.Show( errorMessage, ModalAlertType.Alert ); return; } foreach ( var site in siteService.Queryable() ) { if ( site.DefaultPageId == page.Id ) { site.DefaultPageId = null; site.DefaultPageRouteId = null; } if ( site.LoginPageId == page.Id ) { site.LoginPageId = null; site.LoginPageRouteId = null; } if ( site.RegistrationPageId == page.Id ) { site.RegistrationPageId = null; site.RegistrationPageRouteId = null; } } foreach ( var pageView in pageViewService.GetByPageId( page.Id ) ) { pageView.Page = null; pageView.PageId = null; } pageService.Delete( page ); rockContext.SaveChanges(); Rock.Web.Cache.PageCache.Flush( page.Id ); if ( _page != null ) { _page.FlushChildPages(); } } BindGrid(); }
/// <summary> /// Deletes the family's addresses, phone numbers, photos, viewed records, and people. /// TODO: delete attendance codes for attendance data that's about to be deleted when /// we delete the person record. /// </summary> /// <param name="families">The families.</param> /// <param name="rockContext">The rock context.</param> private void DeleteExistingFamilyData( XElement families, RockContext rockContext ) { PersonService personService = new PersonService( rockContext ); PhoneNumberService phoneNumberService = new PhoneNumberService( rockContext ); PersonViewedService personViewedService = new PersonViewedService( rockContext ); PageViewService pageViewService = new PageViewService( rockContext ); BinaryFileService binaryFileService = new BinaryFileService( rockContext ); PersonAliasService personAliasService = new PersonAliasService( rockContext ); NoteService noteService = new NoteService( rockContext ); AuthService authService = new AuthService( rockContext ); foreach ( var elemFamily in families.Elements( "family" ) ) { Guid guid = elemFamily.Attribute( "guid" ).Value.Trim().AsGuid(); GroupService groupService = new GroupService( rockContext ); Group family = groupService.Get( guid ); if ( family != null ) { var groupMemberService = new GroupMemberService( rockContext ); var members = groupMemberService.GetByGroupId( family.Id ); // delete the people records string errorMessage; List<int> photoIds = members.Select( m => m.Person ).Where( p => p.PhotoId != null ).Select( a => (int)a.PhotoId ).ToList(); foreach ( var person in members.Select( m => m.Person ) ) { person.GivingGroup = null; person.GivingGroupId = null; person.PhotoId = null; // delete phone numbers foreach ( var phone in phoneNumberService.GetByPersonId( person.Id ) ) { if ( phone != null ) { phoneNumberService.Delete( phone ); } } // delete person viewed records foreach ( var view in personViewedService.GetByTargetPersonId( person.Id ) ) { personViewedService.Delete( view ); } // delete page viewed records foreach ( var view in pageViewService.GetByPersonId( person.Id ) ) { pageViewService.Delete( view ); } // delete notes created by them or on their record. foreach ( var note in noteService.Queryable().Where ( n => n.CreatedByPersonAlias.PersonId == person.Id || (n.NoteType.EntityTypeId == _personEntityTypeId && n.EntityId == person.Id ) ) ) { noteService.Delete( note ); } //// delete any GroupMember records they have //foreach ( var groupMember in groupMemberService.Queryable().Where( gm => gm.PersonId == person.Id ) ) //{ // groupMemberService.Delete( groupMember ); //} //// delete any Authorization data //foreach ( var auth in authService.Queryable().Where( a => a.PersonId == person.Id ) ) //{ // authService.Delete( auth ); //} // delete their aliases foreach ( var alias in personAliasService.Queryable().Where( a => a.PersonId == person.Id ) ) { personAliasService.Delete( alias ); } //foreach ( var relationship in person.Gro) // Save these changes so the CanDelete passes the check... //rockContext.ChangeTracker.DetectChanges(); rockContext.SaveChanges( disablePrePostProcessing: true ); if ( personService.CanDelete( person, out errorMessage ) ) { personService.Delete( person ); //rockContext.ChangeTracker.DetectChanges(); //rockContext.SaveChanges( disablePrePostProcessing: true ); } } //rockContext.ChangeTracker.DetectChanges(); rockContext.SaveChanges( disablePrePostProcessing: true ); // delete all member photos foreach ( var photo in binaryFileService.GetByIds( photoIds ) ) { binaryFileService.Delete( photo ); } DeleteGroupAndMemberData( family, rockContext ); } } }
/// <summary> /// Execute method to write transaction to the database. /// </summary> public void Execute() { using ( var rockContext = new RockContext() ) { PageViewService pageViewService = new PageViewService( rockContext ); PageViewUserAgentService pageViewUserAgentService = new PageViewUserAgentService( rockContext ); PageViewSessionService pageViewSessionService = new PageViewSessionService( rockContext ); var userAgent = ( this.UserAgent ?? string.Empty ).Trim(); if ( userAgent.Length > 450 ) { userAgent = userAgent.Substring( 0, 450 ); // trim super long useragents to fit in pageViewUserAgent.UserAgent } // get user agent info var clientType = PageViewUserAgent.GetClientType( userAgent ); Parser uaParser = Parser.GetDefault(); ClientInfo client = uaParser.Parse( userAgent ); var clientOs = client.OS.ToString(); var clientBrowser = client.UserAgent.ToString(); // lookup the pageViewUserAgent, and create it if it doesn't exist var pageViewUserAgent = pageViewUserAgentService.Queryable().Where( a => a.UserAgent == userAgent ).FirstOrDefault(); if ( pageViewUserAgent == null ) { pageViewUserAgent = new PageViewUserAgent(); pageViewUserAgent.UserAgent = userAgent; pageViewUserAgent.ClientType = clientType; pageViewUserAgent.OperatingSystem = clientOs; pageViewUserAgent.Browser = clientBrowser; pageViewUserAgentService.Add( pageViewUserAgent ); rockContext.SaveChanges(); } else { // check if the user agent properties need to be updated if ( clientType != pageViewUserAgent.ClientType || clientOs != pageViewUserAgent.OperatingSystem || clientBrowser != pageViewUserAgent.Browser ) { pageViewUserAgent.ClientType = clientType; pageViewUserAgent.OperatingSystem = clientOs; pageViewUserAgent.Browser = clientBrowser; rockContext.SaveChanges(); } } // lookup PageViewSession, and create it if it doesn't exist Guid sessionId = this.SessionId.AsGuid(); int? pageViewSessionId = pageViewSessionService.Queryable().Where( a => a.PageViewUserAgentId == pageViewUserAgent.Id && a.SessionId == sessionId && a.IpAddress == this.IPAddress ).Select( a => (int?)a.Id ).FirstOrDefault(); if ( !pageViewSessionId.HasValue ) { var pageViewSession = new PageViewSession(); pageViewSession.PageViewUserAgentId = pageViewUserAgent.Id; pageViewSession.SessionId = sessionId; pageViewSession.IpAddress = this.IPAddress; pageViewSessionService.Add( pageViewSession ); rockContext.SaveChanges(); pageViewSessionId = pageViewSession.Id; } PageView pageView = new PageView(); pageViewService.Add( pageView ); // obfuscate rock magic token Regex rgx = new Regex( @"rckipid=([^&]*)" ); string cleanUrl = rgx.Replace( this.Url, "rckipid=XXXXXXXXXXXXXXXXXXXXXXXXXXXX" ); pageView.PageId = this.PageId; pageView.SiteId = this.SiteId; pageView.Url = cleanUrl.Left( 500 ); pageView.DateTimeViewed = this.DateViewed; pageView.PersonAliasId = this.PersonAliasId; pageView.PageTitle = this.PageTitle.Left( 500 ); pageView.PageViewSessionId = pageViewSessionId.Value; rockContext.SaveChanges(); } }
/// <summary> /// Execute method to write transaction to the database. /// </summary> public void Execute() { using ( var rockContext = new RockContext() ) { PageViewService pvService = new PageViewService( rockContext ); PageView pageView = new PageView(); pvService.Add( pageView ); pageView.PageId = this.PageId; pageView.SiteId = this.SiteId; pageView.SessionId = new Guid( this.SessionId ); pageView.Url = this.Url; pageView.UserAgent = this.UserAgent; pageView.DateTimeViewed = this.DateViewed; pageView.IpAddress = this.IPAddress; pageView.PersonAliasId = this.PersonAliasId; pageView.PageTitle = this.PageTitle; string u = this.UserAgent; if ( string.IsNullOrWhiteSpace( u ) ) { pageView.ClientType = "None"; } else { // determine client type // note this regex should be updated from http://detectmobilebrowsers.com/ occassionally // last update 2/22/2014 - JME bool clientDetected = false; // first test for mobile device Regex b = new Regex( @"(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino", RegexOptions.IgnoreCase | RegexOptions.Multiline ); Regex v = new Regex( @"1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-", RegexOptions.IgnoreCase | RegexOptions.Multiline ); if ( ( b.IsMatch( u ) || ( u.Length >= 4 && v.IsMatch( u.Substring( 0, 4 ) ) ) ) ) { pageView.ClientType = "Mobile"; clientDetected = true; } // next test for tablet if ( !clientDetected ) { Regex t = new Regex( @"android|ipad|playbook|silk", RegexOptions.IgnoreCase | RegexOptions.Multiline ); if ( t.IsMatch( u ) ) { pageView.ClientType = "Tablet"; clientDetected = true; } } // let's now label bots/crawler if ( !clientDetected ) { Regex t = new Regex( @"bot|googlebot|crawler|spider|robot|crawling", RegexOptions.IgnoreCase | RegexOptions.Multiline ); if ( t.IsMatch( u ) ) { pageView.ClientType = "Crawler"; clientDetected = true; } } // finally set it to desktop if ( !clientDetected ) { pageView.ClientType = "Desktop"; } } rockContext.SaveChanges(); } }
/// <summary> /// Shows the active users. /// </summary> private void ShowActiveUsers() { int? siteId = GetAttributeValue( "Site" ).AsIntegerOrNull(); if ( !siteId.HasValue ) { lMessages.Text = "<div class='alert alert-warning'>No site is currently configured.</div>"; return; } else { int pageViewCount = GetAttributeValue( "PageViewCount" ).AsIntegerOrNull() ?? 0; StringBuilder sbUsers = new StringBuilder(); var site = SiteCache.Read( siteId.Value ); lSiteName.Text = "<h4>" + site.Name + "</h4>"; lSiteName.Visible = GetAttributeValue( "ShowSiteNameAsTitle" ).AsBoolean(); if ( !site.EnablePageViews ) { lMessages.Text = "<div class='alert alert-warning'>Active " + site.Name + " users not available because page views are not enabled for site.</div>"; return; } lMessages.Text = string.Empty; using ( var rockContext = new RockContext() ) { var qryPageViews = new PageViewService( rockContext ).Queryable(); var qryPersonAlias = new PersonAliasService( rockContext ).Queryable(); var pageViewQry = qryPageViews.Join( qryPersonAlias, pv => pv.PersonAliasId, pa => pa.Id, ( pv, pa ) => new { PersonAliasPersonId = pa.PersonId, pv.DateTimeViewed, pv.SiteId, pv.PageViewSessionId, PagePageTitle = pv.PageTitle } ); var last24Hours = RockDateTime.Now.AddDays( -1 ); int pageViewTakeCount = pageViewCount; if ( pageViewTakeCount == 0 ) { pageViewTakeCount = 1; } // Query to get who is logged in and last visit was to selected site var activeLogins = new UserLoginService( rockContext ).Queryable() .Where( l => l.PersonId.HasValue && l.IsOnLine == true ) .OrderByDescending( l => l.LastActivityDateTime ) .Select( l => new { login = new { l.UserName, l.LastActivityDateTime, l.PersonId, Person = new { l.Person.NickName, l.Person.LastName, l.Person.SuffixValueId } }, pageViews = pageViewQry .Where( v => v.PersonAliasPersonId == l.PersonId ) .Where( v => v.DateTimeViewed > last24Hours ) .OrderByDescending( v => v.DateTimeViewed ) .Take( pageViewTakeCount ) } ) .Select( a => new { a.login, pageViews = a.pageViews.ToList() } ); if ( CurrentUser != null ) { activeLogins = activeLogins.Where( m => m.login.UserName != CurrentUser.UserName ); } foreach ( var activeLogin in activeLogins ) { var login = activeLogin.login; if ( !activeLogin.pageViews.Any() || activeLogin.pageViews.FirstOrDefault().SiteId != site.Id ) { // only show active logins with PageViews and the most recent pageview is for the specified site continue; } var latestPageViewSessionId = activeLogin.pageViews.FirstOrDefault().PageViewSessionId; TimeSpan tsLastActivity = login.LastActivityDateTime.HasValue ? RockDateTime.Now.Subtract( login.LastActivityDateTime.Value ) : TimeSpan.MaxValue; string className = tsLastActivity.Minutes <= 5 ? "recent" : "not-recent"; // create link to the person string personFullName = Person.FormatFullName( login.Person.NickName, login.Person.LastName, login.Person.SuffixValueId ); string personLink = personFullName; if ( GetAttributeValue( "PersonProfilePage" ) != null ) { string personProfilePage = GetAttributeValue( "PersonProfilePage" ); var pageParams = new Dictionary<string, string>(); pageParams.Add( "PersonId", login.PersonId.ToString() ); var pageReference = new Rock.Web.PageReference( personProfilePage, pageParams ); personLink = string.Format( @"<a href='{0}'>{1}</a>", pageReference.BuildUrl(), personFullName ); } // determine whether to show last page views if ( GetAttributeValue( "PageViewCount" ).AsInteger() > 0 ) { string format = @" <li class='active-user {0}' data-toggle='tooltip' data-placement='top' title='{2}'> <i class='fa-li fa fa-circle'></i> {1} </li>"; if ( activeLogin.pageViews != null ) { string pageViewsHtml = activeLogin.pageViews .Where( v => v.PageViewSessionId == latestPageViewSessionId ) .Select( v => HttpUtility.HtmlEncode( v.PagePageTitle ) ).ToList().AsDelimited( "<br> " ); sbUsers.Append( string.Format( format, className, personLink, pageViewsHtml ) ); } } else { string format = @" <li class='active-user {0}'> <i class='fa-li fa fa-circle'></i> {1} </li>"; sbUsers.Append( string.Format( format, className, personLink ) ); } } } if ( sbUsers.Length > 0 ) { lUsers.Text = string.Format( @"<ul class='activeusers fa-ul'>{0}</ul>", sbUsers.ToString() ); } else { lMessages.Text = string.Format( "There are no logged in users on the {0} site.", site.Name ); } } }
protected void rGrid_Delete( object sender, RowEventArgs e ) { var rockContext = new RockContext(); var pageService = new PageService( rockContext ); var pageViewService = new PageViewService( rockContext ); var siteService = new SiteService( rockContext ); var page = pageService.Get( (int)rGrid.DataKeys[e.RowIndex]["id"] ); if ( page != null ) { string errorMessage = string.Empty; if ( !pageService.CanDelete( page, out errorMessage ) ) { //errorMessage = "The page is the parent page of another page."; mdDeleteWarning.Show( errorMessage, ModalAlertType.Alert ); return; } foreach ( var site in siteService.Queryable() ) { if ( site.DefaultPageId == page.Id ) { site.DefaultPageId = null; site.DefaultPageRouteId = null; } if ( site.LoginPageId == page.Id ) { site.LoginPageId = null; site.LoginPageRouteId = null; } if ( site.RegistrationPageId == page.Id ) { site.RegistrationPageId = null; site.RegistrationPageRouteId = null; } } // TODO: Could be thousands of page views. Can we set this up as cascade? foreach( var pageView in pageViewService.GetByPageId(page.Id)) { pageViewService.Delete( pageView ); } pageService.Delete( page ); rockContext.SaveChanges(); Rock.Web.Cache.PageCache.Flush( page.Id ); if ( _page != null ) { _page.FlushChildPages(); } } BindGrid(); }