From c4bce9ecb5e24bc91b3dd4eb3c3f5ad37677e7bd Mon Sep 17 00:00:00 2001 From: Shannon Date: Thu, 8 Nov 2018 12:49:37 +1100 Subject: [PATCH] Adds publish status for mixed unpublish/publish action in the same operation --- .../Services/Implement/ContentService.cs | 23 +++++++----- .../Services/PublishResultType.cs | 10 +++++- .../Services/ContentServiceTests.cs | 35 +++++++++++++++++++ 3 files changed, 59 insertions(+), 9 deletions(-) diff --git a/src/Umbraco.Core/Services/Implement/ContentService.cs b/src/Umbraco.Core/Services/Implement/ContentService.cs index 034dc5182d..58f3cf2d3d 100644 --- a/src/Umbraco.Core/Services/Implement/ContentService.cs +++ b/src/Umbraco.Core/Services/Implement/ContentService.cs @@ -1002,11 +1002,8 @@ namespace Umbraco.Core.Services.Implement publishResult = StrategyCanPublish(scope, content, userId, /*checkPath:*/ true, culturesPublishing, culturesUnpublishing, evtMsgs); if (publishResult.Success) { - - // note: StrategyPublish flips the PublishedState to Publishing! publishResult = StrategyPublish(scope, content, userId, culturesPublishing, culturesUnpublishing, evtMsgs); - } else { @@ -2382,7 +2379,9 @@ namespace Umbraco.Core.Services.Implement } } - //TODO: If we are both publishing and unpublishing cultures, then there should be a status for that (mixed?) + //If we are both publishing and unpublishing cultures, then return a mixed status + if (variesByCulture && culturesPublishing.Count > 0 && culturesUnpublishing.Count > 0) + return new PublishResult(PublishResultType.SuccessMixedCulture, evtMsgs, content); return new PublishResult(evtMsgs, content); } @@ -2409,15 +2408,23 @@ namespace Umbraco.Core.Services.Implement //if this is a variant then we need to log which cultures have been published/unpublished and return an appropriate result if (content.ContentType.VariesByCulture()) { + if (content.Published && culturesUnpublishing.Count == 0 && culturesPublishing.Count == 0) + return new PublishResult(PublishResultType.FailedPublishNothingToPublish, evtMsgs, content); + if (culturesUnpublishing.Count > 0) - { Logger.Info("Document {ContentName} (id={ContentId}) cultures: {Cultures} have been unpublished.", content.Name, content.Id, string.Join(",", culturesUnpublishing)); - return new PublishResult(PublishResultType.SuccessUnpublishCulture, evtMsgs, content); - } - Logger.Info("Document {ContentName} (id={ContentId}) cultures: {Cultures} have been published.", + if (culturesPublishing.Count > 0) + Logger.Info("Document {ContentName} (id={ContentId}) cultures: {Cultures} have been published.", content.Name, content.Id, string.Join(",", culturesPublishing)); + + if (culturesUnpublishing.Count > 0 && culturesPublishing.Count > 0) + return new PublishResult(PublishResultType.SuccessMixedCulture, evtMsgs, content); + + if (culturesUnpublishing.Count > 0 && culturesPublishing.Count == 0) + return new PublishResult(PublishResultType.SuccessUnpublishCulture, evtMsgs, content); + return new PublishResult(PublishResultType.SuccessPublishCulture, evtMsgs, content); } diff --git a/src/Umbraco.Core/Services/PublishResultType.cs b/src/Umbraco.Core/Services/PublishResultType.cs index d669ca4226..d97bf014c6 100644 --- a/src/Umbraco.Core/Services/PublishResultType.cs +++ b/src/Umbraco.Core/Services/PublishResultType.cs @@ -48,7 +48,15 @@ #endregion - //TODO: WE need something like SuccessPublishCultureMixed, FailedPublishCultureMixed - for when a culture is published and another is unpublished at the same time + #region Success - Mixed + + /// + /// A variant content item has a culture published and another culture unpublished in the same operation + /// + SuccessMixedCulture = 7, + + #endregion + #region Failed - Publish diff --git a/src/Umbraco.Tests/Services/ContentServiceTests.cs b/src/Umbraco.Tests/Services/ContentServiceTests.cs index 9a7c529c0d..fbcadb3ddc 100644 --- a/src/Umbraco.Tests/Services/ContentServiceTests.cs +++ b/src/Umbraco.Tests/Services/ContentServiceTests.cs @@ -1554,6 +1554,41 @@ namespace Umbraco.Tests.Services Assert.IsFalse(content.Published); } + [Test] + public void Can_Publish_And_Unpublish_Cultures_In_Single_Operation() + { + var langFr = new Language("fr"); + var langDa = new Language("da"); + ServiceContext.LocalizationService.Save(langFr); + ServiceContext.LocalizationService.Save(langDa); + + var ct = MockedContentTypes.CreateBasicContentType(); + ct.Variations = ContentVariation.Culture; + ServiceContext.ContentTypeService.Save(ct); + + IContent content = MockedContent.CreateBasicContent(ct); + content.SetCultureName("name-fr", langFr.IsoCode); + content.SetCultureName("name-da", langDa.IsoCode); + + content.PublishCulture(langFr.IsoCode); + var result = ServiceContext.ContentService.SavePublishing(content); + Assert.IsTrue(result.Success); + content = ServiceContext.ContentService.GetById(content.Id); + Assert.IsTrue(content.IsCulturePublished(langFr.IsoCode)); + Assert.IsFalse(content.IsCulturePublished(langDa.IsoCode)); + + content.UnpublishCulture(langFr.IsoCode); + content.PublishCulture(langDa.IsoCode); + + result = ServiceContext.ContentService.SavePublishing(content); + Assert.IsTrue(result.Success); + Assert.AreEqual(PublishResultType.SuccessMixedCulture, result.Result); + + content = ServiceContext.ContentService.GetById(content.Id); + Assert.IsFalse(content.IsCulturePublished(langFr.IsoCode)); + Assert.IsTrue(content.IsCulturePublished(langDa.IsoCode)); + } + // documents: an enumeration of documents, in tree order // map: applies (if needed) PublishValue, returns a value indicating whether to proceed with the branch private IEnumerable MapPublishValues(IEnumerable documents, Func map)