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;
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,13 +129,12 @@ 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; }
} }
public string Owner { get; set; } public string Owner { get; set; }
public bool TryUpdateModel<TModel>(TModel model, string prefix, string[] includeProperties, string[] excludeProperties) where TModel : class { public bool TryUpdateModel<TModel>(TModel model, string prefix, string[] includeProperties, string[] excludeProperties) where TModel : class {
(model as OwnerEditorViewModel).Owner = Owner; (model as OwnerEditorViewModel).Owner = Owner;
return true; return true;
@@ -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,19 +163,18 @@ 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 => { });
var user = contentManager.New<IUser>("User"); var user = contentManager.New<IUser>("User");
_authn.Setup(x => x.GetAuthenticatedUser()).Returns(user); _authn.Setup(x => x.GetAuthenticatedUser()).Returns(user);
_authz.Setup(x => x.TryCheckAccess(StandardPermissions.SiteOwner, user, item)).Returns(true); _authz.Setup(x => x.TryCheckAccess(StandardPermissions.SiteOwner, user, item)).Returns(true);
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);

View File

@@ -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));

View File

@@ -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) {