# -*- coding: utf-8 -*-
from __future__ import unicode_literals

import django.db.models.deletion
import django.utils.timezone
from django.conf import settings
from django.contrib.postgres.fields import JSONField
from django.contrib.postgres.search import SearchVectorField
from django.db import migrations, models

import misago.threads.models.attachment
from misago.core.pgutils import CreatePartialCompositeIndex, CreatePartialIndex


class Migration(migrations.Migration):
    dependencies = [
        ('misago_categories', '0001_initial'),
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
    ]

    operations = [
        migrations.CreateModel(
            name='Post',
            fields=[
                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                ('poster_name', models.CharField(max_length=255)),
                ('poster_ip', models.GenericIPAddressField()),
                ('original', models.TextField()),
                ('parsed', models.TextField()),
                ('checksum', models.CharField(max_length=64, default='-')),
                ('attachments_cache', JSONField(null=True, blank=True)),
                ('posted_on', models.DateTimeField()),
                ('updated_on', models.DateTimeField()),
                ('edits', models.PositiveIntegerField(default=0)),
                ('last_editor_name', models.CharField(max_length=255, null=True, blank=True)),
                ('last_editor_slug', models.SlugField(max_length=255, null=True, blank=True)),
                ('hidden_by', models.ForeignKey(related_name='+', on_delete=django.db.models.deletion.SET_NULL, blank=True, to=settings.AUTH_USER_MODEL, null=True)),
                ('hidden_by_name', models.CharField(max_length=255, null=True, blank=True)),
                ('hidden_by_slug', models.SlugField(max_length=255, null=True, blank=True)),
                ('hidden_on', models.DateTimeField(default=django.utils.timezone.now)),
                ('has_reports', models.BooleanField(default=False)),
                ('has_open_reports', models.BooleanField(default=False)),
                ('is_unapproved', models.BooleanField(default=False, db_index=True)),
                ('is_hidden', models.BooleanField(default=False)),
                ('is_protected', models.BooleanField(default=False)),
                ('category', models.ForeignKey(to='misago_categories.Category')),
                ('last_editor', models.ForeignKey(related_name='+', on_delete=django.db.models.deletion.SET_NULL, blank=True, to=settings.AUTH_USER_MODEL, null=True)),
                ('mentions', models.ManyToManyField(related_name='mention_set', to=settings.AUTH_USER_MODEL)),
                ('poster', models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, blank=True, to=settings.AUTH_USER_MODEL, null=True)),
                ('is_event', models.BooleanField(default=False, db_index=True)),
                ('event_type', models.CharField(max_length=255, null=True, blank=True)),
                ('event_context', JSONField(null=True, blank=True)),
                ('likes', models.PositiveIntegerField(default=0)),
                ('last_likes', JSONField(blank=True, null=True)),
                ('search_document', models.TextField(blank=True, null=True)),
                ('search_vector', SearchVectorField()),
            ],
            options={
            },
            bases=(models.Model,),
        ),
        CreatePartialIndex(
            field='Post.has_open_reports',
            index_name='misago_post_has_open_reports_partial',
            condition='has_open_reports = TRUE',
        ),
        CreatePartialIndex(
            field='Post.is_hidden',
            index_name='misago_post_is_hidden_partial',
            condition='is_hidden = FALSE',
        ),
        migrations.CreateModel(
            name='Thread',
            fields=[
                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                ('title', models.CharField(max_length=255)),
                ('slug', models.CharField(max_length=255)),
                ('replies', models.PositiveIntegerField(default=0, db_index=True)),
                ('has_events', models.BooleanField(default=False)),
                ('has_poll', models.BooleanField(default=False)),
                ('has_reported_posts', models.BooleanField(default=False)),
                ('has_open_reports', models.BooleanField(default=False)),
                ('has_unapproved_posts', models.BooleanField(default=False)),
                ('has_hidden_posts', models.BooleanField(default=False)),
                ('started_on', models.DateTimeField(db_index=True)),
                ('starter_name', models.CharField(max_length=255)),
                ('starter_slug', models.CharField(max_length=255)),
                ('last_post_is_event', models.BooleanField(default=False)),
                ('last_post_on', models.DateTimeField(db_index=True)),
                ('last_poster_name', models.CharField(max_length=255, null=True, blank=True)),
                ('last_poster_slug', models.CharField(max_length=255, null=True, blank=True)),
                ('weight', models.PositiveIntegerField(default=0)),
                ('is_unapproved', models.BooleanField(default=False, db_index=True)),
                ('is_hidden', models.BooleanField(default=False)),
                ('is_closed', models.BooleanField(default=False)),
            ],
            options={
            },
            bases=(models.Model,),
        ),
        CreatePartialIndex(
            field='Thread.weight',
            index_name='misago_thread_is_global',
            condition='weight = 2',
        ),
        CreatePartialIndex(
            field='Thread.weight',
            index_name='misago_thread_is_local',
            condition='weight < 2',
        ),
        migrations.CreateModel(
            name='ThreadParticipant',
            fields=[
                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                ('thread', models.ForeignKey(to='misago_threads.Thread')),
                ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)),
                ('is_owner', models.BooleanField(default=False)),
            ],
            options={
            },
            bases=(models.Model,),
        ),
        migrations.AddField(
            model_name='thread',
            name='participants',
            field=models.ManyToManyField(related_name='privatethread_set', through='misago_threads.ThreadParticipant', to=settings.AUTH_USER_MODEL),
            preserve_default=True,
        ),
        CreatePartialIndex(
            field='Thread.has_reported_posts',
            index_name='misago_thread_has_reported_posts_partial',
            condition='has_reported_posts = TRUE',
        ),
        CreatePartialIndex(
            field='Thread.has_unapproved_posts',
            index_name='misago_thread_has_unapproved_posts_partial',
            condition='has_unapproved_posts = TRUE',
        ),
        CreatePartialIndex(
            field='Thread.is_hidden',
            index_name='misago_thread_is_hidden_partial',
            condition='is_hidden = FALSE',
        ),
        CreatePartialIndex(
            field='Thread.weight',
            index_name='misago_thread_is_pinned_globally_partial',
            condition='weight = 2',
        ),
        CreatePartialIndex(
            field='Thread.weight',
            index_name='misago_thread_is_pinned_locally_partial',
            condition='weight = 1',
        ),
        CreatePartialIndex(
            field='Thread.weight',
            index_name='misago_thread_is_unpinned_partial',
            condition='weight = 0',
        ),
        migrations.AddField(
            model_name='post',
            name='thread',
            field=models.ForeignKey(to='misago_threads.Thread'),
            preserve_default=True,
        ),
        migrations.AddField(
            model_name='thread',
            name='first_post',
            field=models.ForeignKey(related_name='+', on_delete=django.db.models.deletion.SET_NULL, blank=True, to='misago_threads.Post', null=True),
            preserve_default=True,
        ),
        migrations.AddField(
            model_name='thread',
            name='category',
            field=models.ForeignKey(to='misago_categories.Category'),
            preserve_default=True,
        ),
        migrations.AddField(
            model_name='thread',
            name='last_post',
            field=models.ForeignKey(related_name='+', on_delete=django.db.models.deletion.SET_NULL, blank=True, to='misago_threads.Post', null=True),
            preserve_default=True,
        ),
        migrations.AddField(
            model_name='thread',
            name='last_poster',
            field=models.ForeignKey(related_name='last_poster_set', on_delete=django.db.models.deletion.SET_NULL, blank=True, to=settings.AUTH_USER_MODEL, null=True),
            preserve_default=True,
        ),
        migrations.AddField(
            model_name='thread',
            name='starter',
            field=models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, blank=True, to=settings.AUTH_USER_MODEL, null=True),
            preserve_default=True,
        ),
        migrations.AlterIndexTogether(
            name='thread',
            index_together=set([
                ('category', 'id'),
                ('category', 'last_post_on'),
                ('category', 'replies'),
            ]),
        ),
        migrations.AlterIndexTogether(
            name='post',
            index_together=set([
                ('thread', 'id'),
                ('is_event', 'is_hidden'),
                ('poster', 'posted_on'),
            ]),
        ),
        migrations.CreateModel(
            name='Subscription',
            fields=[
                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                ('last_read_on', models.DateTimeField(default=django.utils.timezone.now)),
                ('send_email', models.BooleanField(default=False)),
                ('category', models.ForeignKey(to='misago_categories.Category')),
                ('thread', models.ForeignKey(to='misago_threads.Thread')),
                ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)),
            ],
            options={
            },
            bases=(models.Model,),
        ),
        migrations.AlterIndexTogether(
            name='subscription',
            index_together=set([
                ('send_email', 'last_read_on'),
            ]),
        ),
        migrations.CreateModel(
            name='PostEdit',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('edited_on', models.DateTimeField(default=django.utils.timezone.now)),
                ('editor_name', models.CharField(max_length=255)),
                ('editor_slug', models.CharField(max_length=255)),
                ('editor_ip', models.GenericIPAddressField()),
                ('edited_from', models.TextField()),
                ('edited_to', models.TextField()),
                ('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='misago_categories.Category')),
                ('editor', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
                ('post', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='edits_record', to='misago_threads.Post')),
                ('thread', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='misago_threads.Thread')),
            ],
            options={
                'ordering': ['-id'],
            },
        ),
        migrations.CreateModel(
            name='Attachment',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('secret', models.CharField(max_length=64)),
                ('uploaded_on', models.DateTimeField(default=django.utils.timezone.now, db_index=True)),
                ('uploader_name', models.CharField(max_length=255)),
                ('uploader_slug', models.CharField(max_length=255, db_index=True)),
                ('uploader_ip', models.GenericIPAddressField()),
                ('filename', models.CharField(max_length=255, db_index=True)),
                ('size', models.PositiveIntegerField(default=0, db_index=True)),
                ('thumbnail', models.ImageField(max_length=255, blank=True, null=True, upload_to=misago.threads.models.attachment.upload_to)),
                ('image', models.ImageField(max_length=255, blank=True, null=True, upload_to=misago.threads.models.attachment.upload_to)),
                ('file', models.FileField(max_length=255, blank=True, null=True, upload_to=misago.threads.models.attachment.upload_to)),
                ('post', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='misago_threads.Post')),
            ],
        ),
        migrations.CreateModel(
            name='AttachmentType',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(max_length=255)),
                ('extensions', models.CharField(max_length=255)),
                ('mimetypes', models.CharField(blank=True, max_length=255, null=True)),
                ('size_limit', models.PositiveIntegerField(default=1024)),
                ('status', models.PositiveIntegerField(choices=[(0, 'Allow uploads and downloads'), (1, 'Allow downloads only'), (2, 'Disallow both uploading and downloading')], default=0)),
                ('limit_downloads_to', models.ManyToManyField(blank=True, related_name='_attachmenttype_limit_downloads_to_+', to='misago_acl.Role')),
                ('limit_uploads_to', models.ManyToManyField(blank=True, related_name='_attachmenttype_limit_uploads_to_+', to='misago_acl.Role')),
            ],
        ),
        migrations.AddField(
            model_name='attachment',
            name='filetype',
            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='misago_threads.AttachmentType'),
        ),
        migrations.AddField(
            model_name='attachment',
            name='uploader',
            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL),
        ),
        migrations.CreateModel(
            name='Poll',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('poster_name', models.CharField(max_length=255)),
                ('poster_slug', models.CharField(max_length=255)),
                ('poster_ip', models.GenericIPAddressField()),
                ('posted_on', models.DateTimeField(default=django.utils.timezone.now)),
                ('length', models.PositiveIntegerField(default=0)),
                ('question', models.CharField(max_length=255)),
                ('choices', django.contrib.postgres.fields.jsonb.JSONField()),
                ('allowed_choices', models.PositiveIntegerField(default=1)),
                ('allow_revotes', models.BooleanField(default=False)),
                ('votes', models.PositiveIntegerField(default=0)),
                ('is_public', models.BooleanField(default=False)),
                ('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='misago_categories.Category')),
                ('poster', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
                ('thread', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='misago_threads.Thread')),
            ],
        ),
        migrations.CreateModel(
            name='PollVote',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('voter_name', models.CharField(max_length=255)),
                ('voter_slug', models.CharField(max_length=255)),
                ('voter_ip', models.GenericIPAddressField()),
                ('voted_on', models.DateTimeField(default=django.utils.timezone.now)),
                ('choice_hash', models.CharField(db_index=True, max_length=12)),
                ('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='misago_categories.Category')),
                ('poll', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='misago_threads.Poll')),
                ('thread', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='misago_threads.Thread')),
                ('voter', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
            ],
        ),
        migrations.AlterIndexTogether(
            name='pollvote',
            index_together=set([
                ('poll', 'voter_name'),
            ]),
        ),
        migrations.CreateModel(
            name='PostLike',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('liker_name', models.CharField(max_length=255, db_index=True)),
                ('liker_slug', models.CharField(max_length=255)),
                ('liker_ip', models.GenericIPAddressField()),
                ('liked_on', models.DateTimeField(default=django.utils.timezone.now)),
                ('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='misago_categories.Category')),
            ],
            options={
                'ordering': ['-id'],
            },
        ),
        migrations.AddField(
            model_name='postlike',
            name='post',
            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='misago_threads.Post'),
        ),
        migrations.AddField(
            model_name='postlike',
            name='thread',
            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='misago_threads.Thread'),
        ),
        migrations.AddField(
            model_name='postlike',
            name='liker',
            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL),
        ),
        migrations.AddField(
            model_name='post',
            name='liked_by',
            field=models.ManyToManyField(related_name='liked_post_set', through='misago_threads.PostLike', to=settings.AUTH_USER_MODEL),
        ),
    ]