Add natural keys to feed-plugins models (fixes #5600)

This commit is contained in:
Benjamin Dauvergne 2014-09-29 22:37:27 +02:00
parent 5d31d739bc
commit a9a8454ea7
1 changed files with 22 additions and 2 deletions

View File

@ -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')