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; }
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)); }
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))); }
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 }
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); }
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 }); }