/** * Add tags to the database. * * @param entity context */ protected static void ProcessTags(kenticofreeEntities context) { Console.WriteLine("Adding tags to database."); CMS_TagGroup tg = GetTagGroup(context); var tags = (from t in wpxml.Descendants(wpns + "tag") select new CMS_Tag { TagName = t.Element(wpns + "tag_slug").Value, TagGroupID = tg.TagGroupID, TagCount = 0 }); foreach (CMS_Tag tag in tags) { // Don't add an existing tag var exists = (from t in context.CMS_Tag where t.TagName == tag.TagName && t.TagGroupID == tag.TagGroupID select t ); if (!exists.Any()) { context.CMS_Tag.AddObject(tag); } } context.SaveChanges(); }
/** * Get the tag group. * * Kentico encourages grouping tags. Additionally, tags aren't just used for blog posts. * Therefore, we're going to use or create a tag group specifically for our blog import. * This group name is set in the config, so it can be an existing one. It doesn't have to * exist, though, and if it doesn't, this script will create it. * * @param entity context * @return CMS_TagGroup */ protected static CMS_TagGroup GetTagGroup(kenticofreeEntities context) { string groupName = config.Get("tagGroupName"); var tg = (from t in context.CMS_TagGroup where t.TagGroupName == groupName select t ); if (tg.Any()) { return((CMS_TagGroup)tg.First()); } else { Regex forbidden = new Regex(forbiddenChars); CMS_TagGroup group = new CMS_TagGroup() { TagGroupName = forbidden.Replace(groupName, ""), TagGroupDisplayName = groupName, TagGroupDescription = groupName, TagGroupGUID = Guid.NewGuid(), TagGroupSiteID = Int32.Parse(config.Get("siteId")), TagGroupIsAdHoc = false, TagGroupLastModified = DateTime.Now }; context.CMS_TagGroup.AddObject(group); context.SaveChanges(); return(group); } }
/** * Link categories and tags to a post. * * This is combined into one function, because the Wordpress XML uses the same "category" tag * for both categories and tags for a post, and just uses the "domain" attribute to distinguish * between them. * * @param entity context * @param CMS_Document postDoc * @param CONTENT_BlogPost post */ protected static void LinkCategoriesAndTags(kenticofreeEntities context, CMS_Document postDoc, CONTENT_BlogPost post) { var xml = (from c in wpxml.Descendants("item") where Int32.Parse(c.Element(wpns + "post_id").Value) == post.BlogPostID select c ).Single(); var categories = (from c in xml.Descendants("category") select new { Domain = c.Attribute("domain").Value, Nicename = c.Attribute("nicename").Value } ); foreach (var cat in categories) { if (cat.Domain == "post_tag") { CMS_TagGroup tg = GetTagGroup(context); CMS_Tag tag = (from t in context.CMS_Tag where t.TagName == cat.Nicename && t.TagGroupID == tg.TagGroupID select t ).SingleOrDefault(); postDoc.CMS_Tag.Add(tag); if (String.IsNullOrEmpty(postDoc.DocumentTags)) { postDoc.DocumentTags = tag.TagName; } else { postDoc.DocumentTags = postDoc.DocumentTags + ", " + tag.TagName; } tag.TagCount++; } else if (cat.Domain == "category") { CMS_Category category = (from c in context.CMS_Category where c.CategoryName == cat.Nicename select c ).SingleOrDefault(); postDoc.CMS_Category.Add(category); category.CategoryCount++; } } context.SaveChanges(); }
/** * Import Post * * Imports a given post into the database, creating the necessary dependencies, * including BlogMonth (if it doesn't already exist), TreeNode, and Document. * Returns the newly-created document that represents the post. * * @param entities context * @param CMS_Tree blog * @param CONTENT_BlogPost post * @return CMS_Document */ protected static CMS_Document ImportPost(kenticofreeEntities context, CMS_Tree blog, CONTENT_BlogPost post) { Regex forbidden = new Regex(forbiddenChars); Regex consolidateDashes = new Regex("[-]{2}"); /* We want to preserve the IDs of the Posts for linking, but EF won't let us turn on IDENTITY_INSERT * with its available methods (ExecuteStoreCommand and SaveChanges are different connections, it seems). * So we have to do it the old fashioned way. */ object[] values = new object[] { post.BlogPostID.ToString(), post.BlogPostTitle, post.BlogPostDate.Date.ToString("yyyy-MM-dd HH:mm:ss"), post.BlogPostSummary, post.BlogPostAllowComments, post.BlogPostBody, post.BlogLogActivity }; /* We'll use MERGE here, so that we can handle existing entries. * The "xmlTrumpsDb" config switch will allow a choice between nuking what's in the DB * or preserving it. */ string cmd = "SET IDENTITY_INSERT CONTENT_BlogPost ON; "; cmd += "MERGE CONTENT_BlogPost "; cmd += "USING (VALUES ({0},{1},{2},{3},{4},{5},{6})) as temp(BlogPostID, BlogPostTitle, BlogPostDate, BlogPostSummary, BlogPostAllowComments, BlogPostBody, BlogLogActivity) "; cmd += "ON CONTENT_BlogPost.BlogPostID = temp.BlogPostID "; // To nuke or not to nuke, that is the question... if (config.Get("xmlTrumpsDb") == "true") { cmd += "WHEN MATCHED THEN "; cmd += "UPDATE SET CONTENT_BlogPost.BlogPostTitle = temp.BlogPostTitle, CONTENT_BlogPost.BlogPostDate = temp.BlogPostDate, CONTENT_BlogPost.BlogPostSummary = temp.BlogPostSummary, CONTENT_BlogPost.BlogPostAllowComments = temp.BlogPostAllowComments, CONTENT_BlogPost.BlogPostBody = temp.BlogPostBody, CONTENT_BlogPost.BlogLogActivity = temp.BlogLogActivity "; } cmd += "WHEN NOT MATCHED THEN "; cmd += "INSERT (BlogPostId, BlogPostTitle, BlogPostDate, BlogPostSummary, BlogPostAllowComments, BlogPostBody, BlogLogActivity) VALUES ({0},{1},{2},{3},{4},{5},{6}); "; cmd += "SET IDENTITY_INSERT CONTENT_BlogPost OFF;"; context.ExecuteStoreCommand(cmd, values); // See if there's a BlogMonth entry for the month this post is for CMS_Tree month = GetBlogMonth(context, post, blog); CMS_Class blogClass = context.CMS_Class.Where(x => x.ClassName == "CMS.BlogPost").First(); CMS_Tree treeNode = (from t in context.CMS_Tree join d in context.CMS_Document on t.NodeID equals d.DocumentNodeID where d.DocumentForeignKeyValue == post.BlogPostID && t.NodeClassID == 3423 select t).FirstOrDefault(); // Add a new node only if one doesn't already exist if (treeNode == null) { string nodeAlias = consolidateDashes.Replace(forbidden.Replace(post.BlogPostTitle, "-"), "-"); nodeAlias = (nodeAlias.Length > 50 ? nodeAlias.Substring(0, 50) : nodeAlias); // Truncate the alias to avoid SQL Server errors // Create the Tree Node for the post and add it in treeNode = new CMS_Tree() { NodeAliasPath = string.Format("{0}/{1}", month.NodeAliasPath, forbidden.Replace(post.BlogPostTitle, "-")), NodeName = post.BlogPostTitle, NodeAlias = nodeAlias, NodeClassID = blogClass.ClassID, NodeParentID = month.NodeID, NodeLevel = Int32.Parse(config.Get("kenticoBlogLevel")) + 2, NodeACLID = 1, // Default ACL ID NodeSiteID = siteId, NodeGUID = Guid.NewGuid(), NodeInheritPageLevels = "", NodeTemplateForAllCultures = true, NodeChildNodesCount = 0 }; CMS_User author = GetAuthor(context, post); treeNode.NodeOwner = author.UserID; context.CMS_Tree.AddObject(treeNode); treeNode.NodeOrder = GetNodeOrder(context, treeNode); month.NodeChildNodesCount++; // Increment the child nodes count, so the new post will display in the CMS blog.NodeChildNodesCount++; // Increment the blog's child nodes count, too. context.SaveChanges(); } CMS_TagGroup tagGroup = GetTagGroup(context); // Create the document and add it into the database CMS_Document postDoc = AddDocument(context, treeNode, post.BlogPostID, tagGroup.TagGroupID); return(postDoc); }