From a9a8454ea72735043dfa5f959a6d6d8c401130c1 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Mon, 29 Sep 2014 22:37:27 +0200 Subject: [PATCH] Add natural keys to feed-plugins models (fixes #5600) --- portail_citoyen2/apps/feed_plugin/models.py | 24 +++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/portail_citoyen2/apps/feed_plugin/models.py b/portail_citoyen2/apps/feed_plugin/models.py index c319688..8946f5f 100644 --- a/portail_citoyen2/apps/feed_plugin/models.py +++ b/portail_citoyen2/apps/feed_plugin/models.py @@ -7,6 +7,7 @@ from django.conf import settings from django.utils.translation import ugettext_lazy as _ from django.utils.html import strip_tags from django.core.cache import cache +from django.contrib.auth import get_user_model import feedparser @@ -16,12 +17,23 @@ from . import utils logger = logging.getLogger(__name__) -FEED_CACHE_TIMEOUT = 86400 # 1 week + +class FeedPreferenceManager(models.Manager): + def get_by_natural_key(self, user_nk, feed_nk): + User = get_user_model() + return self.get(user=User.objects.get_by_natural_key(*user_nk), + feed=Feed.objects.get_by_natural_key(*feed_nk)) + class FeedPreference(models.Model): user = models.ForeignKey(settings.AUTH_USER_MODEL) feed = models.ForeignKey('Feed') + objects = FeedPreferenceManager() + + def natural_key(self): + return (self.user.natural_key(), self.feed.natural_key()) + class Meta: verbose_name = _('user feed subscription') verbose_name_plural = _('user feed subscriptions') @@ -33,6 +45,10 @@ class ShowUserFeed(CMSPlugin): limit = models.PositiveIntegerField(default=10) timeout = models.PositiveIntegerField(default=60) +class FeedManager(models.Manager): + def get_by_natural_key(self, name, url): + return self.get(name=name, url=url) + class Feed(models.Model): name = models.CharField(max_length=32, verbose_name=_('name')) url = models.URLField() @@ -44,6 +60,8 @@ class Feed(models.Model): verbose_name=_('CSS classes'), blank=True) + objects = FeedManager() + def load(self, now=None, limit=9999): if now is None: now = datetime.datetime.utcnow() @@ -67,7 +85,7 @@ class Feed(models.Model): entries.append((date, title, entry.link)) entries.sort(reverse=True) entries = entries[:limit] - cache.set(key, (entries, now), FEED_CACHE_TIMEOUT) + cache.set(key, (entries, now), 24*3600) duration = datetime.datetime.utcnow()-now logger.debug('loaded RSS feed %r in %s seconds', self.url, duration.seconds) return entries @@ -83,6 +101,8 @@ class Feed(models.Model): utils.launch_in_thread(key, self.load, now, limit) return entries + def natural_key(self): + return (self.name, self.url) class Meta: verbose_name = _('feed')