Add atom and rss feed url attributes to content objects

This commit is contained in:
Bryan Brattlof 2019-01-10 16:41:10 -06:00
commit 14fb307fa7
No known key found for this signature in database
GPG key ID: 7DB190E909D5D8D9
6 changed files with 158 additions and 4 deletions

View file

@ -379,6 +379,8 @@ title Title of the article.
translations List of translations
:ref:`Article <object-article>` objects.
url URL to the article page.
lang_atom_feed_url URL to the language's ATOM feed
land_rss_feed_url URL to the language's RSS feed
====================== ===================================================
.. _PATH: settings.html#PATH
@ -399,6 +401,8 @@ page_name Author page name.
save_as Location to save the author page.
slug Page slug.
url URL to the author page.
atom_feed_url URL to the ATOM feed for the author.
rss_feed_url URL to the RSS feed for the author.
=================== ===================================================
.. [1] for Author object, coming from `:authors:` or `AUTHOR`.
@ -438,6 +442,8 @@ title Title of the page.
translations List of translations
:ref:`Article <object-article>` objects.
url URL to the page.
lang_atom_feed_url URL to the language's ATOM feed.
land_rss_feed_url URL to the language's RSS feed.
===================== ===================================================
.. _PATH: settings.html#PATH

View file

@ -93,6 +93,10 @@ class Content(object):
self.in_default_lang = (self.lang == default_lang)
# build feed urls
self._build_rss_feed_url()
self._build_atom_feed_url()
# create the slug if not existing, generate slug according to
# setting of SLUG_ATTRIBUTE
if not hasattr(self, 'slug'):
@ -149,6 +153,24 @@ class Content(object):
signals.content_object_init.send(self)
def _build_atom_feed_url(self):
atom_url = self.settings.get('TRANSLATION_FEED_ATOM', None)
if atom_url is None or getattr(self, 'lang', None) is None:
self.lang_atom_feed_url = None
else:
self.lang_atom_feed_url = atom_url.format(
lang=self.lang
)
def _build_rss_feed_url(self):
rss_url = self.settings.get('TRANSLATION_FEED_RSS', None)
if rss_url is None or getattr(self, 'lang', None) is None:
self.lang_rss_feed_url = None
else:
self.lang_rss_feed_url = rss_url.format(
lang=self.lang
)
def __str__(self):
return self.source_path or repr(self)

View file

@ -133,6 +133,52 @@ class TestPage(LoggedTestCase):
page = Page(**self.page_kwargs)
self.assertEqual(page.lang, 'fr')
def test_lang_feed_urls(self):
page_kwargs = self._copy_page_kwargs()
settings = get_settings()
if 'TRANSLATION_FEED_RSS' in settings:
del settings['TRANSLATION_FEED_RSS']
if 'TRANSLATION_FEED_ATOM' in settings:
del settings['TRANSLATION_FEED_ATOM']
page_kwargs['settings'] = settings
# if atom and rss translations settings are not set
# 'lang_rss_feed_url' and 'lang_atom_feed_url' should
# return None
page = Page(**page_kwargs)
self.assertIsNone(page.lang_atom_feed_url)
self.assertIsNone(page.lang_rss_feed_url)
settings['TRANSLATION_FEED_RSS'] = None
settings['TRANSLATION_FEED_ATOM'] = None
page_kwargs['settings'] = settings
# if atom and rss translations settings are None
# 'lang_rss_feed_url' and 'lang_atom_feed_url' should
# return None
page = Page(**page_kwargs)
self.assertIsNone(page.lang_atom_feed_url)
self.assertIsNone(page.lang_rss_feed_url)
rss_path = '/we/speak/{lang}.rss.xml'
atom_path = '/we/speak/{lang}.atom.xml'
settings['TRANSLATION_FEED_RSS'] = rss_path
settings['TRANSLATION_FEED_ATOM'] = atom_path
page_kwargs['settings'] = settings
# if the language for the page is set 'lang_rss_feed_url'
# and 'lang_atom_feed_url' should return the formated path
page = Page(**page_kwargs)
self.assertEqual(
page.lang_atom_feed_url,
atom_path.format(lang=DEFAULT_CONFIG['DEFAULT_LANG'])
)
self.assertEqual(
page.lang_rss_feed_url,
rss_path.format(lang=DEFAULT_CONFIG['DEFAULT_LANG'])
)
def test_save_as(self):
# If a lang is not the default lang, save_as should be set
# accordingly.

View file

@ -86,3 +86,61 @@ class TestURLWrapper(unittest.TestCase):
self.assertEqual(author1.slug, 'mr-senko')
self.assertEqual(author2.slug, 'atodorov')
self.assertEqual(author3.slug, 'krasimir')
def test_atom_feed_url(self):
settings = {
'URLWRAPPER_FEED_ATOM': None
}
wrapper = URLWrapper("A Smart Person", settings=settings)
# if '{}_FEED_ATOM' is None, then 'atom_feed_url' should
# also be None
self.assertIsNone(wrapper.atom_feed_url)
url = '/feed/{slug}.atom.xml'
settings['URLWRAPPER_FEED_ATOM'] = url
wrapper = URLWrapper("A Smart Person", settings=settings)
# if '{}_FEED_ATOM is set, then 'atom_feed_url' should
# return the url of the atom feed.
self.assertEqual(
wrapper.atom_feed_url,
url.format(slug='a smart person')
)
# if we update 'URLWrapper.slug', 'atom_feed_url'
# should also update.
wrapper.slug = 'not-a-smart-person'
self.assertEqual(
wrapper.atom_feed_url,
url.format(slug='not-a-smart-person')
)
def test_rss_feed_url(self):
settings = {
'URLWRAPPER_FEED_RSS': None
}
wrapper = URLWrapper("A Smart Person", settings=settings)
# if '{}_FEED_ATOM' is None, then 'atom_feed_url' should
# also be None
self.assertIsNone(wrapper.atom_feed_url)
url = '/feed/{slug}.rss.xml'
settings['URLWRAPPER_FEED_RSS'] = url
wrapper = URLWrapper("A Smart Person", settings=settings)
# if '{}_FEED_ATOM is set, then 'atom_feed_url' should
# return the url of the atom feed.
self.assertEqual(
wrapper.rss_feed_url,
url.format(slug='a smart person')
)
# if we update 'URLWrapper.slug', 'atom_feed_url'
# should also update.
wrapper.slug = 'not-a-smart-person'
self.assertEqual(
wrapper.rss_feed_url,
url.format(slug='not-a-smart-person')
)

View file

@ -17,17 +17,23 @@
<link href="{{ FEED_DOMAIN }}/{% if FEED_RSS_URL %}{{ FEED_RSS_URL }}{% else %}{{ FEED_RSS }}{% endif %}" type="application/rss+xml" rel="alternate" title="{{ SITENAME }} RSS Feed" />
{% endif %}
{% if CATEGORY_FEED_ATOM and category %}
<link href="{{ FEED_DOMAIN }}/{% if CATEGORY_FEED_ATOM_URL %}{{ CATEGORY_FEED_ATOM_URL|format(category.slug) }}{% else %}{{ CATEGORY_FEED_ATOM|format(category.slug) }}{% endif %}" type="application/atom+xml" rel="alternate" title="{{ SITENAME }} Categories Atom Feed" />
<link href="{{ FEED_DOMAIN }}/{{ category.atom_feed_url }}" type="application/atom+xml" rel="alternate" title="{{ SITENAME }} {{ category.name }} Category Atom Feed" />
{% endif %}
{% if CATEGORY_FEED_RSS and category %}
<link href="{{ FEED_DOMAIN }}/{% if CATEGORY_FEED_RSS_URL %}{{ CATEGORY_FEED_RSS_URL|format(category.slug) }}{% else %}{{ CATEGORY_FEED_RSS|format(category.slug) }}{% endif %}" type="application/rss+xml" rel="alternate" title="{{ SITENAME }} Categories RSS Feed" />
<link href="{{ FEED_DOMAIN }}/{{ category.rss_feed_url }}" type="application/rss+xml" rel="alternate" title="{{ SITENAME }} {{ category.name }} Category RSS Feed" />
{% endif %}
{% if TAG_FEED_ATOM and tag %}
<link href="{{ FEED_DOMAIN }}/{% if TAG_FEED_ATOM_URL %}{{ TAG_FEED_ATOM_URL|format(tag.slug) }}{% else %}{{ TAG_FEED_ATOM|format(tag.slug) }}{% endif %}" type="application/atom+xml" rel="alternate" title="{{ SITENAME }} Tags Atom Feed" />
<link href="{{ FEED_DOMAIN }}/{{ tag.atom_feed_url }}" type="application/atom+xml" rel="alternate" title="{{ SITENAME }} {{ tag.name }} Tag Atom Feed" />
{% endif %}
{% if TAG_FEED_RSS and tag %}
<link href="{{ FEED_DOMAIN }}/{% if TAG_FEED_RSS_URL %}{{ TAG_FEED_RSS_URL|format(tag.slug) }}{% else %}{{ TAG_FEED_RSS|format(tag.slug) }}{% endif %}" type="application/rss+xml" rel="alternate" title="{{ SITENAME }} Tags RSS Feed" />
<link href="{{ FEED_DOMAIN }}/{{ tag.rss_feed_url }}" type="application/rss+xml" rel="alternate" title="{{ SITENAME }} {{ tag.name }} Tags RSS Feed" />
{% endif %}
{% if TRANSLATION_FEED_ATOM and article %}
<link href="{{ FEED_DOMAIN }}/{{ article.lang_atom_feed_url }}" type="application/atom+xml" rel="alternate" title="{{ SITENAME }} {{ article.lang }} Translation Atom Feed" />
{% endif %}
{% if TRANSLATION_FEED_RSS and article %}
<link href="{{ FEED_DOMAIN }}/{{ article.lang_rss_feed_url }}" type="application/rss+xml" rel="alternate" title="{{ SITENAME }} {{ article.lang }} Translation RSS Feed" />
{% endif %}
{% endblock head %}
</head>

View file

@ -55,6 +55,22 @@ class URLWrapper(object):
self._slug_from_name = False
self._slug = slug
@property
def atom_feed_url(self):
feed_key = '{}_FEED_ATOM'.format(
self.__class__.__name__.upper())
feed_url = self.settings.get(feed_key, None)
if feed_url is not None:
return feed_url.format(slug=self.slug)
@property
def rss_feed_url(self):
feed_key = '{}_FEED_RSS'.format(
self.__class__.__name__.upper())
feed_url = self.settings.get(feed_key, None)
if feed_url is not None:
return feed_url.format(slug=self.slug)
def as_dict(self):
d = self.__dict__
d['name'] = self.name