Ejemplo n.º 1
0
        /**
         * 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();
        }
Ejemplo n.º 2
0
        /**
         * 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);
            }
        }
Ejemplo n.º 3
0
        /**
         * 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();
        }
Ejemplo n.º 4
0
        /**
         * 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);
        }