From df483c3a8e1fc9ead290d670d7f321674342c933 Mon Sep 17 00:00:00 2001 From: Bing Huan Chio Date: Wed, 22 Apr 2015 12:22:00 -0700 Subject: [PATCH 1/2] Adding modified by to common part --- .../Core/Common/Handlers/CommonPartHandler.cs | 36 +++++++++++-------- src/Orchard.Web/Core/Common/Migrations.cs | 16 +++++---- .../Core/Common/Models/CommonPart.cs | 9 +++++ .../Common/Models/CommonPartVersionRecord.cs | 1 + 4 files changed, 42 insertions(+), 20 deletions(-) diff --git a/src/Orchard.Web/Core/Common/Handlers/CommonPartHandler.cs b/src/Orchard.Web/Core/Common/Handlers/CommonPartHandler.cs index e0e0c525c..cfbc5deba 100644 --- a/src/Orchard.Web/Core/Common/Handlers/CommonPartHandler.cs +++ b/src/Orchard.Web/Core/Common/Handlers/CommonPartHandler.cs @@ -75,7 +75,7 @@ namespace Orchard.Core.Common.Handlers { protected bool ContentTypeWithACommonPart(string typeName) { //Note: What about content type handlers which activate "CommonPart" in code? var contentTypeDefinition = _contentDefinitionManager.GetTypeDefinition(typeName); - + if (contentTypeDefinition != null) return contentTypeDefinition.Parts.Any(part => part.PartDefinition.Name == "CommonPart"); @@ -97,6 +97,7 @@ namespace Orchard.Core.Common.Handlers { part.ModifiedUtc = utcNow; part.VersionCreatedUtc = utcNow; part.VersionModifiedUtc = utcNow; + part.VersionModifiedBy = GetUserName(); } private void AssignUpdateDates(UpdateEditorContext context, CommonPart part) { @@ -104,6 +105,7 @@ namespace Orchard.Core.Common.Handlers { part.ModifiedUtc = utcNow; part.VersionModifiedUtc = utcNow; + part.VersionModifiedBy = GetUserName(); } private void AssignRemovingDates(RemoveContentContext context, CommonPart part) { @@ -111,15 +113,17 @@ namespace Orchard.Core.Common.Handlers { part.ModifiedUtc = utcNow; part.VersionModifiedUtc = utcNow; + part.VersionModifiedBy = GetUserName(); } protected void AssignVersioningDates(VersionContentContext context, CommonPart existing, CommonPart building) { var utcNow = _clock.UtcNow; - // assign the created date + // assign the created date building.VersionCreatedUtc = utcNow; // assign modified date for the new version building.VersionModifiedUtc = utcNow; + building.VersionModifiedBy = GetUserName(); // publish date should be null until publish method called building.VersionPublishedUtc = null; @@ -134,7 +138,7 @@ namespace Orchard.Core.Common.Handlers { protected void AssignPublishingDates(PublishContentContext context, CommonPart part) { var utcNow = _clock.UtcNow; - + part.PublishedUtc = utcNow; part.VersionPublishedUtc = utcNow; } @@ -142,33 +146,37 @@ namespace Orchard.Core.Common.Handlers { protected void LazyLoadHandlers(CommonPart part) { // add handlers that will load content for id's just-in-time part.OwnerField.Loader(() => _contentManager.Get(part.Record.OwnerId)); - part.ContainerField.Loader(() => part.Record.Container == null ? null : _contentManager.Get(part.Record.Container.Id)); + part.ContainerField.Loader(() => part.Record.Container == null ? null : _contentManager.Get(part.Record.Container.Id)); } protected static void PropertySetHandlers(ActivatedContentContext context, CommonPart part) { // add handlers that will update records when part properties are set part.OwnerField.Setter(user => { - part.Record.OwnerId = user == null - ? 0 - : user.ContentItem.Id; - return user; - }); + part.Record.OwnerId = user == null + ? 0 + : user.ContentItem.Id; + return user; + }); // Force call to setter if we had already set a value if (part.OwnerField.Value != null) part.OwnerField.Value = part.OwnerField.Value; part.ContainerField.Setter(container => { - part.Record.Container = container == null - ? null - : container.ContentItem.Record; - return container; - }); + part.Record.Container = container == null + ? null + : container.ContentItem.Record; + return container; + }); // Force call to setter if we had already set a value if (part.ContainerField.Value != null) part.ContainerField.Value = part.ContainerField.Value; } + private string GetUserName() { + var user = _authenticationService.GetAuthenticatedUser(); + return (user == null) ? string.Empty : user.UserName; + } } } diff --git a/src/Orchard.Web/Core/Common/Migrations.cs b/src/Orchard.Web/Core/Common/Migrations.cs index b564055ca..c386aeded 100644 --- a/src/Orchard.Web/Core/Common/Migrations.cs +++ b/src/Orchard.Web/Core/Common/Migrations.cs @@ -15,14 +15,14 @@ namespace Orchard.Core.Common { } public int Create() { - SchemaBuilder.CreateTable("BodyPartRecord", + SchemaBuilder.CreateTable("BodyPartRecord", table => table .ContentPartVersionRecord() .Column("Text", column => column.Unlimited()) .Column("Format") ); - SchemaBuilder.CreateTable("CommonPartRecord", + SchemaBuilder.CreateTable("CommonPartRecord", table => table .ContentPartRecord() .Column("OwnerId") @@ -31,8 +31,8 @@ namespace Orchard.Core.Common { .Column("ModifiedUtc") .Column("Container_id") ); - - SchemaBuilder.CreateTable("CommonPartVersionRecord", + + SchemaBuilder.CreateTable("CommonPartVersionRecord", table => table .ContentPartVersionRecord() .Column("CreatedUtc") @@ -99,13 +99,17 @@ namespace Orchard.Core.Common { foreach (var existingIdentityPart in existingIdentityParts) { var updateIdentityPartRecord = _identityPartRepository.Get(existingIdentityPart.Id); - + updateIdentityPartRecord.Identifier = existingIdentityPart.Identifier; - + _identityPartRepository.Update(updateIdentityPartRecord); } return 4; } + public int UpdateFrom4() { + SchemaBuilder.AlterTable("CommonPartVersionRecord", table => table.AddColumn("ModifiedBy", command => command.Nullable())); + return 5; + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Core/Common/Models/CommonPart.cs b/src/Orchard.Web/Core/Common/Models/CommonPart.cs index 23fc22f4e..188f6afd0 100644 --- a/src/Orchard.Web/Core/Common/Models/CommonPart.cs +++ b/src/Orchard.Web/Core/Common/Models/CommonPart.cs @@ -54,6 +54,15 @@ namespace Orchard.Core.Common.Models { PartVersionRecord.CreatedUtc = value; } } + public string VersionModifiedBy { + get { + return PartVersionRecord == null ? null : PartVersionRecord.ModifiedBy; + } + set { + if (PartVersionRecord != null) + PartVersionRecord.ModifiedBy = value; + } + } public DateTime? VersionPublishedUtc { get { diff --git a/src/Orchard.Web/Core/Common/Models/CommonPartVersionRecord.cs b/src/Orchard.Web/Core/Common/Models/CommonPartVersionRecord.cs index 379392948..b62bf4888 100644 --- a/src/Orchard.Web/Core/Common/Models/CommonPartVersionRecord.cs +++ b/src/Orchard.Web/Core/Common/Models/CommonPartVersionRecord.cs @@ -6,5 +6,6 @@ namespace Orchard.Core.Common.Models { public virtual DateTime? CreatedUtc { get; set; } public virtual DateTime? PublishedUtc { get; set; } public virtual DateTime? ModifiedUtc { get; set; } + public virtual string ModifiedBy { get; set; } } } \ No newline at end of file From 0395d33f7119367301437972d8803bfe323d7a68 Mon Sep 17 00:00:00 2001 From: Bing Huan Chio Date: Wed, 22 Apr 2015 18:42:07 -0700 Subject: [PATCH 2/2] Updated UT and displaying last updated by correctly --- .../Common/Providers/CommonPartProviderTests.cs | 15 +++++++++++++++ src/Orchard.Core.Tests/Orchard.Core.Tests.csproj | 4 ++-- .../Core/Common/Handlers/CommonPartHandler.cs | 2 +- src/Orchard.Web/Core/Common/Migrations.cs | 3 ++- .../Views/CommonMetadataLastModified.cshtml | 13 +++++++++++++ .../Core/Common/Views/CommonMetadataOwner.cshtml | 14 -------------- .../Parts.Common.Metadata.SummaryAdmin.cshtml | 2 +- src/Orchard.Web/Core/Orchard.Core.csproj | 2 +- .../ContentManagement/Aspects/ICommonPart.cs | 1 + 9 files changed, 36 insertions(+), 20 deletions(-) create mode 100644 src/Orchard.Web/Core/Common/Views/CommonMetadataLastModified.cshtml delete mode 100644 src/Orchard.Web/Core/Common/Views/CommonMetadataOwner.cshtml diff --git a/src/Orchard.Core.Tests/Common/Providers/CommonPartProviderTests.cs b/src/Orchard.Core.Tests/Common/Providers/CommonPartProviderTests.cs index 0e56342b8..2fef8bf75 100644 --- a/src/Orchard.Core.Tests/Common/Providers/CommonPartProviderTests.cs +++ b/src/Orchard.Core.Tests/Common/Providers/CommonPartProviderTests.cs @@ -138,6 +138,7 @@ namespace Orchard.Core.Tests.Common.Providers { Filters.Add(new ActivatingFilter("test-item")); Filters.Add(new ActivatingFilter>("test-item")); Filters.Add(new ActivatingFilter("User")); + Filters.Add(new ActivatingFilter("AlternateUser")); } } @@ -146,6 +147,11 @@ namespace Orchard.Core.Tests.Common.Providers { public string UserName { get { return "x"; } } public string Email { get { return "y"; } } } + class AlternateTestUser : ContentPart, IUser { + public new int Id { get { return 6655322; } } + public string UserName { get { return "y"; } } + public string Email { get { return "x"; } } + } [Test] public void OwnerShouldBeNullAndZeroByDefault() { @@ -359,14 +365,22 @@ namespace Orchard.Core.Tests.Common.Providers { public void EditingShouldSetModifiedUtc() { var contentManager = _container.Resolve(); + var user = contentManager.New("User"); + _authn.Setup(x => x.GetAuthenticatedUser()).Returns(user); + var createUtc = _clock.UtcNow; var item = contentManager.Create("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.VersionModifiedBy, Is.EqualTo(user.UserName)); Assert.That(item.PublishedUtc, Is.EqualTo(createUtc)); + // Switch user + var secondUser = contentManager.New("AlternateUser"); + _authn.Setup(x => x.GetAuthenticatedUser()).Returns(secondUser); + _clock.Advance(TimeSpan.FromMinutes(1)); var editUtc = _clock.UtcNow; @@ -377,6 +391,7 @@ namespace Orchard.Core.Tests.Common.Providers { Assert.That(item.ModifiedUtc, Is.EqualTo(editUtc)); Assert.That(item.PublishedUtc, Is.EqualTo(createUtc)); Assert.That(updater.ModelErrors.Count, Is.EqualTo(0)); + Assert.That(item.VersionModifiedBy, Is.EqualTo(secondUser.UserName)); } [Test] diff --git a/src/Orchard.Core.Tests/Orchard.Core.Tests.csproj b/src/Orchard.Core.Tests/Orchard.Core.Tests.csproj index 27f2279bf..70dd09945 100644 --- a/src/Orchard.Core.Tests/Orchard.Core.Tests.csproj +++ b/src/Orchard.Core.Tests/Orchard.Core.Tests.csproj @@ -127,12 +127,12 @@ {9916839C-39FC-4CEB-A5AF-89CA7E87119F} Orchard.Core - false + True {2D1D92BB-4555-4CBE-8D0E-63563D6CE4C6} Orchard.Framework - false + True diff --git a/src/Orchard.Web/Core/Common/Handlers/CommonPartHandler.cs b/src/Orchard.Web/Core/Common/Handlers/CommonPartHandler.cs index cfbc5deba..87470bcc1 100644 --- a/src/Orchard.Web/Core/Common/Handlers/CommonPartHandler.cs +++ b/src/Orchard.Web/Core/Common/Handlers/CommonPartHandler.cs @@ -176,7 +176,7 @@ namespace Orchard.Core.Common.Handlers { } private string GetUserName() { var user = _authenticationService.GetAuthenticatedUser(); - return (user == null) ? string.Empty : user.UserName; + return user == null ? string.Empty : user.UserName; } } } diff --git a/src/Orchard.Web/Core/Common/Migrations.cs b/src/Orchard.Web/Core/Common/Migrations.cs index c386aeded..6b106eef2 100644 --- a/src/Orchard.Web/Core/Common/Migrations.cs +++ b/src/Orchard.Web/Core/Common/Migrations.cs @@ -38,6 +38,7 @@ namespace Orchard.Core.Common { .Column("CreatedUtc") .Column("PublishedUtc") .Column("ModifiedUtc") + .Column("ModifiedBy") ); SchemaBuilder.CreateTable("IdentityPartRecord", @@ -58,7 +59,7 @@ namespace Orchard.Core.Common { .Attachable() .WithDescription("Automatically generates a unique identity for the content item, which is required in import/export scenarios where one content item references another.")); - return 4; + return 5; } public int UpdateFrom1() { diff --git a/src/Orchard.Web/Core/Common/Views/CommonMetadataLastModified.cshtml b/src/Orchard.Web/Core/Common/Views/CommonMetadataLastModified.cshtml new file mode 100644 index 000000000..1de01e391 --- /dev/null +++ b/src/Orchard.Web/Core/Common/Views/CommonMetadataLastModified.cshtml @@ -0,0 +1,13 @@ +@* + Model: + ContentPart +*@ + +@using Orchard.ContentManagement +@using Orchard.Core.Common.Models; +@{ + CommonPart commonPart = Model.ContentPart; + string lastModifiedBy = commonPart.As() == null ? null : commonPart.As().VersionModifiedBy; +} + +@T("By {0}", lastModifiedBy ?? T("unknown").ToString()) \ No newline at end of file diff --git a/src/Orchard.Web/Core/Common/Views/CommonMetadataOwner.cshtml b/src/Orchard.Web/Core/Common/Views/CommonMetadataOwner.cshtml deleted file mode 100644 index ba9029172..000000000 --- a/src/Orchard.Web/Core/Common/Views/CommonMetadataOwner.cshtml +++ /dev/null @@ -1,14 +0,0 @@ -@* - Model: - ContentPart -*@ - -@using Orchard.ContentManagement; -@using Orchard.Core.Common.Models; -@using Orchard.Security; -@{ - CommonPart commonPart = Model.ContentPart; - // owner isn't really who last modified this, is it? - IUser owner = commonPart.As() == null ? null : commonPart.As().Owner; -} -@T("By {0}", owner == null ? T("unknown").ToString() : Convert.ToString(Html.ItemDisplayText(owner))) \ No newline at end of file diff --git a/src/Orchard.Web/Core/Common/Views/Parts.Common.Metadata.SummaryAdmin.cshtml b/src/Orchard.Web/Core/Common/Views/Parts.Common.Metadata.SummaryAdmin.cshtml index 74a76a27d..8d6b38750 100644 --- a/src/Orchard.Web/Core/Common/Views/Parts.Common.Metadata.SummaryAdmin.cshtml +++ b/src/Orchard.Web/Core/Common/Views/Parts.Common.Metadata.SummaryAdmin.cshtml @@ -8,5 +8,5 @@
  • @if (modifiedUtc.HasValue) { @T("Last modified: {0}", Display.DateTimeRelative(DateTimeUtc: modifiedUtc.Value))} | 
  • -
  • @Display.CommonMetadataOwner(ContentPart: Model.ContentPart)
  • +
  • @Display.CommonMetadataLastModified(ContentPart: Model.ContentPart)
  • \ No newline at end of file diff --git a/src/Orchard.Web/Core/Orchard.Core.csproj b/src/Orchard.Web/Core/Orchard.Core.csproj index 3f893b50a..365e9c74e 100644 --- a/src/Orchard.Web/Core/Orchard.Core.csproj +++ b/src/Orchard.Web/Core/Orchard.Core.csproj @@ -292,7 +292,7 @@ - + diff --git a/src/Orchard/ContentManagement/Aspects/ICommonPart.cs b/src/Orchard/ContentManagement/Aspects/ICommonPart.cs index c1776edb3..2d14235ce 100644 --- a/src/Orchard/ContentManagement/Aspects/ICommonPart.cs +++ b/src/Orchard/ContentManagement/Aspects/ICommonPart.cs @@ -13,5 +13,6 @@ namespace Orchard.ContentManagement.Aspects { DateTime? VersionCreatedUtc { get; set; } DateTime? VersionPublishedUtc { get; set; } DateTime? VersionModifiedUtc { get; set; } + string VersionModifiedBy { get; set; } } }