Source code for

from __future__ import unicode_literals
from datetime import datetime

from django.contrib.auth import get_user_model
from django.db.models import Count, Q
from django.utils import timezone

from import BlogPostForm
from import BlogPost, BlogCategory
from mezzanine.generic.models import Keyword
from mezzanine import template

User = get_user_model()

register = template.Library()

[docs]@register.as_tag def blog_months(*args): """ Put a list of dates for blog posts into the template context. """ dates = BlogPost.objects.published().values_list("publish_date", flat=True) tz = timezone.get_current_timezone() dates = [d.astimezone(tz) for d in dates] date_dicts = [{"date": datetime(d.year, d.month, 1)} for d in dates] month_dicts = [] for date_dict in date_dicts: if date_dict not in month_dicts: month_dicts.append(date_dict) for date_dict in month_dicts: date_dict["post_count"] = date_dicts.count(date_dict) return month_dicts
[docs]@register.as_tag def blog_categories(*args): """ Put a list of categories for blog posts into the template context. """ posts = BlogPost.objects.published() categories = BlogCategory.objects.filter(blogposts__in=posts) return list(categories.annotate(post_count=Count("blogposts")))
[docs]@register.as_tag def blog_authors(*args): """ Put a list of authors (users) for blog posts into the template context. """ blog_posts = BlogPost.objects.published() authors = User.objects.filter(blogposts__in=blog_posts) return list(authors.annotate(post_count=Count("blogposts")))
[docs]@register.as_tag def blog_recent_posts(limit=5, tag=None, username=None, category=None): """ Put a list of recently published blog posts into the template context. A tag title or slug, category title or slug or author's username can also be specified to filter the recent posts returned. Usage:: {% blog_recent_posts 5 as recent_posts %} {% blog_recent_posts limit=5 tag="django" as recent_posts %} {% blog_recent_posts limit=5 category="python" as recent_posts %} {% blog_recent_posts 5 username=admin as recent_posts %} """ blog_posts = BlogPost.objects.published().select_related("user") title_or_slug = lambda s: Q(title=s) | Q(slug=s) if tag is not None: try: tag = Keyword.objects.get(title_or_slug(tag)) blog_posts = blog_posts.filter(keywords__keyword=tag) except Keyword.DoesNotExist: return [] if category is not None: try: category = BlogCategory.objects.get(title_or_slug(category)) blog_posts = blog_posts.filter(categories=category) except BlogCategory.DoesNotExist: return [] if username is not None: try: author = User.objects.get(username=username) blog_posts = blog_posts.filter(user=author) except User.DoesNotExist: return [] return list(blog_posts[:limit])
[docs]@register.inclusion_tag("admin/includes/quick_blog.html", takes_context=True) def quick_blog(context): """ Admin dashboard tag for the quick blog form. """ context["form"] = BlogPostForm() return context.flatten()