Commit 31cc7895f25060e7f57419fbfc810fd770c85682
1 parent
8824c5e4
Exists in
master
and in
39 other branches
Moving away from south
Showing
7 changed files
with
188 additions
and
794 deletions
Show diff stats
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