7b2f2c5172aa604f68259274af83cf89ccc9a36e
[wolnelektury.git] / apps / catalogue / migrations / 0006_epub_tag_counters_and_ltags_descendants.py
1 # encoding: utf-8
2 import datetime
3 from south.db import db
4 from south.v2 import SchemaMigration
5 from django.db import models
6
7 def get_ltag(book, orm):
8     ltag, created = orm.Tag.objects.get_or_create(slug='l-' + book.slug, category='book')
9     if created:
10         ltag.name = book.title
11         ltag.sort_key = ('l-' + book.slug)[:120]
12         ltag.save()
13     return ltag
14
15
16 class Migration(SchemaMigration):
17     
18     def forwards(self, orm):
19         """ Add _tag_counter and make sure all books carry their ancestors' l-tags """
20
21         # Adding fields
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)
25
26         def ltag_descendants(book, ltags=None):
27             if ltags is None:
28                 ltags = []
29             for tag in ltags:
30                 orm.TagRelation(object_id=book.pk, tag=tag, content_type=book_ct).save()
31                 print book, tag
32             ltag = get_ltag(book, orm)
33             for child in book.children.all():
34                 ltag_descendants(child, ltags + [ltag])
35         
36         if not db.dry_run:
37             try:
38                 book_ct = orm['contenttypes.contenttype'].objects.get(app_label='catalogue', model='book')
39             except:
40                 return
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)
45     
46     
47     def backwards(self, orm):
48         """ Delete _tag_counter and make sure books carry own l-tag. """
49
50         # Deleting fields
51         db.delete_column('catalogue_book', '_tag_counter')
52         db.delete_column('catalogue_book', '_theme_counter')
53         db.delete_column('catalogue_book', 'epub_file')
54
55         if not db.dry_run:
56             try:
57                 book_ct = orm['contenttypes.contenttype'].objects.get(app_label='catalogue', model='book')
58             except:
59                 return
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()
64     
65     
66     models = {
67         'auth.group': {
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'})
72         },
73         'auth.permission': {
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'})
79         },
80         'auth.user': {
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'})
95         },
96         'catalogue.book': {
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'})
127         },
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'})
137         },
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', [], {})
154         },
155         'catalogue.tag': {
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'})
169         },
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']"})
176         },
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'})
183         }
184     }
185     
186     complete_apps = ['catalogue']