feeds.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. from __future__ import unicode_literals
  2. from django.contrib.auth import get_user_model
  3. from django.contrib.sites.models import Site
  4. from django.contrib.syndication.views import Feed, add_domain
  5. from django.core.urlresolvers import reverse
  6. from django.shortcuts import get_object_or_404
  7. from django.utils.feedgenerator import Atom1Feed
  8. from django.utils.html import strip_tags
  9. from mezzanine.blog.models import BlogPost, BlogCategory
  10. from mezzanine.conf import settings
  11. from mezzanine.core.templatetags.mezzanine_tags import richtext_filters
  12. from mezzanine.core.request import current_request
  13. from mezzanine.generic.models import Keyword
  14. from mezzanine.utils.html import absolute_urls
  15. from mezzanine.utils.sites import current_site_id
  16. User = get_user_model()
  17. try:
  18. unicode
  19. except NameError: # Python 3
  20. unicode = lambda s: s
  21. class PostsRSS(Feed):
  22. """
  23. RSS feed for all blog posts.
  24. """
  25. def __init__(self, *args, **kwargs):
  26. """
  27. Use the title and description of the Blog page for the feed's
  28. title and description. If the blog page has somehow been
  29. removed, fall back to the ``SITE_TITLE`` and ``SITE_TAGLINE``
  30. settings.
  31. """
  32. self.tag = kwargs.pop("tag", None)
  33. self.category = kwargs.pop("category", None)
  34. self.username = kwargs.pop("username", None)
  35. super(PostsRSS, self).__init__(*args, **kwargs)
  36. self._public = True
  37. page = None
  38. if "mezzanine.pages" in settings.INSTALLED_APPS:
  39. from mezzanine.pages.models import Page
  40. try:
  41. page = Page.objects.published().get(slug=settings.BLOG_SLUG)
  42. except Page.DoesNotExist:
  43. pass
  44. else:
  45. self._public = not page.login_required
  46. if self._public:
  47. if page is not None:
  48. self._title = "%s | %s" % (page.title, settings.SITE_TITLE)
  49. self._description = strip_tags(page.description)
  50. else:
  51. self._title = settings.SITE_TITLE
  52. self._description = settings.SITE_TAGLINE
  53. def __call__(self, *args, **kwarg):
  54. self._request = current_request()
  55. self._site = Site.objects.get(id=current_site_id())
  56. return super(PostsRSS, self).__call__(*args, **kwarg)
  57. def add_domain(self, link):
  58. return add_domain(self._site.domain, link, self._request.is_secure())
  59. def title(self):
  60. return unicode(self._title)
  61. def description(self):
  62. return unicode(self._description)
  63. def link(self):
  64. return self.add_domain(reverse("blog_post_list"))
  65. def items(self):
  66. if not self._public:
  67. return []
  68. blog_posts = BlogPost.objects.published().select_related("user"
  69. ).prefetch_related("categories")
  70. if self.tag:
  71. tag = get_object_or_404(Keyword, slug=self.tag)
  72. blog_posts = blog_posts.filter(keywords__keyword=tag)
  73. if self.category:
  74. category = get_object_or_404(BlogCategory, slug=self.category)
  75. blog_posts = blog_posts.filter(categories=category)
  76. if self.username:
  77. author = get_object_or_404(User, username=self.username)
  78. blog_posts = blog_posts.filter(user=author)
  79. limit = settings.BLOG_RSS_LIMIT
  80. if limit is not None:
  81. blog_posts = blog_posts[:settings.BLOG_RSS_LIMIT]
  82. return blog_posts
  83. def item_description(self, item):
  84. description = richtext_filters(item.content)
  85. absolute_urls_name = "mezzanine.utils.html.absolute_urls"
  86. if absolute_urls_name not in settings.RICHTEXT_FILTERS:
  87. description = absolute_urls(description)
  88. return unicode(description)
  89. def categories(self):
  90. if not self._public:
  91. return []
  92. return BlogCategory.objects.all()
  93. def feed_url(self):
  94. return self.add_domain(self._request.path)
  95. def item_link(self, item):
  96. return self.add_domain(super(PostsRSS, self).item_link(item))
  97. def item_author_name(self, item):
  98. return item.user.get_full_name() or item.user.username
  99. def item_author_link(self, item):
  100. username = item.user.username
  101. link = reverse("blog_post_list_author", kwargs={"username": username})
  102. return self.add_domain(link)
  103. def item_pubdate(self, item):
  104. return item.publish_date
  105. def item_categories(self, item):
  106. return item.categories.all()
  107. def item_enclosure_url(self, item):
  108. if item.featured_image:
  109. return self.add_domain(item.featured_image.url)
  110. def item_enclosure_length(self, item):
  111. if item.featured_image:
  112. return item.featured_image.size
  113. def item_enclosure_mime_type(self, item):
  114. if item.featured_image:
  115. return item.featured_image.mimetype[0]
  116. class PostsAtom(PostsRSS):
  117. """
  118. Atom feed for all blog posts.
  119. """
  120. feed_type = Atom1Feed
  121. def subtitle(self):
  122. return self.description()
  123. def item_updateddate(self, item):
  124. return item.updated