aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Tom Willemsen2012-05-22 00:51:03 +0200
committerGravatar Tom Willemsen2012-05-22 00:51:03 +0200
commit6da8f546246c40b49b9e037c2415452e2c0b1632 (patch)
tree02358e0a1d6516cd81a03a5b763a34f74dca737b
parent8a1c3a615d9466399c252bd789e9bd5cfd5533fb (diff)
downloadryuslash.org-6da8f546246c40b49b9e037c2415452e2c0b1632.tar.gz
ryuslash.org-6da8f546246c40b49b9e037c2415452e2c0b1632.zip
Simpler feed settings
Now this might be a temporary change, but for now configuring feeds is kept out of the database and placed in the `settings.py'. I am thinking of adding a web-based interface though, which would also mean I place everything back in a database.
-rw-r--r--aggregator/fixtures/initial_data.json125
-rw-r--r--aggregator/management/commands/loadfeeds.py126
-rw-r--r--aggregator/migrations/0001_initial.py64
-rw-r--r--aggregator/migrations/0002_auto__chg_field_post_post_id.py49
-rw-r--r--aggregator/migrations/0003_auto__add_category.py70
-rw-r--r--aggregator/models.py45
-rw-r--r--aggregator/templates/aggregator/base.html6
-rw-r--r--aggregator/templates/aggregator/post_content.html21
-rw-r--r--aggregator/views.py11
-rw-r--r--local_settings.py.example6
-rw-r--r--static/images/logos/.gitignore2
11 files changed, 122 insertions, 403 deletions
diff --git a/aggregator/fixtures/initial_data.json b/aggregator/fixtures/initial_data.json
deleted file mode 100644
index 3195aaa..0000000
--- a/aggregator/fixtures/initial_data.json
+++ /dev/null
@@ -1,125 +0,0 @@
-[
- {
- "model": "aggregator.Category",
- "pk": 1,
- "fields": {
- "name": "posts"
- }
- },
- {
- "model": "aggregator.Category",
- "pk": 2,
- "fields": {
- "name": "activity"
- }
- },
- {
- "model": "aggregator.Feed",
- "pk": 1,
- "fields": {
- "name": "Advogato",
- "base_url": "http://www.advogato.org/",
- "feed_url": "person/ryuslash/rss.xml",
- "profile_url": "person/ryuslash",
- "favicon_ext": "ico",
- "categories": [ 1 ]
- }
- },
- {
- "model": "aggregator.Feed",
- "pk": 2,
- "fields": {
- "name": "Diasp*",
- "base_url": "http://diasp.org/",
- "feed_url": "public/ryuslash.atom",
- "profile_url": "public/ryuslash",
- "br2nl": true,
- "with_markdown": true,
- "categories": [ 1 ]
- }
- },
- {
- "model": "aggregator.Feed",
- "pk": 3,
- "fields": {
- "name": "Identi.ca",
- "base_url": "http://identi.ca/",
- "feed_url": "api/statuses/user_timeline/107950.rss",
- "profile_url": "ryuslash",
- "favicon_ext": "ico",
- "categories": [ 1 ]
- }
- },
- {
- "model": "aggregator.Feed",
- "pk": 4,
- "fields": {
- "name": "Github",
- "base_url": "https://github.com/",
- "feed_url": "ryuslash.atom",
- "profile_url": "ryuslash",
- "categories": [ 2 ]
- }
- },
- {
- "model": "aggregator.Feed",
- "pk": 5,
- "fields": {
- "name": "Gitorious",
- "base_url": "https://gitorious.org/",
- "feed_url": "~ryuslash/feed.atom",
- "profile_url": "~ryuslash",
- "categories": [ 2 ]
- }
- },
- {
- "model": "aggregator.Feed",
- "pk": 6,
- "fields": {
- "name": "Ikiwiki",
- "base_url": "http://ryuslash.org/wiki/",
- "feed_url": "index.rss",
- "uses_title": true,
- "categories": [ 1 ]
- }
- },
- {
- "model": "aggregator.Feed",
- "pk": 7,
- "fields": {
- "name": "Reddit",
- "base_url": "http://www.reddit.com/",
- "feed_url": "user/ryuslash/.rss",
- "profile_url": "usr/ryuslash/",
- "uses_title": true,
- "favicon_ext": "ico",
- "categories": [ 1 ]
- }
- },
- {
- "model": "aggregator.Feed",
- "pk": 8,
- "fields": {
- "name": "Wordpress",
- "base_url": "http://ryuslash.wordpress.com/",
- "feed_url": "feed/",
- "profile_url": "about/",
- "uses_title": true,
- "favicon_ext": "ico",
- "categories": [ 1 ]
- }
- },
- {
- "model": "aggregator.Feed",
- "pk": 9,
- "fields": {
- "name": "StackOverflow",
- "base_url": "http://stackoverflow.com/",
- "feed_url": "feeds/user/459915",
- "profile_url": "users/459915/ryuslash",
- "uses_title": true,
- "favicon_ext": "ico",
- "categories": [ 1 ]
- }
- }
-]
diff --git a/aggregator/management/commands/loadfeeds.py b/aggregator/management/commands/loadfeeds.py
index 2bee069..fa493c1 100644
--- a/aggregator/management/commands/loadfeeds.py
+++ b/aggregator/management/commands/loadfeeds.py
@@ -1,56 +1,98 @@
import feedparser
import datetime
import markdown
+import re
+import os
+import urllib2
from django.core.management.base import BaseCommand
-from aggregator.models import Feed, Post
+from aggregator.models import Post
+import settings
class Command(BaseCommand):
help = "Load data from saved feeds."
- def handle(self, *args, **kwargs):
- feeds = Feed.objects.all()
+ def prep_feedname(self, value):
+ value = re.sub('[^\w\s-]', '', value).strip().lower()
+ return re.sub('[-\s]+', '-', value)
+
+ def get_ext(self, options):
+ if 'favicon_ext' in options.keys():
+ return options['favicon_ext']
+ else:
+ return 'ico'
+
+ def get_logopath(self, feedname, options):
+ ext = self.get_ext(options)
+ filename = self.prep_feedname(feedname) + '.' + ext
+ basedir = os.path.dirname(os.path.abspath(settings.__file__))
+ return os.path.join(basedir, 'static/images/logos', filename)
+
+ def have_logo(self, feedname, options):
+ logopath = self.get_logopath(feedname, options)
+ return os.path.exists(logopath)
+
+ def save_logo(self, feedname, options):
+ ext = self.get_ext(options)
+ url = options['base_url'] + '/favicon.' + ext
- for feed in feeds:
- parsed = feedparser.parse(feed.get_feed_url())
+ try:
+ logo = urllib2.urlopen(url)
+ except:
+ return
- if 'title' in parsed.feed:
- feed.title = parsed.feed.title
+ save = open(self.get_logopath(feedname, options), 'w')
+
+ save.write(logo.read())
+ save.close()
+ logo.close()
+
+ def construct_feed_url(self, feed):
+ return feed['base_url'] + feed['feed_url']
+
+ def handle(self, *args, **kwargs):
+ for feedname, feedoptions in settings.FEEDS.iteritems():
+ parsed = \
+ feedparser.parse(self.construct_feed_url(feedoptions))
+ icon = self.prep_feedname(feedname) + '.' \
+ + self.get_ext(feedoptions)
+ newcount = 0
+
+ if not self.have_logo(feedname, feedoptions):
+ self.save_logo(feedname, feedoptions)
for entry in parsed.entries:
- if not Post.objects.filter(post_id=entry.id).exists():
- dt = entry.updated_parsed \
- or entry.published_parsed
-
- if dt:
- updated = datetime.datetime(
- dt.tm_year, dt.tm_mon, dt.tm_mday,
- dt.tm_hour, dt.tm_min, dt.tm_sec)
- else:
- updated = datetime.datetime.now()
-
- post = Post(post_id=entry.id,
- title=entry.title,
- remote_url=entry.link,
- updated=updated,
- feed=feed)
-
- if 'content' in entry.keys():
- content = entry.content[0]['value']
- else:
- content = entry.summary
-
- if feed.with_markdown:
- post.body = markdown.markdown(content)
- else:
- post.body = content
-
- post.save()
-
- if feed.post_set.count() > 0:
- last_updated = feed.post_set.order_by('-updated')[0]\
- .updated
- feed.updated = last_updated
-
- feed.save()
+ if Post.objects.filter(post_id=entry.id).exists():
+ continue
+
+ dt = entry.updated_parsed \
+ or entry.published_parsed
+
+ if dt:
+ updated = datetime.datetime(
+ dt.tm_year, dt.tm_mon, dt.tm_mday,
+ dt.tm_hour, dt.tm_min, dt.tm_sec)
+ else:
+ updated = datetime.datetime.now()
+
+ if 'content' in entry.keys():
+ content = entry.content[0]['value']
+ else:
+ content = entry.summary
+
+ if feedoptions['markdown']:
+ content = markdown.markdown(content)
+
+ post = Post(post_id=entry.id,
+ title=entry.title,
+ category=feedoptions['category'],
+ link=entry.link,
+ updated=updated,
+ icon=icon,
+ content=content)
+
+ post.save()
+ newcount += 1
+
+ print 'Grabbed %d new feeds from %s' % (newcount, feedname)
diff --git a/aggregator/migrations/0001_initial.py b/aggregator/migrations/0001_initial.py
index dc3336e..550a389 100644
--- a/aggregator/migrations/0001_initial.py
+++ b/aggregator/migrations/0001_initial.py
@@ -1,78 +1,40 @@
-# encoding: utf-8
+# -*- coding: utf-8 -*-
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
+
class Migration(SchemaMigration):
def forwards(self, orm):
-
- # Adding model 'Feed'
- db.create_table('aggregator_feed', (
- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
- ('name', self.gf('django.db.models.fields.CharField')(max_length=200)),
- ('base_url', self.gf('django.db.models.fields.URLField')(max_length=255)),
- ('feed_url', self.gf('django.db.models.fields.CharField')(max_length=255)),
- ('profile_url', self.gf('django.db.models.fields.CharField')(max_length=255)),
- ('favicon_ext', self.gf('django.db.models.fields.CharField')(default='png', max_length=4)),
- ('title', self.gf('django.db.models.fields.CharField')(max_length=500, blank=True)),
- ('updated', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)),
- ('uses_title', self.gf('django.db.models.fields.BooleanField')(default=False)),
- ('br2nl', self.gf('django.db.models.fields.BooleanField')(default=False)),
- ('with_markdown', self.gf('django.db.models.fields.BooleanField')(default=False)),
- ))
- db.send_create_signal('aggregator', ['Feed'])
-
# Adding model 'Post'
db.create_table('aggregator_post', (
- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
- ('post_id', self.gf('django.db.models.fields.CharField')(unique=True, max_length=255)),
+ ('post_id', self.gf('django.db.models.fields.CharField')(unique=True, max_length=255, primary_key=True)),
('title', self.gf('django.db.models.fields.CharField')(max_length=500)),
- ('body', self.gf('django.db.models.fields.TextField')()),
- ('remote_url', self.gf('django.db.models.fields.URLField')(max_length=255)),
+ ('category', self.gf('django.db.models.fields.CharField')(max_length=255)),
+ ('link', self.gf('django.db.models.fields.URLField')(max_length=255)),
('updated', self.gf('django.db.models.fields.DateTimeField')()),
- ('added', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
- ('feed', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['aggregator.Feed'])),
+ ('content', self.gf('django.db.models.fields.TextField')()),
+ ('icon', self.gf('django.db.models.fields.CharField')(max_length=255)),
))
db.send_create_signal('aggregator', ['Post'])
-
def backwards(self, orm):
-
- # Deleting model 'Feed'
- db.delete_table('aggregator_feed')
-
# Deleting model 'Post'
db.delete_table('aggregator_post')
-
models = {
- 'aggregator.feed': {
- 'Meta': {'ordering': "['-updated']", 'object_name': 'Feed'},
- 'base_url': ('django.db.models.fields.URLField', [], {'max_length': '255'}),
- 'br2nl': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
- 'favicon_ext': ('django.db.models.fields.CharField', [], {'default': "'png'", 'max_length': '4'}),
- 'feed_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
- 'profile_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'title': ('django.db.models.fields.CharField', [], {'max_length': '500', 'blank': 'True'}),
- 'updated': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
- 'uses_title': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
- 'with_markdown': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
- },
'aggregator.post': {
'Meta': {'ordering': "['-updated']", 'object_name': 'Post'},
- 'added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
- 'body': ('django.db.models.fields.TextField', [], {}),
- 'feed': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['aggregator.Feed']"}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'post_id': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '500'}),
- 'remote_url': ('django.db.models.fields.URLField', [], {'max_length': '255'}),
+ 'category': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'content': ('django.db.models.fields.TextField', [], {}),
+ 'icon': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'link': ('django.db.models.fields.URLField', [], {'max_length': '255'}),
+ 'post_id': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255', 'primary_key': 'True'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '500'}),
'updated': ('django.db.models.fields.DateTimeField', [], {})
}
}
- complete_apps = ['aggregator']
+ complete_apps = ['aggregator'] \ No newline at end of file
diff --git a/aggregator/migrations/0002_auto__chg_field_post_post_id.py b/aggregator/migrations/0002_auto__chg_field_post_post_id.py
deleted file mode 100644
index 906ed2d..0000000
--- a/aggregator/migrations/0002_auto__chg_field_post_post_id.py
+++ /dev/null
@@ -1,49 +0,0 @@
-# encoding: utf-8
-import datetime
-from south.db import db
-from south.v2 import SchemaMigration
-from django.db import models
-
-class Migration(SchemaMigration):
-
- def forwards(self, orm):
-
- # Changing field 'Post.post_id'
- db.alter_column('aggregator_post', 'post_id', self.gf('django.db.models.fields.CharField')(unique=True, max_length=255))
-
-
- def backwards(self, orm):
-
- # Changing field 'Post.post_id'
- db.alter_column('aggregator_post', 'post_id', self.gf('django.db.models.fields.CharField')(max_length=500, unique=True))
-
-
- models = {
- 'aggregator.feed': {
- 'Meta': {'ordering': "['-updated']", 'object_name': 'Feed'},
- 'base_url': ('django.db.models.fields.URLField', [], {'max_length': '255'}),
- 'br2nl': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
- 'favicon_ext': ('django.db.models.fields.CharField', [], {'default': "'png'", 'max_length': '4'}),
- 'feed_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
- 'profile_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'title': ('django.db.models.fields.CharField', [], {'max_length': '500', 'blank': 'True'}),
- 'updated': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
- 'uses_title': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
- 'with_markdown': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
- },
- 'aggregator.post': {
- 'Meta': {'ordering': "['-updated']", 'object_name': 'Post'},
- 'added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
- 'body': ('django.db.models.fields.TextField', [], {}),
- 'feed': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['aggregator.Feed']"}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'post_id': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
- 'remote_url': ('django.db.models.fields.URLField', [], {'max_length': '255'}),
- 'title': ('django.db.models.fields.CharField', [], {'max_length': '500'}),
- 'updated': ('django.db.models.fields.DateTimeField', [], {})
- }
- }
-
- complete_apps = ['aggregator']
diff --git a/aggregator/migrations/0003_auto__add_category.py b/aggregator/migrations/0003_auto__add_category.py
deleted file mode 100644
index 9997320..0000000
--- a/aggregator/migrations/0003_auto__add_category.py
+++ /dev/null
@@ -1,70 +0,0 @@
-# encoding: utf-8
-import datetime
-from south.db import db
-from south.v2 import SchemaMigration
-from django.db import models
-
-class Migration(SchemaMigration):
-
- def forwards(self, orm):
-
- # Adding model 'Category'
- db.create_table('aggregator_category', (
- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
- ('name', self.gf('django.db.models.fields.SlugField')(max_length=50, db_index=True)),
- ))
- db.send_create_signal('aggregator', ['Category'])
-
- # Adding M2M table for field categories on 'Feed'
- db.create_table('aggregator_feed_categories', (
- ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
- ('feed', models.ForeignKey(orm['aggregator.feed'], null=False)),
- ('category', models.ForeignKey(orm['aggregator.category'], null=False))
- ))
- db.create_unique('aggregator_feed_categories', ['feed_id', 'category_id'])
-
-
- def backwards(self, orm):
-
- # Deleting model 'Category'
- db.delete_table('aggregator_category')
-
- # Removing M2M table for field categories on 'Feed'
- db.delete_table('aggregator_feed_categories')
-
-
- models = {
- 'aggregator.category': {
- 'Meta': {'object_name': 'Category'},
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'name': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'})
- },
- 'aggregator.feed': {
- 'Meta': {'ordering': "['-updated']", 'object_name': 'Feed'},
- 'base_url': ('django.db.models.fields.URLField', [], {'max_length': '255'}),
- 'br2nl': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
- 'categories': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['aggregator.Category']", 'symmetrical': 'False'}),
- 'favicon_ext': ('django.db.models.fields.CharField', [], {'default': "'png'", 'max_length': '4'}),
- 'feed_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
- 'profile_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'title': ('django.db.models.fields.CharField', [], {'max_length': '500', 'blank': 'True'}),
- 'updated': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
- 'uses_title': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
- 'with_markdown': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
- },
- 'aggregator.post': {
- 'Meta': {'ordering': "['-updated']", 'object_name': 'Post'},
- 'added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
- 'body': ('django.db.models.fields.TextField', [], {}),
- 'feed': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['aggregator.Feed']"}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'post_id': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
- 'remote_url': ('django.db.models.fields.URLField', [], {'max_length': '255'}),
- 'title': ('django.db.models.fields.CharField', [], {'max_length': '500'}),
- 'updated': ('django.db.models.fields.DateTimeField', [], {})
- }
- }
-
- complete_apps = ['aggregator']
diff --git a/aggregator/models.py b/aggregator/models.py
index 4936821..34fb5a3 100644
--- a/aggregator/models.py
+++ b/aggregator/models.py
@@ -1,47 +1,14 @@
from django.db import models
-class Category(models.Model):
- name = models.SlugField()
-
- def __unicode__(self):
- return self.name.capitalize()
-
-class Feed(models.Model):
- name = models.CharField(max_length=200)
- base_url = models.URLField(max_length=255)
- feed_url = models.CharField(max_length=255)
- profile_url = models.CharField(max_length=255)
- favicon_ext = models.CharField(max_length=4, default="png")
- title = models.CharField(max_length=500, blank=True)
- updated = models.DateTimeField(null=True, blank=True)
- uses_title = models.BooleanField(default=False)
- br2nl = models.BooleanField(default=False)
- with_markdown = models.BooleanField(default=False)
- categories = models.ManyToManyField(Category)
-
- def get_profile_url(self):
- return self.base_url + self.profile_url
-
- def get_feed_url(self):
- return self.base_url + self.feed_url
-
- def get_favicon_url(self):
- return self.base_url + 'favicon.' + self.favicon_ext
-
- def __unicode__(self):
- return self.name
-
- class Meta:
- ordering = [ '-updated' ]
-
class Post(models.Model):
- post_id = models.CharField(max_length=255, unique=True)
+ post_id = models.CharField(max_length=255, unique=True,
+ primary_key=True)
title = models.CharField(max_length=500)
- body = models.TextField()
- remote_url = models.URLField(max_length=255)
+ category = models.CharField(max_length=255)
+ link = models.URLField(max_length=255)
updated = models.DateTimeField()
- added = models.DateTimeField(auto_now_add=True)
- feed = models.ForeignKey(Feed)
+ content = models.TextField()
+ icon = models.CharField(max_length=255)
class Meta:
ordering = [ '-updated' ]
diff --git a/aggregator/templates/aggregator/base.html b/aggregator/templates/aggregator/base.html
index 8f752bd..4a24135 100644
--- a/aggregator/templates/aggregator/base.html
+++ b/aggregator/templates/aggregator/base.html
@@ -19,10 +19,8 @@
</h1>
<h2 id="sitesubtitle">
Will this ever really be my website?
- {% for category in categories %}
- <a class="category"
- href="/{{ category.name|slugify }}/">{{ category.name }}</a>
- {% endfor %}
+ <a class="category" href="/activity/">Activities</a>
+ <a class="category" href="/post/">Posts</a>
</h2>
</hgroup>
</header>
diff --git a/aggregator/templates/aggregator/post_content.html b/aggregator/templates/aggregator/post_content.html
index e47de93..dc04741 100644
--- a/aggregator/templates/aggregator/post_content.html
+++ b/aggregator/templates/aggregator/post_content.html
@@ -1,34 +1,23 @@
-<article class="post {{ post.feed.name|slugify }}">
+<article class="post">
<header>
<hgroup>
<h1>
<a href="/post/{{ post.pk }}/">
- <img src="{{ post.feed.get_favicon_url }}" />
+ <img src="/static/images/logos/{{ post.icon }}" />
</a>
<a href="/post/{{ post.pk }}/">
- {% if post.feed.uses_title %}
- {{ post.title }}
- {% else %}
- {{ post.updated }}
- {% endif %}
+ {{ post.title }}
</a>
</h1>
<h2 class="postsubtitle">
- Via
- <a href="{{ post.feed.base_url }}">{{ post.feed.name }}</a>
- (<a href="{{ post.feed.get_profile_url }}">profile</a>,
- <a href="{{ post.remote_url }}">origin</a>)
+ (<a href="{{ post.link }}">origin</a>)
</h2>
</hgroup>
</header>
<div class="postcontent">
{% autoescape off %}
- {% if post.feed.br2nl %}
- {{ post.body|linebreaks }}
- {% else %}
- {{ post.body }}
- {% endif %}
+ {{ post.content }}
{% endautoescape %}
</div>
</article>
diff --git a/aggregator/views.py b/aggregator/views.py
index aaea0f9..510df48 100644
--- a/aggregator/views.py
+++ b/aggregator/views.py
@@ -3,12 +3,11 @@ from django.http import Http404
from django.shortcuts import render
from django.views.generic.base import TemplateView
-from .models import Post, Feed, Category
+from .models import Post
def posts(request, cat, page=1):
- category = cat or 'posts'
- queryset = Post.objects.filter(feed__categories__name=category)
- feeds = Feed.objects.filter(categories__name=category)
+ category = cat or 'post'
+ queryset = Post.objects.filter(category=category)
paginator = Paginator(queryset, 20)
if page == None:
@@ -21,6 +20,4 @@ def posts(request, cat, page=1):
return render(request, 'aggregator/posts.html',
{ 'list': object_list,
- 'feeds': feeds,
- 'category': category,
- 'categories': Category.objects.order_by('name') })
+ 'category': category })
diff --git a/local_settings.py.example b/local_settings.py.example
index 91997d9..9247eba 100644
--- a/local_settings.py.example
+++ b/local_settings.py.example
@@ -34,3 +34,9 @@ TIME_ZONE = 'Europe/Brussels'
# Make this unique, and don't share it with anybody.
SECRET_KEY = ''
+
+FEEDS = {'Diaspora*':
+ { 'base_url': 'http://diasp.org/',
+ 'feed_url': 'public/someuser.atom',
+ 'markdown': True,
+ 'category': 'post' }}
diff --git a/static/images/logos/.gitignore b/static/images/logos/.gitignore
new file mode 100644
index 0000000..d6b7ef3
--- /dev/null
+++ b/static/images/logos/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore