diff --git a/boards/models.py b/boards/models.py --- a/boards/models.py +++ b/boards/models.py @@ -2,12 +2,14 @@ import os from random import random import time import math +from django.core.cache import cache from django.db import models from django.db.models import Count from django.http import Http404 from django.utils import timezone from markupfield.fields import MarkupField +from boards import settings as board_settings from neboard import settings import thumbs @@ -350,9 +352,17 @@ class User(models.Model): return RANK_MODERATOR >= self.rank def get_sorted_fav_tags(self): + cache_key = self._get_tag_cache_key() + fav_tags = cache.get(cache_key) + if fav_tags: + return fav_tags + tags = self.fav_tags.annotate(Count('threads'))\ .filter(threads__count__gt=0).order_by('name') + if tags: + cache.set(cache_key, tags, board_settings.CACHE_TIMEOUT) + return tags def get_post_count(self): @@ -366,6 +376,17 @@ class User(models.Model): if posts.count() > 0: return posts.latest('pub_time').pub_time + def add_tag(self, tag): + self.fav_tags.add(tag) + cache.delete(self._get_tag_cache_key()) + + def remove_tag(self, tag): + self.fav_tags.remove(tag) + cache.delete(self._get_tag_cache_key()) + + def _get_tag_cache_key(self): + return self.user_id + '_tags' + class Setting(models.Model): diff --git a/boards/settings.py b/boards/settings.py new file mode 100644 --- /dev/null +++ b/boards/settings.py @@ -0,0 +1,1 @@ +CACHE_TIMEOUT = 600 # Timeout for caching, if cache is used \ No newline at end of file diff --git a/boards/views.py b/boards/views.py --- a/boards/views.py +++ b/boards/views.py @@ -338,7 +338,7 @@ def tag_subscribe(request, tag_name): tag = get_object_or_404(Tag, name=tag_name) if not tag in user.fav_tags.all(): - user.fav_tags.add(tag) + user.add_tag(tag) return _redirect_to_next(request) @@ -350,7 +350,7 @@ def tag_unsubscribe(request, tag_name): tag = get_object_or_404(Tag, name=tag_name) if tag in user.fav_tags.all(): - user.fav_tags.remove(tag) + user.remove_tag(tag) return _redirect_to_next(request)