From e07fc8c2ba907854c209fda72df1286f6c5d8677 Mon Sep 17 00:00:00 2001 From: Morten Christensen Date: Mon, 26 Nov 2012 09:02:49 -0100 Subject: [PATCH] Adding language column to cmsContentVersion --- src/Umbraco.Core/Models/Content.cs | 14 ++++++++++- src/Umbraco.Core/Models/IContent.cs | 8 ++++-- .../Models/Rdbms/ContentVersionDto.cs | 5 ++++ .../Persistence/Factories/ContentFactory.cs | 15 +++++++++-- .../Persistence/Mappers/ContentMapper.cs | 3 ++- .../Repositories/ContentRepository.cs | 16 ++++++++++++ .../Interfaces/IContentRepository.cs | 8 ++++++ .../Repositories/ContentRepositoryTest.cs | 25 +++++++++++++++++++ 8 files changed, 88 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Core/Models/Content.cs b/src/Umbraco.Core/Models/Content.cs index 1d34a56f8b..8741b09e04 100644 --- a/src/Umbraco.Core/Models/Content.cs +++ b/src/Umbraco.Core/Models/Content.cs @@ -19,6 +19,7 @@ namespace Umbraco.Core.Models private DateTime? _releaseDate; private DateTime? _expireDate; private int _writer; + private string _nodeName; /// /// Constructor for creating a Content object @@ -48,6 +49,7 @@ namespace Umbraco.Core.Models private static readonly PropertyInfo ReleaseDateSelector = ExpressionHelper.GetPropertyInfo(x => x.ReleaseDate); private static readonly PropertyInfo ExpireDateSelector = ExpressionHelper.GetPropertyInfo(x => x.ExpireDate); private static readonly PropertyInfo WriterSelector = ExpressionHelper.GetPropertyInfo(x => x.WriterId); + private static readonly PropertyInfo NodeNameSelector = ExpressionHelper.GetPropertyInfo(x => x.NodeName); /// /// Gets or sets the template used by the Content. @@ -120,7 +122,7 @@ namespace Umbraco.Core.Models /// Left internal until multilingual support is implemented. /// [DataMember] - internal string Language + public string Language { get { return _language; } set @@ -181,6 +183,16 @@ namespace Umbraco.Core.Models } } + internal string NodeName + { + get { return _nodeName; } + set + { + _nodeName = value; + OnPropertyChanged(NodeNameSelector); + } + } + /// /// Gets the ContentType used by this content object /// diff --git a/src/Umbraco.Core/Models/IContent.cs b/src/Umbraco.Core/Models/IContent.cs index e60c4f5c83..2d88a56cc0 100644 --- a/src/Umbraco.Core/Models/IContent.cs +++ b/src/Umbraco.Core/Models/IContent.cs @@ -1,4 +1,5 @@ using System; +using System.Runtime.Serialization; namespace Umbraco.Core.Models { @@ -19,9 +20,12 @@ namespace Umbraco.Core.Models bool Published { get; } /// - /// Language of the data contained within the Content object + /// Language of the data contained within this Content object. /// - //string Language { get; set; } + /// + /// Left internal until multilingual support is implemented. + /// + string Language { get; set; } /// /// Gets or Sets the date the Content should be released and thus be published diff --git a/src/Umbraco.Core/Models/Rdbms/ContentVersionDto.cs b/src/Umbraco.Core/Models/Rdbms/ContentVersionDto.cs index 4c832dc486..e63d4e27da 100644 --- a/src/Umbraco.Core/Models/Rdbms/ContentVersionDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/ContentVersionDto.cs @@ -25,6 +25,11 @@ namespace Umbraco.Core.Models.Rdbms [Constraint(Default = "getdate()")] public DateTime VersionDate { get; set; } + [Column("LanguageLocale")] + [Length(10)] + [NullSetting(NullSetting = NullSettings.Null)] + public string Language { get; set; } + [ResultColumn] public ContentDto ContentDto { get; set; } } diff --git a/src/Umbraco.Core/Persistence/Factories/ContentFactory.cs b/src/Umbraco.Core/Persistence/Factories/ContentFactory.cs index 5115c619d5..83ba2cf3e3 100644 --- a/src/Umbraco.Core/Persistence/Factories/ContentFactory.cs +++ b/src/Umbraco.Core/Persistence/Factories/ContentFactory.cs @@ -36,7 +36,9 @@ namespace Umbraco.Core.Persistence.Factories dto.ContentVersionDto.ContentDto.NodeDto.UniqueId.HasValue ? dto.ContentVersionDto.ContentDto.NodeDto.UniqueId.Value : _id.ToGuid(), - Name = dto.ContentVersionDto.ContentDto.NodeDto.Text, + Name = dto.Text, + NodeName = dto.ContentVersionDto.ContentDto.NodeDto.Text, + Language = dto.ContentVersionDto.Language, Path = dto.ContentVersionDto.ContentDto.NodeDto.Path, CreatorId = dto.ContentVersionDto.ContentDto.NodeDto.UserId.Value, WriterId = dto.WriterUserId, @@ -81,11 +83,16 @@ namespace Umbraco.Core.Persistence.Factories private ContentVersionDto BuildContentVersionDto(IContent entity) { + //TODO: Change this once the Language property is public on IContent + var content = entity as Content; + var lang = content == null ? string.Empty : content.Language; + var contentVersionDto = new ContentVersionDto { NodeId = entity.Id, VersionDate = entity.UpdateDate, VersionId = entity.Version, + Language = lang, ContentDto = BuildContentDto(entity) }; return contentVersionDto; @@ -110,6 +117,10 @@ namespace Umbraco.Core.Persistence.Factories private NodeDto BuildNodeDto(IContent entity) { + //TODO: Change this once the Language property is public on IContent + var content = entity as Content; + var nodeName = content == null ? entity.Name : content.NodeName; + var nodeDto = new NodeDto { CreateDate = entity.CreateDate, @@ -119,7 +130,7 @@ namespace Umbraco.Core.Persistence.Factories ParentId = entity.ParentId, Path = entity.Path, SortOrder = entity.SortOrder, - Text = entity.Name, + Text = nodeName, Trashed = entity.Trashed, UniqueId = entity.Key, UserId = entity.CreatorId diff --git a/src/Umbraco.Core/Persistence/Mappers/ContentMapper.cs b/src/Umbraco.Core/Persistence/Mappers/ContentMapper.cs index 4624aef9cf..12321a0353 100644 --- a/src/Umbraco.Core/Persistence/Mappers/ContentMapper.cs +++ b/src/Umbraco.Core/Persistence/Mappers/ContentMapper.cs @@ -33,13 +33,14 @@ namespace Umbraco.Core.Persistence.Mappers CacheMap(src => src.ParentId, dto => dto.ParentId); CacheMap(src => src.Path, dto => dto.Path); CacheMap(src => src.SortOrder, dto => dto.SortOrder); - CacheMap(src => src.Name, dto => dto.Text); + CacheMap(src => src.NodeName, dto => dto.Text); CacheMap(src => src.Trashed, dto => dto.Trashed); CacheMap(src => src.Key, dto => dto.UniqueId); CacheMap(src => src.CreatorId, dto => dto.UserId); CacheMap(src => src.ContentTypeId, dto => dto.ContentTypeId); CacheMap(src => src.UpdateDate, dto => dto.VersionDate); CacheMap(src => src.Version, dto => dto.VersionId); + CacheMap(src => src.Language, dto => dto.Language); CacheMap(src => src.Name, dto => dto.Text); CacheMap(src => src.ExpireDate, dto => dto.ExpiresDate); CacheMap(src => src.ReleaseDate, dto => dto.ReleaseDate); diff --git a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs index 7762237e89..53572fde09 100644 --- a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs @@ -89,6 +89,7 @@ namespace Umbraco.Core.Persistence.Repositories var sqlClause = GetBaseQuery(false); var translator = new SqlTranslator(sqlClause, query); var sql = translator.Translate(); + //sql.OrderBy("[cmsContentVersion].[VersionDate] DESC"); //NOTE: This doesn't allow properties to be part of the query var dtos = Database.Fetch(sql); @@ -311,6 +312,21 @@ namespace Umbraco.Core.Persistence.Repositories return content; } + public IContent GetByLanguage(int id, string language) + { + var contentSql = GetBaseQuery(false); + contentSql.Where(GetBaseWhereClause(), new { Id = id }); + contentSql.Where("[cmsContentVersion].[LanguageLocale] = @Language", new { Language = language }); + contentSql.OrderBy("[cmsContentVersion].[VersionDate] DESC"); + + var dto = Database.Query(contentSql).FirstOrDefault(); + + if (dto == null) + return null; + + return GetByVersion(dto.NodeId, dto.ContentVersionDto.VersionId); + } + public void Delete(int id, Guid versionId) { var documentDto = Database.FirstOrDefault("WHERE nodeId = @Id AND versionId = @VersionId AND newest = @Newest", new { Id = id, VersionId = versionId, Newest = false }); diff --git a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IContentRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IContentRepository.cs index 2b2a4c1f36..a483eea672 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IContentRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IContentRepository.cs @@ -34,5 +34,13 @@ namespace Umbraco.Core.Persistence.Repositories /// Id of the object to delete versions from /// Latest version date void Delete(int id, DateTime versionDate); + + /// + /// Gets a specific language version of an + /// + /// Id of the to retrieve version from + /// Culture code for the language to retrieve + /// An item + IContent GetByLanguage(int id, string language); } } \ No newline at end of file diff --git a/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs index 6381dc925c..b0b9439fc9 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs @@ -332,6 +332,31 @@ namespace Umbraco.Tests.Persistence.Repositories } + [Test] + public void Can_Create_Different_Language_Version() + { + // Arrange + var provider = new PetaPocoUnitOfWorkProvider(); + var unitOfWork = provider.GetUnitOfWork(); + var repository = RepositoryResolver.ResolveByType(unitOfWork); + var content = repository.Get(1047); + + // Act + content.Language = "da-DK"; + content.Name = "Tekst Side 1"; + repository.AddOrUpdate(content); + unitOfWork.Commit(); + + var latest = repository.Get(1047); + var english = repository.GetByLanguage(1047, "en-US"); + var danish = repository.GetByLanguage(1047, "da-DK"); + + // Assert + Assert.That(latest.Name, Is.EqualTo("Tekst Side 1")); + Assert.That(english.Name, Is.EqualTo("Text Page 1")); + Assert.That(danish.Name, Is.EqualTo("Tekst Side 1")); + } + public void CreateTestData() { //Create and Save ContentType "umbTextpage" -> 1045