diff --git a/djangobb_forum/tasks.py b/djangobb_forum/tasks.py index 9420354..e1d3a79 100644 --- a/djangobb_forum/tasks.py +++ b/djangobb_forum/tasks.py @@ -1,5 +1,9 @@ +from django.contrib.auth.models import User + from celery.decorators import task +from djangobb_forum.models import Topic + @task def scratch_notify_topic_subscribers(post_id): """ @@ -19,3 +23,22 @@ def scratch_notify_topic_subscribers(post_id): object = topic, ) social_action.save() + +@task +def update_topic_on_view(user_id, topic_id, is_authenticated): + """ + Update the views and reads for a topic - part of show_topic. + Turned into async task to reduce page load times and increase + scalability. + """ + try: + topic = Topic.objects.get(pk=topic_id) + Topic.objects.filter(pk=topic_id).update(views=F('views') + 1) + if is_authenticated: + try: + user = User.objects.get(pk=user_id) + topic.update_read(request.user) + except User.DoesNotExist: + pass + except Topic.DoesNotExist: + pass diff --git a/djangobb_forum/views.py b/djangobb_forum/views.py index e5201da..90411c2 100644 --- a/djangobb_forum/views.py +++ b/djangobb_forum/views.py @@ -31,6 +31,7 @@ from djangobb_forum.forms import AddPostForm, EditPostForm, UserSearchForm, \ VotePollForm, ReportForm, VotePollForm, PollForm, PostStatus from djangobb_forum.models import Category, Forum, Topic, Post, Reputation, \ Report, Attachment, PostTracking +from djangobb_forum.tasks import update_topic_on_view from djangobb_forum.templatetags import forum_extras from djangobb_forum.templatetags.forum_extras import forum_moderated_by from djangobb_forum.util import build_form, paginate, set_language, smiles, convert_text_to_html, UnapprovedImageError, can_close_topic @@ -387,11 +388,10 @@ def show_topic(request, topic_id, full=True): topic = get_object_or_404(Topic.objects.select_related(), pk=topic_id) if not topic.forum.category.has_access(request.user): return HttpResponseForbidden() - Topic.objects.filter(pk=topic.id).update(views=F('views') + 1) last_post = topic.last_post - if request.user.is_authenticated(): - topic.update_read(request.user) + update_topic_on_view.delay(user_id=request.user.id, topic_id=topic.id, is_authenticated=user_is_authenticated) + # without specifying, following query wouldn't select related properly posts = topic.posts.select_related('user__userprofile', 'user__forum_profile',