/// <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);
        }
예제 #2
0
        /// <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);
        }
예제 #4
0
        /// <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);
        }