Fix issue with published and modified dates not properly set

--HG--
branch : 1.x
This commit is contained in:
Renaud Paquay
2011-01-06 18:43:26 -08:00
parent 459ee5a0da
commit aa8d357998
3 changed files with 119 additions and 34 deletions

View File

@@ -11,7 +11,6 @@ using Orchard.ContentManagement.Aspects;
using Orchard.ContentManagement.Drivers;
using Orchard.ContentManagement.Drivers.Coordinators;
using Orchard.ContentManagement.MetaData;
using Orchard.Core.Common;
using Orchard.Core.Common.Drivers;
using Orchard.Core.Common.Handlers;
using Orchard.Core.Common.Models;
@@ -97,7 +96,7 @@ namespace Orchard.Core.Tests.Common.Providers {
class TestUser : ContentPart, IUser {
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"; } }
}
@@ -112,8 +111,7 @@ namespace Orchard.Core.Tests.Common.Providers {
}
[Test]
public void PublishingShouldFailIfOwnerIsUnknown()
{
public void PublishingShouldFailIfOwnerIsUnknown() {
var contentManager = _container.Resolve<IContentManager>();
var updateModel = new Mock<IUpdateModel>();
@@ -131,8 +129,7 @@ namespace Orchard.Core.Tests.Common.Providers {
ModelStateDictionary _modelState = new ModelStateDictionary();
public ModelStateDictionary ModelErrors
{
public ModelStateDictionary ModelErrors {
get { return _modelState; }
}
@@ -149,8 +146,7 @@ namespace Orchard.Core.Tests.Common.Providers {
}
[Test]
public void PublishingShouldNotThrowExceptionIfOwnerIsNull()
{
public void PublishingShouldNotThrowExceptionIfOwnerIsNull() {
var contentManager = _container.Resolve<IContentManager>();
var item = contentManager.Create<ICommonPart>("test-item", VersionOptions.Draft, init => { });
@@ -167,8 +163,7 @@ namespace Orchard.Core.Tests.Common.Providers {
}
[Test]
public void PublishingShouldFailIfOwnerIsEmpty()
{
public void PublishingShouldFailIfOwnerIsEmpty() {
var contentManager = _container.Resolve<IContentManager>();
var item = contentManager.Create<ICommonPart>("test-item", VersionOptions.Draft, init => { });
@@ -179,7 +174,7 @@ namespace Orchard.Core.Tests.Common.Providers {
item.Owner = user;
var updater = new UpdatModelStub() {Owner = ""};
var updater = new UpdatModelStub() { Owner = "" };
contentManager.UpdateEditor(item.ContentItem, updater);
@@ -187,14 +182,26 @@ namespace Orchard.Core.Tests.Common.Providers {
}
[Test]
public void PublishingShouldSetPublishUtc()
{
public void CreatingShouldSetCreatedAndModifiedUtc() {
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);
}
[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);
_clock.Advance(TimeSpan.FromMinutes(1));
@@ -203,9 +210,92 @@ namespace Orchard.Core.Tests.Common.Providers {
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));
}
[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]
public void VersioningItemShouldCreatedAndPublishedUtcValuesPerVersion() {
@@ -236,9 +326,9 @@ namespace Orchard.Core.Tests.Common.Providers {
Assert.That(item1.CreatedUtc, Is.EqualTo(createUtc));
Assert.That(item2.CreatedUtc, Is.EqualTo(createUtc));
// both instances non-versioned dates show the earliest publish date
Assert.That(item1.PublishedUtc, Is.EqualTo(publish1Utc));
Assert.That(item2.PublishedUtc, Is.EqualTo(publish1Utc));
// both instances non-versioned dates show the most recent publish
Assert.That(item1.PublishedUtc, Is.EqualTo(publish2Utc));
Assert.That(item2.PublishedUtc, Is.EqualTo(publish2Utc));
// version1 versioned dates show create was upfront and publish was oldest
Assert.That(item1.VersionCreatedUtc, Is.EqualTo(createUtc));
@@ -271,8 +361,7 @@ namespace Orchard.Core.Tests.Common.Providers {
contentManager.Unpublish(item.ContentItem);
// db records need to be updated before seeking by published flags
_session.Flush();
_session.Clear();
ClearSession();
var publishedItem = contentManager.Get<ICommonPart>(item.ContentItem.Id, VersionOptions.Published);
var latestItem = contentManager.Get<ICommonPart>(item.ContentItem.Id, VersionOptions.Latest);

View File

@@ -13,6 +13,7 @@ namespace Orchard.Core.Common.Drivers {
private readonly IAuthenticationService _authenticationService;
private readonly IAuthorizationService _authorizationService;
private readonly IMembershipService _membershipService;
private readonly IClock _clock;
public CommonPartDriver(
IOrchardServices services,
@@ -25,6 +26,7 @@ namespace Orchard.Core.Common.Drivers {
_authenticationService = authenticationService;
_authorizationService = authorizationService;
_membershipService = membershipService;
_clock = clock;
T = NullLocalizer.Instance;
Services = services;
}
@@ -50,6 +52,10 @@ namespace Orchard.Core.Common.Drivers {
}
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(
OwnerEditor(part, updater, shapeHelper),
ContainerEditor(part, updater, shapeHelper));

View File

@@ -46,9 +46,7 @@ namespace Orchard.Core.Common.Handlers {
OnVersioned<ContentPart<CommonPartVersionRecord>>(AssignVersioningDates);
OnPublishing<CommonPart>(AssignPublishingDates);
OnUnpublishing<CommonPart>(AssignPublishingDates);
OnPublishing<ContentPart<CommonPartVersionRecord>>(AssignPublishingDates);
OnUnpublishing<ContentPart<CommonPartVersionRecord>>(AssignPublishingDates);
OnIndexing<CommonPart>((context, commonPart) => context.DocumentIndex
.Add("type", commonPart.ContentItem.ContentType).Store()
@@ -114,21 +112,13 @@ namespace Orchard.Core.Common.Handlers {
}
protected void AssignPublishingDates(PublishContentContext context, CommonPart part) {
// don't assign dates when unpublishing
if (context.PublishingItemVersionRecord == null)
return;
// set the initial published date
part.PublishedUtc = part.PublishedUtc ?? _clock.UtcNow;
// The non-versioned publish date is always the last publish date
part.PublishedUtc = _clock.UtcNow;
}
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
part.Record.PublishedUtc = part.Record.PublishedUtc ?? _clock.UtcNow;
part.Record.PublishedUtc = _clock.UtcNow;
}
protected void LazyLoadHandlers(CommonPart part) {