Shifting TagsPart

This commit is contained in:
Sebastien Ros
2013-10-30 16:29:21 -07:00
parent 81e5168fae
commit 5c3e07dc99
11 changed files with 86 additions and 42 deletions

View File

@@ -95,9 +95,9 @@ namespace Orchard.Tests.Modules.Tags.Services {
ClearSession();
var thing2 = _contentManager.Get(thing.Id);
Assert.That(thing2.As<TagsPart>().CurrentTags.Any(tagRecord => tagRecord.TagName == "tag1"), Is.True);
Assert.That(thing2.As<TagsPart>().CurrentTags.Any(tagRecord => tagRecord.TagName == "tag2"), Is.True);
Assert.That(thing2.As<TagsPart>().CurrentTags.Any(tagRecord => tagRecord.TagName == "tag3"), Is.True);
Assert.That(thing2.As<TagsPart>().CurrentTags.Any(tag => tag == "tag1"), Is.True);
Assert.That(thing2.As<TagsPart>().CurrentTags.Any(tag => tag == "tag2"), Is.True);
Assert.That(thing2.As<TagsPart>().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<TagsPart>().CurrentTags.Any(tagRecord => tagRecord.TagName == "tag1"), Is.True);
Assert.That(_contentManager.Get(thing1.Id).As<TagsPart>().CurrentTags.Any(tagRecord => tagRecord.TagName == "tag2"), Is.False);
Assert.That(_contentManager.Get(thing1.Id).As<TagsPart>().CurrentTags.Any(tagRecord => tagRecord.TagName == "tag3"), Is.True);
Assert.That(_contentManager.Get(thing1.Id).As<TagsPart>().CurrentTags.Any(t => t == "tag1"), Is.True);
Assert.That(_contentManager.Get(thing1.Id).As<TagsPart>().CurrentTags.Any(t => t == "tag2"), Is.False);
Assert.That(_contentManager.Get(thing1.Id).As<TagsPart>().CurrentTags.Any(t => t == "tag3"), Is.True);
Assert.That(_contentManager.Get(thing2.Id).As<TagsPart>().CurrentTags.Any(tagRecord => tagRecord.TagName == "tag3"), Is.True);
Assert.That(_contentManager.Get(thing2.Id).As<TagsPart>().CurrentTags.Any(t => t == "tag3"), Is.True);
Assert.That(_contentManager.Get(thing3.Id).As<TagsPart>().CurrentTags.Any(tagRecord => tagRecord.TagName == "tag3"), Is.True);
Assert.That(_contentManager.Get(thing3.Id).As<TagsPart>().CurrentTags.Any(t => t == "tag3"), Is.True);
}
public class ThingHandler : ContentHandler {

View File

@@ -14,7 +14,7 @@ using Orchard.UI.Notify;
namespace Orchard.Tags.Drivers {
[UsedImplicitly]
public class TagsPartDriver : ContentPartDriver<TagsPart> {
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));
}
}
}

View File

@@ -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<TagsPart>(
(context, tagsPart) => {
foreach (var tag in tagsPart.CurrentTags) {
context.DocumentIndex.Add("tags", tag.TagName).Analyze();
context.DocumentIndex.Add("tags", tag).Analyze();
}
});
}

View File

@@ -1,9 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Orchard.ContentManagement;
namespace Orchard.Tags.Models {
public class TagsPart : ContentPart<TagsPartRecord> {
public IEnumerable<TagRecord> CurrentTags { get { return Record.Tags.Select(t => t.TagRecord); } }
public IEnumerable<string> CurrentTags {
get { return ParseTags(Retrieve<string>("CurrentTags")); }
set { Store("CurrentTags", String.Join(",", value)); }
}
private IEnumerable<string> ParseTags(string tags) {
return (tags ?? "").Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
}
}
}

View File

@@ -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<ContentTagRecord>();
}
[Aggregate]
public virtual IList<ContentTagRecord> Tags { get; set; }
}
}

View File

@@ -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<TagsPart>(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<string>();
}
public void UpdateTagsForContentItem(ContentItem contentItem, IEnumerable<string> tagNamesForContentItem) {
@@ -191,6 +197,8 @@ namespace Orchard.Tags.Services {
foreach (var newTagForContentItem in newTagsForContentItem) {
_contentTagRepository.Create(new ContentTagRecord { TagsPartRecord = contentItem.As<TagsPart>().Record, TagRecord = newTagForContentItem });
}
contentItem.As<TagsPart>().CurrentTags = tagNamesForContentItem;
}
}

View File

@@ -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<TagsPart>().CurrentTags.Select(tag => tag.TagName);
var tags = contentItem.As<TagsPart>().CurrentTags;
post.Set("mt_keywords", string.Join(", ", tags));
});

View File

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

View File

@@ -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<string>();
_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<InfosetPart>().Store("TagsPart", "CurrentTags", String.Join(",", tagNames));
});
return new JsonResult { Data = lastContentItemId };
}
}
}

View File

@@ -22,7 +22,7 @@
</fieldset>
<fieldset>
<legend>@T("Migrating Content Item Menu Parts:")</legend>
<legend>@T("Migrating Content Item Permissions Parts:")</legend>
<span class="hint">@T("This migration step will copy all Content Item Permissions parts to Infosets.")</span>
<button type="button" class="button button-migrate" data-url="@Url.Action("MigrateContentPermissionsPart", "Infoset")">@T("Migrate")</button>
</fieldset>
@@ -33,6 +33,12 @@
<button type="button" class="button button-migrate" data-url="@Url.Action("MigrateContentMenuItemPart", "Infoset")">@T("Migrate")</button>
</fieldset>
<fieldset>
<legend>@T("Migrating Tags Parts:")</legend>
<span class="hint">@T("This migration step will copy all Tags parts to Infosets.")</span>
<button type="button" class="button button-migrate" data-url="@Url.Action("MigrateTagsPart", "Infoset")">@T("Migrate")</button>
</fieldset>
@using (Script.Foot()) {
<script type="text/javascript">
$(function() {

View File

@@ -41,19 +41,19 @@ namespace Orchard.Mvc {
return new HttpContextWrapper(HttpContext.Current);
}
// this doesn't work in a background service, throws an exception in ContentManager.Handlers
//var siteService = context.Resolve<ISiteService>();
//var baseUrl = siteService.GetSiteSettings().BaseUrl;
//this doesn't work in a background service, throws an exception in ContentManager.Handlers
var siteService = context.Resolve<ISiteService>();
var baseUrl = siteService.GetSiteSettings().BaseUrl;
var session = context.Resolve<ISessionLocator>().For(typeof(ContentItem));
var shellSettings = context.Resolve<ShellSettings>();
//var session = context.Resolve<ISessionLocator>().For(typeof(ContentItem));
//var shellSettings = context.Resolve<ShellSettings>();
var tableName = "Settings_SiteSettings2PartRecord";
if (!string.IsNullOrEmpty(shellSettings.DataTablePrefix)) {
tableName = shellSettings.DataTablePrefix + "_" + tableName;
}
var query = session.CreateSQLQuery("SELECT BaseUrl FROM " + tableName);
var baseUrl = query.UniqueResult<string>();
//var tableName = "Settings_SiteSettings2PartRecord";
//if (!string.IsNullOrEmpty(shellSettings.DataTablePrefix)) {
// tableName = shellSettings.DataTablePrefix + "_" + tableName;
//}
//var query = session.CreateSQLQuery("SELECT BaseUrl FROM " + tableName);
//var baseUrl = query.UniqueResult<string>();
return new HttpContextPlaceholder(baseUrl);
}