# Generated by Django 1.11.2 on 2017-06-22 10:22 import bitfield.models import django.contrib.auth.models import django.core.validators import django.db.models.deletion import django.utils.timezone from django.conf import settings from django.db import migrations, models from django.db.backends.postgresql.schema import DatabaseSchemaEditor from django.db.migrations.state import StateApps from zerver.models import generate_email_token_for_stream def migrate_existing_attachment_data(apps: StateApps, schema_editor: DatabaseSchemaEditor) -> None: Attachment = apps.get_model('zerver', 'Attachment') Recipient = apps.get_model('zerver', 'Recipient') Stream = apps.get_model('zerver', 'Stream') attachments = Attachment.objects.all() for entry in attachments: owner = entry.owner entry.realm = owner.realm for message in entry.messages.all(): if owner == message.sender: if message.recipient.type == Recipient.STREAM: stream = Stream.objects.get(id=message.recipient.type_id) is_realm_public = not stream.realm.is_zephyr_mirror_realm and not stream.invite_only entry.is_realm_public = entry.is_realm_public or is_realm_public entry.save() class Migration(migrations.Migration): initial = True dependencies = [ ('auth', '0001_initial'), ] if settings.POSTGRES_MISSING_DICTIONARIES: fts_sql = """ CREATE TEXT SEARCH CONFIGURATION zulip.english_us_search (COPY=pg_catalog.english); """ else: fts_sql = """ CREATE TEXT SEARCH DICTIONARY english_us_hunspell (template = ispell, DictFile = en_us, AffFile = en_us, StopWords = zulip_english); CREATE TEXT SEARCH CONFIGURATION zulip.english_us_search (COPY=pg_catalog.english); ALTER TEXT SEARCH CONFIGURATION zulip.english_us_search ALTER MAPPING FOR asciiword, asciihword, hword_asciipart, word, hword, hword_part WITH english_us_hunspell, english_stem; """ fts_sql += """ CREATE FUNCTION escape_html(text) RETURNS text IMMUTABLE LANGUAGE 'sql' AS $$ SELECT replace(replace(replace(replace(replace($1, '&', '&'), '<', '<'), '>', '>'), '"', '"'), '''', '''); $$ ; ALTER TABLE zerver_message ADD COLUMN search_tsvector tsvector; CREATE INDEX zerver_message_search_tsvector ON zerver_message USING gin(search_tsvector); ALTER INDEX zerver_message_search_tsvector SET (fastupdate = OFF); CREATE TABLE fts_update_log (id SERIAL PRIMARY KEY, message_id INTEGER NOT NULL); CREATE FUNCTION do_notify_fts_update_log() RETURNS trigger LANGUAGE plpgsql AS $$ BEGIN NOTIFY fts_update_log; RETURN NEW; END $$; CREATE TRIGGER fts_update_log_notify AFTER INSERT ON fts_update_log FOR EACH STATEMENT EXECUTE PROCEDURE do_notify_fts_update_log(); CREATE FUNCTION append_to_fts_update_log() RETURNS trigger LANGUAGE plpgsql AS $$ BEGIN INSERT INTO fts_update_log (message_id) VALUES (NEW.id); RETURN NEW; END $$; CREATE TRIGGER zerver_message_update_search_tsvector_async BEFORE INSERT OR UPDATE OF subject, rendered_content ON zerver_message FOR EACH ROW EXECUTE PROCEDURE append_to_fts_update_log(); """ operations = [ migrations.CreateModel( name='UserProfile', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('password', models.CharField(max_length=128, verbose_name='password')), ('last_login', models.DateTimeField(default=django.utils.timezone.now, verbose_name='last login')), ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), ('email', models.EmailField(db_index=True, max_length=75, unique=True)), ('is_staff', models.BooleanField(default=False)), ('is_active', models.BooleanField(default=True)), ('is_bot', models.BooleanField(default=False)), ('date_joined', models.DateTimeField(default=django.utils.timezone.now)), ('is_mirror_dummy', models.BooleanField(default=False)), ('full_name', models.CharField(max_length=100)), ('short_name', models.CharField(max_length=100)), ('pointer', models.IntegerField()), ('last_pointer_updater', models.CharField(max_length=64)), ('api_key', models.CharField(max_length=32)), ('enable_stream_desktop_notifications', models.BooleanField(default=True)), ('enable_stream_sounds', models.BooleanField(default=True)), ('enable_desktop_notifications', models.BooleanField(default=True)), ('enable_sounds', models.BooleanField(default=True)), ('enable_offline_email_notifications', models.BooleanField(default=True)), ('enable_offline_push_notifications', models.BooleanField(default=True)), ('enable_digest_emails', models.BooleanField(default=True)), ('default_desktop_notifications', models.BooleanField(default=True)), ('last_reminder', models.DateTimeField(default=django.utils.timezone.now, null=True)), ('rate_limits', models.CharField(default='', max_length=100)), ('default_all_public_streams', models.BooleanField(default=False)), ('enter_sends', models.NullBooleanField(default=True)), ('autoscroll_forever', models.BooleanField(default=False)), ('twenty_four_hour_time', models.BooleanField(default=False)), ('avatar_source', models.CharField(choices=[('G', 'Hosted by Gravatar'), ('U', 'Uploaded by user'), ('S', 'System generated')], default='G', max_length=1)), ('tutorial_status', models.CharField(choices=[('W', 'Waiting'), ('S', 'Started'), ('F', 'Finished')], default='W', max_length=1)), ('onboarding_steps', models.TextField(default='[]')), ('invites_granted', models.IntegerField(default=0)), ('invites_used', models.IntegerField(default=0)), ('alert_words', models.TextField(default='[]')), ('muted_topics', models.TextField(default='[]')), ('bot_owner', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)), ], options={ 'abstract': False, }, ), migrations.CreateModel( name='Client', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(db_index=True, max_length=30, unique=True)), ], ), migrations.CreateModel( name='DefaultStream', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ], ), migrations.CreateModel( name='Huddle', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('huddle_hash', models.CharField(db_index=True, max_length=40, unique=True)), ], ), migrations.CreateModel( name='Message', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('subject', models.CharField(db_index=True, max_length=60)), ('content', models.TextField()), ('rendered_content', models.TextField(null=True)), ('rendered_content_version', models.IntegerField(null=True)), ('pub_date', models.DateTimeField(db_index=True, verbose_name='date published')), ('last_edit_time', models.DateTimeField(null=True)), ('edit_history', models.TextField(null=True)), ('has_attachment', models.BooleanField(db_index=True, default=False)), ('has_image', models.BooleanField(db_index=True, default=False)), ('has_link', models.BooleanField(db_index=True, default=False)), ], ), migrations.CreateModel( name='PreregistrationUser', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('email', models.EmailField(max_length=75)), ('invited_at', models.DateTimeField(auto_now=True)), ('status', models.IntegerField(default=0)), ], ), migrations.CreateModel( name='PushDeviceToken', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('kind', models.PositiveSmallIntegerField(choices=[(1, 'apns'), (2, 'gcm')])), ('token', models.CharField(max_length=4096, unique=True)), ('last_updated', models.DateTimeField(auto_now=True, default=django.utils.timezone.now)), ('ios_app_id', models.TextField(null=True)), ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], ), migrations.CreateModel( name='Realm', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('domain', models.CharField(db_index=True, max_length=40, unique=True)), ('name', models.CharField(max_length=40, null=True)), ('restricted_to_domain', models.BooleanField(default=True)), ('invite_required', models.BooleanField(default=False)), ('invite_by_admins_only', models.BooleanField(default=False)), ('mandatory_topics', models.BooleanField(default=False)), ('show_digest_email', models.BooleanField(default=True)), ('name_changes_disabled', models.BooleanField(default=False)), ('date_created', models.DateTimeField(default=django.utils.timezone.now)), ('deactivated', models.BooleanField(default=False)), ], options={ 'permissions': (('administer', 'Administer a realm'),), }, ), migrations.CreateModel( name='RealmAlias', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('domain', models.CharField(db_index=True, max_length=80, unique=True)), ('realm', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='zerver.Realm')), ], ), migrations.CreateModel( name='RealmEmoji', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.TextField()), ('img_url', models.TextField()), ('realm', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='zerver.Realm')), ], ), migrations.CreateModel( name='RealmFilter', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('pattern', models.TextField()), ('url_format_string', models.TextField()), ('realm', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='zerver.Realm')), ], ), migrations.CreateModel( name='Recipient', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('type_id', models.IntegerField(db_index=True)), ('type', models.PositiveSmallIntegerField(db_index=True)), ], ), migrations.CreateModel( name='Referral', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('email', models.EmailField(max_length=75)), ('timestamp', models.DateTimeField(auto_now_add=True)), ('user_profile', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], ), migrations.CreateModel( name='ScheduledJob', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('scheduled_timestamp', models.DateTimeField()), ('type', models.PositiveSmallIntegerField()), ('data', models.TextField()), ('filter_id', models.IntegerField(null=True)), ('filter_string', models.CharField(max_length=100)), ], ), migrations.CreateModel( name='Stream', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(db_index=True, max_length=60)), ('invite_only', models.NullBooleanField(default=False)), ('email_token', models.CharField(default=generate_email_token_for_stream, max_length=32)), ('description', models.CharField(default='', max_length=1024)), ('date_created', models.DateTimeField(default=django.utils.timezone.now)), ('deactivated', models.BooleanField(default=False)), ('realm', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='zerver.Realm')), ], ), migrations.CreateModel( name='Subscription', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('active', models.BooleanField(default=True)), ('in_home_view', models.NullBooleanField(default=True)), ('color', models.CharField(default='#c2c2c2', max_length=10)), ('desktop_notifications', models.BooleanField(default=True)), ('audible_notifications', models.BooleanField(default=True)), ('notifications', models.BooleanField(default=False)), ('recipient', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='zerver.Recipient')), ('user_profile', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], ), migrations.CreateModel( name='UserActivity', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('query', models.CharField(db_index=True, max_length=50)), ('count', models.IntegerField()), ('last_visit', models.DateTimeField(verbose_name='last visit')), ('client', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='zerver.Client')), ('user_profile', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], ), migrations.CreateModel( name='UserActivityInterval', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('start', models.DateTimeField(db_index=True, verbose_name='start time')), ('end', models.DateTimeField(db_index=True, verbose_name='end time')), ('user_profile', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], ), migrations.CreateModel( name='UserMessage', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('flags', bitfield.models.BitField(['read', 'starred', 'collapsed', 'mentioned', 'wildcard_mentioned', 'summarize_in_home', 'summarize_in_stream', 'force_expand', 'force_collapse', 'has_alert_word', 'historical', 'is_me_message'], default=0)), ('message', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='zerver.Message')), ('user_profile', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], ), migrations.CreateModel( name='UserPresence', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('timestamp', models.DateTimeField(verbose_name='presence changed')), ('status', models.PositiveSmallIntegerField(default=1)), ('client', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='zerver.Client')), ('user_profile', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], ), migrations.AlterUniqueTogether( name='userpresence', unique_together={('user_profile', 'client')}, ), migrations.AlterUniqueTogether( name='usermessage', unique_together={('user_profile', 'message')}, ), migrations.AlterUniqueTogether( name='useractivity', unique_together={('user_profile', 'client', 'query')}, ), migrations.AlterUniqueTogether( name='subscription', unique_together={('user_profile', 'recipient')}, ), migrations.AlterUniqueTogether( name='stream', unique_together={('name', 'realm')}, ), migrations.AlterUniqueTogether( name='recipient', unique_together={('type', 'type_id')}, ), migrations.AlterUniqueTogether( name='realmfilter', unique_together={('realm', 'pattern')}, ), migrations.AlterUniqueTogether( name='realmemoji', unique_together={('realm', 'name')}, ), migrations.AddField( model_name='realm', name='notifications_stream', field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='+', to='zerver.Stream'), ), migrations.AddField( model_name='preregistrationuser', name='realm', field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='zerver.Realm'), ), migrations.AddField( model_name='preregistrationuser', name='referred_by', field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), ), migrations.AddField( model_name='preregistrationuser', name='streams', field=models.ManyToManyField(null=True, to='zerver.Stream'), ), migrations.AddField( model_name='message', name='recipient', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='zerver.Recipient'), ), migrations.AddField( model_name='message', name='sender', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), ), migrations.AddField( model_name='message', name='sending_client', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='zerver.Client'), ), migrations.AddField( model_name='defaultstream', name='realm', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='zerver.Realm'), ), migrations.AddField( model_name='defaultstream', name='stream', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='zerver.Stream'), ), migrations.AlterUniqueTogether( name='defaultstream', unique_together={('realm', 'stream')}, ), migrations.AddField( model_name='userprofile', name='default_events_register_stream', field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='+', to='zerver.Stream'), ), migrations.AddField( model_name='userprofile', name='default_sending_stream', field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='+', to='zerver.Stream'), ), migrations.AddField( model_name='userprofile', name='groups', field=models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups'), ), migrations.AddField( model_name='userprofile', name='realm', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='zerver.Realm'), ), migrations.AddField( model_name='userprofile', name='user_permissions', field=models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions'), ), migrations.RunSQL( sql=fts_sql, ), migrations.AlterModelManagers( name='userprofile', managers=[ ('objects', django.contrib.auth.models.UserManager()), ], ), migrations.AlterField( model_name='preregistrationuser', name='email', field=models.EmailField(max_length=254), ), migrations.AlterField( model_name='preregistrationuser', name='streams', field=models.ManyToManyField(to='zerver.Stream'), ), migrations.AlterField( model_name='pushdevicetoken', name='last_updated', field=models.DateTimeField(auto_now=True), ), migrations.AlterField( model_name='referral', name='email', field=models.EmailField(max_length=254), ), migrations.AlterField( model_name='userprofile', name='email', field=models.EmailField(db_index=True, max_length=254, unique=True), ), migrations.AlterField( model_name='userprofile', name='last_login', field=models.DateTimeField(blank=True, null=True, verbose_name='last login'), ), migrations.RunSQL( sql='CREATE INDEX upper_subject_idx ON zerver_message ((upper(subject)));', reverse_sql='DROP INDEX upper_subject_idx;', ), migrations.RunSQL( sql='CREATE INDEX upper_stream_name_idx ON zerver_stream ((upper(name)));', reverse_sql='DROP INDEX upper_stream_name_idx;', ), migrations.AddField( model_name='userprofile', name='left_side_userlist', field=models.BooleanField(default=False), ), migrations.AlterModelOptions( name='realm', options={'permissions': (('administer', 'Administer a realm'), ('api_super_user', 'Can send messages as other users for mirroring'))}, ), migrations.RunSQL( sql='CREATE INDEX upper_userprofile_email_idx ON zerver_userprofile ((upper(email)));', reverse_sql='DROP INDEX upper_userprofile_email_idx;', ), migrations.AlterField( model_name='userprofile', name='is_active', field=models.BooleanField(db_index=True, default=True), ), migrations.AlterField( model_name='userprofile', name='is_bot', field=models.BooleanField(db_index=True, default=False), ), migrations.RunSQL( sql='CREATE INDEX upper_preregistration_email_idx ON zerver_preregistrationuser ((upper(email)));', reverse_sql='DROP INDEX upper_preregistration_email_idx;', ), migrations.AlterField( model_name='userprofile', name='enable_stream_desktop_notifications', field=models.BooleanField(default=False), ), migrations.AlterField( model_name='userprofile', name='enable_stream_sounds', field=models.BooleanField(default=False), ), migrations.AddField( model_name='userprofile', name='is_api_super_user', field=models.BooleanField(db_index=True, default=False), ), migrations.AddField( model_name='userprofile', name='is_realm_admin', field=models.BooleanField(db_index=True, default=False), ), migrations.AlterField( model_name='realmemoji', name='img_url', field=models.URLField(), ), migrations.AlterField( model_name='realmemoji', name='name', field=models.TextField(validators=[django.core.validators.MinLengthValidator(1), django.core.validators.RegexValidator(regex='^[0-9a-zA-Z.\\-_]+(?