Exemple #1
0
        /// <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();
        }
Exemple #2
0
 public PageViewServiceTest()
 {
     _mockLinkService  = new Mock <ILinkService>();
     _mockDownloadUtil = new Mock <IDownloadUtil>();
     _mockStreamUtil   = new Mock <IStreamUtil>();
     _mockPrintService = new Mock <IPrintService>();
     _pageViewService  = new PageViewService(_mockLinkService.Object, _mockDownloadUtil.Object, _mockStreamUtil.Object, _mockPrintService.Object);
 }
Exemple #3
0
        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();
        }
Exemple #4
0
        /// <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();
        }
Exemple #5
0
        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);
        }
Exemple #6
0
        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)
            {
                lPersonName.Text = person.FullName;

                PageViewService pageviewService = new PageViewService(rockContext);

                var pageViews = pageviewService.Queryable();

                var sessionInfo = pageviewService.Queryable()
                                  .Where(s => s.PersonAlias.PersonId == person.Id);


                if (startDate != DateTime.MinValue)
                {
                    sessionInfo = sessionInfo.Where(s => s.DateTimeViewed > drpDateFilter.LowerValue);
                }

                if (endDate != DateTime.MaxValue)
                {
                    sessionInfo = sessionInfo.Where(s => s.DateTimeViewed < drpDateFilter.UpperValue);
                }

                if (siteId != -1)
                {
                    sessionInfo = sessionInfo.Where(p => p.SiteId == siteId);
                }

                var pageviewInfo = sessionInfo.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 && p.SiteId == s.Key.SiteId).ToList()
                });

                pageviewInfo = pageviewInfo.OrderByDescending(p => p.StartDateTime)
                               .Skip(skipCount)
                               .Take(sessionCount + 1);

                rptSessions.DataSource = pageviewInfo.ToList().Take(sessionCount);
                rptSessions.DataBind();

                // set next button
                if (pageviewInfo.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>";
            }
        }
Exemple #7
0
        /// <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>
        /// 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(hfSiteId.Value.AsInteger());
            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();
        }
Exemple #9
0
        /// <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();
            }
        }
Exemple #10
0
        /// <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;
                }
            }
        }
Exemple #11
0
        /// <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();

                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.SessionId,
                        PagePageTitle = pv.Page.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("Person")
                                       .Where(l =>
                                              l.PersonId.HasValue &&
                                              l.IsOnLine == true)
                                       .OrderByDescending(l => l.LastActivityDateTime)
                                       .Select(l => new
                    {
                        login     = l,
                        pageViews = pageViewQry
                                    .Where(v => v.PersonAliasPersonId == l.PersonId)
                                    .Where(v => v.DateTimeViewed > last24Hours)
                                    .OrderByDescending(v => v.DateTimeViewed)
                                    .Take(pageViewTakeCount)
                    })
                                       .Where(a =>
                                              a.pageViews.Any() &&
                                              a.pageViews.FirstOrDefault().SiteId == site.Id)
                                       .Select(a => new
                    {
                        a.login,
                        pageViews       = a.pageViews,
                        LatestSessionId = a.pageViews.FirstOrDefault().SessionId
                    });

                    if (CurrentUser != null)
                    {
                        activeLogins = activeLogins.Where(m => m.login.UserName != CurrentUser.UserName);
                    }

                    foreach (var activeLogin in activeLogins)
                    {
                        var login = activeLogin.login;

                        Guid?latestSession = activeLogin.LatestSessionId;


                        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>";
                            if (activeLogin.pageViews != null)
                            {
                                var    pageViews     = activeLogin.pageViews.ToList();
                                string pageViewsHtml = activeLogin.pageViews.ToList()
                                                       .Where(v => v.SessionId == latestSession)
                                                       .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);
                }
            }
        }