def get_months_authors_categories(self, from_dt=None, to_dt=None, user=None, perm=None): """ Returns a structure of post metadata: ([ ((year1, month1), count), ((year1, month2), count) ], # newest first [ (author1, count), (author2, count) ], # alphabetical [ (category1, count), (category2, count) ], # alphabetical total) # num of posts * Use 'from_dt' and 'to_dt' (datetime objects) to restrict search to posts with a publish_time within the intervals (None means ignore). * If user and perm is provided, the list is also filtered for permissions. * Note also that it only fetches from most recent version. """ blog_posts = get_blog_posts(self.env, from_dt=from_dt, to_dt=to_dt) a_dict = {} c_dict = {} m_dict = {} total = 0 for post in blog_posts: if user and perm: # Check permissions bp = BlogPost(self.env, post[0], post[1]) if not 'BLOG_VIEW' in perm(bp.resource): continue # Skip this post post_time = post[2] m_dict[(post_time.year, post_time.month)] = m_dict.get( (post_time.year, post_time.month), 0) + 1 author = post[3] a_dict[author] = a_dict.get(author, 0) + 1 categories = post[6] # a list for category in set(categories): c_dict[category] = c_dict.get(category, 0) + 1 total += 1 return ([(m, m_dict.get(m, 0)) for m in sorted(m_dict.keys(), reverse=True)], [(a, a_dict.get(a, 0)) for a in sorted(a_dict.keys())], [(c, c_dict.get(c, 0)) for c in sorted(c_dict.keys())], total)
def expand_macro(self, formatter, name, content): # Parse content for arguments args_list, args_dict = parse_args(content) from_dt, to_dt = parse_period(list(args_dict.get('period', '').split('/'))) category = args_dict.get('category', '') author = args_dict.get('author', '') recent = int(args_dict.get('recent', 0)) format = args_dict.get('format', 'inline').lower() heading = args_dict.get('heading', '') max_size = int(args_dict.get('max_size', 0)) show_meta = args_dict.get('meta', '') != 'off' and True or False # Get blog posts all_posts = get_blog_posts(self.env, author=author, category=category, from_dt=from_dt, to_dt=to_dt) # Trim posts against permissions and count post_list = [] post_instances = [] if format in ['float', 'full']: recent = recent or self.env.config.getint('fullblog', 'num_items_front') recent = recent or len(all_posts) count = 0 for post in all_posts: if count == recent: break bp = BlogPost(self.env, post[0]) if 'BLOG_VIEW' in formatter.req.perm(bp.resource): count += 1 post_instances.append(bp) post_list.append(post) # Rendering add_stylesheet(formatter.req, 'tracfullblog/css/fullblog.css') add_stylesheet(formatter.req, 'common/css/code.css') if format == 'inline': data = {'heading': heading, 'posts': post_list, 'blog_personal_blog': self.config.getbool( 'fullblog', 'personal_blog'), 'show_meta': show_meta, 'execute_blog_macro': True} return Chrome(self.env).render_template(formatter.req, 'fullblog_macro_monthlist.html', data=data, fragment=True) elif format == 'full': return self._render_full_format(formatter, post_list, post_instances, heading, max_size, show_meta) elif format == 'float': # Essentially a 'full' list - just wrapped inside a new div return tag.div(self._render_full_format(formatter, post_list, post_instances, heading, max_size, show_meta), class_="blogflash") else: raise TracError("Invalid 'format' argument used for macro %s." % name)