feat: speedup feed generation
This commit is contained in:
9
boards/helpers.py
Normal file
9
boards/helpers.py
Normal 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
|
||||
|
||||
@@ -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
|
||||
|
||||
12
boards/templatetags/articles.py
Normal file
12
boards/templatetags/articles.py
Normal 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)
|
||||
]
|
||||
@@ -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
|
||||
|
||||
@@ -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 %}">
|
||||
|
||||
Reference in New Issue
Block a user