From 06b67f1d27b72b54d4ff08d09d5d20ae5429aad1 Mon Sep 17 00:00:00 2001
From: Skia
Date: Tue, 30 May 2017 22:10:50 +0200
Subject: [PATCH] Still reducing the number of queries on the Forum
Signed-off-by: Skia
---
...520_1235.py => 0004_auto_20170530_2058.py} | 19 ++++++++++++-------
forum/models.py | 15 ++++++---------
forum/templates/forum/forum.jinja | 2 +-
forum/templates/forum/macros.jinja | 2 +-
forum/views.py | 8 +++++---
migrate.py | 2 +-
6 files changed, 26 insertions(+), 22 deletions(-)
rename forum/migrations/{0004_auto_20170520_1235.py => 0004_auto_20170530_2058.py} (62%)
diff --git a/forum/migrations/0004_auto_20170520_1235.py b/forum/migrations/0004_auto_20170530_2058.py
similarity index 62%
rename from forum/migrations/0004_auto_20170520_1235.py
rename to forum/migrations/0004_auto_20170530_2058.py
index 9dcb408d..d236d5ac 100644
--- a/forum/migrations/0004_auto_20170520_1235.py
+++ b/forum/migrations/0004_auto_20170530_2058.py
@@ -22,36 +22,41 @@ class Migration(migrations.Migration):
migrations.AddField(
model_name='forum',
name='_last_message',
- field=models.ForeignKey(related_name='forums_where_its_last', to='forum.ForumMessage', null=True, verbose_name='the last message'),
+ field=models.ForeignKey(related_name='forums_where_its_last', null=True, to='forum.ForumMessage', verbose_name='the last message'),
),
migrations.AddField(
model_name='forum',
name='_topic_number',
- field=models.IntegerField(default=0, verbose_name='number of topics'),
+ field=models.IntegerField(verbose_name='number of topics', default=0),
),
migrations.AddField(
model_name='forummessage',
name='_deleted',
- field=models.BooleanField(default=False, verbose_name='is deleted'),
+ field=models.BooleanField(verbose_name='is deleted', default=False),
),
migrations.AddField(
model_name='forumtopic',
name='_last_message',
- field=models.ForeignKey(related_name='+', to='forum.ForumMessage', null=True, verbose_name='the last message'),
+ field=models.ForeignKey(related_name='+', null=True, to='forum.ForumMessage', verbose_name='the last message'),
+ ),
+ migrations.AddField(
+ model_name='forumtopic',
+ name='_message_number',
+ field=models.IntegerField(verbose_name='number of messages', default=0),
),
migrations.AddField(
model_name='forumtopic',
name='_title',
- field=models.CharField(max_length=64, blank=True, verbose_name='title'),
+ field=models.CharField(max_length=64, verbose_name='title', blank=True),
),
migrations.AlterField(
model_name='forum',
name='description',
- field=models.CharField(max_length=512, default='', verbose_name='description'),
+ field=models.CharField(max_length=512, verbose_name='description', default=''),
),
migrations.AlterField(
model_name='forum',
name='id',
- field=models.AutoField(primary_key=True, serialize=False, db_index=True),
+ field=models.AutoField(serialize=False, db_index=True, primary_key=True),
),
]
diff --git a/forum/models.py b/forum/models.py
index dad33469..2ddcc061 100644
--- a/forum/models.py
+++ b/forum/models.py
@@ -183,6 +183,7 @@ class ForumTopic(models.Model):
description = models.CharField(_('description'), max_length=256, default="")
_last_message = models.ForeignKey('ForumMessage', related_name="+", verbose_name=_("the last message"), null=True)
_title = models.CharField(_('title'), max_length=64, blank=True)
+ _message_number = models.IntegerField(_("number of messages"), default=0)
class Meta:
ordering = ['-_last_message__date']
@@ -220,12 +221,7 @@ class ForumTopic(models.Model):
@cached_property
def title(self):
- if self._title:
- return self._title
- else:
- self._title = self.messages.order_by('id').first().title
- self.save()
- return self._title
+ return self._title
class ForumMessage(models.Model):
"""
@@ -250,10 +246,10 @@ class ForumMessage(models.Model):
super(ForumMessage, self).save(*args, **kwargs)
if self.is_last_in_topic():
self.topic._last_message_id = self.id
- self.topic.save()
if self.is_first_in_topic():
self.topic._title = self.title
- self.topic.save()
+ self.topic._message_number = self.topic.messages.count()
+ self.topic.save()
def is_first_in_topic(self):
return bool(self.id == self.topic.messages.order_by('date').first().id)
@@ -285,7 +281,8 @@ class ForumMessage(models.Model):
def mark_as_read(self, user):
try: # Need the try/except because of AnonymousUser
- self.readers.add(user)
+ if not self.is_read(user):
+ self.readers.add(user)
except: pass
def is_read(self, user):
diff --git a/forum/templates/forum/forum.jinja b/forum/templates/forum/forum.jinja
index 6d4886fe..f3c3c8c6 100644
--- a/forum/templates/forum/forum.jinja
+++ b/forum/templates/forum/forum.jinja
@@ -36,7 +36,7 @@
{{ display_forum(forum, user, True) }}
- {% for f in forum.children.all() %}
+ {% for f in forum.children.all().select_related("_last_message__author", "_last_message__topic") %}
{{ display_forum(f, user) }}
{% endfor %}
{% endif %}
diff --git a/forum/templates/forum/macros.jinja b/forum/templates/forum/macros.jinja
index b89ce4c2..c423bba4 100644
--- a/forum/templates/forum/macros.jinja
+++ b/forum/templates/forum/macros.jinja
@@ -69,7 +69,7 @@
{{ user_profile_link(topic.author) }}
- {{ topic.messages.count() }}
+ {{ topic._message_number }}
diff --git a/forum/views.py b/forum/views.py
index 157ab624..89374e36 100644
--- a/forum/views.py
+++ b/forum/views.py
@@ -41,7 +41,7 @@ from core.views import CanViewMixin, CanEditMixin, CanEditPropMixin, CanCreateMi
from forum.models import Forum, ForumMessage, ForumTopic, ForumMessageMeta
class ForumMainView(ListView):
- queryset = Forum.objects.filter(parent=None).select_related("_last_message__author", "_last_message__topic___title")
+ queryset = Forum.objects.filter(parent=None).prefetch_related("children___last_message__author", "children___last_message__topic")
template_name = "forum/main.jinja"
class ForumMarkAllAsRead(RedirectView):
@@ -122,7 +122,8 @@ class ForumDetailView(CanViewMixin, DetailView):
def get_context_data(self, **kwargs):
kwargs = super(ForumDetailView, self).get_context_data(**kwargs)
- qs = self.object.topics.order_by('-_last_message__date').select_related('_last_message')
+ qs = self.object.topics.order_by('-_last_message__date').select_related('_last_message__author', 'author')\
+ .prefetch_related("forum__edit_groups")
paginator = Paginator(qs,
settings.SITH_FORUM_PAGE_LENGTH)
page = self.request.GET.get('topic_page')
@@ -178,7 +179,8 @@ class ForumTopicDetailView(CanViewMixin, DetailView):
kwargs['first_unread_message_id'] = msg.id
except:
kwargs['first_unread_message_id'] = float("inf")
- paginator = Paginator(self.object.messages.select_related('author__avatar_pict').order_by('date'),
+ paginator = Paginator(self.object.messages.select_related('author__avatar_pict')\
+ .prefetch_related('topic__forum__edit_groups', 'readers').order_by('date'),
settings.SITH_FORUM_PAGE_LENGTH)
page = self.request.GET.get('page')
try:
diff --git a/migrate.py b/migrate.py
index e44bcc91..a0c420eb 100644
--- a/migrate.py
+++ b/migrate.py
@@ -1245,7 +1245,7 @@ def migrate_forum():
id=r['id_sujet'],
author=author or root,
forum=parent or saloon,
- _title=to_unicode(r['titre_sujet']),
+ _title=to_unicode(r['titre_sujet'])[:64],
description=to_unicode(r['soustitre_sujet']),
)
topic.save()