feat: speedup feed generation

This commit is contained in:
vas3k
2022-08-15 12:27:51 +02:00
parent 2ab857aae0
commit 41c0a4ad8f
5 changed files with 34 additions and 10 deletions

9
boards/helpers.py Normal file
View File

@@ -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

View File

@@ -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

View File

@@ -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)
]

View File

@@ -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

View File

@@ -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 %}
<div class="feed {% if column > 1 %}hide-on-iphone{% endif %}">
{% if feed.name %}
<div class="feed-title {% if column != 0 %}feed-title-hidden{% endif %}">