/// <summary> /// Executes the specified request. /// </summary> /// <param name="id">The page id.</param> /// <returns></returns> public EditPagePropertiesViewModel Execute(Guid id) { var modelQuery = Repository .AsQueryable <PageProperties>() .Where(p => p.Id == id) .Select(page => new { Model = new EditPagePropertiesViewModel { Id = page.Id, Version = page.Version, PageName = page.Title, PageUrl = page.PageUrl, ForceAccessProtocol = page.ForceAccessProtocol, PageCSS = page.CustomCss, PageJavascript = page.CustomJS, UseNoFollow = page.UseNoFollow, UseNoIndex = page.UseNoIndex, UseCanonicalUrl = page.UseCanonicalUrl, IsPagePublished = page.Status == PageStatus.Published, IsArchived = page.IsArchived, IsMasterPage = page.IsMasterPage, TemplateId = page.Layout.Id, MasterPageId = page.MasterPage.Id, CategoryId = page.Category.Id, LanguageId = page.Language.Id, AccessControlEnabled = cmsConfiguration.Security.AccessControlEnabled, IsInSitemap = page.PagesView.IsInSitemap, Image = page.Image == null || page.Image.IsDeleted ? null : new ImageSelectorViewModel { ImageId = page.Image.Id, ImageVersion = page.Image.Version, ImageUrl = fileUrlResolver.EnsureFullPathUrl(page.Image.PublicUrl), ThumbnailUrl = fileUrlResolver.EnsureFullPathUrl(page.Image.PublicThumbnailUrl), ImageTooltip = page.Image.Caption, FolderId = page.Image.Folder != null ? page.Image.Folder.Id : (Guid?)null }, SecondaryImage = page.SecondaryImage == null || page.SecondaryImage.IsDeleted ? null : new ImageSelectorViewModel { ImageId = page.SecondaryImage.Id, ImageVersion = page.SecondaryImage.Version, ImageUrl = fileUrlResolver.EnsureFullPathUrl(page.SecondaryImage.PublicUrl), ThumbnailUrl = fileUrlResolver.EnsureFullPathUrl(page.SecondaryImage.PublicThumbnailUrl), ImageTooltip = page.SecondaryImage.Caption, FolderId = page.SecondaryImage.Folder != null ? page.SecondaryImage.Folder.Id : (Guid?)null }, FeaturedImage = page.FeaturedImage == null || page.FeaturedImage.IsDeleted ? null : new ImageSelectorViewModel { ImageId = page.FeaturedImage.Id, ImageVersion = page.FeaturedImage.Version, ImageUrl = fileUrlResolver.EnsureFullPathUrl(page.FeaturedImage.PublicUrl), ThumbnailUrl = fileUrlResolver.EnsureFullPathUrl(page.FeaturedImage.PublicThumbnailUrl), ImageTooltip = page.FeaturedImage.Caption, FolderId = page.FeaturedImage.Folder != null ? page.FeaturedImage.Folder.Id : (Guid?)null } }, LanguageGroupIdentifier = page.LanguageGroupIdentifier }) .ToFuture(); var tagsFuture = tagService.GetPageTagNames(id); var categories = categoryService.GetCategories(); var languagesFuture = (cmsConfiguration.EnableMultilanguage) ? languageService.GetLanguages() : null; IEnumerable <AccessRule> userAccessFuture; if (cmsConfiguration.Security.AccessControlEnabled) { userAccessFuture = Repository .AsQueryable <Root.Models.Page>() .Where(x => x.Id == id && !x.IsDeleted) .SelectMany(x => x.AccessRules) .OrderBy(x => x.IsForRole) .ThenBy(x => x.Identity) .ToFuture(); } else { userAccessFuture = null; } var model = modelQuery.ToList().FirstOrDefault(); if (model != null && model.Model != null) { if (model.Model.IsMasterPage) { AccessControlService.DemandAccess(Context.Principal, RootModuleConstants.UserRoles.Administration); } else { AccessControlService.DemandAccess(Context.Principal, RootModuleConstants.UserRoles.MultipleRoles(RootModuleConstants.UserRoles.EditContent, RootModuleConstants.UserRoles.PublishContent)); } model.Model.Tags = tagsFuture.ToList(); model.Model.RedirectFromOldUrl = true; model.Model.Categories = categories; model.Model.PageAccessProtocols = this.GetProtocolForcingTypes(); model.Model.UpdateSitemap = true; model.Model.CustomOptions = optionService.GetCustomOptions(); model.Model.ShowTranslationsTab = cmsConfiguration.EnableMultilanguage && !model.Model.IsMasterPage; if (model.Model.ShowTranslationsTab) { model.Model.Languages = languagesFuture.ToList(); if (!model.Model.Languages.Any()) { model.Model.TranslationMessages = new UserMessages(); model.Model.TranslationMessages.AddInfo(PagesGlobalization.EditPageProperties_TranslationsTab_NoLanguagesCreated_Message); } if (model.LanguageGroupIdentifier.HasValue) { model.Model.Translations = pageService.GetPageTranslations(model.LanguageGroupIdentifier.Value).ToList(); } } // Get layout options, page options and merge them model.Model.OptionValues = optionService.GetMergedMasterPagesOptionValues(model.Model.Id, model.Model.MasterPageId, model.Model.TemplateId); if (userAccessFuture != null) { model.Model.UserAccessList = userAccessFuture.Select(x => new UserAccessViewModel(x)).ToList(); var rules = model.Model.UserAccessList.Cast <IAccessRule>().ToList(); SetIsReadOnly(model.Model, rules); } model.Model.CanPublishPage = SecurityService.IsAuthorized(Context.Principal, RootModuleConstants.UserRoles.PublishContent); // Get templates model.Model.Templates = layoutService.GetAvailableLayouts(id, model.Model.MasterPageId).ToList(); model.Model.Templates .Where(x => x.TemplateId == model.Model.TemplateId || x.TemplateId == model.Model.MasterPageId) .Take(1).ToList() .ForEach(x => x.IsActive = true); } return(model != null ? model.Model : null); }
/// <summary> /// Executes the specified request. /// </summary> /// <param name="request">The request.</param> /// <returns>AddNewPage view model</returns> public AddNewPageViewModel Execute(AddNewPageCommandRequest request) { if (request.CreateMasterPage) { AccessControlService.DemandAccess(Context.Principal, RootModuleConstants.UserRoles.Administration); } else { AccessControlService.DemandAccess(Context.Principal, RootModuleConstants.UserRoles.EditContent); } var showLanguages = cmsConfiguration.EnableMultilanguage && !request.CreateMasterPage; var languagesFuture = (showLanguages) ? languageService.GetLanguagesLookupValues() : null; var principal = securityService.GetCurrentPrincipal(); var model = new AddNewPageViewModel { ParentPageUrl = request.ParentPageUrl, Templates = layoutService.GetAvailableLayouts().ToList(), AccessControlEnabled = cmsConfiguration.Security.AccessControlEnabled, CreateMasterPage = request.CreateMasterPage, ShowLanguages = showLanguages }; if (showLanguages) { model.Languages = languagesFuture.ToList(); model.ShowLanguages = model.Languages.Any(); } if (model.Templates.Count > 0) { model.Templates.ToList().ForEach(x => x.IsActive = false); // Select current page as master var urlHash = request.ParentPageUrl.UrlHash(); model.Templates.Where(t => t.IsMasterPage && t.MasterUrlHash == urlHash).ToList().ForEach(x => x.IsActive = true); // Select current page's layout if (model.Templates.Count(t => t.IsActive) != 1) { // Try to get layout of the current page var currentPageLayout = repository .AsQueryable <Root.Models.Page>(p => p.PageUrlHash == request.ParentPageUrl.UrlHash()) .Select(p => new { MasterPageId = p.MasterPage != null ? p.MasterPage.Id : (System.Guid?)null, LayoutId = p.Layout != null ? p.Layout.Id : (System.Guid?)null }) .FirstOrDefault(); if (currentPageLayout != null) { if (currentPageLayout.MasterPageId.HasValue) { model.Templates .Where(t => t.IsMasterPage && t.TemplateId == currentPageLayout.MasterPageId.Value) .Take(1) .ToList().ForEach(x => x.IsActive = true); } else if (currentPageLayout.LayoutId.HasValue) { model.Templates .Where(t => !t.IsMasterPage && t.TemplateId == currentPageLayout.LayoutId.Value) .Take(1) .ToList().ForEach(x => x.IsActive = true); } } } // Select first layout as active if (model.Templates.Count(t => t.IsActive) != 1) { model.Templates.First().IsActive = true; } var active = model.Templates.First(t => t.IsActive); if (active != null) { if (active.IsMasterPage) { model.MasterPageId = active.TemplateId; model.UserAccessList = Repository .AsQueryable <Root.Models.Page>() .Where(x => x.Id == model.MasterPageId && !x.IsDeleted) .SelectMany(x => x.AccessRules) .OrderBy(x => x.Identity) .Select(x => new UserAccessViewModel(x)).ToList(); } else { model.TemplateId = active.TemplateId; model.UserAccessList = AccessControlService.GetDefaultAccessList(principal).Select(f => new UserAccessViewModel(f)).ToList(); } } if (model.TemplateId.HasValue) { model.OptionValues = layoutService.GetLayoutOptionValues(model.TemplateId.Value); } if (model.MasterPageId.HasValue) { model.OptionValues = masterPageService.GetMasterPageOptionValues(model.MasterPageId.Value); } model.CustomOptions = optionService.GetCustomOptions(); } return(model); }
public PagesGridViewModel <SiteSettingPageViewModel> GetFilteredPagesList(PagesFilter request) { request.SetDefaultSortingOptions("Title"); PageProperties alias = null; PagesView viewAlias = null; SiteSettingPageViewModel modelAlias = null; var query = unitOfWork.Session .QueryOver(() => viewAlias) .Inner.JoinAlias(() => viewAlias.Page, () => alias) .Where(() => !alias.IsDeleted && alias.Status != PageStatus.Preview); var hasnotSeoDisjunction = Restrictions.Disjunction() .Add(Restrictions.Eq(Projections.Property(() => viewAlias.IsInSitemap), false)) .Add(RestrictionsExtensions.IsNullOrWhiteSpace(Projections.Property(() => alias.MetaTitle))) .Add(RestrictionsExtensions.IsNullOrWhiteSpace(Projections.Property(() => alias.MetaKeywords))) .Add(RestrictionsExtensions.IsNullOrWhiteSpace(Projections.Property(() => alias.MetaDescription))); var hasSeoProjection = Projections.Conditional(hasnotSeoDisjunction, Projections.Constant(false, NHibernateUtil.Boolean), Projections.Constant(true, NHibernateUtil.Boolean)); query = FilterQuery(query, request, hasnotSeoDisjunction); query = query .SelectList(select => select .Select(() => alias.Id).WithAlias(() => modelAlias.Id) .Select(() => alias.Version).WithAlias(() => modelAlias.Version) .Select(() => alias.Title).WithAlias(() => modelAlias.Title) .Select(() => alias.Status).WithAlias(() => modelAlias.PageStatus) .Select(hasSeoProjection).WithAlias(() => modelAlias.HasSEO) .Select(() => alias.CreatedOn).WithAlias(() => modelAlias.CreatedOn) .Select(() => alias.ModifiedOn).WithAlias(() => modelAlias.ModifiedOn) .Select(() => alias.PageUrl).WithAlias(() => modelAlias.Url) .Select(() => alias.Language.Id).WithAlias(() => modelAlias.LanguageId) .Select(() => alias.IsMasterPage).WithAlias(() => modelAlias.IsMasterPage)) .TransformUsing(Transformers.AliasToBean <SiteSettingPageViewModel>()); if (configuration.Security.AccessControlEnabled) { IEnumerable <Guid> deniedPages = accessControlService.GetDeniedObjects <PageProperties>(); foreach (var deniedPageId in deniedPages) { var id = deniedPageId; query = query.Where(f => f.Id != id); } } var count = query.ToRowCountFutureValue(); var categoriesFuture = categoryService.GetCategories(); IEnumerable <LookupKeyValue> languagesFuture = configuration.EnableMultilanguage ? languageService.GetLanguagesLookupValues() : null; var pages = query.AddSortingAndPaging(request).Future <SiteSettingPageViewModel>(); var layouts = layoutService .GetAvailableLayouts() .Select(l => new LookupKeyValue( string.Format("{0}-{1}", l.IsMasterPage ? "m" : "l", l.TemplateId), l.Title)) .ToList(); var model = CreateModel(pages, request, count, categoriesFuture, layouts); if (languagesFuture != null) { model.Languages = languagesFuture.ToList(); model.Languages.Insert(0, languageService.GetInvariantLanguageModel()); } return(model); }
/// <summary> /// Executes the specified request. /// </summary> /// <param name="request">The request.</param> /// <returns>Result model.</returns> public virtual PagesGridViewModel <SiteSettingPageViewModel> Execute(PagesFilter request) { request.SetDefaultSortingOptions("Title"); PageProperties alias = null; SiteSettingPageViewModel modelAlias = null; var query = UnitOfWork.Session .QueryOver(() => alias) .Where(() => !alias.IsDeleted && alias.Status != PageStatus.Preview); // NOTE: below does not work - need to find out how to rewrite it. // var nodesSubQuery = QueryOver.Of<SitemapNode>() // .Where(x => x.Page.Id == alias.Id || x.UrlHash == alias.PageUrlHash) // .Select(s => 1) // .Take(1); var hasSeoDisjunction = Restrictions.Disjunction() .Add(RestrictionsExtensions.IsNullOrWhiteSpace(Projections.Property(() => alias.MetaTitle))) .Add(RestrictionsExtensions.IsNullOrWhiteSpace(Projections.Property(() => alias.MetaKeywords))) .Add(RestrictionsExtensions.IsNullOrWhiteSpace(Projections.Property(() => alias.MetaDescription))); var hasSeoProjection = Projections.Conditional(hasSeoDisjunction, //.Add(Restrictions.IsNull(Projections.SubQuery(nodesSubQuery))), Projections.Constant(false, NHibernateUtil.Boolean), Projections.Constant(true, NHibernateUtil.Boolean)); query = FilterQuery(query, request, hasSeoDisjunction); var sitemapNodesFuture = Repository .AsQueryable <SitemapNode>() .Where(n => !n.IsDeleted && !n.Sitemap.IsDeleted).ToFuture(); query = query .SelectList(select => select .Select(() => alias.Id).WithAlias(() => modelAlias.Id) .Select(() => alias.Version).WithAlias(() => modelAlias.Version) .Select(() => alias.Title).WithAlias(() => modelAlias.Title) .Select(() => alias.Status).WithAlias(() => modelAlias.PageStatus) .Select(hasSeoProjection).WithAlias(() => modelAlias.HasSEO) .Select(() => alias.CreatedOn).WithAlias(() => modelAlias.CreatedOn) .Select(() => alias.ModifiedOn).WithAlias(() => modelAlias.ModifiedOn) .Select(() => alias.PageUrl).WithAlias(() => modelAlias.Url) .Select(() => alias.Language.Id).WithAlias(() => modelAlias.LanguageId)) .TransformUsing(Transformers.AliasToBean <SiteSettingPageViewModel>()); if (configuration.Security.AccessControlEnabled) { IEnumerable <Guid> deniedPages = accessControlService.GetDeniedObjects <PageProperties>(); foreach (var deniedPageId in deniedPages) { var id = deniedPageId; query = query.Where(f => f.Id != id); } } var count = query.ToRowCountFutureValue(); var categoriesFuture = categoryService.GetCategories(); IEnumerable <LookupKeyValue> languagesFuture = configuration.EnableMultilanguage ? languageService.GetLanguages() : null; var pages = query.AddSortingAndPaging(request).Future <SiteSettingPageViewModel>(); var layouts = layoutService .GetAvailableLayouts() .Select(l => new LookupKeyValue( string.Format("{0}-{1}", l.IsMasterPage ? "m" : "l", l.TemplateId), l.Title)) .ToList(); var model = CreateModel(pages, request, count, categoriesFuture, layouts); if (languagesFuture != null) { model.Languages = languagesFuture.ToList(); model.Languages.Insert(0, languageService.GetInvariantLanguageModel()); } // NOTE: Query over with subquery in CASE statement and paging des not work. if (sitemapNodesFuture != null) { var nodes = sitemapNodesFuture.ToList(); foreach (var pageViewModel in model.Items) { var hash = pageViewModel.Url.UrlHash(); pageViewModel.HasSEO = pageViewModel.HasSEO && nodes.Any(n => n.UrlHash == hash || (n.Page != null && n.Page.Id == pageViewModel.Id)); } } return(model); }