예제 #1
0
        private void CopyProperties(VerPage verPage, CmsPage cmsPage)
        {
            cmsPage.Title     = verPage.Title;
            cmsPage.NaviTitle = verPage.NaviTitle;

            if (cmsPage.Html == null)
            {
                cmsPage.Html = new CmsPageHtml();
            }

            cmsPage.Html.Content = verPage.Html.Content;
            cmsPage.Html.Sidebar = verPage.Html.Sidebar;
            cmsPage.Html.Header  = verPage.Html.Header;

            cmsPage.Description = verPage.Description;
            cmsPage.Keywords    = verPage.Keywords;
            cmsPage.Layout      = verPage.Layout;

            //navinode does not need to be restored
            //pubPage.NaviNode = cmsPage.NaviNode;

            cmsPage.NaviTitle   = String.IsNullOrEmpty(verPage.NaviTitle)? verPage.Title : verPage.NaviTitle;
            cmsPage.IsPublished = true;

            // TODO: why normal in the first place, should be archived all the time for verpage
            //cmsPage.Status = CmsPage.STATUS_NORMAL;
            cmsPage.Status = verPage.Status;

            cmsPage.Modified   = verPage.Modified;
            cmsPage.ModifiedBy = verPage.ModifiedBy;
            cmsPage.Created    = verPage.Created;
            cmsPage.CreatedBy  = verPage.CreatedBy;

            cmsPage.Url = verPage.Url;
        }
예제 #2
0
        public ActionResult Version(int id)
        {
            VerPage vPage = _db.Set <VerPage>().SingleOrDefault(e => e.VerId == id);

            if (vPage == null)
            {
                return(new HttpNotFoundResult("Page version not found"));
            }

            CmsPage page = new CmsPage();

            CopyProperties(vPage, page);

            page.Id       = vPage.Id;
            page.NaviNode = _db.Set <NaviNode>().SingleOrDefault(
                e => e.Id == vPage.NaviNodeId);

            StringBuilder webpartHeaders = new StringBuilder();

            bool havingWebPart = false;

            page.ContentHtml.Content = _pageEngine.ReplaceTokens(
                page: page,
                webpartHeaders: webpartHeaders,
                havingWebPart: out havingWebPart,
                controllerContext: this.ControllerContext);

            PermissionType accessMode = SecurityHelper.PageAccessMode(_db, page);

            ViewBag.AccessMode = accessMode;
            ViewBag.VerId      = vPage.VerId;
            ViewBag.BaseNode   = CmsPageBase.FindBaseNode(page);

            return(View(page));
        }
예제 #3
0
        public ActionResult Restore(int id)
        {
            VerPage verPage = _db.Set <VerPage>().SingleOrDefault(e => e.VerId == id);

            if (verPage == null)
            {
                throw new Exception("Version is not found.");
            }

            CmsPage cmsPage = _db.Set <CmsPage>().SingleOrDefault(e => e.Id == verPage.Id);

            if (cmsPage != null)
            {
                CopyProperties(verPage, cmsPage);

                PubPage pubpage = _db.Set <PubPage>().SingleOrDefault(e => e.Id == verPage.Id);

                if (pubpage != null && pubpage.Modified == verPage.Modified)
                {
                    cmsPage.Status = CmsPage.STATUS_NORMAL;
                }
                else
                {
                    cmsPage.Status = CmsPage.STATUS_CHANGE_SAVED;
                }

                ((DbContext)_db).Entry(cmsPage).State = EntityState.Modified;
                _db.SaveChanges();
            }

            return(Redirect(PageHelper.Goto(verPage.Id, _db)));
        }
예제 #4
0
        private void SaveVersion(CmsPage cmsPage)
        {
            var currentLiveVer = _db.Set <VerPage>().SingleOrDefault(e => e.Id == cmsPage.Id && e.IsPublished);

            if (currentLiveVer != null)
            {
                currentLiveVer.IsPublished = false;
            }
            int     innerId = cmsPage.Id;
            VerPage verPage = new VerPage();

            verPage.Id = cmsPage.Id;

            _db.Set <VerPage>().Add(verPage);

            verPage.Title       = cmsPage.Title;
            verPage.NaviTitle   = cmsPage.NaviTitle;
            verPage.Layout      = cmsPage.Layout;
            verPage.MenuOrder   = cmsPage.MenuOrder;
            verPage.Type        = cmsPage.Type;
            verPage.Commentable = cmsPage.Commentable;
            verPage.Hidden      = cmsPage.Hidden;

            verPage.Html         = new VerPageHtml();
            verPage.Html.Content = cmsPage.Html.Content;
            verPage.Html.Sidebar = cmsPage.Html.Sidebar;
            verPage.Html.Header  = cmsPage.Html.Header;


            verPage.Description = cmsPage.Description;
            verPage.Keywords    = cmsPage.Keywords;
            verPage.Layout      = cmsPage.Layout;

            //pubPage.NaviNode = cmsPage.NaviNode;
            //don't save navi node to remove constraint
            verPage.NaviNodeId =
                cmsPage.NaviNode == null ? 0 : cmsPage.NaviNode.Id;

            verPage.NaviTitle = cmsPage.NaviTitle;

            verPage.Modified   = cmsPage.Modified;
            verPage.ModifiedBy = cmsPage.ModifiedBy;
            verPage.Created    = cmsPage.Created;
            verPage.CreatedBy  = cmsPage.CreatedBy;

            verPage.Published   = DateTime.Now;
            verPage.PublishedBy = User.Identity.Name.ToUpper();

            verPage.Status = CmsPage.STATUS_ARCHIVED;

            verPage.Url = cmsPage.Url;

            verPage.IsPublished = true;
            //db.SaveChanges();
            //will be save later
        }
예제 #5
0
        private void RestoreLastVersion(CmsPage cmsPage)
        {
            int     innerId = cmsPage.Id;
            VerPage verPage =
                (from v in _db.Set <VerPage>()
                 where v.Id == innerId
                 orderby v.VerId descending
                 select v).First();

            if (verPage == null)
            {
                return;
            }

            CopyProperties(verPage, cmsPage);
        }
예제 #6
0
        public ActionResult Do(string id, string act)
        {
            int     internalId = CmsPage.FromFriendlyId(id);
            CmsPage page       = _db.Set <CmsPage>().Single(e => e.Id == internalId);

            var accessMode = SecurityHelper.PageAccessMode(_db, page);

            bool isModified = false;

            switch (act)
            {
                #region delete
            case "delete":
                if (accessMode < PermissionType.Publish)
                {
                    throw new Exception("Access Denided.");
                }

                NaviNode naviNode = page.NaviNode;

                int parentId = naviNode.Id;

                int numOfPages = _db.Set <CmsPage>().Where(x => x.NaviNode.Id == parentId).Count();

                int numOfFolder =
                    _db.Set <NaviNode>().Where(x => x.Parent.Id == parentId).Count();

                if (numOfPages == 1 && numOfFolder == 0)
                {
                    //delete both page and folder
                    var pubPages = _db.Set <PubPage>().Where(e => e.NaviNode.Id == naviNode.Id).ToList();
                    var pages    = _db.Set <CmsPage>().Where(e => e.NaviNode.Id == naviNode.Id).ToList();
                    ((DbSet <PubPage>)_db.Set <PubPage>()).RemoveRange(pubPages);
                    ((DbSet <CmsPage>)_db.Set <CmsPage>()).RemoveRange(pages);
                    _db.SaveChanges();

                    NaviNode toBeDeleted = naviNode;
                    var      naviParent  = naviNode.Parent;
                    _db.Set <NaviNode>().Remove(toBeDeleted);
                    _db.SaveChanges();
                    naviNode = naviParent;
                }
                else
                {
                    PubPage pubPage = _db.Set <PubPage>().SingleOrDefault(p => p.Id == page.Id);
                    if (pubPage != null)
                    {
                        _db.Set <PubPage>().Remove(pubPage);
                    }
                    _db.Set <CmsPage>().Remove(page);
                    _db.SaveChanges();
                }

                CmsPage defaultPage = naviNode.Pages.OrderBy(pg => pg.MenuOrder).ThenBy(pg => pg.Id).FirstOrDefault();
                while (defaultPage == null)
                {
                    if (naviNode.Id == 1 || naviNode.Parent == null)
                    {
                        throw new Exception("Navigation Error");
                    }

                    naviNode = naviNode.Parent;

                    defaultPage = naviNode.Pages.OrderBy(pg => pg.MenuOrder).ThenBy(pg => pg.Id).FirstOrDefault();
                }

                return(RedirectToAction("Page", "Cms", new { id = defaultPage.FriendlyId }));

                #endregion
                #region unlock
            case "unlock":
                if (accessMode < PermissionType.Edit)
                {
                    throw new Exception("Access Denided.");
                }
                if (page.Status == CmsPage.STATUS_EDITING_START)
                {
                    page.Status = CmsPage.STATUS_NORMAL;
                    isModified  = true;
                }
                else if (page.Status == CmsPage.STATUS_EDITING_AGAIN)
                {
                    page.Status = CmsPage.STATUS_CHANGE_SAVED;
                    isModified  = true;
                }

                //db.Entry(page).State = EntityState.Modified;
                //db.SaveChanges();

                //return RedirectToAction("Edit", new { id = id });

                break;

                #endregion
                #region publish
            case "publish":
                if (accessMode < PermissionType.Publish)
                {
                    throw new Exception("Access Denided.");
                }
                if (page.Status == CmsPage.STATUS_NORMAL ||
                    page.Status == CmsPage.STATUS_CHANGE_SAVED)
                {
                    page.IsPublished = true;
                    page.Status      = CmsPage.STATUS_NORMAL;
                    PublishDraft(page);
                    SaveVersion(page);
                    isModified = true;
                }

                break;

                #endregion
                #region unpublish
            case "unpublish":
                if (accessMode < PermissionType.Publish)
                {
                    throw new Exception("Access Denided.");
                }
                // Remove the published page from public site if it exists.
                PubPage pageToUnpublish = _db.Set <PubPage>().SingleOrDefault(p => p.Id == page.Id);
                if (pageToUnpublish != null)
                {
                    _db.Set <PubPage>().Remove(pageToUnpublish);
                    _db.SaveChanges();
                }

                // Label most recent live version in history to unpublished.
                VerPage currentLiveVer = _db.Set <VerPage>().SingleOrDefault(e => e.Id == page.Id && e.IsPublished);
                if (currentLiveVer != null)
                {
                    currentLiveVer.IsPublished = false;
                    currentLiveVer.Status      = CmsPage.STATUS_UNPUBLISHED;
                    _db.SaveChanges();
                }

                // Change CmsPage status after remove PubPage and update VerPage
                page.IsPublished = false;
                page.Status      = CmsPage.STATUS_CHANGE_SAVED;
                isModified       = true;

                break;

                #endregion
                #region edit
            case "edit":
                bool allowEdit = false;

                if (page.Status == CmsPage.STATUS_NORMAL)
                {
                    page.Status = CmsPage.STATUS_EDITING_START;
                    allowEdit   = true;
                }
                else if (page.Status == CmsPage.STATUS_CHANGE_SAVED)
                {
                    page.Status = CmsPage.STATUS_EDITING_AGAIN;
                    allowEdit   = true;
                }
                else if (page.Status != CmsPage.STATUS_EDITING_START &&
                         page.Status != CmsPage.STATUS_EDITING_AGAIN)
                {
                    page.Status = CmsPage.STATUS_EDITING_AGAIN;
                    allowEdit   = true;
                }

                if (User.Identity.Name.ToUpper() == page.ModifiedBy &&
                    accessMode >= PermissionType.Edit)
                {
                    allowEdit = true;
                }

                if (allowEdit)
                {
                    page.Modified   = DateTime.Now;
                    page.ModifiedBy = User.Identity.Name.ToUpper();
                    ((DbContext)_db).Entry(page).State = EntityState.Modified;
                    _db.SaveChanges();

                    return(RedirectToAction("Edit", new { id = id }));
                }

                break;

                #endregion
                #region cancel
            case "cancel":
                // TODO Restore previous status
                if (page.Status == CmsPage.STATUS_EDITING_START)
                {
                    page.Status = CmsPage.STATUS_NORMAL;
                    isModified  = true;
                }
                else if (page.Status == CmsPage.STATUS_EDITING_AGAIN)
                {
                    page.Status = CmsPage.STATUS_CHANGE_SAVED;
                    isModified  = true;
                }

                break;

                #endregion
                #region restore
            case "restore":
                if (accessMode < PermissionType.Edit)
                {
                    throw new Exception("Access Denided.");
                }
                RestoreLastVersion(page);
                isModified = true;
                break;
                #endregion
            }

            if (isModified)
            {
                ((DbContext)_db).Entry(page).State = EntityState.Modified;
                _db.SaveChanges();
            }

            return(Redirect("/" + page.Url));
            //return RedirectToAction("Page", "Cms", new { id = page.FriendlyId });
        }