From e73a39945b97f4807274c2f9700277c32c64eed0 Mon Sep 17 00:00:00 2001 From: Andre Rodrigues Date: Tue, 22 Mar 2011 16:41:04 -0700 Subject: [PATCH 1/6] Removing dependency on "Dependencies.xml" --HG-- branch : dev --- .../FileSystems/Dependencies/DefaultDependenciesFolder.cs | 8 +------- .../FileSystems/Dependencies/IDependenciesFolder.cs | 1 - .../Mvc/ViewEngines/Razor/IRazorCompilationEvents.cs | 5 +---- 3 files changed, 2 insertions(+), 12 deletions(-) diff --git a/src/Orchard/FileSystems/Dependencies/DefaultDependenciesFolder.cs b/src/Orchard/FileSystems/Dependencies/DefaultDependenciesFolder.cs index 11ae69ed9..2a9acd9ff 100644 --- a/src/Orchard/FileSystems/Dependencies/DefaultDependenciesFolder.cs +++ b/src/Orchard/FileSystems/Dependencies/DefaultDependenciesFolder.cs @@ -24,9 +24,7 @@ namespace Orchard.FileSystems.Dependencies { public Localizer T { get; set; } private string PersistencePath { - get { - return _appDataFolder.Combine(BasePath, FileName); - } + get { return _appDataFolder.Combine(BasePath, FileName); } } public DependencyDescriptor GetDescriptor(string moduleName) { @@ -55,10 +53,6 @@ namespace Orchard.FileSystems.Dependencies { } } - public IEnumerable GetViewCompilationDependencies() { - yield return _appDataFolder.GetVirtualPath(this.PersistencePath); - } - private IEnumerable ReadDependencies(string persistancePath) { Func ns = (name => XName.Get(name)); Func elem = (e, name) => e.Element(ns(name)).Value; diff --git a/src/Orchard/FileSystems/Dependencies/IDependenciesFolder.cs b/src/Orchard/FileSystems/Dependencies/IDependenciesFolder.cs index 9369fb38d..5468cab95 100644 --- a/src/Orchard/FileSystems/Dependencies/IDependenciesFolder.cs +++ b/src/Orchard/FileSystems/Dependencies/IDependenciesFolder.cs @@ -23,6 +23,5 @@ namespace Orchard.FileSystems.Dependencies { DependencyDescriptor GetDescriptor(string moduleName); IEnumerable LoadDescriptors(); void StoreDescriptors(IEnumerable dependencyDescriptors); - IEnumerable GetViewCompilationDependencies(); } } diff --git a/src/Orchard/Mvc/ViewEngines/Razor/IRazorCompilationEvents.cs b/src/Orchard/Mvc/ViewEngines/Razor/IRazorCompilationEvents.cs index 6ef3ddf89..385988df1 100644 --- a/src/Orchard/Mvc/ViewEngines/Razor/IRazorCompilationEvents.cs +++ b/src/Orchard/Mvc/ViewEngines/Razor/IRazorCompilationEvents.cs @@ -84,14 +84,11 @@ namespace Orchard.Mvc.ViewEngines.Razor { provider.AssemblyBuilder.AddAssemblyReference(assembly); } } + foreach (var virtualDependency in entry.dependencies) { provider.AddVirtualPathDependency(virtualDependency); } } - - foreach (var virtualDependency in _dependenciesFolder.GetViewCompilationDependencies()) { - provider.AddVirtualPathDependency(virtualDependency); - } } private DependencyDescriptor GetModuleDependencyDescriptor(string virtualPath) { From 4a404afd2dc7bd39bb3a1c902fcf4291c5b95509 Mon Sep 17 00:00:00 2001 From: Andre Rodrigues Date: Tue, 22 Mar 2011 17:10:32 -0700 Subject: [PATCH 2/6] Adding HostRestart folder to WebPI and making it writable. --HG-- branch : dev --- Orchard.proj | 2 ++ lib/msdeploy/manifest.xml | 1 + lib/msdeploy/parameters.xml | 4 ++++ 3 files changed, 7 insertions(+) diff --git a/Orchard.proj b/Orchard.proj index 206e68404..ca84ef19e 100644 --- a/Orchard.proj +++ b/Orchard.proj @@ -293,6 +293,8 @@ DestinationFolder="$(MsDeployFolder)\Orchard\%(RecursiveDir)"/> + + diff --git a/lib/msdeploy/manifest.xml b/lib/msdeploy/manifest.xml index 629f30126..eaf157234 100644 --- a/lib/msdeploy/manifest.xml +++ b/lib/msdeploy/manifest.xml @@ -2,5 +2,6 @@ + diff --git a/lib/msdeploy/parameters.xml b/lib/msdeploy/parameters.xml index 17c00292f..3a2e494c9 100644 --- a/lib/msdeploy/parameters.xml +++ b/lib/msdeploy/parameters.xml @@ -13,6 +13,10 @@ + + + + From 319134e23710150c1e1752efd23ba85dafcc01ee Mon Sep 17 00:00:00 2001 From: Dave Reed Date: Tue, 22 Mar 2011 17:48:26 -0700 Subject: [PATCH 3/6] Changing list management pick items ability to a new 'choose items' view. --HG-- branch : dev --- .../Controllers/AdminController.cs | 204 +++++++++++++----- .../Orchard.Lists/Orchard.Lists.csproj | 4 + .../Modules/Orchard.Lists/Routes.cs | 39 ++-- .../ViewModels/ChooseContentsViewModel.cs | 21 ++ .../Orchard.Lists/Views/Admin/Choose.cshtml | 62 ++++++ .../Orchard.Lists/Views/Admin/List.cshtml | 11 +- .../Views/Parts.Container.Manage.cshtml | 9 +- 7 files changed, 260 insertions(+), 90 deletions(-) create mode 100644 src/Orchard.Web/Modules/Orchard.Lists/ViewModels/ChooseContentsViewModel.cs create mode 100644 src/Orchard.Web/Modules/Orchard.Lists/Views/Admin/Choose.cshtml diff --git a/src/Orchard.Web/Modules/Orchard.Lists/Controllers/AdminController.cs b/src/Orchard.Web/Modules/Orchard.Lists/Controllers/AdminController.cs index 64575d7d9..d00d09baf 100644 --- a/src/Orchard.Web/Modules/Orchard.Lists/Controllers/AdminController.cs +++ b/src/Orchard.Web/Modules/Orchard.Lists/Controllers/AdminController.cs @@ -60,47 +60,26 @@ namespace Lists.Controllers { public ActionResult List(ListContentsViewModel model, PagerParameters pagerParameters) { var pager = new Pager(_siteService.GetSiteSettings(), pagerParameters); var container = model.ContainerId.HasValue ? _contentManager.GetLatest((int)model.ContainerId) : null; - if (container == null && model.ContainerId.HasValue) { + if (container == null || !container.Has()) { return HttpNotFound(); } - var restrictedContentType = container == null ? null : container.As().Record.ItemContentType; + var restrictedContentType = container.As().Record.ItemContentType; var hasRestriction = !string.IsNullOrEmpty(restrictedContentType); if (hasRestriction) { model.FilterByContentType = restrictedContentType; } - - if (container != null) { - var metadata = container.ContentManager.GetItemMetadata(container); - model.ContainerDisplayName = metadata.DisplayText; - if (string.IsNullOrEmpty(model.ContainerDisplayName)) { - model.ContainerDisplayName = container.ContentType; - } - } - - var query = _contentManager.Query(VersionOptions.Latest); - - if (!string.IsNullOrEmpty(model.FilterByContentType)) { - var contentTypeDefinition = _contentDefinitionManager.GetTypeDefinition(model.FilterByContentType); - if (contentTypeDefinition == null) - return HttpNotFound(); - query = query.ForType(model.FilterByContentType); - } - query = query.Join().Where(cr => cr.Container.Id == model.ContainerId); - - switch (model.Options.OrderBy) { - case ContentsOrder.Modified: - query = query.OrderByDescending(cr => cr.ModifiedUtc); - break; - case ContentsOrder.Published: - query = query.OrderByDescending(cr => cr.PublishedUtc); - break; - case ContentsOrder.Created: - query = query.OrderByDescending(cr => cr.CreatedUtc); - break; - } - model.Options.SelectedFilter = model.FilterByContentType; + model.ContainerDisplayName = container.ContentManager.GetItemMetadata(container).DisplayText; + if (string.IsNullOrEmpty(model.ContainerDisplayName)) { + model.ContainerDisplayName = container.ContentType; + } + + var query = GetListContentItemQuery(model); + if (query == null) { + return new HttpNotFoundResult(); + } + if (!hasRestriction) { model.Options.FilterOptions = GetContainableTypes() .Select(ctd => new KeyValuePair(ctd.Name, ctd.DisplayName)) @@ -120,7 +99,7 @@ namespace Lists.Controllers { .Options(model.Options) .HasRestriction(hasRestriction) .ContainerDisplayName(model.ContainerDisplayName) - .ContainerContentType(container == null ? null : container.ContentType) + .ContainerContentType(container.ContentType) .ContainerItemContentType(hasRestriction ? restrictedContentType : (model.FilterByContentType ?? "")) .OtherLists(_contentManager.Query(VersionOptions.Latest).List() .Select(part => part.ContentItem) @@ -131,6 +110,32 @@ namespace Lists.Controllers { return View((object)viewModel); } + private IContentQuery GetListContentItemQuery(ListContentsViewModel model) { + var query = _contentManager.Query(VersionOptions.Latest); + + if (!string.IsNullOrEmpty(model.FilterByContentType)) { + var contentTypeDefinition = _contentDefinitionManager.GetTypeDefinition(model.FilterByContentType); + if (contentTypeDefinition == null) { + return null; + } + query = query.ForType(model.FilterByContentType); + } + query = query.Join().Where(cr => cr.Container.Id == model.ContainerId); + + switch (model.Options.OrderBy) { + case ContentsOrder.Modified: + query = query.OrderByDescending(cr => cr.ModifiedUtc); + break; + case ContentsOrder.Published: + query = query.OrderByDescending(cr => cr.PublishedUtc); + break; + case ContentsOrder.Created: + query = query.OrderByDescending(cr => cr.CreatedUtc); + break; + } + return query; + } + [HttpPost, ActionName("List")] [FormValueRequired("submit.BulkEdit")] public ActionResult ListPOST(ContentOptions options, IEnumerable itemIds, int? targetContainerId, string returnUrl) { @@ -172,6 +177,119 @@ namespace Lists.Controllers { return this.RedirectLocal(returnUrl, () => RedirectToAction("List")); } + [HttpPost, ActionName("List")] + [FormValueRequired("submit.Filter")] + public ActionResult ListFilterPOST(ContentOptions options) { + var routeValues = ControllerContext.RouteData.Values; + if (options != null) { + routeValues["Options.OrderBy"] = options.OrderBy; + if (GetContainableTypes().Any(ctd => string.Equals(ctd.Name, options.SelectedFilter, StringComparison.OrdinalIgnoreCase))) { + routeValues["filterByContentType"] = options.SelectedFilter; + } + else { + routeValues.Remove("filterByContentType"); + } + } + + return RedirectToAction("List", routeValues); + } + + public ActionResult Choose(ChooseContentsViewModel model, PagerParameters pagerParameters) { + var pager = new Pager(_siteService.GetSiteSettings(), pagerParameters); + var container = model.SourceContainerId == 0 ? null : _contentManager.GetLatest(model.SourceContainerId); + if (container == null && model.SourceContainerId != 0) { + return HttpNotFound(); + } + + var query = _contentManager.Query(VersionOptions.Latest); + + if (!string.IsNullOrEmpty(model.FilterByContentType)) { + var contentTypeDefinition = _contentDefinitionManager.GetTypeDefinition(model.FilterByContentType); + if (contentTypeDefinition == null) { + return HttpNotFound(); + } + query = query.ForType(model.FilterByContentType); + } + if (model.SourceContainerId == 0) { + query = query.Join().Where(cr => cr.Container == null); + } + else { + query = query.Join().Where(cr => cr.Container.Id == model.SourceContainerId); + } + + switch (model.OrderBy) { + case ContentsOrder.Modified: + query = query.OrderByDescending(cr => cr.ModifiedUtc); + break; + case ContentsOrder.Published: + query = query.OrderByDescending(cr => cr.PublishedUtc); + break; + case ContentsOrder.Created: + query = query.OrderByDescending(cr => cr.CreatedUtc); + break; + } + + model.SelectedFilter = model.FilterByContentType; + + model.FilterOptions = GetContainableTypes() + .Select(ctd => new KeyValuePair(ctd.Name, ctd.DisplayName)) + .ToList().OrderBy(kvp => kvp.Key); + + var pagerShape = Shape.Pager(pager).TotalItemCount(query.Count()); + var pageOfContentItems = query.Slice(pager.GetStartIndex(), pager.PageSize).ToList(); + + var list = Shape.List(); + list.AddRange(pageOfContentItems.Select(ci => _contentManager.BuildDisplay(ci, "SummaryAdmin"))); + + dynamic viewModel = Shape.ViewModel() + .ContentItems(list) + .Pager(pagerShape) + .SourceContainerId(model.SourceContainerId) + .TargetContainerId(model.TargetContainerId) + .SelectedFilter(model.SelectedFilter) + .FilterOptions(model.FilterOptions) + .OrderBy(model.OrderBy) + .Containers(_contentManager.Query(VersionOptions.Latest).List() + .Select(part => part.ContentItem) + .OrderBy(item => item.As().VersionPublishedUtc)); + + // Casting to avoid invalid (under medium trust) reflection over the protected View method and force a static invocation. + return View((object)viewModel); + } + + [HttpPost, ActionName("Choose")] + [FormValueRequired("submit.MoveTo")] + public ActionResult ChoosePOST(IEnumerable itemIds, int targetContainerId, string returnUrl) { + if (itemIds != null && !BulkMoveToList(itemIds, targetContainerId)) { + return new HttpUnauthorizedResult(); + } + + return this.RedirectLocal(returnUrl, () => RedirectToAction("List", new { ContainerId = targetContainerId })); + } + + [HttpPost, ActionName("Choose")] + [FormValueRequired("submit.Filter")] + public ActionResult ChooseFilterPOST(ChooseContentsViewModel model) { + var routeValues = ControllerContext.RouteData.Values; + if (GetContainableTypes().Any(ctd => string.Equals(ctd.Name, model.SelectedFilter, StringComparison.OrdinalIgnoreCase))) { + routeValues["filterByContentType"] = model.SelectedFilter; + } + else { + routeValues.Remove("filterByContentType"); + } + if (model.SourceContainerId == 0) { + routeValues.Remove("SourceContainerId"); + } + else { + routeValues["SourceContainerId"] = model.SourceContainerId; + } + routeValues["OrderBy"] = model.OrderBy; + routeValues["TargetContainerId"] = model.TargetContainerId; + + return RedirectToAction("Choose", routeValues); + } + + private bool BulkMoveToList(IEnumerable itemIds, int? targetContainerId) { if (!targetContainerId.HasValue) { Services.Notifier.Information(T("Please select the list to move the items to.")); @@ -248,23 +366,5 @@ namespace Lists.Controllers { return true; } - [HttpPost, ActionName("List")] - [FormValueRequired("submit.Filter")] - public ActionResult ListFilterPOST(ContentOptions options) { - var routeValues = ControllerContext.RouteData.Values; - if (options != null) { - routeValues["Options.OrderBy"] = options.OrderBy; - if (GetContainableTypes().Any(ctd => string.Equals(ctd.Name, options.SelectedFilter, StringComparison.OrdinalIgnoreCase))) { - routeValues["filterByContentType"] = options.SelectedFilter; - } - else { - routeValues.Remove("filterByContentType"); - } - } - - return RedirectToAction("List", routeValues); - } - - } } diff --git a/src/Orchard.Web/Modules/Orchard.Lists/Orchard.Lists.csproj b/src/Orchard.Web/Modules/Orchard.Lists/Orchard.Lists.csproj index cae96d59b..a59b9e679 100644 --- a/src/Orchard.Web/Modules/Orchard.Lists/Orchard.Lists.csproj +++ b/src/Orchard.Web/Modules/Orchard.Lists/Orchard.Lists.csproj @@ -52,6 +52,7 @@ + @@ -98,6 +99,9 @@ Designer + + + diff --git a/src/Orchard/Environment/Warmup/StartupResult.cs b/src/Orchard/Environment/Warmup/StartupResult.cs deleted file mode 100644 index 0a1400f90..000000000 --- a/src/Orchard/Environment/Warmup/StartupResult.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System; - -namespace Orchard.Environment.Warmup { - public class StartupResult { - public IOrchardHost Host { get; set; } - public Exception Error { get; set; } - } -} diff --git a/src/Orchard/Environment/Warmup/WarmupUtility.cs b/src/Orchard/Environment/Warmup/WarmupUtility.cs index e13003fd4..b964ef244 100644 --- a/src/Orchard/Environment/Warmup/WarmupUtility.cs +++ b/src/Orchard/Environment/Warmup/WarmupUtility.cs @@ -1,19 +1,29 @@ using System; -using System.Linq; using System.Text; -using System.Text.RegularExpressions; namespace Orchard.Environment.Warmup { public static class WarmupUtility { - private const string EncodingPattern = "[^a-z0-9]"; - public static string EncodeUrl(string url) { if(String.IsNullOrWhiteSpace(url)) { throw new ArgumentException("url can't be empty"); } - return Regex.Replace(url.ToLower(), EncodingPattern, m => "_" + Encoding.UTF8.GetBytes(m.Value).Select(b => b.ToString("X")).Aggregate((a, b) => a + b)); - } + var sb = new StringBuilder(); + foreach (var c in url.ToLowerInvariant()) { + // only accept alphanumeric chars + if ((c >= 'a' && c <= 'z') || (c >= '0' && c <= '9')) { + sb.Append(c); + } + // otherwise encode them in UTF8 + else { + sb.Append("_"); + foreach(var b in Encoding.UTF8.GetBytes(new [] {c})) { + sb.Append(b.ToString("X")); + } + } + } + return sb.ToString(); + } } } diff --git a/src/Orchard/Orchard.Framework.csproj b/src/Orchard/Orchard.Framework.csproj index dc713d2b6..f6e62d379 100644 --- a/src/Orchard/Orchard.Framework.csproj +++ b/src/Orchard/Orchard.Framework.csproj @@ -187,7 +187,6 @@ - From 34b9ed9d5b821900ea7dcb900f84b9018a1fc1b1 Mon Sep 17 00:00:00 2001 From: jowall Date: Wed, 23 Mar 2011 10:14:19 -0700 Subject: [PATCH 6/6] Added some margin to the header. --HG-- branch : dev --- src/Orchard.Web/Themes/TheAdmin/Styles/site.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Orchard.Web/Themes/TheAdmin/Styles/site.css b/src/Orchard.Web/Themes/TheAdmin/Styles/site.css index 8953950e9..e7874c014 100644 --- a/src/Orchard.Web/Themes/TheAdmin/Styles/site.css +++ b/src/Orchard.Web/Themes/TheAdmin/Styles/site.css @@ -243,6 +243,7 @@ form.link button:hover, button.link:hover { ***************************************************************/ #header { height:50px; + margin:16px 0 0 0; background:#f3f4f5; } #branding {