)Model.SiteCultures).All(c => c == Model.Culture || localizations.Any(l => c == l.Culture.Culture)))
{
- @Html.ActionLink(T("+ New translation").Text, "Translate", "Admin", new { area = "Orchard.Localization", id = Model.Id }, new { itemprop = "UnsafeUrl" })
+ @Html.ActionLink(T("+ New translation").Text, "Translate", "Admin", new { area = "Orchard.Localization", id = Model.MasterId }, new { itemprop = "UnsafeUrl" })
}
}
\ No newline at end of file
diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Handlers/MediaPartHandler.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Handlers/MediaPartHandler.cs
index 0376feca3..2e73d8209 100644
--- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Handlers/MediaPartHandler.cs
+++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Handlers/MediaPartHandler.cs
@@ -1,25 +1,40 @@
using System;
-using Orchard.ContentManagement.Handlers;
-using Orchard.Data;
-using Orchard.MediaLibrary.Services;
-using Orchard.MediaLibrary.Models;
using System.IO;
-using Orchard.FileSystems.Media;
+using System.Linq;
using Orchard.ContentManagement;
+using Orchard.ContentManagement.Handlers;
+using Orchard.ContentManagement.MetaData;
+using Orchard.Core.Title.Models;
+using Orchard.Data;
+using Orchard.FileSystems.Media;
+using Orchard.MediaLibrary.Models;
+using Orchard.MediaLibrary.Services;
namespace Orchard.MediaLibrary.Handlers {
public class MediaPartHandler : ContentHandler {
private readonly IMediaLibraryService _mediaLibraryService;
private readonly IStorageProvider _storageProvider;
+ private readonly IContentDefinitionManager _contentDefinitionManager;
public MediaPartHandler(
IStorageProvider storageProvider,
IMediaLibraryService mediaLibraryService,
- IRepository repository) {
+ IRepository repository,
+ IContentDefinitionManager contentDefinitionManager) {
_storageProvider = storageProvider;
_mediaLibraryService = mediaLibraryService;
+ _contentDefinitionManager = contentDefinitionManager;
Filters.Add(StorageFilter.For(repository));
+ Filters.Add(new ActivatingFilter(contentType => {
+ var typeDefinition = _contentDefinitionManager.GetTypeDefinition(contentType);
+ // To avoid NRE when the handler runs for ad-hoc content types, e.g. MediaLibraryExplorer.
+ return typeDefinition == null ?
+ false :
+ typeDefinition.Parts.Any(contentTypePartDefinition =>
+ contentTypePartDefinition.PartDefinition.Name == typeof(MediaPart).Name);
+ }));
+
OnRemoving((context, part) => RemoveMedia(part));
OnLoaded((context, part) => {
if (!String.IsNullOrEmpty(part.FileName)) {
diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Models/MediaPart.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Models/MediaPart.cs
index 38647a55c..b8cef2b4a 100644
--- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Models/MediaPart.cs
+++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Models/MediaPart.cs
@@ -1,8 +1,10 @@
using System;
using Orchard.ContentManagement;
using Orchard.ContentManagement.FieldStorage.InfosetStorage;
+using Orchard.ContentManagement.Handlers;
using Orchard.ContentManagement.Utilities;
using Orchard.Core.Title.Models;
+using Orchard.MediaLibrary.Handlers;
namespace Orchard.MediaLibrary.Models {
public class MediaPart : ContentPart {
@@ -11,6 +13,8 @@ namespace Orchard.MediaLibrary.Models {
///
/// Gets or sets the title of the media.
+ /// This adds an implicit dependency on which will be resolved by an
+ /// in the .
///
public string Title {
get { return ContentItem.As().Title; }
@@ -63,7 +67,7 @@ namespace Orchard.MediaLibrary.Models {
/// Gets the public Url of the media if stored locally.
///
public string MediaUrl {
- get { return _publicUrl.Value; }
+ get { return _publicUrl.Value; }
}
///
diff --git a/src/Orchard.Web/Modules/Orchard.Redis/Caching/RedisCacheStorageProvider.cs b/src/Orchard.Web/Modules/Orchard.Redis/Caching/RedisCacheStorageProvider.cs
index 38ba2134b..c85578cd8 100644
--- a/src/Orchard.Web/Modules/Orchard.Redis/Caching/RedisCacheStorageProvider.cs
+++ b/src/Orchard.Web/Modules/Orchard.Redis/Caching/RedisCacheStorageProvider.cs
@@ -58,7 +58,7 @@ namespace Orchard.Redis.Caching {
}
public void Clear() {
- Database.KeyDeleteWithPrefix(GetLocalizedKey("*"));
+ _connectionMultiplexer.KeyDeleteWithPrefix(GetLocalizedKey("*"));
}
private string GetLocalizedKey(string key) {
diff --git a/src/Orchard.Web/Modules/Orchard.Redis/Extensions/RedisDatabaseExtensions.cs b/src/Orchard.Web/Modules/Orchard.Redis/Extensions/RedisDatabaseExtensions.cs
deleted file mode 100644
index 2b223a064..000000000
--- a/src/Orchard.Web/Modules/Orchard.Redis/Extensions/RedisDatabaseExtensions.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-using System;
-using StackExchange.Redis;
-
-namespace Orchard.Redis.Extensions {
- public static class RedisDatabaseExtensions {
-
- public static void KeyDeleteWithPrefix(this IDatabase database, string prefix) {
- if (database == null) {
- throw new ArgumentException("Database cannot be null", "database");
- }
-
- if (string.IsNullOrWhiteSpace(prefix)) {
- throw new ArgumentException("Prefix cannot be empty", "database");
- }
-
- database.ScriptEvaluate(@"
- local keys = redis.call('keys', ARGV[1])
- for i=1,#keys,5000 do
- redis.call('del', unpack(keys, i, math.min(i+4999, #keys)))
- end", values: new RedisValue[] { prefix });
- }
-
- public static int KeyCount(this IDatabase database, string prefix) {
- if (database == null) {
- throw new ArgumentException("Database cannot be null", "database");
- }
-
- if (string.IsNullOrWhiteSpace(prefix)) {
- throw new ArgumentException("Prefix cannot be empty", "database");
- }
-
- var retVal = database.ScriptEvaluate("return table.getn(redis.call('keys', ARGV[1]))", values: new RedisValue[] { prefix });
-
- if (retVal.IsNull) {
- return 0;
- }
-
- return (int)retVal;
- }
- }
-}
\ No newline at end of file
diff --git a/src/Orchard.Web/Modules/Orchard.Redis/Orchard.Redis.csproj b/src/Orchard.Web/Modules/Orchard.Redis/Orchard.Redis.csproj
index 891fb88bf..b050876b5 100644
--- a/src/Orchard.Web/Modules/Orchard.Redis/Orchard.Redis.csproj
+++ b/src/Orchard.Web/Modules/Orchard.Redis/Orchard.Redis.csproj
@@ -113,7 +113,7 @@
-
+
diff --git a/src/Orchard.Web/Modules/Orchard.Redis/OutputCache/RedisOutputCacheStorageProvider.cs b/src/Orchard.Web/Modules/Orchard.Redis/OutputCache/RedisOutputCacheStorageProvider.cs
index c740bf294..ca8816b7e 100644
--- a/src/Orchard.Web/Modules/Orchard.Redis/OutputCache/RedisOutputCacheStorageProvider.cs
+++ b/src/Orchard.Web/Modules/Orchard.Redis/OutputCache/RedisOutputCacheStorageProvider.cs
@@ -86,7 +86,7 @@ namespace Orchard.Redis.OutputCache {
return;
}
- Database.KeyDeleteWithPrefix(GetLocalizedKey("*"));
+ Database.KeyDelete(GetPrefixedKeys().Select(key => (RedisKey)key).ToArray());
}
public CacheItem GetCacheItem(string key) {
@@ -126,7 +126,7 @@ namespace Orchard.Redis.OutputCache {
return 0;
}
- return Database.KeyCount(GetLocalizedKey("*"));
+ return GetPrefixedKeys().Count();
}
///
@@ -147,19 +147,19 @@ namespace Orchard.Redis.OutputCache {
return new string[0];
}
+ var prefix = GetLocalizedKey("");
+ return GetPrefixedKeys().Select(x => x.Substring(prefix.Length));
+ }
+
+ private IEnumerable GetPrefixedKeys() {
// prevent the same request from computing the list twice (count + list)
if (_keysCache == null) {
_keysCache = new HashSet();
- var prefix = GetLocalizedKey("");
-
- foreach (var endPoint in _connectionMultiplexer.GetEndPoints()) {
- var server = _connectionMultiplexer.GetServer(endPoint);
- foreach (var key in server.Keys(pattern: GetLocalizedKey("*"))) {
- _keysCache.Add(key.ToString().Substring(prefix.Length));
- }
+ var keys = _connectionMultiplexer.GetKeys(GetLocalizedKey("*"));
+ foreach (var key in keys) {
+ _keysCache.Add(key);
}
}
-
return _keysCache;
}
diff --git a/src/Orchard.Web/Modules/Orchard.Taxonomies/Drivers/TaxonomyFieldDriver.cs b/src/Orchard.Web/Modules/Orchard.Taxonomies/Drivers/TaxonomyFieldDriver.cs
index 8e48ac6ba..396c7696b 100644
--- a/src/Orchard.Web/Modules/Orchard.Taxonomies/Drivers/TaxonomyFieldDriver.cs
+++ b/src/Orchard.Web/Modules/Orchard.Taxonomies/Drivers/TaxonomyFieldDriver.cs
@@ -117,13 +117,10 @@ namespace Orchard.Taxonomies.Drivers {
}
protected override void Exporting(ContentPart part, TaxonomyField field, ExportContentContext context) {
- var appliedTerms = _taxonomyService.GetTermsForContentItem(part.ContentItem.Id, field.Name);
-
+ var appliedTerms = _taxonomyService.GetTermsForContentItem(part.ContentItem.Id, field.Name);
// stores all content items associated to this field
var termIdentities = appliedTerms.Select(x => Services.ContentManager.GetItemMetadata(x).Identity.ToString()).ToArray();
-
- if (termIdentities.Any())
- context.Element(XmlConvert.EncodeLocalName(field.FieldDefinition.Name + "." + field.Name)).SetAttributeValue("Terms", String.Join(",", termIdentities));
+ context.Element(XmlConvert.EncodeLocalName(field.FieldDefinition.Name + "." + field.Name)).SetAttributeValue("Terms", String.Join(",", termIdentities));
}
protected override void Importing(ContentPart part, TaxonomyField field, ImportContentContext context) {
diff --git a/src/Orchard/DisplayManagement/Descriptors/ShapeAttributeStrategy/ShapeAttributeBindingStrategy.cs b/src/Orchard/DisplayManagement/Descriptors/ShapeAttributeStrategy/ShapeAttributeBindingStrategy.cs
index 3dbe111e8..a98639fa3 100644
--- a/src/Orchard/DisplayManagement/Descriptors/ShapeAttributeStrategy/ShapeAttributeBindingStrategy.cs
+++ b/src/Orchard/DisplayManagement/Descriptors/ShapeAttributeStrategy/ShapeAttributeBindingStrategy.cs
@@ -70,7 +70,7 @@ namespace Orchard.DisplayManagement.Descriptors.ShapeAttributeStrategy {
catch(TargetInvocationException e) {
// Throwing a TIE here will probably kill the web process
// in Azure. For unknown reasons.
- throw e.InnerException;
+ throw new Exception(string.Concat("TargetInvocationException ", methodInfo.Name), e.InnerException);
}
}
diff --git a/src/Orchard/Mvc/Extensions/ControllerExtensions.cs b/src/Orchard/Mvc/Extensions/ControllerExtensions.cs
index 904aae4d5..ddec70712 100644
--- a/src/Orchard/Mvc/Extensions/ControllerExtensions.cs
+++ b/src/Orchard/Mvc/Extensions/ControllerExtensions.cs
@@ -2,13 +2,15 @@
using System.Web;
using System.Web.Mvc;
using Orchard.Utility.Extensions;
+using Orchard.Environment.Configuration;
namespace Orchard.Mvc.Extensions {
public static class ControllerExtensions {
public static ActionResult RedirectLocal(this Controller controller, string redirectUrl, Func invalidUrlBehavior) {
if (!string.IsNullOrWhiteSpace(redirectUrl) && controller.Request.IsLocalUrl(redirectUrl)) {
- return new RedirectResult(redirectUrl);
+ return RedirectWithTenantPrefix(redirectUrl, controller);
}
+
return invalidUrlBehavior != null ? invalidUrlBehavior() : null;
}
@@ -18,10 +20,25 @@ namespace Orchard.Mvc.Extensions {
public static ActionResult RedirectLocal(this Controller controller, string redirectUrl, string defaultUrl) {
if (controller.Request.IsLocalUrl(redirectUrl)) {
- return new RedirectResult(redirectUrl);
+ return RedirectWithTenantPrefix(redirectUrl, controller);
}
- return new RedirectResult(defaultUrl ?? "~/");
+ return RedirectWithTenantPrefix(defaultUrl ?? "~/", controller);
+ }
+
+ private static ActionResult RedirectWithTenantPrefix(string redirectUrl, Controller controller) {
+ if (redirectUrl.StartsWith("~/")) {
+ ShellSettings settings;
+ var context = controller.ControllerContext.GetWorkContext();
+
+ if (context != null &&
+ context.TryResolve(out settings) &&
+ !string.IsNullOrWhiteSpace(settings.RequestUrlPrefix)) {
+ redirectUrl = VirtualPathUtility.ToAbsolute(redirectUrl, controller.Request.ApplicationPath.TrimEnd('/') + "/" + settings.RequestUrlPrefix);
+ }
+ }
+
+ return new RedirectResult(redirectUrl);
}
}
}
diff --git a/src/Orchard/UI/Navigation/Pager.cs b/src/Orchard/UI/Navigation/Pager.cs
index defcc539c..9fff3da35 100644
--- a/src/Orchard/UI/Navigation/Pager.cs
+++ b/src/Orchard/UI/Navigation/Pager.cs
@@ -23,10 +23,10 @@ namespace Orchard.UI.Navigation {
/// The page parameter.
/// The page size parameter.
public Pager(ISite site, int? page, int? pageSize) {
- Page = (int) (page != null ? (page > 0 ? page : PageDefault) : PageDefault);
- PageSize = pageSize ?? site.PageSize;
+ Page = page == null || page == 0 ? PageDefault : page.Value;
- if (site.MaxPageSize > 0 && PageSize > site.MaxPageSize) {
+ PageSize = pageSize ?? site.PageSize;
+ if (site.MaxPageSize > 0 && (PageSize == 0 || PageSize > site.MaxPageSize)) {
PageSize = site.MaxPageSize;
}
}
diff --git a/src/Rebracer.xml b/src/Rebracer.xml
index ee2bf5fa9..ab7d68805 100644
--- a/src/Rebracer.xml
+++ b/src/Rebracer.xml
@@ -22,8 +22,8 @@
- 0
- 0
+ 1
+ 1
1
1
-1
@@ -141,10 +141,10 @@
false
false
false
- false
+ true
true
false
- false
+ true
true
true
true