/// <summary>
        /// 
        /// </summary>
        /// <param name="ci"></param>
        /// <param name="obj"></param>
        /// <returns></returns>
        public dynamic CreateTemplateDynamicData(Opinion o, CfCacheIndexEntry obj)
        {
            var commentData = "No comment";
            if (!string.IsNullOrEmpty(o.Comment))
            {
                if (o.Comment.Length < 255) { commentData = o.Comment; }
                else { commentData = o.Comment.Excerpt(255) + " ..."; }
            }

            dynamic data = new { Name = Sanitize(obj.Name), Comment = Sanitize(commentData), Score = o.Rating };
            return data;
        }
 //-- Here there is a difference between the posts Content (which may be a climb) and the post's Place
 internal Post UpdateOpinionPost(Opinion o)
 {
     return UpdateTypedPost(o.ID, new { Content = GetPostPlace(o.ObjectID) });
 }
 internal void DeleteOpinionPost(Opinion o)
 {
     DeleteTypedPost(postRepo.GetByID(o.ID));
 }
 /// <summary>
 /// 
 /// </summary>
 /// <param name="o"></param>
 /// <param name="placeID"></param>
 /// <param name="isPrivate"></param>
 /// <returns></returns>
 internal Post CreateOpinionPost(Opinion o, Guid placeID, bool isPublic)
 {
     var place = AppLookups.GetCacheIndexEntry(placeID);
     var postMgr = new cf.Content.Feed.V0.OpinionPostManager();
     dynamic data = postMgr.CreateTemplateDynamicData(o, GetPostPlace(o.ObjectID));
     return postMgr.CreatePost(o.ID, o.UserID, place, isPublic, data);
 }