Commit 31cc7895f25060e7f57419fbfc810fd770c85682

Authored by Sergio Oliveira
1 parent 8824c5e4

Moving away from south

src/accounts/migrations/0001_initial.py
1 # -*- coding: utf-8 -*- 1 # -*- coding: 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 -  
8 -class Migration(SchemaMigration):  
9 -  
10 - def forwards(self, orm):  
11 - # Adding model 'User'  
12 - db.create_table(u'accounts_user', (  
13 - (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),  
14 - ('password', self.gf('django.db.models.fields.CharField')(max_length=128)),  
15 - ('last_login', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)),  
16 - ('is_superuser', self.gf('django.db.models.fields.BooleanField')(default=False)),  
17 - ('username', self.gf('django.db.models.fields.CharField')(unique=True, max_length=30)),  
18 - ('first_name', self.gf('django.db.models.fields.CharField')(max_length=30, blank=True)),  
19 - ('last_name', self.gf('django.db.models.fields.CharField')(max_length=30, blank=True)),  
20 - ('email', self.gf('django.db.models.fields.EmailField')(unique=True, max_length=75, blank=True)),  
21 - ('is_staff', self.gf('django.db.models.fields.BooleanField')(default=False)),  
22 - ('is_active', self.gf('django.db.models.fields.BooleanField')(default=True)),  
23 - ('date_joined', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)),  
24 - ('institution', self.gf('django.db.models.fields.CharField')(max_length=128, null=True, blank=True)),  
25 - ('role', self.gf('django.db.models.fields.CharField')(max_length=128, null=True, blank=True)),  
26 - ('twitter', self.gf('django.db.models.fields.CharField')(max_length=128, null=True, blank=True)),  
27 - ('facebook', self.gf('django.db.models.fields.CharField')(max_length=128, null=True, blank=True)),  
28 - ('google_talk', self.gf('django.db.models.fields.EmailField')(max_length=75, null=True, blank=True)),  
29 - ('github', self.gf('django.db.models.fields.CharField')(max_length=128, null=True, blank=True)),  
30 - ('webpage', self.gf('django.db.models.fields.CharField')(max_length=256, null=True, blank=True)),  
31 - ('verification_hash', self.gf('django.db.models.fields.CharField')(max_length=32, null=True, blank=True)),  
32 - ('modified', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),  
33 - ('bio', self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True)),  
34 - ))  
35 - db.send_create_signal(u'accounts', ['User'])  
36 -  
37 - # Adding M2M table for field groups on 'User'  
38 - m2m_table_name = db.shorten_name(u'accounts_user_groups')  
39 - db.create_table(m2m_table_name, (  
40 - ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),  
41 - ('user', models.ForeignKey(orm[u'accounts.user'], null=False)),  
42 - ('group', models.ForeignKey(orm[u'auth.group'], null=False))  
43 - ))  
44 - db.create_unique(m2m_table_name, ['user_id', 'group_id'])  
45 -  
46 - # Adding M2M table for field user_permissions on 'User'  
47 - m2m_table_name = db.shorten_name(u'accounts_user_user_permissions')  
48 - db.create_table(m2m_table_name, (  
49 - ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),  
50 - ('user', models.ForeignKey(orm[u'accounts.user'], null=False)),  
51 - ('permission', models.ForeignKey(orm[u'auth.permission'], null=False))  
52 - ))  
53 - db.create_unique(m2m_table_name, ['user_id', 'permission_id'])  
54 -  
55 -  
56 - def backwards(self, orm):  
57 - # Deleting model 'User'  
58 - db.delete_table(u'accounts_user')  
59 -  
60 - # Removing M2M table for field groups on 'User'  
61 - db.delete_table(db.shorten_name(u'accounts_user_groups'))  
62 -  
63 - # Removing M2M table for field user_permissions on 'User'  
64 - db.delete_table(db.shorten_name(u'accounts_user_user_permissions'))  
65 -  
66 -  
67 - models = {  
68 - u'accounts.user': {  
69 - 'Meta': {'object_name': 'User'},  
70 - 'bio': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),  
71 - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),  
72 - 'email': ('django.db.models.fields.EmailField', [], {'unique': 'True', 'max_length': '75', 'blank': 'True'}),  
73 - 'facebook': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}),  
74 - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),  
75 - 'github': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}),  
76 - 'google_talk': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),  
77 - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}),  
78 - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),  
79 - 'institution': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}),  
80 - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),  
81 - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),  
82 - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),  
83 - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),  
84 - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),  
85 - 'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),  
86 - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),  
87 - 'role': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}),  
88 - 'twitter': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}),  
89 - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}),  
90 - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}),  
91 - 'verification_hash': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),  
92 - 'webpage': ('django.db.models.fields.CharField', [], {'max_length': '256', 'null': 'True', 'blank': 'True'})  
93 - },  
94 - u'auth.group': {  
95 - 'Meta': {'object_name': 'Group'},  
96 - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),  
97 - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),  
98 - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})  
99 - },  
100 - u'auth.permission': {  
101 - 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},  
102 - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),  
103 - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),  
104 - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),  
105 - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})  
106 - },  
107 - u'contenttypes.contenttype': {  
108 - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},  
109 - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),  
110 - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),  
111 - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),  
112 - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})  
113 - }  
114 - }  
115 -  
116 - complete_apps = ['accounts']  
117 \ No newline at end of file 2 \ No newline at end of file
  3 +from __future__ import unicode_literals
  4 +
  5 +from django.db import models, migrations
  6 +import django.utils.timezone
  7 +import django.core.validators
  8 +
  9 +
  10 +class Migration(migrations.Migration):
  11 +
  12 + dependencies = [
  13 + ('auth', '0001_initial'),
  14 + ]
  15 +
  16 + operations = [
  17 + migrations.CreateModel(
  18 + name='User',
  19 + fields=[
  20 + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
  21 + ('password', models.CharField(max_length=128, verbose_name='password')),
  22 + ('last_login', models.DateTimeField(default=django.utils.timezone.now, verbose_name='last login')),
  23 + ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
  24 + ('username', models.CharField(help_text='Required. 30 characters or fewer. Letters, digits and ./+/-/_ only.', unique=True, max_length=30, verbose_name='username', validators=[django.core.validators.RegexValidator('^[\\w.@+-]+$', 'Enter a valid username.', 'invalid')])),
  25 + ('first_name', models.CharField(max_length=30, verbose_name='first name', blank=True)),
  26 + ('last_name', models.CharField(max_length=30, verbose_name='last name', blank=True)),
  27 + ('email', models.EmailField(unique=True, max_length=75, verbose_name='email address', blank=True)),
  28 + ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')),
  29 + ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
  30 + ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
  31 + ('institution', models.CharField(max_length=128, null=True, blank=True)),
  32 + ('role', models.CharField(max_length=128, null=True, blank=True)),
  33 + ('twitter', models.CharField(max_length=128, null=True, blank=True)),
  34 + ('facebook', models.CharField(max_length=128, null=True, blank=True)),
  35 + ('google_talk', models.EmailField(max_length=75, null=True, blank=True)),
  36 + ('github', models.CharField(max_length=128, null=True, verbose_name='github', blank=True)),
  37 + ('webpage', models.CharField(max_length=256, null=True, blank=True)),
  38 + ('verification_hash', models.CharField(max_length=32, null=True, blank=True)),
  39 + ('modified', models.DateTimeField(auto_now=True)),
  40 + ('bio', models.CharField(max_length=200, null=True, blank=True)),
  41 + ('groups', models.ManyToManyField(related_query_name='user', related_name='user_set', to='auth.Group', blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of his/her group.', verbose_name='groups')),
  42 + ('user_permissions', models.ManyToManyField(related_query_name='user', related_name='user_set', to='auth.Permission', blank=True, help_text='Specific permissions for this user.', verbose_name='user permissions')),
  43 + ],
  44 + options={
  45 + 'abstract': False,
  46 + 'verbose_name': 'user',
  47 + 'verbose_name_plural': 'users',
  48 + },
  49 + bases=(models.Model,),
  50 + ),
  51 + ]
src/badger/migrations/0001_initial.py
@@ -1,132 +0,0 @@ @@ -1,132 +0,0 @@
1 -# -*- coding: 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 -  
8 -class Migration(SchemaMigration):  
9 -  
10 - def forwards(self, orm):  
11 - # Adding model 'Badge'  
12 - db.create_table(u'badger_badge', (  
13 - (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),  
14 - ('title', self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True)),  
15 - ('description', self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True)),  
16 - ('image_base64', self.gf('django.db.models.fields.TextField')()),  
17 - ('type', self.gf('django.db.models.fields.CharField')(max_length=200)),  
18 - ('user_attr', self.gf('django.db.models.fields.CharField')(max_length=100, null=True, blank=True)),  
19 - ('comparison', self.gf('django.db.models.fields.CharField')(max_length=10, null=True, blank=True)),  
20 - ('value', self.gf('django.db.models.fields.PositiveSmallIntegerField')(null=True, blank=True)),  
21 - ('order', self.gf('django.db.models.fields.PositiveSmallIntegerField')(default=100)),  
22 - ))  
23 - db.send_create_signal(u'badger', ['Badge'])  
24 -  
25 - # Adding M2M table for field awardees on 'Badge'  
26 - m2m_table_name = db.shorten_name(u'badger_badge_awardees')  
27 - db.create_table(m2m_table_name, (  
28 - ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),  
29 - ('badge', models.ForeignKey(orm[u'badger.badge'], null=False)),  
30 - ('user', models.ForeignKey(orm[u'accounts.user'], null=False))  
31 - ))  
32 - db.create_unique(m2m_table_name, ['badge_id', 'user_id'])  
33 -  
34 - # Adding model 'BadgeI18N'  
35 - db.create_table(u'badger_badgei18n', (  
36 - (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),  
37 - ('i18n_language', self.gf('django.db.models.fields.CharField')(max_length=10)),  
38 - ('title', self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True)),  
39 - ('description', self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True)),  
40 - ('i18n_source', self.gf('django.db.models.fields.related.ForeignKey')(related_name='translations', to=orm['badger.Badge'])),  
41 - ))  
42 - db.send_create_signal(u'badger', ['BadgeI18N'])  
43 -  
44 - # Adding unique constraint on 'BadgeI18N', fields ['i18n_source', 'i18n_language']  
45 - db.create_unique(u'badger_badgei18n', ['i18n_source_id', 'i18n_language'])  
46 -  
47 -  
48 - def backwards(self, orm):  
49 - # Removing unique constraint on 'BadgeI18N', fields ['i18n_source', 'i18n_language']  
50 - db.delete_unique(u'badger_badgei18n', ['i18n_source_id', 'i18n_language'])  
51 -  
52 - # Deleting model 'Badge'  
53 - db.delete_table(u'badger_badge')  
54 -  
55 - # Removing M2M table for field awardees on 'Badge'  
56 - db.delete_table(db.shorten_name(u'badger_badge_awardees'))  
57 -  
58 - # Deleting model 'BadgeI18N'  
59 - db.delete_table(u'badger_badgei18n')  
60 -  
61 -  
62 - models = {  
63 - u'accounts.user': {  
64 - 'Meta': {'object_name': 'User'},  
65 - 'bio': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),  
66 - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),  
67 - 'email': ('django.db.models.fields.EmailField', [], {'unique': 'True', 'max_length': '75', 'blank': 'True'}),  
68 - 'facebook': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}),  
69 - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),  
70 - 'github': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}),  
71 - 'google_talk': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),  
72 - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}),  
73 - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),  
74 - 'institution': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}),  
75 - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),  
76 - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),  
77 - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),  
78 - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),  
79 - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),  
80 - 'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),  
81 - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),  
82 - 'role': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}),  
83 - 'twitter': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}),  
84 - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}),  
85 - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}),  
86 - 'verification_hash': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),  
87 - 'webpage': ('django.db.models.fields.CharField', [], {'max_length': '256', 'null': 'True', 'blank': 'True'})  
88 - },  
89 - u'auth.group': {  
90 - 'Meta': {'object_name': 'Group'},  
91 - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),  
92 - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),  
93 - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})  
94 - },  
95 - u'auth.permission': {  
96 - 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},  
97 - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),  
98 - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),  
99 - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),  
100 - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})  
101 - },  
102 - u'badger.badge': {  
103 - 'Meta': {'ordering': "['order']", 'object_name': 'Badge'},  
104 - 'awardees': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['accounts.User']", 'null': 'True', 'blank': 'True'}),  
105 - 'comparison': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}),  
106 - 'description': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),  
107 - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),  
108 - 'image_base64': ('django.db.models.fields.TextField', [], {}),  
109 - 'order': ('django.db.models.fields.PositiveSmallIntegerField', [], {'default': '100'}),  
110 - 'title': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),  
111 - 'type': ('django.db.models.fields.CharField', [], {'max_length': '200'}),  
112 - 'user_attr': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),  
113 - 'value': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'})  
114 - },  
115 - u'badger.badgei18n': {  
116 - 'Meta': {'unique_together': "(('i18n_source', 'i18n_language'),)", 'object_name': 'BadgeI18N'},  
117 - 'description': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),  
118 - 'i18n_language': ('django.db.models.fields.CharField', [], {'max_length': '10'}),  
119 - 'i18n_source': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'to': u"orm['badger.Badge']"}),  
120 - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),  
121 - 'title': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'})  
122 - },  
123 - u'contenttypes.contenttype': {  
124 - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},  
125 - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),  
126 - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),  
127 - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),  
128 - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})  
129 - }  
130 - }  
131 -  
132 - complete_apps = ['badger']  
133 \ No newline at end of file 0 \ No newline at end of file
src/badger/migrations/__init__.py
src/colab/custom_settings.py
@@ -93,7 +93,6 @@ INSTALLED_APPS += ( @@ -93,7 +93,6 @@ INSTALLED_APPS += (
93 'accounts', 93 'accounts',
94 94
95 # Not standard apps 95 # Not standard apps
96 - 'south',  
97 'raven.contrib.django.raven_compat', 96 'raven.contrib.django.raven_compat',
98 'cliauth', 97 'cliauth',
99 'django_mobile', 98 'django_mobile',
src/proxy/trac/migrations/0001_initial.py
1 # -*- coding: utf-8 -*- 1 # -*- coding: utf-8 -*-
2 -import datetime 2 +from __future__ import unicode_literals
  3 +
  4 +from django.db import models, migrations
3 from django.db import connections 5 from django.db import connections
4 -from south.db import db  
5 -from south.v2 import SchemaMigration  
6 -from django.db import models  
7 -  
8 -  
9 -class Migration(SchemaMigration):  
10 -  
11 - def forwards(self, orm):  
12 - connection = connections['trac']  
13 -  
14 - cursor = connection.cursor()  
15 - cursor.execute('''  
16 - CREATE OR REPLACE VIEW wiki_view AS SELECT  
17 - wiki.name AS name,  
18 - (SELECT wiki2.text FROM wiki AS wiki2 WHERE wiki2.name = wiki.name  
19 - AND wiki2.version = MAX(wiki.version)) AS wiki_text,  
20 - (SELECT wiki3.author FROM wiki AS wiki3 WHERE wiki3.name = wiki.name  
21 - AND wiki3.version = 1) AS author,  
22 - string_agg(DISTINCT wiki.author, ', ') AS collaborators,  
23 - TIMESTAMP WITH TIME ZONE 'epoch' + (MAX(wiki.time)/1000000) * INTERVAL '1s' AS created,  
24 - TIMESTAMP WITH TIME ZONE 'epoch' + (MIN(wiki.time)/1000000) * INTERVAL '1s' AS modified  
25 - FROM wiki  
26 - GROUP BY wiki.name;  
27 -  
28 - CREATE OR REPLACE VIEW ticket_view AS SELECT  
29 - ticket.id AS id,  
30 - ticket.summary as summary,  
31 - ticket.description as description,  
32 - ticket.milestone as milestone,  
33 - ticket.priority as priority,  
34 - ticket.component as component,  
35 - ticket.version as version,  
36 - ticket.severity as severity,  
37 - ticket.reporter as reporter,  
38 - ticket.reporter as author,  
39 - ticket.status as status,  
40 - ticket.keywords as keywords,  
41 - (SELECT  
42 - string_agg(DISTINCT ticket_change.author, ', ')  
43 - FROM ticket_change WHERE ticket_change.ticket = ticket.id  
44 - GROUP BY ticket_change.ticket) as collaborators,  
45 - TIMESTAMP WITH TIME ZONE 'epoch' + (time/1000000)* INTERVAL '1s' AS created,  
46 - TIMESTAMP WITH TIME ZONE 'epoch' + (changetime/1000000) * INTERVAL '1s' AS modified  
47 - FROM ticket;  
48 -  
49 - CREATE OR REPLACE VIEW revision_view AS SELECT  
50 - revision.rev,  
51 - revision.author,  
52 - revision.message,  
53 - repository.value AS repository_name,  
54 - TIMESTAMP WITH TIME ZONE 'epoch' + (revision.time/1000000) * INTERVAL '1s' AS created  
55 - FROM revision  
56 - INNER JOIN repository ON(  
57 - repository.id = revision.repos  
58 - AND repository.name = 'name'  
59 - AND repository.value != ''  
60 - ); 6 +
  7 +
  8 +def create_views(apps, schema_editor):
  9 + connection = connections['trac']
  10 +
  11 + cursor = connection.cursor()
  12 +
  13 + # revision_view
  14 + cursor.execute('''
  15 + CREATE OR REPLACE VIEW revision_view AS SELECT
  16 + revision.rev,
  17 + revision.author,
  18 + revision.message,
  19 + repository.value AS repository_name,
  20 + TIMESTAMP WITH TIME ZONE 'epoch' + (revision.time/1000000) * INTERVAL '1s' AS created,
  21 + CONCAT(revision.repos, '-', revision.rev) AS key
  22 + FROM revision
  23 + INNER JOIN repository ON(
  24 + repository.id = revision.repos
  25 + AND repository.name = 'name'
  26 + AND repository.value != ''
  27 + );
  28 + ''')
  29 +
  30 + # attachment_view
  31 + cursor.execute('''
  32 + CREATE OR REPLACE VIEW attachment_view AS SELECT
  33 + CONCAT(attachment.type, '/' , attachment.id, '/', attachment.filename) AS url,
  34 + attachment.type AS used_by,
  35 + attachment.filename AS filename,
  36 + attachment.id as attach_id,
  37 + (SELECT LOWER(SUBSTRING(attachment.filename FROM '\.(\w+)$'))) AS mimetype,
  38 + attachment.author AS author,
  39 + attachment.description AS description,
  40 + attachment.size AS size,
  41 + TIMESTAMP WITH TIME ZONE 'epoch' + (attachment.time/1000000)* INTERVAL '1s' AS created
  42 + FROM attachment;
  43 + ''')
  44 +
  45 + # wiki_view
  46 + cursor.execute('''
  47 + CREATE OR REPLACE VIEW wiki_view AS SELECT
  48 + wiki.name AS name,
  49 + (SELECT wiki2.text FROM wiki AS wiki2 WHERE wiki2.name = wiki.name
  50 + AND wiki2.version = MAX(wiki.version)) AS wiki_text,
  51 + (SELECT wiki3.author FROM wiki AS wiki3 WHERE wiki3.name = wiki.name
  52 + AND wiki3.version = 1) AS author,
  53 + string_agg(DISTINCT wiki.author, ', ') AS collaborators,
  54 + TIMESTAMP WITH TIME ZONE 'epoch' + (MIN(wiki.time)/1000000) * INTERVAL '1s' AS created,
  55 + TIMESTAMP WITH TIME ZONE 'epoch' + (MAX(wiki.time)/1000000) * INTERVAL '1s' AS modified,
  56 + (SELECT wiki4.author FROM wiki AS wiki4 WHERE wiki4.name = wiki.name
  57 + AND wiki4.version = MAX(wiki.version)) AS modified_by
  58 + FROM wiki
  59 + GROUP BY wiki.name;
61 ''') 60 ''')
62 - cursor.execute('''  
63 - CREATE OR REPLACE VIEW revision_view AS SELECT  
64 - revision.rev,  
65 - revision.author,  
66 - revision.message,  
67 - repository.value AS repository_name,  
68 - TIMESTAMP WITH TIME ZONE 'epoch' + (revision.time/1000000) * INTERVAL '1s' AS created,  
69 - CONCAT(revision.repos, '-', revision.rev) AS key  
70 - FROM revision  
71 - INNER JOIN repository ON(  
72 - repository.id = revision.repos  
73 - AND repository.name = 'name'  
74 - AND repository.value != ''  
75 - );  
76 - ''')  
77 - cursor.execute('''  
78 - CREATE OR REPLACE VIEW attachment_view AS SELECT  
79 - CONCAT(attachment.type, '/' , attachment.id, '/', attachment.filename) AS url,  
80 - attachment.type AS used_by,  
81 - attachment.filename AS filename,  
82 - attachment.id as attach_id,  
83 - (SELECT LOWER(SUBSTRING(attachment.filename FROM '\.(\w+)$'))) AS mimetype,  
84 - attachment.author AS author,  
85 - attachment.description AS description,  
86 - attachment.size AS size,  
87 - TIMESTAMP WITH TIME ZONE 'epoch' + (attachment.time/1000000)* INTERVAL '1s' AS created  
88 - FROM attachment;  
89 - ''')  
90 - cursor.execute('''  
91 - CREATE OR REPLACE VIEW wiki_view AS SELECT  
92 - wiki.name AS name,  
93 - (SELECT wiki2.text FROM wiki AS wiki2 WHERE wiki2.name = wiki.name  
94 - AND wiki2.version = MAX(wiki.version)) AS wiki_text,  
95 - (SELECT wiki3.author FROM wiki AS wiki3 WHERE wiki3.name = wiki.name  
96 - AND wiki3.version = 1) AS author,  
97 - string_agg(DISTINCT wiki.author, ', ') AS collaborators,  
98 - TIMESTAMP WITH TIME ZONE 'epoch' + (MIN(wiki.time)/1000000) * INTERVAL '1s' AS created,  
99 - TIMESTAMP WITH TIME ZONE 'epoch' + (MAX(wiki.time)/1000000) * INTERVAL '1s' AS modified  
100 - FROM wiki  
101 - GROUP BY wiki.name;  
102 - ''')  
103 - cursor.execute('''  
104 - CREATE OR REPLACE VIEW wiki_view AS SELECT  
105 - wiki.name AS name,  
106 - (SELECT wiki2.text FROM wiki AS wiki2 WHERE wiki2.name = wiki.name  
107 - AND wiki2.version = MAX(wiki.version)) AS wiki_text,  
108 - (SELECT wiki3.author FROM wiki AS wiki3 WHERE wiki3.name = wiki.name  
109 - AND wiki3.version = 1) AS author,  
110 - string_agg(DISTINCT wiki.author, ', ') AS collaborators,  
111 - TIMESTAMP WITH TIME ZONE 'epoch' + (MIN(wiki.time)/1000000) * INTERVAL '1s' AS created,  
112 - TIMESTAMP WITH TIME ZONE 'epoch' + (MAX(wiki.time)/1000000) * INTERVAL '1s' AS modified,  
113 - (SELECT wiki4.author FROM wiki AS wiki4 WHERE wiki4.name = wiki.name  
114 - AND wiki4.version = MAX(wiki.version)) AS modified_by  
115 - FROM wiki  
116 - GROUP BY wiki.name;  
117 -  
118 - CREATE OR REPLACE VIEW ticket_view AS SELECT  
119 - ticket.id AS id,  
120 - ticket.summary as summary,  
121 - ticket.description as description,  
122 - ticket.milestone as milestone,  
123 - ticket.priority as priority,  
124 - ticket.component as component,  
125 - ticket.version as version,  
126 - ticket.severity as severity,  
127 - ticket.reporter as reporter,  
128 - ticket.reporter as author,  
129 - ticket.status as status,  
130 - ticket.keywords as keywords,  
131 - (SELECT  
132 - string_agg(DISTINCT ticket_change.author, ', ')  
133 - FROM ticket_change WHERE ticket_change.ticket = ticket.id  
134 - GROUP BY ticket_change.ticket) as collaborators,  
135 - TIMESTAMP WITH TIME ZONE 'epoch' + (time/1000000)* INTERVAL '1s' AS created,  
136 - TIMESTAMP WITH TIME ZONE 'epoch' + (changetime/1000000) * INTERVAL '1s' AS modified,  
137 - (SELECT  
138 - ticket_change.author  
139 - FROM ticket_change  
140 - WHERE ticket_change.ticket = ticket.id  
141 - AND ticket_change.time = ticket.changetime  
142 - LIMIT 1  
143 - ) AS modified_by  
144 - FROM ticket;  
145 - ''')  
146 - cursor.execute('''  
147 - CREATE OR REPLACE VIEW ticket_collab_count_view AS  
148 - SELECT  
149 - COALESCE (t1.author, t2.author) as author,  
150 - (COALESCE(t1.count, 0) + COALESCE(t2.count, 0)) as count  
151 - FROM  
152 - (SELECT author, count(*) as count  
153 - FROM ticket_change  
154 - GROUP BY author  
155 - ORDER BY author  
156 - ) AS t1  
157 - FULL OUTER JOIN  
158 - (SELECT reporter as author, count(*) as count  
159 - FROM ticket  
160 - GROUP BY reporter  
161 - ORDER BY reporter  
162 - ) AS t2  
163 - ON t1.author = t2.author;  
164 -  
165 - CREATE OR REPLACE VIEW wiki_collab_count_view AS  
166 - SELECT author, count(*) from wiki GROUP BY author;  
167 - ''')  
168 -  
169 - pass  
170 -  
171 - def backwards(self, orm):  
172 - connection = connections['trac']  
173 -  
174 - cursor = connection.cursor()  
175 - cursor.execute('''  
176 - DROP VIEW IF EXISTS revision_view;  
177 - DROP VIEW IF EXISTS ticket_view;  
178 - DROP VIEW IF EXISTS wiki_view;  
179 - DROP VIEW IF EXISTS ticket_collab_count_view;  
180 - DROP VIEW IF EXISTS wiki_collab_count_view;  
181 - DROP VIEW IF EXISTS attachment_view;  
182 - ''')  
183 -  
184 - pass  
185 -  
186 - models = {  
187 - u'proxy.attachment': {  
188 - 'Meta': {'object_name': 'Attachment', 'db_table': "'attachment_view'", 'managed': 'False'},  
189 - 'attach_id': ('django.db.models.fields.TextField', [], {}),  
190 - 'author': ('django.db.models.fields.TextField', [], {'blank': 'True'}),  
191 - 'created': ('django.db.models.fields.DateTimeField', [], {'blank': 'True'}),  
192 - 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),  
193 - 'filename': ('django.db.models.fields.TextField', [], {}),  
194 - 'mimetype': ('django.db.models.fields.TextField', [], {'blank': 'True'}),  
195 - 'size': ('django.db.models.fields.IntegerField', [], {'blank': 'True'}),  
196 - 'url': ('django.db.models.fields.TextField', [], {'primary_key': 'True'}),  
197 - 'used_by': ('django.db.models.fields.TextField', [], {})  
198 - },  
199 - u'proxy.revision': {  
200 - 'Meta': {'object_name': 'Revision', 'db_table': "'revision_view'", 'managed': 'False'},  
201 - 'author': ('django.db.models.fields.TextField', [], {'blank': 'True'}),  
202 - 'created': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),  
203 - 'key': ('django.db.models.fields.TextField', [], {'primary_key': 'True'}),  
204 - 'message': ('django.db.models.fields.TextField', [], {'blank': 'True'}),  
205 - 'repository_name': ('django.db.models.fields.TextField', [], {'blank': 'True'}),  
206 - 'rev': ('django.db.models.fields.TextField', [], {'blank': 'True'})  
207 - },  
208 - u'proxy.ticket': {  
209 - 'Meta': {'object_name': 'Ticket', 'db_table': "'ticket_view'", 'managed': 'False'},  
210 - 'author': ('django.db.models.fields.TextField', [], {'blank': 'True'}),  
211 - 'collaborators': ('django.db.models.fields.TextField', [], {'blank': 'True'}),  
212 - 'component': ('django.db.models.fields.TextField', [], {'blank': 'True'}),  
213 - 'created': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),  
214 - 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),  
215 - 'id': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}),  
216 - 'keywords': ('django.db.models.fields.TextField', [], {'blank': 'True'}),  
217 - 'milestone': ('django.db.models.fields.TextField', [], {'blank': 'True'}),  
218 - 'modified': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),  
219 - 'modified_by': ('django.db.models.fields.TextField', [], {'blank': 'True'}),  
220 - 'priority': ('django.db.models.fields.TextField', [], {'blank': 'True'}),  
221 - 'reporter': ('django.db.models.fields.TextField', [], {'blank': 'True'}),  
222 - 'severity': ('django.db.models.fields.TextField', [], {'blank': 'True'}),  
223 - 'status': ('django.db.models.fields.TextField', [], {'blank': 'True'}),  
224 - 'summary': ('django.db.models.fields.TextField', [], {'blank': 'True'}),  
225 - 'version': ('django.db.models.fields.TextField', [], {'blank': 'True'})  
226 - },  
227 - u'proxy.ticketcollabcount': {  
228 - 'Meta': {'object_name': 'TicketCollabCount', 'db_table': "'ticket_collab_count_view'", 'managed': 'False'},  
229 - 'author': ('django.db.models.fields.TextField', [], {'primary_key': 'True'}),  
230 - 'count': ('django.db.models.fields.IntegerField', [], {})  
231 - },  
232 - u'proxy.wiki': {  
233 - 'Meta': {'object_name': 'Wiki', 'db_table': "'wiki_view'", 'managed': 'False'},  
234 - 'author': ('django.db.models.fields.TextField', [], {'blank': 'True'}),  
235 - 'collaborators': ('django.db.models.fields.TextField', [], {'blank': 'True'}),  
236 - 'created': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),  
237 - 'modified': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),  
238 - 'modified_by': ('django.db.models.fields.TextField', [], {'blank': 'True'}),  
239 - 'name': ('django.db.models.fields.TextField', [], {'primary_key': 'True'}),  
240 - 'wiki_text': ('django.db.models.fields.TextField', [], {'blank': 'True'})  
241 - },  
242 - u'proxy.wikicollabcount': {  
243 - 'Meta': {'object_name': 'WikiCollabCount', 'db_table': "'wiki_collab_count_view'", 'managed': 'False'},  
244 - 'author': ('django.db.models.fields.TextField', [], {'primary_key': 'True'}),  
245 - 'count': ('django.db.models.fields.IntegerField', [], {})  
246 - }  
247 - }  
248 -  
249 - complete_apps = ['proxy']  
250 - symmetrical = True  
251 \ No newline at end of file 61 \ No newline at end of file
  62 +
  63 + # ticket_view
  64 + cursor.execute('''
  65 + CREATE OR REPLACE VIEW ticket_view AS SELECT
  66 + ticket.id AS id,
  67 + ticket.summary as summary,
  68 + ticket.description as description,
  69 + ticket.milestone as milestone,
  70 + ticket.priority as priority,
  71 + ticket.component as component,
  72 + ticket.version as version,
  73 + ticket.severity as severity,
  74 + ticket.reporter as reporter,
  75 + ticket.reporter as author,
  76 + ticket.status as status,
  77 + ticket.keywords as keywords,
  78 + (SELECT
  79 + string_agg(DISTINCT ticket_change.author, ', ')
  80 + FROM ticket_change WHERE ticket_change.ticket = ticket.id
  81 + GROUP BY ticket_change.ticket) as collaborators,
  82 + TIMESTAMP WITH TIME ZONE 'epoch' + (time/1000000)* INTERVAL '1s' AS created,
  83 + TIMESTAMP WITH TIME ZONE 'epoch' + (changetime/1000000) * INTERVAL '1s' AS modified,
  84 + (SELECT
  85 + ticket_change.author
  86 + FROM ticket_change
  87 + WHERE ticket_change.ticket = ticket.id
  88 + AND ticket_change.time = ticket.changetime
  89 + LIMIT 1
  90 + ) AS modified_by
  91 + FROM ticket;
  92 + ''')
  93 +
  94 + # ticket_collab_count_view
  95 + cursor.execute('''
  96 + CREATE OR REPLACE VIEW ticket_collab_count_view AS
  97 + SELECT
  98 + COALESCE (t1.author, t2.author) as author,
  99 + (COALESCE(t1.count, 0) + COALESCE(t2.count, 0)) as count
  100 + FROM
  101 + (SELECT author, count(*) as count
  102 + FROM ticket_change
  103 + GROUP BY author
  104 + ORDER BY author
  105 + ) AS t1
  106 + FULL OUTER JOIN
  107 + (SELECT reporter as author, count(*) as count
  108 + FROM ticket
  109 + GROUP BY reporter
  110 + ORDER BY reporter
  111 + ) AS t2
  112 + ON t1.author = t2.author;
  113 + ''')
  114 +
  115 + # wiki_collab_count_view
  116 + cursor.execute('''
  117 + CREATE OR REPLACE VIEW wiki_collab_count_view AS
  118 + SELECT author, count(*) from wiki GROUP BY author;
  119 + ''')
  120 +
  121 +
  122 +def drop_views(apps, schema_editor):
  123 + connection = connections['trac']
  124 +
  125 + cursor = connection.cursor()
  126 + cursor.execute('''
  127 + DROP VIEW IF EXISTS revision_view;
  128 + DROP VIEW IF EXISTS ticket_view;
  129 + DROP VIEW IF EXISTS wiki_view;
  130 + DROP VIEW IF EXISTS ticket_collab_count_view;
  131 + DROP VIEW IF EXISTS wiki_collab_count_view;
  132 + DROP VIEW IF EXISTS attachment_view;
  133 + ''')
  134 +
  135 +
  136 +class Migration(migrations.Migration):
  137 +
  138 + dependencies = [
  139 + ]
  140 +
  141 + operations = [
  142 + migrations.RunPython(code=create_views, reverse_code=drop_views)
  143 + ]
src/super_archives/migrations/0001_initial.py
@@ -1,299 +0,0 @@ @@ -1,299 +0,0 @@
1 -# -*- coding: 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 -  
8 -class Migration(SchemaMigration):  
9 -  
10 - def forwards(self, orm):  
11 - # Adding model 'EmailAddressValidation'  
12 - db.create_table(u'super_archives_emailaddressvalidation', (  
13 - (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),  
14 - ('address', self.gf('django.db.models.fields.EmailField')(unique=True, max_length=75)),  
15 - ('user', self.gf('django.db.models.fields.related.ForeignKey')(related_name='emails_not_validated', null=True, to=orm['accounts.User'])),  
16 - ('validation_key', self.gf('django.db.models.fields.CharField')(default='143df80aa814429f9938d3b165148480', max_length=32, null=True)),  
17 - ('created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),  
18 - ))  
19 - db.send_create_signal(u'super_archives', ['EmailAddressValidation'])  
20 -  
21 - # Adding unique constraint on 'EmailAddressValidation', fields ['user', 'address']  
22 - db.create_unique(u'super_archives_emailaddressvalidation', ['user_id', 'address'])  
23 -  
24 - # Adding model 'EmailAddress'  
25 - db.create_table(u'super_archives_emailaddress', (  
26 - (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),  
27 - ('user', self.gf('django.db.models.fields.related.ForeignKey')(related_name='emails', null=True, on_delete=models.SET_NULL, to=orm['accounts.User'])),  
28 - ('address', self.gf('django.db.models.fields.EmailField')(unique=True, max_length=75)),  
29 - ('real_name', self.gf('django.db.models.fields.CharField')(db_index=True, max_length=64, blank=True)),  
30 - ('md5', self.gf('django.db.models.fields.CharField')(max_length=32, null=True)),  
31 - ))  
32 - db.send_create_signal(u'super_archives', ['EmailAddress'])  
33 -  
34 - # Adding model 'MailingList'  
35 - db.create_table(u'super_archives_mailinglist', (  
36 - (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),  
37 - ('name', self.gf('django.db.models.fields.CharField')(max_length=80)),  
38 - ('email', self.gf('django.db.models.fields.EmailField')(max_length=75)),  
39 - ('description', self.gf('django.db.models.fields.TextField')()),  
40 - ('logo', self.gf('django.db.models.fields.files.FileField')(max_length=100)),  
41 - ('last_imported_index', self.gf('django.db.models.fields.IntegerField')(default=0)),  
42 - ))  
43 - db.send_create_signal(u'super_archives', ['MailingList'])  
44 -  
45 - # Adding model 'MailingListMembership'  
46 - db.create_table(u'super_archives_mailinglistmembership', (  
47 - (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),  
48 - ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['accounts.User'])),  
49 - ('mailinglist', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['super_archives.MailingList'])),  
50 - ))  
51 - db.send_create_signal(u'super_archives', ['MailingListMembership'])  
52 -  
53 - # Adding model 'Keyword'  
54 - db.create_table(u'super_archives_keyword', (  
55 - (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),  
56 - ('keyword', self.gf('django.db.models.fields.CharField')(max_length='128')),  
57 - ('weight', self.gf('django.db.models.fields.IntegerField')(default=0)),  
58 - ('thread', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['super_archives.Thread'])),  
59 - ))  
60 - db.send_create_signal(u'super_archives', ['Keyword'])  
61 -  
62 - # Adding model 'Thread'  
63 - db.create_table(u'super_archives_thread', (  
64 - (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),  
65 - ('subject_token', self.gf('django.db.models.fields.CharField')(max_length=512)),  
66 - ('mailinglist', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['super_archives.MailingList'])),  
67 - ('latest_message', self.gf('django.db.models.fields.related.OneToOneField')(related_name='+', unique=True, null=True, to=orm['super_archives.Message'])),  
68 - ('score', self.gf('django.db.models.fields.IntegerField')(default=0)),  
69 - ('spam', self.gf('django.db.models.fields.BooleanField')(default=False)),  
70 - ))  
71 - db.send_create_signal(u'super_archives', ['Thread'])  
72 -  
73 - # Adding unique constraint on 'Thread', fields ['subject_token', 'mailinglist']  
74 - db.create_unique(u'super_archives_thread', ['subject_token', 'mailinglist_id'])  
75 -  
76 - # Adding model 'Vote'  
77 - db.create_table(u'super_archives_vote', (  
78 - (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),  
79 - ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['accounts.User'])),  
80 - ('message', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['super_archives.Message'])),  
81 - ('created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),  
82 - ))  
83 - db.send_create_signal(u'super_archives', ['Vote'])  
84 -  
85 - # Adding unique constraint on 'Vote', fields ['user', 'message']  
86 - db.create_unique(u'super_archives_vote', ['user_id', 'message_id'])  
87 -  
88 - # Adding model 'Message'  
89 - db.create_table(u'super_archives_message', (  
90 - (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),  
91 - ('from_address', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['super_archives.EmailAddress'])),  
92 - ('thread', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['super_archives.Thread'], null=True)),  
93 - ('subject', self.gf('django.db.models.fields.CharField')(max_length=512, db_index=True)),  
94 - ('subject_clean', self.gf('django.db.models.fields.CharField')(max_length=512, db_index=True)),  
95 - ('body', self.gf('django.db.models.fields.TextField')(default='')),  
96 - ('received_time', self.gf('django.db.models.fields.DateTimeField')(db_index=True)),  
97 - ('message_id', self.gf('django.db.models.fields.CharField')(max_length=512)),  
98 - ('spam', self.gf('django.db.models.fields.BooleanField')(default=False)),  
99 - ))  
100 - db.send_create_signal(u'super_archives', ['Message'])  
101 -  
102 - # Adding unique constraint on 'Message', fields ['thread', 'message_id']  
103 - db.create_unique(u'super_archives_message', ['thread_id', 'message_id'])  
104 -  
105 - # Adding model 'MessageBlock'  
106 - db.create_table(u'super_archives_messageblock', (  
107 - (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),  
108 - ('message', self.gf('django.db.models.fields.related.ForeignKey')(related_name='blocks', to=orm['super_archives.Message'])),  
109 - ('text', self.gf('django.db.models.fields.TextField')()),  
110 - ('is_reply', self.gf('django.db.models.fields.BooleanField')()),  
111 - ('order', self.gf('django.db.models.fields.IntegerField')()),  
112 - ))  
113 - db.send_create_signal(u'super_archives', ['MessageBlock'])  
114 -  
115 - # Adding model 'MessageMetadata'  
116 - db.create_table(u'super_archives_messagemetadata', (  
117 - (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),  
118 - ('Message', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['super_archives.Message'])),  
119 - ('name', self.gf('django.db.models.fields.CharField')(max_length=512)),  
120 - ('value', self.gf('django.db.models.fields.TextField')()),  
121 - ))  
122 - db.send_create_signal(u'super_archives', ['MessageMetadata'])  
123 -  
124 -  
125 - def backwards(self, orm):  
126 - # Removing unique constraint on 'Message', fields ['thread', 'message_id']  
127 - db.delete_unique(u'super_archives_message', ['thread_id', 'message_id'])  
128 -  
129 - # Removing unique constraint on 'Vote', fields ['user', 'message']  
130 - db.delete_unique(u'super_archives_vote', ['user_id', 'message_id'])  
131 -  
132 - # Removing unique constraint on 'Thread', fields ['subject_token', 'mailinglist']  
133 - db.delete_unique(u'super_archives_thread', ['subject_token', 'mailinglist_id'])  
134 -  
135 - # Removing unique constraint on 'EmailAddressValidation', fields ['user', 'address']  
136 - db.delete_unique(u'super_archives_emailaddressvalidation', ['user_id', 'address'])  
137 -  
138 - # Deleting model 'EmailAddressValidation'  
139 - db.delete_table(u'super_archives_emailaddressvalidation')  
140 -  
141 - # Deleting model 'EmailAddress'  
142 - db.delete_table(u'super_archives_emailaddress')  
143 -  
144 - # Deleting model 'MailingList'  
145 - db.delete_table(u'super_archives_mailinglist')  
146 -  
147 - # Deleting model 'MailingListMembership'  
148 - db.delete_table(u'super_archives_mailinglistmembership')  
149 -  
150 - # Deleting model 'Keyword'  
151 - db.delete_table(u'super_archives_keyword')  
152 -  
153 - # Deleting model 'Thread'  
154 - db.delete_table(u'super_archives_thread')  
155 -  
156 - # Deleting model 'Vote'  
157 - db.delete_table(u'super_archives_vote')  
158 -  
159 - # Deleting model 'Message'  
160 - db.delete_table(u'super_archives_message')  
161 -  
162 - # Deleting model 'MessageBlock'  
163 - db.delete_table(u'super_archives_messageblock')  
164 -  
165 - # Deleting model 'MessageMetadata'  
166 - db.delete_table(u'super_archives_messagemetadata')  
167 -  
168 -  
169 - models = {  
170 - u'accounts.user': {  
171 - 'Meta': {'object_name': 'User'},  
172 - 'bio': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),  
173 - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),  
174 - 'email': ('django.db.models.fields.EmailField', [], {'unique': 'True', 'max_length': '75', 'blank': 'True'}),  
175 - 'facebook': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}),  
176 - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),  
177 - 'github': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}),  
178 - 'google_talk': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),  
179 - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}),  
180 - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),  
181 - 'institution': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}),  
182 - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),  
183 - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),  
184 - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),  
185 - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),  
186 - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),  
187 - 'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),  
188 - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),  
189 - 'role': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}),  
190 - 'twitter': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}),  
191 - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}),  
192 - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}),  
193 - 'verification_hash': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),  
194 - 'webpage': ('django.db.models.fields.CharField', [], {'max_length': '256', 'null': 'True', 'blank': 'True'})  
195 - },  
196 - u'auth.group': {  
197 - 'Meta': {'object_name': 'Group'},  
198 - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),  
199 - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),  
200 - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})  
201 - },  
202 - u'auth.permission': {  
203 - 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},  
204 - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),  
205 - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),  
206 - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),  
207 - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})  
208 - },  
209 - u'contenttypes.contenttype': {  
210 - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},  
211 - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),  
212 - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),  
213 - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),  
214 - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})  
215 - },  
216 - u'super_archives.emailaddress': {  
217 - 'Meta': {'ordering': "('id',)", 'object_name': 'EmailAddress'},  
218 - 'address': ('django.db.models.fields.EmailField', [], {'unique': 'True', 'max_length': '75'}),  
219 - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),  
220 - 'md5': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}),  
221 - 'real_name': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '64', 'blank': 'True'}),  
222 - 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'emails'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['accounts.User']"})  
223 - },  
224 - u'super_archives.emailaddressvalidation': {  
225 - 'Meta': {'unique_together': "(('user', 'address'),)", 'object_name': 'EmailAddressValidation'},  
226 - 'address': ('django.db.models.fields.EmailField', [], {'unique': 'True', 'max_length': '75'}),  
227 - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),  
228 - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),  
229 - 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'emails_not_validated'", 'null': 'True', 'to': u"orm['accounts.User']"}),  
230 - 'validation_key': ('django.db.models.fields.CharField', [], {'default': "'aa4ac05f39464a05932308e9fda2daf5'", 'max_length': '32', 'null': 'True'})  
231 - },  
232 - u'super_archives.keyword': {  
233 - 'Meta': {'ordering': "('?',)", 'object_name': 'Keyword'},  
234 - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),  
235 - 'keyword': ('django.db.models.fields.CharField', [], {'max_length': "'128'"}),  
236 - 'thread': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['super_archives.Thread']"}),  
237 - 'weight': ('django.db.models.fields.IntegerField', [], {'default': '0'})  
238 - },  
239 - u'super_archives.mailinglist': {  
240 - 'Meta': {'object_name': 'MailingList'},  
241 - 'description': ('django.db.models.fields.TextField', [], {}),  
242 - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75'}),  
243 - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),  
244 - 'last_imported_index': ('django.db.models.fields.IntegerField', [], {'default': '0'}),  
245 - 'logo': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),  
246 - 'name': ('django.db.models.fields.CharField', [], {'max_length': '80'})  
247 - },  
248 - u'super_archives.mailinglistmembership': {  
249 - 'Meta': {'object_name': 'MailingListMembership'},  
250 - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),  
251 - 'mailinglist': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['super_archives.MailingList']"}),  
252 - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounts.User']"})  
253 - },  
254 - u'super_archives.message': {  
255 - 'Meta': {'ordering': "('received_time',)", 'unique_together': "(('thread', 'message_id'),)", 'object_name': 'Message'},  
256 - 'body': ('django.db.models.fields.TextField', [], {'default': "''"}),  
257 - 'from_address': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['super_archives.EmailAddress']"}),  
258 - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),  
259 - 'message_id': ('django.db.models.fields.CharField', [], {'max_length': '512'}),  
260 - 'received_time': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),  
261 - 'spam': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),  
262 - 'subject': ('django.db.models.fields.CharField', [], {'max_length': '512', 'db_index': 'True'}),  
263 - 'subject_clean': ('django.db.models.fields.CharField', [], {'max_length': '512', 'db_index': 'True'}),  
264 - 'thread': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['super_archives.Thread']", 'null': 'True'})  
265 - },  
266 - u'super_archives.messageblock': {  
267 - 'Meta': {'ordering': "('order',)", 'object_name': 'MessageBlock'},  
268 - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),  
269 - 'is_reply': ('django.db.models.fields.BooleanField', [], {}),  
270 - 'message': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'blocks'", 'to': u"orm['super_archives.Message']"}),  
271 - 'order': ('django.db.models.fields.IntegerField', [], {}),  
272 - 'text': ('django.db.models.fields.TextField', [], {})  
273 - },  
274 - u'super_archives.messagemetadata': {  
275 - 'Message': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['super_archives.Message']"}),  
276 - 'Meta': {'object_name': 'MessageMetadata'},  
277 - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),  
278 - 'name': ('django.db.models.fields.CharField', [], {'max_length': '512'}),  
279 - 'value': ('django.db.models.fields.TextField', [], {})  
280 - },  
281 - u'super_archives.thread': {  
282 - 'Meta': {'ordering': "('-latest_message__received_time',)", 'unique_together': "(('subject_token', 'mailinglist'),)", 'object_name': 'Thread'},  
283 - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),  
284 - 'latest_message': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'+'", 'unique': 'True', 'null': 'True', 'to': u"orm['super_archives.Message']"}),  
285 - 'mailinglist': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['super_archives.MailingList']"}),  
286 - 'score': ('django.db.models.fields.IntegerField', [], {'default': '0'}),  
287 - 'spam': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),  
288 - 'subject_token': ('django.db.models.fields.CharField', [], {'max_length': '512'})  
289 - },  
290 - u'super_archives.vote': {  
291 - 'Meta': {'unique_together': "(('user', 'message'),)", 'object_name': 'Vote'},  
292 - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),  
293 - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),  
294 - 'message': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['super_archives.Message']"}),  
295 - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounts.User']"})  
296 - }  
297 - }  
298 -  
299 - complete_apps = ['super_archives']  
300 \ No newline at end of file 0 \ No newline at end of file
src/super_archives/migrations/__init__.py