From 921d06a8e01e2613abdd07ce4d1a88d4957fe0d1 Mon Sep 17 00:00:00 2001 From: Tom Willemsen Date: Thu, 22 Mar 2012 00:04:01 +0100 Subject: Add Category model Each feed can belong to multiple categories. A category is only a slug. --- aggregator/fixtures/initial_data.json | 35 +++++++++--- aggregator/migrations/0003_auto__add_category.py | 70 ++++++++++++++++++++++++ aggregator/models.py | 10 ++++ 3 files changed, 108 insertions(+), 7 deletions(-) create mode 100644 aggregator/migrations/0003_auto__add_category.py diff --git a/aggregator/fixtures/initial_data.json b/aggregator/fixtures/initial_data.json index 5926e9c..e91883d 100644 --- a/aggregator/fixtures/initial_data.json +++ b/aggregator/fixtures/initial_data.json @@ -1,4 +1,18 @@ [ + { + "model": "aggregator.Category", + "pk": 1, + "fields": { + "name": "misc" + } + }, + { + "model": "aggregator.Category", + "pk": 2, + "fields": { + "name": "code" + } + }, { "model": "aggregator.Feed", "pk": 1, @@ -7,7 +21,8 @@ "base_url": "http://www.advogato.org/", "feed_url": "person/ryuslash/rss.xml", "profile_url": "person/ryuslash", - "favicon_ext": "ico" + "favicon_ext": "ico", + "categories": [ 1 ] } }, { @@ -19,7 +34,8 @@ "feed_url": "public/ryuslash.atom", "profile_url": "public/ryuslash", "br2nl": true, - "with_markdown": true + "with_markdown": true, + "categories": [ 1 ] } }, { @@ -30,7 +46,8 @@ "base_url": "http://identi.ca/", "feed_url": "api/statuses/user_timeline/107950.rss", "profile_url": "ryuslash", - "favicon_ext": "ico" + "favicon_ext": "ico", + "categories": [ 1 ] } }, { @@ -40,7 +57,8 @@ "name": "Github", "base_url": "https://github.com/", "feed_url": "ryuslash.atom", - "profile_url": "ryuslash" + "profile_url": "ryuslash", + "categories": [ 2 ] } }, { @@ -50,7 +68,8 @@ "name": "Gitorious", "base_url": "https://gitorious.org/", "feed_url": "~ryuslash/feed.atom", - "profile_url": "~ryuslash" + "profile_url": "~ryuslash", + "categories": [ 2 ] } }, { @@ -60,7 +79,8 @@ "name": "Ikiwiki", "base_url": "http://ryuslash.org/wiki/", "feed_url": "index.rss", - "uses_title": true + "uses_title": true, + "categories": [ 1 ] } }, { @@ -72,7 +92,8 @@ "feed_url": "user/ryuslash/.rss", "profile_url": "usr/ryuslash/", "uses_title": true, - "favicon_ext": "ico" + "favicon_ext": "ico", + "categories": [ 1 ] } } ] diff --git a/aggregator/migrations/0003_auto__add_category.py b/aggregator/migrations/0003_auto__add_category.py new file mode 100644 index 0000000..9997320 --- /dev/null +++ b/aggregator/migrations/0003_auto__add_category.py @@ -0,0 +1,70 @@ +# 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 b5c4f3c..4936821 100644 --- a/aggregator/models.py +++ b/aggregator/models.py @@ -1,5 +1,11 @@ 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) @@ -11,6 +17,7 @@ class Feed(models.Model): 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 @@ -21,6 +28,9 @@ class Feed(models.Model): def get_favicon_url(self): return self.base_url + 'favicon.' + self.favicon_ext + def __unicode__(self): + return self.name + class Meta: ordering = [ '-updated' ] -- cgit v1.2.3-54-g00ecf