Commit 31cc7895f25060e7f57419fbfc810fd770c85682

Authored by Sergio Oliveira
1 parent 8824c5e4

Moving away from south

src/accounts/migrations/0001_initial.py
1 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 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   -# -*- 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 0 \ No newline at end of file
src/badger/migrations/__init__.py
src/colab/custom_settings.py
... ... @@ -93,7 +93,6 @@ INSTALLED_APPS += (
93 93 'accounts',
94 94  
95 95 # Not standard apps
96   - 'south',
97 96 'raven.contrib.django.raven_compat',
98 97 'cliauth',
99 98 'django_mobile',
... ...
src/proxy/trac/migrations/0001_initial.py
1 1 # -*- coding: utf-8 -*-
2   -import datetime
  2 +from __future__ import unicode_literals
  3 +
  4 +from django.db import models, migrations
3 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 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   -# -*- 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 0 \ No newline at end of file
src/super_archives/migrations/__init__.py