diff --git a/src/Orchard.Tests.Modules/Tags/Services/TagsServiceTests.cs b/src/Orchard.Tests.Modules/Tags/Services/TagsServiceTests.cs index d1a7d822c..992b22931 100644 --- a/src/Orchard.Tests.Modules/Tags/Services/TagsServiceTests.cs +++ b/src/Orchard.Tests.Modules/Tags/Services/TagsServiceTests.cs @@ -95,9 +95,9 @@ namespace Orchard.Tests.Modules.Tags.Services { ClearSession(); var thing2 = _contentManager.Get(thing.Id); - Assert.That(thing2.As().CurrentTags.Any(tagRecord => tagRecord.TagName == "tag1"), Is.True); - Assert.That(thing2.As().CurrentTags.Any(tagRecord => tagRecord.TagName == "tag2"), Is.True); - Assert.That(thing2.As().CurrentTags.Any(tagRecord => tagRecord.TagName == "tag3"), Is.True); + Assert.That(thing2.As().CurrentTags.Any(tag => tag == "tag1"), Is.True); + Assert.That(thing2.As().CurrentTags.Any(tag => tag == "tag2"), Is.True); + Assert.That(thing2.As().CurrentTags.Any(tag => tag == "tag3"), Is.True); } [Test] @@ -263,13 +263,13 @@ namespace Orchard.Tests.Modules.Tags.Services { Assert.That(_tagService.GetTags().Any(tagRecord => tagRecord.TagName == "tag2"), Is.False); Assert.That(_tagService.GetTags().Any(tagRecord => tagRecord.TagName == "tag3"), Is.True); - Assert.That(_contentManager.Get(thing1.Id).As().CurrentTags.Any(tagRecord => tagRecord.TagName == "tag1"), Is.True); - Assert.That(_contentManager.Get(thing1.Id).As().CurrentTags.Any(tagRecord => tagRecord.TagName == "tag2"), Is.False); - Assert.That(_contentManager.Get(thing1.Id).As().CurrentTags.Any(tagRecord => tagRecord.TagName == "tag3"), Is.True); + Assert.That(_contentManager.Get(thing1.Id).As().CurrentTags.Any(t => t == "tag1"), Is.True); + Assert.That(_contentManager.Get(thing1.Id).As().CurrentTags.Any(t => t == "tag2"), Is.False); + Assert.That(_contentManager.Get(thing1.Id).As().CurrentTags.Any(t => t == "tag3"), Is.True); - Assert.That(_contentManager.Get(thing2.Id).As().CurrentTags.Any(tagRecord => tagRecord.TagName == "tag3"), Is.True); + Assert.That(_contentManager.Get(thing2.Id).As().CurrentTags.Any(t => t == "tag3"), Is.True); - Assert.That(_contentManager.Get(thing3.Id).As().CurrentTags.Any(tagRecord => tagRecord.TagName == "tag3"), Is.True); + Assert.That(_contentManager.Get(thing3.Id).As().CurrentTags.Any(t => t == "tag3"), Is.True); } public class ThingHandler : ContentHandler { diff --git a/src/Orchard.Web/Modules/Orchard.Tags/Drivers/TagsPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Tags/Drivers/TagsPartDriver.cs index 617ad806a..e97f739a6 100644 --- a/src/Orchard.Web/Modules/Orchard.Tags/Drivers/TagsPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Tags/Drivers/TagsPartDriver.cs @@ -14,7 +14,7 @@ using Orchard.UI.Notify; namespace Orchard.Tags.Drivers { [UsedImplicitly] public class TagsPartDriver : ContentPartDriver { - private static readonly char[] _disalowedChars = new [] { '<', '>', '*', '%', ':', '&', '\\', '"', '|' }; + private static readonly char[] _disalowedChars = { '<', '>', '*', '%', ':', '&', '\\', '"', '|' }; private const string TemplateName = "Parts/Tags"; private readonly ITagService _tagService; private readonly INotifier _notifier; @@ -67,7 +67,7 @@ namespace Orchard.Tags.Drivers { private static EditTagsViewModel BuildEditorViewModel(TagsPart part) { return new EditTagsViewModel { - Tags = string.Join(", ", part.CurrentTags.Select((t, i) => t.TagName).ToArray()) + Tags = string.Join(", ", part.CurrentTags) }; } @@ -77,14 +77,14 @@ namespace Orchard.Tags.Drivers { var tags = tagString.Split(new[] {","}, StringSplitOptions.RemoveEmptyEntries); // Merge tags. if (tags.Length > 0) { - var currentTags = part.CurrentTags.Select(t => t.TagName); + var currentTags = part.CurrentTags; _tagService.UpdateTagsForContentItem(context.ContentItem, tags.Concat(currentTags).Distinct()); } } } protected override void Exporting(TagsPart part, ExportContentContext context) { - context.Element(part.PartDefinition.Name).SetAttributeValue("Tags", String.Join(",", part.CurrentTags.Select(t => t.TagName))); + context.Element(part.PartDefinition.Name).SetAttributeValue("Tags", String.Join(",", part.CurrentTags)); } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Tags/Handlers/TagsPartHandler.cs b/src/Orchard.Web/Modules/Orchard.Tags/Handlers/TagsPartHandler.cs index a7f5d1e87..bd26978c4 100644 --- a/src/Orchard.Web/Modules/Orchard.Tags/Handlers/TagsPartHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.Tags/Handlers/TagsPartHandler.cs @@ -1,6 +1,4 @@ -using System; -using System.Linq; -using Orchard.Data; +using Orchard.Data; using Orchard.ContentManagement.Handlers; using Orchard.Tags.Models; using Orchard.Tags.Services; @@ -16,7 +14,7 @@ namespace Orchard.Tags.Handlers { OnIndexing( (context, tagsPart) => { foreach (var tag in tagsPart.CurrentTags) { - context.DocumentIndex.Add("tags", tag.TagName).Analyze(); + context.DocumentIndex.Add("tags", tag).Analyze(); } }); } diff --git a/src/Orchard.Web/Modules/Orchard.Tags/Models/TagsPart.cs b/src/Orchard.Web/Modules/Orchard.Tags/Models/TagsPart.cs index a24c82df3..ae393aab6 100644 --- a/src/Orchard.Web/Modules/Orchard.Tags/Models/TagsPart.cs +++ b/src/Orchard.Web/Modules/Orchard.Tags/Models/TagsPart.cs @@ -1,9 +1,16 @@ +using System; using System.Collections.Generic; -using System.Linq; using Orchard.ContentManagement; namespace Orchard.Tags.Models { public class TagsPart : ContentPart { - public IEnumerable CurrentTags { get { return Record.Tags.Select(t => t.TagRecord); } } + public IEnumerable CurrentTags { + get { return ParseTags(Retrieve("CurrentTags")); } + set { Store("CurrentTags", String.Join(",", value)); } + } + + private IEnumerable ParseTags(string tags) { + return (tags ?? "").Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Tags/Models/TagsPartRecord.cs b/src/Orchard.Web/Modules/Orchard.Tags/Models/TagsPartRecord.cs index 19aabe193..005ec9a3e 100644 --- a/src/Orchard.Web/Modules/Orchard.Tags/Models/TagsPartRecord.cs +++ b/src/Orchard.Web/Modules/Orchard.Tags/Models/TagsPartRecord.cs @@ -1,6 +1,5 @@ using System.Collections.Generic; using Orchard.ContentManagement.Records; -using Orchard.Data.Conventions; namespace Orchard.Tags.Models { public class TagsPartRecord : ContentPartRecord { @@ -8,7 +7,6 @@ namespace Orchard.Tags.Models { Tags = new List(); } - [Aggregate] public virtual IList Tags { get; set; } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Tags/Services/TagService.cs b/src/Orchard.Web/Modules/Orchard.Tags/Services/TagService.cs index b5045086a..62e1b6b33 100644 --- a/src/Orchard.Web/Modules/Orchard.Tags/Services/TagService.cs +++ b/src/Orchard.Web/Modules/Orchard.Tags/Services/TagService.cs @@ -10,7 +10,6 @@ using Orchard.ContentManagement; using Orchard.Security; using Orchard.Tags.Models; using Orchard.UI.Notify; -using Orchard.Events; namespace Orchard.Tags.Services { [UsedImplicitly] @@ -149,6 +148,8 @@ namespace Orchard.Tags.Services { } private void TagContentItem(TagsPartRecord tagsPartRecord, string tagName) { + var tagPart = _orchardServices.ContentManager.Get(tagsPartRecord.Id, VersionOptions.Latest); + tagPart.CurrentTags = tagPart.CurrentTags.Concat(new [] {tagName}); var tagRecord = GetTagByName(tagName); var tagsContentItems = new ContentTagRecord { TagsPartRecord = tagsPartRecord, TagRecord = tagRecord }; _contentTagRepository.Create(tagsContentItems); @@ -165,7 +166,10 @@ namespace Orchard.Tags.Services { // delete orphan tags (for each tag, if there is no other contentItem than the one being deleted, it's an orphan) foreach (var tag in tagsPart.CurrentTags) { if (_contentTagRepository.Count(x => x.TagsPartRecord.Id != contentItem.Id) == 0) { - _tagRepository.Delete(tag); + var tagRecord = GetTagByName(tag); + if (tagRecord != null) { + _tagRepository.Delete(tagRecord); + } } } @@ -173,6 +177,8 @@ namespace Orchard.Tags.Services { foreach (var record in _contentTagRepository.Fetch(x => x.TagsPartRecord.Id == contentItem.Id)) { _contentTagRepository.Delete(record); } + + tagsPart.CurrentTags = Enumerable.Empty(); } public void UpdateTagsForContentItem(ContentItem contentItem, IEnumerable tagNamesForContentItem) { @@ -191,6 +197,8 @@ namespace Orchard.Tags.Services { foreach (var newTagForContentItem in newTagsForContentItem) { _contentTagRepository.Create(new ContentTagRecord { TagsPartRecord = contentItem.As().Record, TagRecord = newTagForContentItem }); } + + contentItem.As().CurrentTags = tagNamesForContentItem; } } diff --git a/src/Orchard.Web/Modules/Orchard.Tags/Services/XmlRpcHandler.cs b/src/Orchard.Web/Modules/Orchard.Tags/Services/XmlRpcHandler.cs index 01226cad7..7902cd4e6 100644 --- a/src/Orchard.Web/Modules/Orchard.Tags/Services/XmlRpcHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.Tags/Services/XmlRpcHandler.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Xml.Linq; using Orchard.ContentManagement; using Orchard.Core.XmlRpc; @@ -101,7 +100,7 @@ namespace Orchard.Tags.Services { if (contentItem == null) return; - var tags = contentItem.As().CurrentTags.Select(tag => tag.TagName); + var tags = contentItem.As().CurrentTags; post.Set("mt_keywords", string.Join(", ", tags)); }); diff --git a/src/Orchard.Web/Modules/Orchard.Tags/Views/Parts/Tags.ShowTags.cshtml b/src/Orchard.Web/Modules/Orchard.Tags/Views/Parts/Tags.ShowTags.cshtml index 1f0892ff1..0300e0b57 100644 --- a/src/Orchard.Web/Modules/Orchard.Tags/Views/Parts/Tags.ShowTags.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Tags/Views/Parts/Tags.ShowTags.cshtml @@ -4,7 +4,7 @@ if (tagsHtml.Any()) { tagsHtml.Add(new HtmlString(", ")); } - tagsHtml.Add(Html.ActionLink((string)t.TagName, "Search", "Home", new { area = "Orchard.Tags", tagName = (string)t.TagName }, new { })); + tagsHtml.Add(Html.ActionLink((string)t, "Search", "Home", new { area = "Orchard.Tags", tagName = (string)t }, new { })); } } diff --git a/src/Orchard.Web/Modules/Upgrade/Controllers/InfosetController.cs b/src/Orchard.Web/Modules/Upgrade/Controllers/InfosetController.cs index 3799f9e02..fc3677084 100644 --- a/src/Orchard.Web/Modules/Upgrade/Controllers/InfosetController.cs +++ b/src/Orchard.Web/Modules/Upgrade/Controllers/InfosetController.cs @@ -1,4 +1,6 @@ -using System.Linq; +using System; +using System.Collections.Generic; +using System.Linq; using System.Security.Authentication; using System.Web.Mvc; using Orchard; @@ -135,8 +137,8 @@ namespace Upgrade.Controllers { throw new AuthenticationException(""); var lastContentItemId = id; - // TypePadSettingsPartRecord - _upgradeService.ExecuteReader("SELECT TOP " + BATCH + " * FROM " + _upgradeService.GetPrefixedTableName("Orchard_ContentPermissions_ContentPermissionsPartRecord" + " WHERE Id > " + id), + + _upgradeService.ExecuteReader("SELECT TOP " + BATCH + " * FROM " + _upgradeService.GetPrefixedTableName("Orchard_ContentPermissions_ContentPermissionsPartRecord") + " WHERE Id > " + id, (reader, connection) => { lastContentItemId = (int) reader["Id"]; var contentPermissionPart = _orchardServices.ContentManager.Get(lastContentItemId); @@ -166,8 +168,8 @@ namespace Upgrade.Controllers { throw new AuthenticationException(""); var lastContentItemId = id; - // TypePadSettingsPartRecord - _upgradeService.ExecuteReader("SELECT TOP " + BATCH + " * FROM " + _upgradeService.GetPrefixedTableName("Orchard_ContentPicker_ContentMenuItemPartRecord" + " WHERE Id > " + id), + + _upgradeService.ExecuteReader("SELECT TOP " + BATCH + " * FROM " + _upgradeService.GetPrefixedTableName("Orchard_ContentPicker_ContentMenuItemPartRecord") + " WHERE Id > " + id, (reader, connection) => { lastContentItemId = (int)reader["Id"]; var contentPermissionPart = _orchardServices.ContentManager.Get(lastContentItemId); @@ -177,5 +179,31 @@ namespace Upgrade.Controllers { return new JsonResult { Data = lastContentItemId }; } + + [HttpPost] + public JsonResult MigrateTagsPart(int id) { + if (!_orchardServices.Authorizer.Authorize(StandardPermissions.SiteOwner)) + throw new AuthenticationException(""); + + var lastContentItemId = id; + + _upgradeService.ExecuteReader("SELECT TOP " + BATCH + " * FROM " + _upgradeService.GetPrefixedTableName("Orchard_Tags_TagsPartRecord") + " WHERE Id > " + id, + (reader, connection) => { + lastContentItemId = (int)reader["Id"]; + var contentPermissionPart = _orchardServices.ContentManager.Get(lastContentItemId); + + var tagNames = new List(); + _upgradeService.ExecuteReader("SELECT TOP " + BATCH + " TR.TagName as TagName FROM " + + _upgradeService.GetPrefixedTableName("Orchard_Tags_ContentTagRecord") + " as CTR " + + " INNER JOIN " + _upgradeService.GetPrefixedTableName("Orchard_Tags_TagRecord") + " as TR " + + " ON CTR.TagRecord_Id = TR.Id" + + " WHERE TagsPartRecord_id = " + lastContentItemId, (r, c) => tagNames.Add((string) r["TagName"])); + + + contentPermissionPart.As().Store("TagsPart", "CurrentTags", String.Join(",", tagNames)); + }); + + return new JsonResult { Data = lastContentItemId }; + } } } diff --git a/src/Orchard.Web/Modules/Upgrade/Views/Infoset/Index.cshtml b/src/Orchard.Web/Modules/Upgrade/Views/Infoset/Index.cshtml index 2238fae30..f07502e1d 100644 --- a/src/Orchard.Web/Modules/Upgrade/Views/Infoset/Index.cshtml +++ b/src/Orchard.Web/Modules/Upgrade/Views/Infoset/Index.cshtml @@ -22,7 +22,7 @@
- @T("Migrating Content Item Menu Parts:") + @T("Migrating Content Item Permissions Parts:") @T("This migration step will copy all Content Item Permissions parts to Infosets.")
@@ -33,6 +33,12 @@ +
+ @T("Migrating Tags Parts:") + @T("This migration step will copy all Tags parts to Infosets.") + +
+ @using (Script.Foot()) {