django-aggregator icon indicating copy to clipboard operation
django-aggregator copied to clipboard

A 'planet' app for your Django project. Powers http://django-fr.org/planete/

Django-aggregator

A planet app for your Django project. It crawls a set of feeds, aggregates them on a single page and re-publishes the entries with RSS and Atom feeds.

This app is based on Django's community aggregator_, updated to Django 1.2 and slightly improved.

.. _Django's community aggregator: http://www.djangoproject.com/community/

Installation

::

pip install -e git+git://github.com/brutasse/django-aggregator#egg=aggregator

Requirements:

  • Django >= 1.2
  • The universal feedparser

Configuration

Add aggregator to your INSTALLED_APPS & run syncdb.

Templates


Create a simple view that renders a template. Use the following template tags
to fetch & render the data:

* ``{% load aggregator_tags %}`` to load the template library

* ``{% get_feed_list as feed_list %}`` to fetch the feeds

* ``{% get_entries <num_latest> as entries_list %}`` to fetch the latest
  entries

And then, to display the list of indexed feeds::

    <h2>Indexed feeds</h2>
    <ul>
        {% for feed in feed_list %}
            <li>{{ feed.title }} (<a href="{{ feed.public_url }}">site</a>)</li>
        {% endfor %}
    </ul>

To render the latest entries::

    <h2>Latest entries</h2>
    {% for entry in entries_list %}
        <div class="entry">
            <h2>{{ entry.feed.title }}: {{ entry.title|safe }}</h2>
            <p>{{ entry.summary|safe }}</p>
            <p>
                Published: {{ entry.date|date }}.
                <a href="{{ entry.link }}">Read more</a>
            </p>
        </div>
    {% endfor %}

If you want to render only a preview of the entries, you can do::

    {{ entry.summary|safe|truncatewords_html:30 }}

Feeds
`````

To publish some feeds of the aggregated content, subclass the base ``Feed``
class::

    from aggregator.feeds import Feed

    class MyAwesomeFeed(Feed):
        title = 'Aggregated content on <topic>'
        link = 'http://example.com'
        description = 'A more detailed description'

You can have Atom feeds::

    from django.utils.feedgenerator import Atom1Feed

    class MyAwesomeAtomFeed(MyAwesomeFeed):
        feed_type = Atom1Feed
        subtitle = MyAwesomeFeed.description

And add them to your URLs::

    from myproject.feeds import MyAwesomeFeed, MyAwesomeAtomFeed

    urlpatterns = patterns('',
        # ...
        url(r'^path/to/feeds/rss/$', MyAwesomeFeed(), name='aggregator_rss'),
        url(r'^path/to/feeds/atom/$', MyAwesomeAtomFeed(), name='aggregator_atom'),
        # ...
    )

When you're done you can add your feeds' URLs in the ``<head>`` section of
your website.

Usage
-----

Adding some feeds

Go to the admin and add the different feeds' name, title & URLs.

Updating the feeds


There are two management commands:

* ``mark_defunct_feeds`` will fetch all the registered feeds and check if they
  return a 404 or 500 response. If so, they are marked as "defunct" and will
  be skipped at each update.

* ``update_feeds`` fetches all the non-defunct feeds and checks for new
  content.

Here is how you could configure cron to schedule these two tasks::

    PYTHONPATH=/path/to/project
    DJANGO_SETTINGS_MODULE=settings_module

    15,45 * * * * python /path/to/manage.py update_feeds
    0 */6 * * *   python /path/to/manage.py mark_defunct_feeds