From 1295cc89496ee97fa6292948a23160200fb319ee Mon Sep 17 00:00:00 2001 From: Dave Reed Date: Thu, 9 Dec 2010 11:34:57 -0800 Subject: [PATCH] #16825: Exception in background task --HG-- branch : dev --- .../Scheduling/OwnedScheduledTaskHandler.cs | 30 +++++++++++++++++++ src/Orchard.Web/Core/Orchard.Core.csproj | 1 + .../Handlers/UnpublishingTaskHandler.cs | 8 +++-- .../Handlers/PublishingTaskHandler.cs | 8 +++-- 4 files changed, 41 insertions(+), 6 deletions(-) create mode 100644 src/Orchard.Web/Core/Common/Scheduling/OwnedScheduledTaskHandler.cs diff --git a/src/Orchard.Web/Core/Common/Scheduling/OwnedScheduledTaskHandler.cs b/src/Orchard.Web/Core/Common/Scheduling/OwnedScheduledTaskHandler.cs new file mode 100644 index 000000000..5577ac963 --- /dev/null +++ b/src/Orchard.Web/Core/Common/Scheduling/OwnedScheduledTaskHandler.cs @@ -0,0 +1,30 @@ +using System; +using Orchard.ContentManagement; +using Orchard.Core.Common.Models; +using Orchard.Security; +using Orchard.Tasks.Scheduling; + +namespace Orchard.Core.Common.Scheduling { + public abstract class OwnedScheduledTaskHandler : IScheduledTaskHandler { + private readonly IOrchardServices _orchardServices; + + protected OwnedScheduledTaskHandler(IOrchardServices orchardServices) { + _orchardServices = orchardServices; + } + + protected void SetCurrentUser(ContentItem contentItem) { + IUser owner = null; + var commonPart = contentItem.As(); + if (commonPart != null) { + owner = commonPart.Owner; + } + if (owner == null) { + var superUser = _orchardServices.WorkContext.CurrentSite.SuperUser; + owner = _orchardServices.WorkContext.Resolve().GetUser(superUser); + } + _orchardServices.WorkContext.Resolve().SetAuthenticatedUserForRequest(owner); + } + + public abstract void Process(ScheduledTaskContext context); + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Core/Orchard.Core.csproj b/src/Orchard.Web/Core/Orchard.Core.csproj index e63beeb36..c06905952 100644 --- a/src/Orchard.Web/Core/Orchard.Core.csproj +++ b/src/Orchard.Web/Core/Orchard.Core.csproj @@ -227,6 +227,7 @@ + diff --git a/src/Orchard.Web/Modules/Orchard.ArchiveLater/Handlers/UnpublishingTaskHandler.cs b/src/Orchard.Web/Modules/Orchard.ArchiveLater/Handlers/UnpublishingTaskHandler.cs index 48c2dfd45..28e955f6d 100644 --- a/src/Orchard.Web/Modules/Orchard.ArchiveLater/Handlers/UnpublishingTaskHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.ArchiveLater/Handlers/UnpublishingTaskHandler.cs @@ -1,27 +1,29 @@ using JetBrains.Annotations; using Orchard.ContentManagement; +using Orchard.Core.Common.Scheduling; using Orchard.Logging; using Orchard.Tasks.Scheduling; namespace Orchard.ArchiveLater.Handlers { [UsedImplicitly] - public class UnpublishingTaskHandler : IScheduledTaskHandler { + public class UnpublishingTaskHandler : OwnedScheduledTaskHandler { private readonly IContentManager _contentManager; - public UnpublishingTaskHandler(IContentManager contentManager) { + public UnpublishingTaskHandler(IContentManager contentManager, IOrchardServices orchardServices) : base(orchardServices) { _contentManager = contentManager; Logger = NullLogger.Instance; } public ILogger Logger { get; set; } - public void Process(ScheduledTaskContext context) { + public override void Process(ScheduledTaskContext context) { if (context.Task.TaskType == "Unpublish") { Logger.Information("Unpublishing item #{0} version {1} scheduled at {2} utc", context.Task.ContentItem.Id, context.Task.ContentItem.Version, context.Task.ScheduledUtc); + SetCurrentUser(context.Task.ContentItem); _contentManager.Unpublish(context.Task.ContentItem); } } diff --git a/src/Orchard.Web/Modules/Orchard.PublishLater/Handlers/PublishingTaskHandler.cs b/src/Orchard.Web/Modules/Orchard.PublishLater/Handlers/PublishingTaskHandler.cs index 6d2120c73..80ed2b1ef 100644 --- a/src/Orchard.Web/Modules/Orchard.PublishLater/Handlers/PublishingTaskHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.PublishLater/Handlers/PublishingTaskHandler.cs @@ -1,27 +1,29 @@ using JetBrains.Annotations; using Orchard.ContentManagement; +using Orchard.Core.Common.Scheduling; using Orchard.Logging; using Orchard.Tasks.Scheduling; namespace Orchard.PublishLater.Handlers { [UsedImplicitly] - public class PublishingTaskHandler : IScheduledTaskHandler { + public class PublishingTaskHandler : OwnedScheduledTaskHandler { private readonly IContentManager _contentManager; - public PublishingTaskHandler(IContentManager contentManager) { + public PublishingTaskHandler(IContentManager contentManager, IOrchardServices orchardServices) : base(orchardServices) { _contentManager = contentManager; Logger = NullLogger.Instance; } public ILogger Logger { get; set; } - public void Process(ScheduledTaskContext context) { + public override void Process(ScheduledTaskContext context) { if (context.Task.TaskType == "Publish") { Logger.Information("Publishing item #{0} version {1} scheduled at {2} utc", context.Task.ContentItem.Id, context.Task.ContentItem.Version, context.Task.ScheduledUtc); + SetCurrentUser(context.Task.ContentItem); _contentManager.Publish(context.Task.ContentItem); } }