mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-09-23 21:13:35 +08:00
Fix issue with published and modified dates not properly set
--HG-- branch : 1.x
This commit is contained in:
@@ -11,7 +11,6 @@ using Orchard.ContentManagement.Aspects;
|
|||||||
using Orchard.ContentManagement.Drivers;
|
using Orchard.ContentManagement.Drivers;
|
||||||
using Orchard.ContentManagement.Drivers.Coordinators;
|
using Orchard.ContentManagement.Drivers.Coordinators;
|
||||||
using Orchard.ContentManagement.MetaData;
|
using Orchard.ContentManagement.MetaData;
|
||||||
using Orchard.Core.Common;
|
|
||||||
using Orchard.Core.Common.Drivers;
|
using Orchard.Core.Common.Drivers;
|
||||||
using Orchard.Core.Common.Handlers;
|
using Orchard.Core.Common.Handlers;
|
||||||
using Orchard.Core.Common.Models;
|
using Orchard.Core.Common.Models;
|
||||||
@@ -97,7 +96,7 @@ namespace Orchard.Core.Tests.Common.Providers {
|
|||||||
|
|
||||||
class TestUser : ContentPart, IUser {
|
class TestUser : ContentPart, IUser {
|
||||||
public new int Id { get { return 6655321; } }
|
public new int Id { get { return 6655321; } }
|
||||||
public string UserName {get { return "x"; }}
|
public string UserName { get { return "x"; } }
|
||||||
public string Email { get { return "y"; } }
|
public string Email { get { return "y"; } }
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -112,8 +111,7 @@ namespace Orchard.Core.Tests.Common.Providers {
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void PublishingShouldFailIfOwnerIsUnknown()
|
public void PublishingShouldFailIfOwnerIsUnknown() {
|
||||||
{
|
|
||||||
var contentManager = _container.Resolve<IContentManager>();
|
var contentManager = _container.Resolve<IContentManager>();
|
||||||
var updateModel = new Mock<IUpdateModel>();
|
var updateModel = new Mock<IUpdateModel>();
|
||||||
|
|
||||||
@@ -131,8 +129,7 @@ namespace Orchard.Core.Tests.Common.Providers {
|
|||||||
|
|
||||||
ModelStateDictionary _modelState = new ModelStateDictionary();
|
ModelStateDictionary _modelState = new ModelStateDictionary();
|
||||||
|
|
||||||
public ModelStateDictionary ModelErrors
|
public ModelStateDictionary ModelErrors {
|
||||||
{
|
|
||||||
get { return _modelState; }
|
get { return _modelState; }
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -149,8 +146,7 @@ namespace Orchard.Core.Tests.Common.Providers {
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void PublishingShouldNotThrowExceptionIfOwnerIsNull()
|
public void PublishingShouldNotThrowExceptionIfOwnerIsNull() {
|
||||||
{
|
|
||||||
var contentManager = _container.Resolve<IContentManager>();
|
var contentManager = _container.Resolve<IContentManager>();
|
||||||
|
|
||||||
var item = contentManager.Create<ICommonPart>("test-item", VersionOptions.Draft, init => { });
|
var item = contentManager.Create<ICommonPart>("test-item", VersionOptions.Draft, init => { });
|
||||||
@@ -167,8 +163,7 @@ namespace Orchard.Core.Tests.Common.Providers {
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void PublishingShouldFailIfOwnerIsEmpty()
|
public void PublishingShouldFailIfOwnerIsEmpty() {
|
||||||
{
|
|
||||||
var contentManager = _container.Resolve<IContentManager>();
|
var contentManager = _container.Resolve<IContentManager>();
|
||||||
|
|
||||||
var item = contentManager.Create<ICommonPart>("test-item", VersionOptions.Draft, init => { });
|
var item = contentManager.Create<ICommonPart>("test-item", VersionOptions.Draft, init => { });
|
||||||
@@ -179,7 +174,7 @@ namespace Orchard.Core.Tests.Common.Providers {
|
|||||||
|
|
||||||
item.Owner = user;
|
item.Owner = user;
|
||||||
|
|
||||||
var updater = new UpdatModelStub() {Owner = ""};
|
var updater = new UpdatModelStub() { Owner = "" };
|
||||||
|
|
||||||
contentManager.UpdateEditor(item.ContentItem, updater);
|
contentManager.UpdateEditor(item.ContentItem, updater);
|
||||||
|
|
||||||
@@ -187,14 +182,26 @@ namespace Orchard.Core.Tests.Common.Providers {
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void PublishingShouldSetPublishUtc()
|
public void CreatingShouldSetCreatedAndModifiedUtc() {
|
||||||
{
|
|
||||||
var contentManager = _container.Resolve<IContentManager>();
|
var contentManager = _container.Resolve<IContentManager>();
|
||||||
|
|
||||||
var createUtc = _clock.UtcNow;
|
var createUtc = _clock.UtcNow;
|
||||||
var item = contentManager.Create<ICommonPart>("test-item", VersionOptions.Draft, init => { });
|
var item = contentManager.Create<ICommonPart>("test-item", VersionOptions.Draft, init => { });
|
||||||
|
|
||||||
Assert.That(item.CreatedUtc, Is.EqualTo(createUtc));
|
Assert.That(item.CreatedUtc, Is.EqualTo(createUtc));
|
||||||
|
Assert.That(item.ModifiedUtc, Is.EqualTo(createUtc));
|
||||||
|
Assert.That(item.PublishedUtc, Is.Null);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void PublishingShouldSetPublishUtcAndShouldNotChangeModifiedUtc() {
|
||||||
|
var contentManager = _container.Resolve<IContentManager>();
|
||||||
|
|
||||||
|
var createUtc = _clock.UtcNow;
|
||||||
|
var item = contentManager.Create<ICommonPart>("test-item", VersionOptions.Draft, init => { });
|
||||||
|
|
||||||
|
Assert.That(item.CreatedUtc, Is.EqualTo(createUtc));
|
||||||
|
Assert.That(item.ModifiedUtc, Is.EqualTo(createUtc));
|
||||||
Assert.That(item.PublishedUtc, Is.Null);
|
Assert.That(item.PublishedUtc, Is.Null);
|
||||||
|
|
||||||
_clock.Advance(TimeSpan.FromMinutes(1));
|
_clock.Advance(TimeSpan.FromMinutes(1));
|
||||||
@@ -203,9 +210,92 @@ namespace Orchard.Core.Tests.Common.Providers {
|
|||||||
contentManager.Publish(item.ContentItem);
|
contentManager.Publish(item.ContentItem);
|
||||||
|
|
||||||
Assert.That(item.CreatedUtc, Is.EqualTo(createUtc));
|
Assert.That(item.CreatedUtc, Is.EqualTo(createUtc));
|
||||||
|
Assert.That(item.ModifiedUtc, Is.EqualTo(createUtc));
|
||||||
Assert.That(item.PublishedUtc, Is.EqualTo(publishUtc));
|
Assert.That(item.PublishedUtc, Is.EqualTo(publishUtc));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void PublishingTwiceShouldKeepSettingPublishUtcAndShouldNotChangeModifiedUtc() {
|
||||||
|
var contentManager = _container.Resolve<IContentManager>();
|
||||||
|
|
||||||
|
var createUtc = _clock.UtcNow;
|
||||||
|
var item = contentManager.Create<ICommonPart>("test-item", VersionOptions.Draft, init => { });
|
||||||
|
|
||||||
|
Assert.That(item.CreatedUtc, Is.EqualTo(createUtc));
|
||||||
|
Assert.That(item.ModifiedUtc, Is.EqualTo(createUtc));
|
||||||
|
Assert.That(item.PublishedUtc, Is.Null);
|
||||||
|
|
||||||
|
_clock.Advance(TimeSpan.FromMinutes(1));
|
||||||
|
var publishUtc1 = _clock.UtcNow;
|
||||||
|
|
||||||
|
contentManager.Publish(item.ContentItem);
|
||||||
|
|
||||||
|
Assert.That(item.CreatedUtc, Is.EqualTo(createUtc));
|
||||||
|
Assert.That(item.ModifiedUtc, Is.EqualTo(createUtc));
|
||||||
|
Assert.That(item.PublishedUtc, Is.EqualTo(publishUtc1));
|
||||||
|
|
||||||
|
contentManager.Unpublish(item.ContentItem);
|
||||||
|
|
||||||
|
_clock.Advance(TimeSpan.FromMinutes(1));
|
||||||
|
var publishUtc2 = _clock.UtcNow;
|
||||||
|
|
||||||
|
contentManager.Publish(item.ContentItem);
|
||||||
|
|
||||||
|
Assert.That(item.CreatedUtc, Is.EqualTo(createUtc));
|
||||||
|
Assert.That(item.ModifiedUtc, Is.EqualTo(createUtc));
|
||||||
|
Assert.That(item.PublishedUtc, Is.EqualTo(publishUtc2));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void UnpublishingShouldNotChangePublishUtcAndModifiedUtc() {
|
||||||
|
var contentManager = _container.Resolve<IContentManager>();
|
||||||
|
|
||||||
|
var createUtc = _clock.UtcNow;
|
||||||
|
var item = contentManager.Create<ICommonPart>("test-item", VersionOptions.Draft, init => { });
|
||||||
|
|
||||||
|
Assert.That(item.CreatedUtc, Is.EqualTo(createUtc));
|
||||||
|
Assert.That(item.ModifiedUtc, Is.EqualTo(createUtc));
|
||||||
|
Assert.That(item.PublishedUtc, Is.Null);
|
||||||
|
|
||||||
|
_clock.Advance(TimeSpan.FromMinutes(1));
|
||||||
|
var publishUtc = _clock.UtcNow;
|
||||||
|
|
||||||
|
contentManager.Publish(item.ContentItem);
|
||||||
|
|
||||||
|
Assert.That(item.CreatedUtc, Is.EqualTo(createUtc));
|
||||||
|
Assert.That(item.ModifiedUtc, Is.EqualTo(createUtc));
|
||||||
|
Assert.That(item.PublishedUtc, Is.EqualTo(publishUtc));
|
||||||
|
|
||||||
|
contentManager.Unpublish(item.ContentItem);
|
||||||
|
|
||||||
|
Assert.That(item.CreatedUtc, Is.EqualTo(createUtc));
|
||||||
|
Assert.That(item.ModifiedUtc, Is.EqualTo(createUtc));
|
||||||
|
Assert.That(item.PublishedUtc, Is.EqualTo(publishUtc));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void EditingShouldSetModifiedUtc() {
|
||||||
|
var contentManager = _container.Resolve<IContentManager>();
|
||||||
|
|
||||||
|
var createUtc = _clock.UtcNow;
|
||||||
|
var item = contentManager.Create<ICommonPart>("test-item", VersionOptions.Draft, init => { });
|
||||||
|
contentManager.Publish(item.ContentItem);
|
||||||
|
|
||||||
|
Assert.That(item.CreatedUtc, Is.EqualTo(createUtc));
|
||||||
|
Assert.That(item.ModifiedUtc, Is.EqualTo(createUtc));
|
||||||
|
Assert.That(item.PublishedUtc, Is.EqualTo(createUtc));
|
||||||
|
|
||||||
|
_clock.Advance(TimeSpan.FromMinutes(1));
|
||||||
|
var editUtc = _clock.UtcNow;
|
||||||
|
|
||||||
|
var updater = new UpdatModelStub() { Owner = "" };
|
||||||
|
contentManager.UpdateEditor(item.ContentItem, updater);
|
||||||
|
|
||||||
|
Assert.That(item.CreatedUtc, Is.EqualTo(createUtc));
|
||||||
|
Assert.That(item.ModifiedUtc, Is.EqualTo(editUtc));
|
||||||
|
Assert.That(item.PublishedUtc, Is.EqualTo(createUtc));
|
||||||
|
Assert.That(updater.ModelErrors.Count, Is.EqualTo(0));
|
||||||
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void VersioningItemShouldCreatedAndPublishedUtcValuesPerVersion() {
|
public void VersioningItemShouldCreatedAndPublishedUtcValuesPerVersion() {
|
||||||
@@ -236,9 +326,9 @@ namespace Orchard.Core.Tests.Common.Providers {
|
|||||||
Assert.That(item1.CreatedUtc, Is.EqualTo(createUtc));
|
Assert.That(item1.CreatedUtc, Is.EqualTo(createUtc));
|
||||||
Assert.That(item2.CreatedUtc, Is.EqualTo(createUtc));
|
Assert.That(item2.CreatedUtc, Is.EqualTo(createUtc));
|
||||||
|
|
||||||
// both instances non-versioned dates show the earliest publish date
|
// both instances non-versioned dates show the most recent publish
|
||||||
Assert.That(item1.PublishedUtc, Is.EqualTo(publish1Utc));
|
Assert.That(item1.PublishedUtc, Is.EqualTo(publish2Utc));
|
||||||
Assert.That(item2.PublishedUtc, Is.EqualTo(publish1Utc));
|
Assert.That(item2.PublishedUtc, Is.EqualTo(publish2Utc));
|
||||||
|
|
||||||
// version1 versioned dates show create was upfront and publish was oldest
|
// version1 versioned dates show create was upfront and publish was oldest
|
||||||
Assert.That(item1.VersionCreatedUtc, Is.EqualTo(createUtc));
|
Assert.That(item1.VersionCreatedUtc, Is.EqualTo(createUtc));
|
||||||
@@ -271,8 +361,7 @@ namespace Orchard.Core.Tests.Common.Providers {
|
|||||||
contentManager.Unpublish(item.ContentItem);
|
contentManager.Unpublish(item.ContentItem);
|
||||||
|
|
||||||
// db records need to be updated before seeking by published flags
|
// db records need to be updated before seeking by published flags
|
||||||
_session.Flush();
|
ClearSession();
|
||||||
_session.Clear();
|
|
||||||
|
|
||||||
var publishedItem = contentManager.Get<ICommonPart>(item.ContentItem.Id, VersionOptions.Published);
|
var publishedItem = contentManager.Get<ICommonPart>(item.ContentItem.Id, VersionOptions.Published);
|
||||||
var latestItem = contentManager.Get<ICommonPart>(item.ContentItem.Id, VersionOptions.Latest);
|
var latestItem = contentManager.Get<ICommonPart>(item.ContentItem.Id, VersionOptions.Latest);
|
||||||
|
@@ -13,6 +13,7 @@ namespace Orchard.Core.Common.Drivers {
|
|||||||
private readonly IAuthenticationService _authenticationService;
|
private readonly IAuthenticationService _authenticationService;
|
||||||
private readonly IAuthorizationService _authorizationService;
|
private readonly IAuthorizationService _authorizationService;
|
||||||
private readonly IMembershipService _membershipService;
|
private readonly IMembershipService _membershipService;
|
||||||
|
private readonly IClock _clock;
|
||||||
|
|
||||||
public CommonPartDriver(
|
public CommonPartDriver(
|
||||||
IOrchardServices services,
|
IOrchardServices services,
|
||||||
@@ -25,6 +26,7 @@ namespace Orchard.Core.Common.Drivers {
|
|||||||
_authenticationService = authenticationService;
|
_authenticationService = authenticationService;
|
||||||
_authorizationService = authorizationService;
|
_authorizationService = authorizationService;
|
||||||
_membershipService = membershipService;
|
_membershipService = membershipService;
|
||||||
|
_clock = clock;
|
||||||
T = NullLocalizer.Instance;
|
T = NullLocalizer.Instance;
|
||||||
Services = services;
|
Services = services;
|
||||||
}
|
}
|
||||||
@@ -50,6 +52,10 @@ namespace Orchard.Core.Common.Drivers {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected override DriverResult Editor(CommonPart part, IUpdateModel updater, dynamic shapeHelper) {
|
protected override DriverResult Editor(CommonPart part, IUpdateModel updater, dynamic shapeHelper) {
|
||||||
|
// this event is hooked so the modified timestamp is changed when an edit-post occurs
|
||||||
|
part.ModifiedUtc = _clock.UtcNow;
|
||||||
|
part.VersionModifiedUtc = _clock.UtcNow;
|
||||||
|
|
||||||
return Combined(
|
return Combined(
|
||||||
OwnerEditor(part, updater, shapeHelper),
|
OwnerEditor(part, updater, shapeHelper),
|
||||||
ContainerEditor(part, updater, shapeHelper));
|
ContainerEditor(part, updater, shapeHelper));
|
||||||
|
@@ -46,9 +46,7 @@ namespace Orchard.Core.Common.Handlers {
|
|||||||
OnVersioned<ContentPart<CommonPartVersionRecord>>(AssignVersioningDates);
|
OnVersioned<ContentPart<CommonPartVersionRecord>>(AssignVersioningDates);
|
||||||
|
|
||||||
OnPublishing<CommonPart>(AssignPublishingDates);
|
OnPublishing<CommonPart>(AssignPublishingDates);
|
||||||
OnUnpublishing<CommonPart>(AssignPublishingDates);
|
|
||||||
OnPublishing<ContentPart<CommonPartVersionRecord>>(AssignPublishingDates);
|
OnPublishing<ContentPart<CommonPartVersionRecord>>(AssignPublishingDates);
|
||||||
OnUnpublishing<ContentPart<CommonPartVersionRecord>>(AssignPublishingDates);
|
|
||||||
|
|
||||||
OnIndexing<CommonPart>((context, commonPart) => context.DocumentIndex
|
OnIndexing<CommonPart>((context, commonPart) => context.DocumentIndex
|
||||||
.Add("type", commonPart.ContentItem.ContentType).Store()
|
.Add("type", commonPart.ContentItem.ContentType).Store()
|
||||||
@@ -114,21 +112,13 @@ namespace Orchard.Core.Common.Handlers {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected void AssignPublishingDates(PublishContentContext context, CommonPart part) {
|
protected void AssignPublishingDates(PublishContentContext context, CommonPart part) {
|
||||||
// don't assign dates when unpublishing
|
// The non-versioned publish date is always the last publish date
|
||||||
if (context.PublishingItemVersionRecord == null)
|
part.PublishedUtc = _clock.UtcNow;
|
||||||
return;
|
|
||||||
|
|
||||||
// set the initial published date
|
|
||||||
part.PublishedUtc = part.PublishedUtc ?? _clock.UtcNow;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void AssignPublishingDates(PublishContentContext context, ContentPart<CommonPartVersionRecord> part) {
|
protected void AssignPublishingDates(PublishContentContext context, ContentPart<CommonPartVersionRecord> part) {
|
||||||
// don't assign dates when unpublishing
|
|
||||||
if (context.PublishingItemVersionRecord == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// assign the version's published date
|
// assign the version's published date
|
||||||
part.Record.PublishedUtc = part.Record.PublishedUtc ?? _clock.UtcNow;
|
part.Record.PublishedUtc = _clock.UtcNow;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void LazyLoadHandlers(CommonPart part) {
|
protected void LazyLoadHandlers(CommonPart part) {
|
||||||
|
Reference in New Issue
Block a user