Add natural keys to feed-plugins models (fixes #5600)
This commit is contained in:
parent
5d31d739bc
commit
a9a8454ea7
|
@ -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')
|
||||
|
|
Reference in New Issue