Skip to content

Commit 41c0a4a

Browse files
committed
feat: speedup feed generation
1 parent 2ab857a commit 41c0a4a

File tree

5 files changed

+34
-10
lines changed

5 files changed

+34
-10
lines changed

boards/helpers.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from collections import defaultdict
2+
3+
4+
def regroup_articles_by_feed(articles_list):
5+
articles_dict = defaultdict(list)
6+
for article in articles_list:
7+
articles_dict[article.feed_id].append(article)
8+
return articles_dict
9+

boards/models.py

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import uuid
22
from datetime import datetime, timedelta
33

4+
from django.conf import settings
45
from django.contrib.humanize.templatetags.humanize import naturaltime
56
from django.db import models
67
from django.db.models import JSONField
@@ -140,13 +141,6 @@ def save(self, *args, **kwargs):
140141
def last_articles(self):
141142
return self.articles.all()[:15 * self.columns]
142143

143-
def articles_by_column(self):
144-
articles = self.articles.all()[:self.articles_per_column * self.columns]
145-
return [
146-
(column, articles[column * self.articles_per_column:self.articles_per_column * (column + 1)])
147-
for column in range(self.columns)
148-
]
149-
150144
def natural_last_article_at(self):
151145
if not self.last_article_at:
152146
return None

boards/templatetags/articles.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from django import template
2+
3+
register = template.Library()
4+
5+
6+
@register.simple_tag()
7+
def articles_by_column(articles_grouped_by_feed, feed):
8+
articles = articles_grouped_by_feed[feed.id][0:feed.articles_per_column * feed.columns]
9+
return [
10+
(column, articles[column * feed.articles_per_column:feed.articles_per_column * (column + 1)])
11+
for column in range(feed.columns)
12+
]

boards/views.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
from django.views.decorators.http import last_modified
88

99
from boards.cache import board_last_modified_at
10-
from boards.models import Board, BoardBlock, BoardFeed
10+
from boards.helpers import regroup_articles_by_feed
11+
from boards.models import Board, BoardBlock, BoardFeed, Article
1112

1213

1314
@cache_page(settings.STATIC_PAGE_CACHE_SECONDS)
@@ -28,11 +29,16 @@ def board(request, board_slug):
2829
return cached_page
2930

3031
blocks = BoardBlock.objects.filter(board=board)
31-
feeds = BoardFeed.objects.select_related("articles").filter(board=board)
32+
feeds = BoardFeed.objects.select_related("block").filter(board=board)
33+
articles = Article.objects.select_related("feed").filter(
34+
board=board,
35+
created_at__gt=datetime.utcnow() - timedelta(days=settings.OLD_ARTICLES_CLEANUP_AFTER_DAYS)
36+
)
3237
result = render(request, "board.html", {
3338
"board": board,
3439
"blocks": blocks,
3540
"feeds": feeds,
41+
"articles_grouped_by_feed": regroup_articles_by_feed(articles),
3642
})
3743
cache.set(f"board_{board.slug}", result, settings.BOARD_CACHE_SECONDS)
3844
return result

templates/feeds/simple.html

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
{% load static %}
22
{% load text_filters %}
33
{% load bleach_tags %}
4+
{% load articles %}
45

5-
{% for column, articles in feed.articles_by_column %}
6+
{% articles_by_column articles_grouped_by_feed feed as feed_articles_by_column %}
7+
8+
{% for column, articles in feed_articles_by_column %}
69
<div class="feed {% if column > 1 %}hide-on-iphone{% endif %}">
710
{% if feed.name %}
811
<div class="feed-title {% if column != 0 %}feed-title-hidden{% endif %}">

0 commit comments

Comments
 (0)