diff --git a/boards/helpers.py b/boards/helpers.py new file mode 100644 index 0000000..8aff6bf --- /dev/null +++ b/boards/helpers.py @@ -0,0 +1,9 @@ +from collections import defaultdict + + +def regroup_articles_by_feed(articles_list): + articles_dict = defaultdict(list) + for article in articles_list: + articles_dict[article.feed_id].append(article) + return articles_dict + diff --git a/boards/models.py b/boards/models.py index adbbe90..9a29a44 100644 --- a/boards/models.py +++ b/boards/models.py @@ -1,6 +1,7 @@ import uuid from datetime import datetime, timedelta +from django.conf import settings from django.contrib.humanize.templatetags.humanize import naturaltime from django.db import models from django.db.models import JSONField @@ -140,13 +141,6 @@ class BoardFeed(models.Model): def last_articles(self): return self.articles.all()[:15 * self.columns] - def articles_by_column(self): - articles = self.articles.all()[:self.articles_per_column * self.columns] - return [ - (column, articles[column * self.articles_per_column:self.articles_per_column * (column + 1)]) - for column in range(self.columns) - ] - def natural_last_article_at(self): if not self.last_article_at: return None diff --git a/boards/templatetags/articles.py b/boards/templatetags/articles.py new file mode 100644 index 0000000..9478b1c --- /dev/null +++ b/boards/templatetags/articles.py @@ -0,0 +1,12 @@ +from django import template + +register = template.Library() + + +@register.simple_tag() +def articles_by_column(articles_grouped_by_feed, feed): + articles = articles_grouped_by_feed[feed.id][0:feed.articles_per_column * feed.columns] + return [ + (column, articles[column * feed.articles_per_column:feed.articles_per_column * (column + 1)]) + for column in range(feed.columns) + ] diff --git a/boards/views.py b/boards/views.py index f0070dc..54e9730 100644 --- a/boards/views.py +++ b/boards/views.py @@ -7,7 +7,8 @@ from django.views.decorators.cache import cache_page from django.views.decorators.http import last_modified from boards.cache import board_last_modified_at -from boards.models import Board, BoardBlock, BoardFeed +from boards.helpers import regroup_articles_by_feed +from boards.models import Board, BoardBlock, BoardFeed, Article @cache_page(settings.STATIC_PAGE_CACHE_SECONDS) @@ -28,11 +29,16 @@ def board(request, board_slug): return cached_page blocks = BoardBlock.objects.filter(board=board) - feeds = BoardFeed.objects.select_related("articles").filter(board=board) + feeds = BoardFeed.objects.select_related("block").filter(board=board) + articles = Article.objects.select_related("feed").filter( + board=board, + created_at__gt=datetime.utcnow() - timedelta(days=settings.OLD_ARTICLES_CLEANUP_AFTER_DAYS) + ) result = render(request, "board.html", { "board": board, "blocks": blocks, "feeds": feeds, + "articles_grouped_by_feed": regroup_articles_by_feed(articles), }) cache.set(f"board_{board.slug}", result, settings.BOARD_CACHE_SECONDS) return result diff --git a/templates/feeds/simple.html b/templates/feeds/simple.html index 3134a5e..031fff2 100644 --- a/templates/feeds/simple.html +++ b/templates/feeds/simple.html @@ -1,8 +1,11 @@ {% load static %} {% load text_filters %} {% load bleach_tags %} +{% load articles %} -{% for column, articles in feed.articles_by_column %} +{% articles_by_column articles_grouped_by_feed feed as feed_articles_by_column %} + +{% for column, articles in feed_articles_by_column %}