import logging logger = logging.getLogger(__name__) from collections import OrderedDict from django.utils.html import escape from django.contrib.syndication.views import Feed, add_domain from django.contrib.sites.shortcuts import get_current_site from django.utils import timezone from mhackspace.base.feeds import MediaRssFeed from mhackspace.blog.models import Category, Post from mhackspace.feeds.models import Article # as ArticleFeed class RssFeed(Feed): title = "Maidstone Hackspace News" link = "/" feed_type = MediaRssFeed description = ( "The latest blog posts and news from the Maidstone Hackspace site" ) def get_feed(self, obj, request): self.current_site = get_current_site(request) return super(RssFeed, self).get_feed(obj, request) def items(self, category): items = [] # for item in Post.objects.all(): for item in Post.objects.select_related("author").filter( active=True, members_only=False ): img = "/static/images/card.png" if item.image: img = item.image.home.url items.append( { "title": item.title, "description": item.description, "author": item.author, "pubdate": item.published_date, "updated": item.updated_date, "image": img, } ) for item in Article.objects.select_related("feed").all(): img = "/static/images/card.png" if item.image: img = item.image.home.url items.append( { "title": item.title, "description": item.description, "author": item.feed.author, "pubdate": item.date, "updated": item.date, "image": img, } ) items.sort(key=lambda r: r.get("pubdate")) return items def item_title(self, post): return post.get("title") def item_description(self, post): return escape(post.get("description")) def item_author_name(self, post): return post.get("author") def item_link(self, post): return "link" def item_categories(self, post): return "" def item_pubdate(self, post): return post.get("pubdate") def item_updateddate(self, post): return post.get("updated") def item_extra_kwargs(self, post): return { "thumbnail_url": add_domain( domain=self.current_site.domain, url=post.get("image"), secure=True, ), "thumbnail_width": 100, "thumbnail_height": 100, } class BlogFeed(Feed): title = "Maidstone Hackspace Blog" link = "/blog/" feed_type = MediaRssFeed description = ( "The latest blog posts and news from the Maidstone Hackspace site" ) def get_feed(self, obj, request): self.current_site = get_current_site(request) return super(BlogFeed, self).get_feed(obj, request) def items(self, category): return Post.objects.select_related("author").filter( active=True, members_only=False, published_date__lte=timezone.now() )[:20] def item_title(self, post): return post.title def item_description(self, post): return escape(post.description) def item_author_name(self, post): return post.author.name def item_author_email(self, post): if post.author.public: return post.author.email def item_categories(self, post): return post.categories.all() def item_pubdate(self, post): return post.published_date def item_updateddate(self, post): return post.updated_date def item_extra_kwargs(self, post): if not post.image.name: return {} try: return { "thumbnail_url": add_domain( domain=self.current_site.domain, url=post.image.full.url, secure=True, ), "thumbnail_width": post.image.full.width, "thumbnail_height": post.image.full.height, } except IOError as e: logger.exception("File does not exists error") return {} class BlogCategoryFeed(BlogFeed): def get_object(self, request, category): return Category.objects.filter(slug=category).first() def items(self, category): return Post.objects.select_related("author").filter( active=True, members_only=False, categories=category, published_date__lte=timezone.now(), )[:20] def title(self, category): return "Maidstone Hackspace Blog: %s" % category.name def description(self, category): return escape(category.description)