From cdaedc48e291e8b303f58cc798a4309c42794d05 Mon Sep 17 00:00:00 2001 From: Felipe Martin Date: Fri, 4 Apr 2014 12:08:47 +0200 Subject: [PATCH 1/5] Model save auto generate slug if needed --- shelfzilla/models.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/shelfzilla/models.py b/shelfzilla/models.py index 193e5cc..7b3cccf 100644 --- a/shelfzilla/models.py +++ b/shelfzilla/models.py @@ -1,5 +1,6 @@ from django.db import models from django.utils.translation import ugettext_lazy as _ +from django.template.defaultfilters import slugify class ReviewModel(models.Model): @@ -11,5 +12,12 @@ class ReviewModel(models.Model): if hasattr(self, 'name'): return self.name and self.name[0] or '' + def save(self, *args, **kwargs): + # If model have a name and slug attribute, save slug + # TODO set a model field to custom field name for slug creation + if not getattr(self, 'slug', None) and getattr(self, 'name', None): + self.slug = slugify(self.name) + return super(ReviewModel, self).save(*args, **kwargs) + class Meta: abstract = True From 6f2043acf0e06d92082e63892ac82eeb015065c0 Mon Sep 17 00:00:00 2001 From: Felipe Martin Date: Fri, 4 Apr 2014 15:00:23 +0200 Subject: [PATCH 2/5] Refactored some models: + shelfzilla.ReviewModel -> shelfzilla.Model + Added field shelfzilla.Model.hidden + Added manga.Person + Added fields original_publisher, art, story to manga.Series + Added fields retail_price, pages, release_date to manga.Volume --- ...ume_hidden__add_field_volume_retail_pri.py | 228 ++++++++++++++++++ ...ield_series_art__add_field_series_story.py | 176 ++++++++++++++ shelfzilla/apps/manga/models.py | 39 ++- shelfzilla/models.py | 6 +- 4 files changed, 441 insertions(+), 8 deletions(-) create mode 100644 shelfzilla/apps/manga/migrations/0014_auto__add_person__add_field_volume_hidden__add_field_volume_retail_pri.py create mode 100644 shelfzilla/apps/manga/migrations/0015_auto__add_field_series_art__add_field_series_story.py diff --git a/shelfzilla/apps/manga/migrations/0014_auto__add_person__add_field_volume_hidden__add_field_volume_retail_pri.py b/shelfzilla/apps/manga/migrations/0014_auto__add_person__add_field_volume_hidden__add_field_volume_retail_pri.py new file mode 100644 index 0000000..971fb6c --- /dev/null +++ b/shelfzilla/apps/manga/migrations/0014_auto__add_person__add_field_volume_hidden__add_field_volume_retail_pri.py @@ -0,0 +1,228 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as 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 'Person' + db.create_table(u'manga_person', ( + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('for_review', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('for_review_comment', self.gf('django.db.models.fields.TextField')(null=True, blank=True)), + ('hidden', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('name', self.gf('django.db.models.fields.CharField')(max_length=256)), + ('slug', self.gf('django.db.models.fields.SlugField')(max_length=50, null=True, blank=True)), + )) + db.send_create_signal(u'manga', ['Person']) + + # Adding field 'Volume.hidden' + db.add_column(u'manga_volume', 'hidden', + self.gf('django.db.models.fields.BooleanField')(default=False), + keep_default=False) + + # Adding field 'Volume.retail_price' + db.add_column(u'manga_volume', 'retail_price', + self.gf('django.db.models.fields.DecimalField')(null=True, max_digits=5, decimal_places=2), + keep_default=False) + + # Adding field 'Volume.pages' + db.add_column(u'manga_volume', 'pages', + self.gf('django.db.models.fields.IntegerField')(null=True), + keep_default=False) + + # Adding field 'Volume.release_date' + db.add_column(u'manga_volume', 'release_date', + self.gf('django.db.models.fields.DateField')(null=True), + keep_default=False) + + # Adding field 'Publisher.hidden' + db.add_column(u'manga_publisher', 'hidden', + self.gf('django.db.models.fields.BooleanField')(default=False), + keep_default=False) + + # Adding field 'Series.hidden' + db.add_column(u'manga_series', 'hidden', + self.gf('django.db.models.fields.BooleanField')(default=False), + keep_default=False) + + # Adding field 'Series.original_publisher' + db.add_column(u'manga_series', 'original_publisher', + self.gf('django.db.models.fields.related.ForeignKey')(related_name='original_series', null=True, to=orm['manga.Publisher']), + keep_default=False) + + + def backwards(self, orm): + # Deleting model 'Person' + db.delete_table(u'manga_person') + + # Deleting field 'Volume.hidden' + db.delete_column(u'manga_volume', 'hidden') + + # Deleting field 'Volume.retail_price' + db.delete_column(u'manga_volume', 'retail_price') + + # Deleting field 'Volume.pages' + db.delete_column(u'manga_volume', 'pages') + + # Deleting field 'Volume.release_date' + db.delete_column(u'manga_volume', 'release_date') + + # Deleting field 'Publisher.hidden' + db.delete_column(u'manga_publisher', 'hidden') + + # Deleting field 'Series.hidden' + db.delete_column(u'manga_series', 'hidden') + + # Deleting field 'Series.original_publisher' + db.delete_column(u'manga_series', 'original_publisher_id') + + + models = { + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '75'}) + }, + u'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + 'filer.file': { + 'Meta': {'object_name': 'File'}, + '_file_size': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'folder': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'all_files'", 'null': 'True', 'to': "orm['filer.Folder']"}), + 'has_all_mandatory_data': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}), + 'original_filename': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'owned_files'", 'null': 'True', 'to': u"orm['auth.User']"}), + 'polymorphic_ctype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'polymorphic_filer.file_set'", 'null': 'True', 'to': u"orm['contenttypes.ContentType']"}), + 'sha1': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '40', 'blank': 'True'}), + 'uploaded_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + 'filer.folder': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('parent', 'name'),)", 'object_name': 'Folder'}, + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'filer_owned_folders'", 'null': 'True', 'to': u"orm['auth.User']"}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['filer.Folder']"}), + 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'uploaded_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + 'filer.image': { + 'Meta': {'object_name': 'Image', '_ormbases': ['filer.File']}, + '_height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + '_width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'date_taken': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'default_alt_text': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'default_caption': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + u'file_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['filer.File']", 'unique': 'True', 'primary_key': 'True'}), + 'must_always_publish_author_credit': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'must_always_publish_copyright': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'subject_location': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '64', 'null': 'True', 'blank': 'True'}) + }, + u'manga.person': { + 'Meta': {'ordering': "['name']", 'object_name': 'Person'}, + 'for_review': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'for_review_comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'hidden': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '256'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}) + }, + u'manga.publisher': { + 'Meta': {'ordering': "['name']", 'object_name': 'Publisher'}, + 'for_review': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'for_review_comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'hidden': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '40'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}) + }, + u'manga.series': { + 'Meta': {'ordering': "['name']", 'object_name': 'Series'}, + 'cover': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['filer.Image']", 'null': 'True', 'blank': 'True'}), + 'finished': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'folder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['filer.Folder']", 'null': 'True', 'blank': 'True'}), + 'for_review': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'for_review_comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'hidden': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '256'}), + 'original_publisher': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'original_series'", 'null': 'True', 'to': u"orm['manga.Publisher']"}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}), + 'summary': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}) + }, + u'manga.userhavevolume': { + 'Meta': {'object_name': 'UserHaveVolume'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'have_volumes'", 'to': u"orm['auth.User']"}), + 'volume': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'owned_by'", 'to': u"orm['manga.Volume']"}) + }, + u'manga.userwishlistvolume': { + 'Meta': {'object_name': 'UserWishlistVolume'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'wishlisted_volumes'", 'to': u"orm['auth.User']"}), + 'volume': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'wishlisted_by'", 'to': u"orm['manga.Volume']"}) + }, + u'manga.volume': { + 'Meta': {'ordering': "['series__name', 'number']", 'object_name': 'Volume'}, + 'cover': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['filer.Image']", 'null': 'True', 'blank': 'True'}), + 'for_review': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'for_review_comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'hidden': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'isbn_10': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'isbn_13': ('django.db.models.fields.CharField', [], {'max_length': '13', 'null': 'True', 'blank': 'True'}), + 'number': ('django.db.models.fields.IntegerField', [], {}), + 'pages': ('django.db.models.fields.IntegerField', [], {'null': 'True'}), + 'publisher': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'volumes'", 'to': u"orm['manga.Publisher']"}), + 'release_date': ('django.db.models.fields.DateField', [], {'null': 'True'}), + 'retail_price': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '5', 'decimal_places': '2'}), + 'series': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'volumes'", 'to': u"orm['manga.Series']"}) + } + } + + complete_apps = ['manga'] \ No newline at end of file diff --git a/shelfzilla/apps/manga/migrations/0015_auto__add_field_series_art__add_field_series_story.py b/shelfzilla/apps/manga/migrations/0015_auto__add_field_series_art__add_field_series_story.py new file mode 100644 index 0000000..9f51711 --- /dev/null +++ b/shelfzilla/apps/manga/migrations/0015_auto__add_field_series_art__add_field_series_story.py @@ -0,0 +1,176 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding field 'Series.art' + db.add_column(u'manga_series', 'art', + self.gf('django.db.models.fields.related.ForeignKey')(related_name='artist_of', null=True, to=orm['manga.Person']), + keep_default=False) + + # Adding field 'Series.story' + db.add_column(u'manga_series', 'story', + self.gf('django.db.models.fields.related.ForeignKey')(related_name='scriptwriter_of', null=True, to=orm['manga.Person']), + keep_default=False) + + + def backwards(self, orm): + # Deleting field 'Series.art' + db.delete_column(u'manga_series', 'art_id') + + # Deleting field 'Series.story' + db.delete_column(u'manga_series', 'story_id') + + + models = { + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '75'}) + }, + u'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + 'filer.file': { + 'Meta': {'object_name': 'File'}, + '_file_size': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'folder': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'all_files'", 'null': 'True', 'to': "orm['filer.Folder']"}), + 'has_all_mandatory_data': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}), + 'original_filename': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'owned_files'", 'null': 'True', 'to': u"orm['auth.User']"}), + 'polymorphic_ctype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'polymorphic_filer.file_set'", 'null': 'True', 'to': u"orm['contenttypes.ContentType']"}), + 'sha1': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '40', 'blank': 'True'}), + 'uploaded_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + 'filer.folder': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('parent', 'name'),)", 'object_name': 'Folder'}, + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'filer_owned_folders'", 'null': 'True', 'to': u"orm['auth.User']"}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['filer.Folder']"}), + 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'uploaded_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + 'filer.image': { + 'Meta': {'object_name': 'Image', '_ormbases': ['filer.File']}, + '_height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + '_width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'date_taken': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'default_alt_text': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'default_caption': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + u'file_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['filer.File']", 'unique': 'True', 'primary_key': 'True'}), + 'must_always_publish_author_credit': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'must_always_publish_copyright': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'subject_location': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '64', 'null': 'True', 'blank': 'True'}) + }, + u'manga.person': { + 'Meta': {'ordering': "['name']", 'object_name': 'Person'}, + 'for_review': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'for_review_comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'hidden': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '256'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}) + }, + u'manga.publisher': { + 'Meta': {'ordering': "['name']", 'object_name': 'Publisher'}, + 'for_review': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'for_review_comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'hidden': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '40'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}) + }, + u'manga.series': { + 'Meta': {'ordering': "['name']", 'object_name': 'Series'}, + 'art': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'artist_of'", 'null': 'True', 'to': u"orm['manga.Person']"}), + 'cover': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['filer.Image']", 'null': 'True', 'blank': 'True'}), + 'finished': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'folder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['filer.Folder']", 'null': 'True', 'blank': 'True'}), + 'for_review': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'for_review_comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'hidden': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '256'}), + 'original_publisher': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'original_series'", 'null': 'True', 'to': u"orm['manga.Publisher']"}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}), + 'story': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'scriptwriter_of'", 'null': 'True', 'to': u"orm['manga.Person']"}), + 'summary': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}) + }, + u'manga.userhavevolume': { + 'Meta': {'object_name': 'UserHaveVolume'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'have_volumes'", 'to': u"orm['auth.User']"}), + 'volume': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'owned_by'", 'to': u"orm['manga.Volume']"}) + }, + u'manga.userwishlistvolume': { + 'Meta': {'object_name': 'UserWishlistVolume'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'wishlisted_volumes'", 'to': u"orm['auth.User']"}), + 'volume': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'wishlisted_by'", 'to': u"orm['manga.Volume']"}) + }, + u'manga.volume': { + 'Meta': {'ordering': "['series__name', 'number']", 'object_name': 'Volume'}, + 'cover': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['filer.Image']", 'null': 'True', 'blank': 'True'}), + 'for_review': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'for_review_comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'hidden': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'isbn_10': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'isbn_13': ('django.db.models.fields.CharField', [], {'max_length': '13', 'null': 'True', 'blank': 'True'}), + 'number': ('django.db.models.fields.IntegerField', [], {}), + 'pages': ('django.db.models.fields.IntegerField', [], {'null': 'True'}), + 'publisher': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'volumes'", 'to': u"orm['manga.Publisher']"}), + 'release_date': ('django.db.models.fields.DateField', [], {'null': 'True'}), + 'retail_price': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '5', 'decimal_places': '2'}), + 'series': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'volumes'", 'to': u"orm['manga.Series']"}) + } + } + + complete_apps = ['manga'] \ No newline at end of file diff --git a/shelfzilla/apps/manga/models.py b/shelfzilla/apps/manga/models.py index 9be637e..22fd5b6 100644 --- a/shelfzilla/apps/manga/models.py +++ b/shelfzilla/apps/manga/models.py @@ -5,10 +5,10 @@ from django.db.models.signals import post_save from filer.fields.image import FilerImageField from filer.models.foldermodels import Folder -from shelfzilla.models import ReviewModel +from shelfzilla.models import Model -class Publisher(ReviewModel): +class Publisher(Model): name = models.CharField(_('Name'), max_length=40) slug = models.SlugField(_('Slug'), blank=True, null=True) url = models.URLField(_('URL'), blank=True, null=True) @@ -39,13 +39,21 @@ class Publisher(ReviewModel): verbose_name_plural = _('Publishers') -class Series(ReviewModel): +class Series(Model): name = models.CharField(_('Name'), max_length=256) slug = models.SlugField(_('Slug'), blank=True, null=True) cover = FilerImageField(blank=True, null=True) summary = models.TextField(_('Summary'), blank=True, null=True) finished = models.BooleanField(_('Finished'), default=False) + original_publisher = models.ForeignKey( + Publisher, related_name='original_series', null=True) + + art = models.ForeignKey( + 'Person', related_name='artist_of', null=True) + story = models.ForeignKey( + 'Person', related_name='scriptwriter_of', null=True) + folder = models.ForeignKey(Folder, null=True, blank=True) # Cache @@ -73,7 +81,7 @@ class Series(ReviewModel): verbose_name_plural = _('Series') -class Volume(ReviewModel): +class Volume(Model): number = models.IntegerField(_('Number')) series = models.ForeignKey(Series, related_name="volumes") publisher = models.ForeignKey(Publisher, related_name="volumes") @@ -83,6 +91,11 @@ class Volume(ReviewModel): isbn_13 = models.CharField( _('ISBN-13'), max_length=13, blank=True, null=True) + retail_price = models.DecimalField( + _('Retail price'), max_digits=5, decimal_places=2, null=True) + pages = models.IntegerField(_('Pages'), null=True) + release_date = models.DateField(_('Release date'), null=True) + def __unicode__(self): return u'{} #{}'.format(self.series.name, self.number) @@ -92,6 +105,19 @@ class Volume(ReviewModel): verbose_name_plural = _('Volumes') +class Person(Model): + name = models.CharField(_('Name'), max_length=256) + slug = models.SlugField(_('Slug'), blank=True, null=True) + + class Meta: + ordering = ['name'] + verbose_name = _('Person') + verbose_name_plural = _('Persons') + + +# +# RELATIONS +# class UserHaveVolume(models.Model): user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='have_volumes') @@ -117,8 +143,9 @@ class UserWishlistVolume(models.Model): self.volume ) - -# Signals +# +# SIGNALS +# def series_check_filer(sender, instance, created, **kwargs): name = instance.name diff --git a/shelfzilla/models.py b/shelfzilla/models.py index 7b3cccf..89bd11d 100644 --- a/shelfzilla/models.py +++ b/shelfzilla/models.py @@ -3,11 +3,13 @@ from django.utils.translation import ugettext_lazy as _ from django.template.defaultfilters import slugify -class ReviewModel(models.Model): +class Model(models.Model): for_review = models.BooleanField(_('For review'), default=False) for_review_comment = models.TextField( _('Review comment'), null=True, blank=True) + hidden = models.BooleanField(_('Hidden'), default=False) + def first_letter(self): if hasattr(self, 'name'): return self.name and self.name[0] or '' @@ -17,7 +19,7 @@ class ReviewModel(models.Model): # TODO set a model field to custom field name for slug creation if not getattr(self, 'slug', None) and getattr(self, 'name', None): self.slug = slugify(self.name) - return super(ReviewModel, self).save(*args, **kwargs) + return super(Model, self).save(*args, **kwargs) class Meta: abstract = True From a12f419a47c50b818f350dadc0d7d4c5d22a2683 Mon Sep 17 00:00:00 2001 From: Felipe Martin Date: Fri, 4 Apr 2014 15:15:50 +0200 Subject: [PATCH 3/5] Fixed profile page --- shelfzilla/apps/users/views.py | 9 ++++++--- shelfzilla/themes/bootflat/templates/users/profile.html | 6 ++++-- .../themes/bootflat/templates/users/profile/summary.html | 2 ++ 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/shelfzilla/apps/users/views.py b/shelfzilla/apps/users/views.py index d5ec01d..99298e8 100644 --- a/shelfzilla/apps/users/views.py +++ b/shelfzilla/apps/users/views.py @@ -63,15 +63,18 @@ class LogoutView(View): class ProfileView(View): - template = 'users/profile/{}.html' + tempalte = 'users/profile.html' + template_section = 'users/profile/{}.html' def get(self, request, section='summary'): if request.user.is_authenticated(): data = { 'item': User.objects.get(pk=request.user.pk) } - - template = self.template.format(section) + if section != 'summary': + template = self.template_section.format(section) + else: + template = self.tempalte data = self.get_context_from_section(request, section, data) ctx = RequestContext(request, data) diff --git a/shelfzilla/themes/bootflat/templates/users/profile.html b/shelfzilla/themes/bootflat/templates/users/profile.html index 98fd7e3..702f343 100644 --- a/shelfzilla/themes/bootflat/templates/users/profile.html +++ b/shelfzilla/themes/bootflat/templates/users/profile.html @@ -23,7 +23,7 @@
- {% block profile_content %}{% endblock %} + {% block profile_content %} + {% include "users/profile/summary.html" %} + {% endblock %}
diff --git a/shelfzilla/themes/bootflat/templates/users/profile/summary.html b/shelfzilla/themes/bootflat/templates/users/profile/summary.html index f7bcbf9..4fc316b 100644 --- a/shelfzilla/themes/bootflat/templates/users/profile/summary.html +++ b/shelfzilla/themes/bootflat/templates/users/profile/summary.html @@ -1,7 +1,9 @@ +{% comment %} {% extends 'users/profile.html'|pjax:request %} {% load i18n %} {% block page_title %}{{ block.super }}{% endblock %} +{% endcomment %} {% block profile_content %}
From d62d7af295eee3391a6257bcb8621c75578361d4 Mon Sep 17 00:00:00 2001 From: Felipe Martin Date: Fri, 4 Apr 2014 15:48:08 +0200 Subject: [PATCH 4/5] New alphabetic listing --- shelfzilla/apps/manga/views/series.py | 27 +++++++++++++- .../bootflat/templates/manga/series/list.html | 37 +++++++++++++++---- 2 files changed, 55 insertions(+), 9 deletions(-) diff --git a/shelfzilla/apps/manga/views/series.py b/shelfzilla/apps/manga/views/series.py index c7fb541..c5234ea 100644 --- a/shelfzilla/apps/manga/views/series.py +++ b/shelfzilla/apps/manga/views/series.py @@ -1,5 +1,7 @@ +import string from django.template import RequestContext from django.shortcuts import render_to_response, get_object_or_404 +from django.utils.translation import ugettext as _ from shelfzilla.views import View from ..models import Series @@ -11,15 +13,36 @@ class SeriesView(View): class SeriesListView(SeriesView): template = 'manga/series/list.html' + filters = ['other', 'all'] def get(self, request): - items = Series.objects.all() + letters = list(string.ascii_uppercase) + letters.append(_('other')) + letters.append(_('all')) + current_letter = request.GET.get('letter', 'A') + + items = self.get_items(current_letter) + context = { - 'items': items + 'items': items, + 'letters': letters, + 'current_letter': current_letter } ctx = RequestContext(request, self.get_context(context)) return render_to_response(self.template, context_instance=ctx) + def get_items(self, letter): + result = Series.objects.all() + if len(letter) == 1: + result = Series.objects.filter(name__istartswith=letter) + elif letter == 'all': + result = Series.objects.all() + elif letter == 'other': + # result = Series.objects.filter(name__regex=r'') + result = [] + + return result + class SeriesDetailView(SeriesView): template = 'manga/series/detail.html' diff --git a/shelfzilla/themes/bootflat/templates/manga/series/list.html b/shelfzilla/themes/bootflat/templates/manga/series/list.html index 8f6f3eb..3c04d59 100644 --- a/shelfzilla/themes/bootflat/templates/manga/series/list.html +++ b/shelfzilla/themes/bootflat/templates/manga/series/list.html @@ -8,22 +8,22 @@
- {% for letter in letter_list %} + {% if current_letter != 'all' %}
-

{{ letter.grouper }}

+

{{ current_letter }}

    - {% for item in letter.list %} + {% for item in items %}
  • {% if item.slug %} {{ item.name }} @@ -31,10 +31,33 @@ {{ item.name }} {% endif %}
  • + {% empty %} +
  • {% trans "No results" %}
  • {% endfor %}
- {% endfor %} + {% else %} + {% for letter in letter_list %} +
+
+

{{ letter.grouper }}

+
+
    + {% for item in letter.list %} +
  • + {% if item.slug %} + {{ item.name }} + {% else %} + {{ item.name }} + {% endif %} +
  • + {% empty %} +
  • {% trans "No results" %}
  • + {% endfor %} +
+
+ {% endfor %} + {% endif %}
{% endblock %} From c934cb459ee2aff490d5c7f0520c3c55e8ebb996 Mon Sep 17 00:00:00 2001 From: Felipe Martin Date: Fri, 4 Apr 2014 17:40:59 +0200 Subject: [PATCH 5/5] Forgot django-reversion on settings file --- config/production/requirements.txt | 1 + config/requirements.txt | 1 + 2 files changed, 2 insertions(+) create mode 100644 config/production/requirements.txt diff --git a/config/production/requirements.txt b/config/production/requirements.txt new file mode 100644 index 0000000..3c8d7e7 --- /dev/null +++ b/config/production/requirements.txt @@ -0,0 +1 @@ +-r ../requirements.txt diff --git a/config/requirements.txt b/config/requirements.txt index a352d71..07e7d60 100644 --- a/config/requirements.txt +++ b/config/requirements.txt @@ -4,6 +4,7 @@ South==0.8.4 # Admin django-suit==0.2.6 +django-reversion==1.8.0 # Fixes longerusername==0.4