3 from south.db import db
4 from south.v2 import SchemaMigration
5 from django.db import models
7 def get_ltag(book, orm):
8 ltag, created = orm.Tag.objects.get_or_create(slug='l-' + book.slug, category='book')
10 ltag.name = book.title
11 ltag.sort_key = ('l-' + book.slug)[:120]
16 class Migration(SchemaMigration):
18 def forwards(self, orm):
19 """ Add _tag_counter and make sure all books carry their ancestors' l-tags """
22 db.add_column('catalogue_book', '_tag_counter', self.gf('catalogue.fields.JSONField')(null=True))
23 db.add_column('catalogue_book', '_theme_counter', self.gf('catalogue.fields.JSONField')(null=True))
24 db.add_column('catalogue_book', 'epub_file', self.gf('django.db.models.fields.files.FileField')(default='', max_length=100, blank=True), keep_default=False)
26 def ltag_descendants(book, ltags=None):
30 orm.TagRelation(object_id=book.pk, tag=tag, content_type=book_ct).save()
32 ltag = get_ltag(book, orm)
33 for child in book.children.all():
34 ltag_descendants(child, ltags + [ltag])
38 book_ct = orm['contenttypes.contenttype'].objects.get(app_label='catalogue', model='book')
41 # remove all l-tags on books
42 orm.TagRelation.objects.filter(content_type=book_ct, tag__category='book').delete()
43 for book in orm.Book.objects.filter(parent=None):
44 ltag_descendants(book)
47 def backwards(self, orm):
48 """ Delete _tag_counter and make sure books carry own l-tag. """
51 db.delete_column('catalogue_book', '_tag_counter')
52 db.delete_column('catalogue_book', '_theme_counter')
53 db.delete_column('catalogue_book', 'epub_file')
57 book_ct = orm['contenttypes.contenttype'].objects.get(app_label='catalogue', model='book')
60 # remove all l-tags on books
61 orm.TagRelation.objects.filter(content_type=book_ct, tag__category='book').delete()
62 for book in orm.Book.objects.filter(parent=None):
63 orm.TagRelation(object_id=book.pk, tag=get_ltag(book, orm), content_type=book_ct).save()
68 'Meta': {'object_name': 'Group'},
69 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
70 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
71 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'blank': 'True'})
74 'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
75 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
76 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
77 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
78 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
81 'Meta': {'object_name': 'User'},
82 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
83 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
84 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
85 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'blank': 'True'}),
86 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
87 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
88 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
89 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
90 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
91 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
92 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
93 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'blank': 'True'}),
94 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
97 'Meta': {'object_name': 'Book'},
98 '_short_html': ('django.db.models.fields.TextField', [], {}),
99 '_short_html_de': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}),
100 '_short_html_en': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}),
101 '_short_html_es': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}),
102 '_short_html_fr': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}),
103 '_short_html_lt': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}),
104 '_short_html_pl': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}),
105 '_short_html_ru': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}),
106 '_short_html_uk': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}),
107 '_tag_counter': ('catalogue.fields.JSONField', [], {'null': 'True'}),
108 '_theme_counter': ('catalogue.fields.JSONField', [], {'null': 'True'}),
109 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
110 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
111 'epub_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}),
112 'extra_info': ('catalogue.fields.JSONField', [], {}),
113 'gazeta_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}),
114 'html_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}),
115 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
116 'mp3_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}),
117 'odt_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}),
118 'ogg_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}),
119 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['catalogue.Book']"}),
120 'parent_number': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
121 'pdf_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}),
122 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120', 'db_index': 'True'}),
123 'title': ('django.db.models.fields.CharField', [], {'max_length': '120'}),
124 'txt_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}),
125 'wiki_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}),
126 'xml_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'})
128 'catalogue.bookstub': {
129 'Meta': {'object_name': 'BookStub'},
130 'author': ('django.db.models.fields.CharField', [], {'max_length': '120'}),
131 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
132 'pd': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
133 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120', 'db_index': 'True'}),
134 'title': ('django.db.models.fields.CharField', [], {'max_length': '120'}),
135 'translator': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
136 'translator_death': ('django.db.models.fields.TextField', [], {'blank': 'True'})
138 'catalogue.fragment': {
139 'Meta': {'object_name': 'Fragment'},
140 '_short_html': ('django.db.models.fields.TextField', [], {}),
141 '_short_html_de': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}),
142 '_short_html_en': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}),
143 '_short_html_es': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}),
144 '_short_html_fr': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}),
145 '_short_html_lt': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}),
146 '_short_html_pl': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}),
147 '_short_html_ru': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}),
148 '_short_html_uk': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}),
149 'anchor': ('django.db.models.fields.CharField', [], {'max_length': '120'}),
150 'book': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'fragments'", 'to': "orm['catalogue.Book']"}),
151 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
152 'short_text': ('django.db.models.fields.TextField', [], {}),
153 'text': ('django.db.models.fields.TextField', [], {})
156 'Meta': {'object_name': 'Tag'},
157 'book_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
158 'category': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}),
159 'death': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
160 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
161 'gazeta_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}),
162 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
163 'main_page': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True', 'blank': 'True'}),
164 'name': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}),
165 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120', 'db_index': 'True'}),
166 'sort_key': ('django.db.models.fields.SlugField', [], {'max_length': '120', 'db_index': 'True'}),
167 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}),
168 'wiki_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'})
170 'catalogue.tagrelation': {
171 'Meta': {'unique_together': "(('tag', 'content_type', 'object_id'),)", 'object_name': 'TagRelation', 'db_table': "'catalogue_tag_relation'"},
172 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
173 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
174 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
175 'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'items'", 'to': "orm['catalogue.Tag']"})
177 'contenttypes.contenttype': {
178 'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
179 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
180 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
181 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
182 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
186 complete_apps = ['catalogue']