From e871392405acb1ca475819b22fa8a49bc3fa694d Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Wed, 23 Jan 2019 07:54:45 +0100 Subject: [PATCH] Added IsPublished(culture) to IPublishedContent --- .../PublishedContent/IPublishedContent.cs | 8 ++++++-- .../PublishedContentWrapped.cs | 4 ++++ .../XmlPublishedContentInitBenchmarks.cs | 20 ++++++++++--------- .../Published/NestedContentTests.cs | 1 + .../PublishedContentDataTableTests.cs | 1 + .../SolidPublishedSnapshot.cs | 1 + .../TestHelpers/Stubs/TestPublishedContent.cs | 1 + .../Models/PublishedContentBase.cs | 2 ++ .../NuCache/PublishedContent.cs | 17 ++++++++++++++++ .../PublishedCache/PublishedMember.cs | 2 ++ .../DictionaryPublishedContent.cs | 2 ++ .../XmlPublishedCache/XmlPublishedContent.cs | 12 +++++++++-- src/Umbraco.Web/umbraco.presentation/page.cs | 5 +++++ 13 files changed, 63 insertions(+), 13 deletions(-) diff --git a/src/Umbraco.Core/Models/PublishedContent/IPublishedContent.cs b/src/Umbraco.Core/Models/PublishedContent/IPublishedContent.cs index c5fa0330f2..e50fb2c396 100644 --- a/src/Umbraco.Core/Models/PublishedContent/IPublishedContent.cs +++ b/src/Umbraco.Core/Models/PublishedContent/IPublishedContent.cs @@ -153,8 +153,12 @@ namespace Umbraco.Core.Models.PublishedContent /// bool IsDraft(string culture = null); - // fixme/task - consider having an IsPublished flag too - // so that when IsDraft is true, we can check whether there is a published version? + /// + /// Gets a value indicating whether the content is published. + /// + /// + bool IsPublished(string culture = null); + #endregion diff --git a/src/Umbraco.Core/Models/PublishedContent/PublishedContentWrapped.cs b/src/Umbraco.Core/Models/PublishedContent/PublishedContentWrapped.cs index 36755c8944..42ff16bae5 100644 --- a/src/Umbraco.Core/Models/PublishedContent/PublishedContentWrapped.cs +++ b/src/Umbraco.Core/Models/PublishedContent/PublishedContentWrapped.cs @@ -111,6 +111,10 @@ namespace Umbraco.Core.Models.PublishedContent /// public virtual bool IsDraft(string culture = null) => _content.IsDraft(culture); + /// + public virtual bool IsPublished(string culture = null) => _content.IsPublished(culture); + + #endregion #region Tree diff --git a/src/Umbraco.Tests.Benchmarks/XmlPublishedContentInitBenchmarks.cs b/src/Umbraco.Tests.Benchmarks/XmlPublishedContentInitBenchmarks.cs index 751767f8e7..860dc0ac4b 100644 --- a/src/Umbraco.Tests.Benchmarks/XmlPublishedContentInitBenchmarks.cs +++ b/src/Umbraco.Tests.Benchmarks/XmlPublishedContentInitBenchmarks.cs @@ -94,6 +94,7 @@ namespace Umbraco.Tests.Benchmarks Guid key, version; string name, urlName, writerName, creatorName, docTypeAlias, path; bool isDraft; + bool isPublished; DateTime createDate, updateDate; PublishedContentType publishedContentType; Dictionary properties; @@ -104,7 +105,7 @@ namespace Umbraco.Tests.Benchmarks OriginalInitializeNode(_xml10.DocumentElement, false, false, out id, out key, out template, out sortOrder, out name, out writerName, out urlName, out creatorName, out creatorId, out writerId, out docTypeAlias, out nodeType, out path, - out version, out createDate, out updateDate, out level, out isDraft, out publishedContentType, + out version, out createDate, out updateDate, out level, out isDraft, out isPublished, out publishedContentType, out properties); } @@ -114,7 +115,7 @@ namespace Umbraco.Tests.Benchmarks OriginalInitializeNode(_xml100.DocumentElement, false, false, out id, out key, out template, out sortOrder, out name, out writerName, out urlName, out creatorName, out creatorId, out writerId, out docTypeAlias, out nodeType, out path, - out version, out createDate, out updateDate, out level, out isDraft, out publishedContentType, + out version, out createDate, out updateDate, out level, out isDraft, out isPublished, out publishedContentType, out properties); } @@ -124,7 +125,7 @@ namespace Umbraco.Tests.Benchmarks OriginalInitializeNode(_xml1000.DocumentElement, false, false, out id, out key, out template, out sortOrder, out name, out writerName, out urlName, out creatorName, out creatorId, out writerId, out docTypeAlias, out nodeType, out path, - out version, out createDate, out updateDate, out level, out isDraft, out publishedContentType, + out version, out createDate, out updateDate, out level, out isDraft, out isPublished, out publishedContentType, out properties); } @@ -134,7 +135,7 @@ namespace Umbraco.Tests.Benchmarks OriginalInitializeNode(_xml10000.DocumentElement, false, false, out id, out key, out template, out sortOrder, out name, out writerName, out urlName, out creatorName, out creatorId, out writerId, out docTypeAlias, out nodeType, out path, - out version, out createDate, out updateDate, out level, out isDraft, out publishedContentType, + out version, out createDate, out updateDate, out level, out isDraft, out isPublished, out publishedContentType, out properties); } @@ -144,7 +145,7 @@ namespace Umbraco.Tests.Benchmarks XmlPublishedContent.InitializeNode(null, _xml10.DocumentElement, false, out id, out key, out template, out sortOrder, out name, out writerName, out urlName, out creatorName, out creatorId, out writerId, out docTypeAlias, out nodeType, out path, - out createDate, out updateDate, out level, out isDraft, out publishedContentType, + out createDate, out updateDate, out level, out isDraft, out isPublished, out publishedContentType, out properties, GetPublishedContentType); } @@ -154,7 +155,7 @@ namespace Umbraco.Tests.Benchmarks XmlPublishedContent.InitializeNode(null, _xml100.DocumentElement, false, out id, out key, out template, out sortOrder, out name, out writerName, out urlName, out creatorName, out creatorId, out writerId, out docTypeAlias, out nodeType, out path, - out createDate, out updateDate, out level, out isDraft, out publishedContentType, + out createDate, out updateDate, out level, out isDraft, out isPublished,out publishedContentType, out properties, GetPublishedContentType); } @@ -164,7 +165,7 @@ namespace Umbraco.Tests.Benchmarks XmlPublishedContent.InitializeNode(null, _xml1000.DocumentElement, false, out id, out key, out template, out sortOrder, out name, out writerName, out urlName, out creatorName, out creatorId, out writerId, out docTypeAlias, out nodeType, out path, - out createDate, out updateDate, out level, out isDraft, out publishedContentType, + out createDate, out updateDate, out level, out isDraft, out isPublished,out publishedContentType, out properties, GetPublishedContentType); } @@ -174,7 +175,7 @@ namespace Umbraco.Tests.Benchmarks XmlPublishedContent.InitializeNode(null, _xml10000.DocumentElement, false, out id, out key, out template, out sortOrder, out name, out writerName, out urlName, out creatorName, out creatorId, out writerId, out docTypeAlias, out nodeType, out path, - out createDate, out updateDate, out level, out isDraft, out publishedContentType, + out createDate, out updateDate, out level, out isDraft, out isPublished,out publishedContentType, out properties, GetPublishedContentType); } @@ -182,7 +183,7 @@ namespace Umbraco.Tests.Benchmarks internal static void OriginalInitializeNode(XmlNode xmlNode, bool legacy, bool isPreviewing, out int id, out Guid key, out int template, out int sortOrder, out string name, out string writerName, out string urlName, out string creatorName, out int creatorId, out int writerId, out string docTypeAlias, out int docTypeId, out string path, - out Guid version, out DateTime createDate, out DateTime updateDate, out int level, out bool isDraft, + out Guid version, out DateTime createDate, out DateTime updateDate, out int level, out bool isDraft, out bool isPublished, out PublishedContentType contentType, out Dictionary properties) { //initialize the out params with defaults: @@ -193,6 +194,7 @@ namespace Umbraco.Tests.Benchmarks name = writerName = urlName = creatorName = docTypeAlias = path = null; createDate = updateDate = default(DateTime); isDraft = false; + isPublished = true; contentType = null; properties = null; diff --git a/src/Umbraco.Tests/Published/NestedContentTests.cs b/src/Umbraco.Tests/Published/NestedContentTests.cs index b5d6182c28..91810d6de1 100644 --- a/src/Umbraco.Tests/Published/NestedContentTests.cs +++ b/src/Umbraco.Tests/Published/NestedContentTests.cs @@ -262,6 +262,7 @@ namespace Umbraco.Tests.Published // ReSharper disable UnassignedGetOnlyAutoProperty public override PublishedItemType ItemType { get; } public override bool IsDraft(string culture = null) => false; + public override bool IsPublished(string culture = null) => true; public override IPublishedContent Parent { get; } public override IEnumerable Children { get; } public override PublishedContentType ContentType { get; } diff --git a/src/Umbraco.Tests/PublishedContent/PublishedContentDataTableTests.cs b/src/Umbraco.Tests/PublishedContent/PublishedContentDataTableTests.cs index 73f3cd1537..283ed1edd9 100644 --- a/src/Umbraco.Tests/PublishedContent/PublishedContentDataTableTests.cs +++ b/src/Umbraco.Tests/PublishedContent/PublishedContentDataTableTests.cs @@ -217,6 +217,7 @@ namespace Umbraco.Tests.PublishedContent public Guid Version { get; set; } public int Level { get; set; } public bool IsDraft(string culture = null) => false; + public bool IsPublished(string culture = null) => true; public IEnumerable Properties { get; set; } diff --git a/src/Umbraco.Tests/PublishedContent/SolidPublishedSnapshot.cs b/src/Umbraco.Tests/PublishedContent/SolidPublishedSnapshot.cs index f7077ecb3a..a838e06a9a 100644 --- a/src/Umbraco.Tests/PublishedContent/SolidPublishedSnapshot.cs +++ b/src/Umbraco.Tests/PublishedContent/SolidPublishedSnapshot.cs @@ -192,6 +192,7 @@ namespace Umbraco.Tests.PublishedContent public PublishedItemType ItemType { get { return PublishedItemType.Content; } } public bool IsDraft(string culture = null) => false; + public bool IsPublished(string culture = null) => true; #endregion diff --git a/src/Umbraco.Tests/TestHelpers/Stubs/TestPublishedContent.cs b/src/Umbraco.Tests/TestHelpers/Stubs/TestPublishedContent.cs index 58c8e37cbf..a9abe96232 100644 --- a/src/Umbraco.Tests/TestHelpers/Stubs/TestPublishedContent.cs +++ b/src/Umbraco.Tests/TestHelpers/Stubs/TestPublishedContent.cs @@ -48,6 +48,7 @@ namespace Umbraco.Tests.TestHelpers.Stubs public string GetUrl(string culture = null) => throw new NotSupportedException(); public PublishedItemType ItemType => ContentType.ItemType; public bool IsDraft(string culture = null) => false; + public bool IsPublished(string culture = null) => true; public IPublishedContent Parent { get; set; } public IEnumerable Children { get; set; } diff --git a/src/Umbraco.Web/Models/PublishedContentBase.cs b/src/Umbraco.Web/Models/PublishedContentBase.cs index c772f6ca85..12acb6b0c8 100644 --- a/src/Umbraco.Web/Models/PublishedContentBase.cs +++ b/src/Umbraco.Web/Models/PublishedContentBase.cs @@ -144,6 +144,8 @@ namespace Umbraco.Web.Models /// public abstract bool IsDraft(string culture = null); + public abstract bool IsPublished(string culture = null); + #endregion #region Tree diff --git a/src/Umbraco.Web/PublishedCache/NuCache/PublishedContent.cs b/src/Umbraco.Web/PublishedCache/NuCache/PublishedContent.cs index d1e1d63630..69c672ab98 100644 --- a/src/Umbraco.Web/PublishedCache/NuCache/PublishedContent.cs +++ b/src/Umbraco.Web/PublishedCache/NuCache/PublishedContent.cs @@ -293,6 +293,23 @@ namespace Umbraco.Web.PublishedCache.NuCache return _contentData.CultureInfos.TryGetValue(culture, out var cvar) && cvar.IsDraft; } + public override bool IsPublished(string culture = null) + { + if (!ContentType.VariesByCulture()) + { + return _contentData.Published; + } + + // handle context culture + if (culture == null) + { + culture = VariationContextAccessor?.VariationContext?.Culture ?? ""; + } + + //If the current culture is not a draft, it must be the published version + return _contentData.CultureInfos.TryGetValue(culture, out var cvar) && !cvar.IsDraft; + } + #endregion #region Tree diff --git a/src/Umbraco.Web/PublishedCache/PublishedMember.cs b/src/Umbraco.Web/PublishedCache/PublishedMember.cs index ef95b2846c..cbe2250920 100644 --- a/src/Umbraco.Web/PublishedCache/PublishedMember.cs +++ b/src/Umbraco.Web/PublishedCache/PublishedMember.cs @@ -78,6 +78,8 @@ namespace Umbraco.Web.PublishedCache public override bool IsDraft(string culture = null) => false; + public override bool IsPublished(string culture = null) => true; + public override IPublishedContent Parent => null; public override IEnumerable Children => Enumerable.Empty(); diff --git a/src/Umbraco.Web/PublishedCache/XmlPublishedCache/DictionaryPublishedContent.cs b/src/Umbraco.Web/PublishedCache/XmlPublishedCache/DictionaryPublishedContent.cs index 83bd84dab6..a395db1da5 100644 --- a/src/Umbraco.Web/PublishedCache/XmlPublishedCache/DictionaryPublishedContent.cs +++ b/src/Umbraco.Web/PublishedCache/XmlPublishedCache/DictionaryPublishedContent.cs @@ -179,6 +179,8 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache public override bool IsDraft(string culture = null) => false; + public override bool IsPublished(string culture = null) => true; + public override IEnumerable Properties => _properties; public override IEnumerable Children => _getChildren.Value; diff --git a/src/Umbraco.Web/PublishedCache/XmlPublishedCache/XmlPublishedContent.cs b/src/Umbraco.Web/PublishedCache/XmlPublishedCache/XmlPublishedContent.cs index 2b3bc39452..c3cf22559d 100644 --- a/src/Umbraco.Web/PublishedCache/XmlPublishedCache/XmlPublishedContent.cs +++ b/src/Umbraco.Web/PublishedCache/XmlPublishedCache/XmlPublishedContent.cs @@ -63,6 +63,7 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache private int _sortOrder; private int _level; private bool _isDraft; + private bool _isPublished; public override IEnumerable Children { @@ -228,6 +229,12 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache return _isDraft; // bah } + public override bool IsPublished(string culture = null) + { + EnsureNodeInitialized(); + return _isPublished; + } + public override IEnumerable Properties { get @@ -280,7 +287,7 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache InitializeNode(this, _xmlNode, _isPreviewing, out _id, out _key, out _template, out _sortOrder, out _name, out _writerName, out _urlName, out _creatorName, out _creatorId, out _writerId, out _docTypeAlias, out _docTypeId, out _path, - out _createDate, out _updateDate, out _level, out _isDraft, out _contentType, out _properties, + out _createDate, out _updateDate, out _level, out _isDraft, out _isPublished, out _contentType, out _properties, _contentTypeCache.Get); _nodeInitialized = true; @@ -290,7 +297,7 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache internal static void InitializeNode(XmlPublishedContent node, XmlNode xmlNode, bool isPreviewing, out int id, out Guid key, out int template, out int sortOrder, out string name, out string writerName, out string urlName, out string creatorName, out int creatorId, out int writerId, out string docTypeAlias, out int docTypeId, out string path, - out DateTime createDate, out DateTime updateDate, out int level, out bool isDraft, + out DateTime createDate, out DateTime updateDate, out int level, out bool isDraft,out bool isPublished, out PublishedContentType contentType, out Dictionary properties, Func getPublishedContentType) { @@ -302,6 +309,7 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache name = writerName = urlName = creatorName = docTypeAlias = path = null; createDate = updateDate = default(DateTime); isDraft = false; + isPublished = false; contentType = null; properties = null; diff --git a/src/Umbraco.Web/umbraco.presentation/page.cs b/src/Umbraco.Web/umbraco.presentation/page.cs index 7b591640b5..0c9b0c6ff3 100644 --- a/src/Umbraco.Web/umbraco.presentation/page.cs +++ b/src/Umbraco.Web/umbraco.presentation/page.cs @@ -469,6 +469,11 @@ namespace umbraco throw new NotImplementedException(); } + public bool IsPublished(string culture = null) + { + throw new NotImplementedException(); + } + public IPublishedContent Parent { get { return _parent; }