diff --git a/src/Umbraco.Core/Persistence/Repositories/IDocumentRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IDocumentRepository.cs index f4d83fe6ee..685f8643cb 100644 --- a/src/Umbraco.Core/Persistence/Repositories/IDocumentRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/IDocumentRepository.cs @@ -7,6 +7,12 @@ namespace Umbraco.Core.Persistence.Repositories { public interface IDocumentRepository : IContentRepository, IReadRepository { + /// + /// Clears the publishing schedule for all entries before this date + /// + /// + void ClearSchedule(DateTime date); + /// /// Gets a collection of objects, which has an expiration date less than or equal to today. /// diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/DocumentRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/DocumentRepository.cs index 76a5a51327..02df4172d6 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/DocumentRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/DocumentRepository.cs @@ -907,22 +907,24 @@ namespace Umbraco.Core.Persistence.Repositories.Implement #region Schedule + /// + public void ClearSchedule(DateTime date) + { + var sql = Sql().Delete().Where(x => x.Date <= date); + Database.Execute(sql); + } + /// public IEnumerable GetContentForRelease(DateTime date) { var action = ContentScheduleChange.Start.ToString(); - // fixme/review - code would blow if more than 2000 items - // fixme/review - isn't this simpler? var sql = GetBaseQuery(QueryType.Many) .WhereIn(x => x.NodeId, Sql() .Select(x => x.NodeId) .From() .Where(x => x.Action == action && x.Date <= date)); - - sql.Where(x => !x.Trashed); // fixme/review - shouldn't we exclude trashed nodes? - sql.Where(x => !x.Published); - + AddGetByQueryOrderBy(sql); return MapDtosToContent(Database.Fetch(sql)); @@ -940,8 +942,6 @@ namespace Umbraco.Core.Persistence.Repositories.Implement .From() .Where(x => x.Action == action && x.Date <= date)); - sql.Where(x => x.Published); - AddGetByQueryOrderBy(sql); return MapDtosToContent(Database.Fetch(sql)); diff --git a/src/Umbraco.Core/Services/Implement/ContentService.cs b/src/Umbraco.Core/Services/Implement/ContentService.cs index e7668e61aa..9e5d2a22a8 100644 --- a/src/Umbraco.Core/Services/Implement/ContentService.cs +++ b/src/Umbraco.Core/Services/Implement/ContentService.cs @@ -1173,7 +1173,7 @@ namespace Umbraco.Core.Services.Implement var now = date; - foreach (var d in GetContentForRelease(now)) + foreach (var d in _documentRepository.GetContentForRelease(now)) { PublishResult result; if (d.ContentType.VariesByCulture()) @@ -1188,13 +1188,17 @@ namespace Umbraco.Core.Services.Implement { //Clear this schedule for this culture d.ContentSchedule.Clear(c, ContentScheduleChange.Start, now); - //set the culture to be published - d.PublishCulture(c); + if (!d.Trashed) + d.PublishCulture(c); //set the culture to be published } if (pendingCultures.Count > 0) { - result = SavePublishing(d, d.WriterId); + if (!d.Trashed) + result = SavePublishing(d, d.WriterId); + else + result = new PublishResult(PublishResultType.FailedPublishPathNotPublished, evtMsgs, d); + if (result.Success == false) Logger.Error(null, "Failed to publish document id={DocumentId}, reason={Reason}.", d.Id, result.Result); yield return result; @@ -1204,14 +1208,18 @@ namespace Umbraco.Core.Services.Implement { //Clear this schedule d.ContentSchedule.Clear(ContentScheduleChange.Start, now); - result = SaveAndPublish(d, userId: d.WriterId); + if (!d.Trashed) + result = SaveAndPublish(d, userId: d.WriterId); + else + result = new PublishResult(PublishResultType.FailedPublishPathNotPublished, evtMsgs, d); + if (result.Success == false) Logger.Error(null, "Failed to publish document id={DocumentId}, reason={Reason}.", d.Id, result.Result); yield return result; } } - foreach (var d in GetContentForExpiration(now)) + foreach (var d in _documentRepository.GetContentForExpiration(now)) { PublishResult result; if (d.ContentType.VariesByCulture()) @@ -1251,6 +1259,8 @@ namespace Umbraco.Core.Services.Implement } + _documentRepository.ClearSchedule(now); + scope.Complete(); } }